diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index 6a07944..68060c2 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -9,7 +9,7 @@ "name": "conn", "source": "./plugin", "description": "Conn: MCP server + working-etiquette skill.", - "version": "0.8.6" + "version": "0.8.7" } ] } diff --git a/.github/actions/setup/action.yml b/.github/actions/setup/action.yml index 14792fa..e552486 100644 --- a/.github/actions/setup/action.yml +++ b/.github/actions/setup/action.yml @@ -36,5 +36,4 @@ runs: save-if: ${{ github.ref == 'refs/heads/main' }} - name: Frontend dependencies shell: bash - working-directory: frontends/tauri run: npm ci diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f361fe4..4eb6237 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -82,13 +82,15 @@ jobs: sh -n scripts/install.sh ! CONN_VERSION="latest" sh scripts/install.sh > /dev/null 2>&1 - run: python -m unittest discover -s tests/release -v - - run: npm test - working-directory: frontends/tauri + - run: npm run test:ui + - run: node scripts/check-ui-boundaries.mjs + - run: node scripts/generate-owner-contract.mjs --check - name: Core and renderer screen parity run: npm run test:screen - working-directory: frontends/tauri + working-directory: packages/ui - run: npm run build working-directory: frontends/tauri + - run: npm run build:web - name: The website builds, including the pages it generates from docs/ run: npm ci && npm run build working-directory: site @@ -169,14 +171,14 @@ jobs: save-if: ${{ github.ref == 'refs/heads/main' }} - name: Install the lockfile-pinned test browser run: npx playwright install chromium --with-deps - working-directory: frontends/tauri - - run: cargo build --locked -p conn-browser-harness + working-directory: tests/collaboration + - run: cargo build --locked -p conn-web -p conn + - run: npm run build:web + - run: npm run test:checkpoint -w @conn/ui + - run: npm run test:app-lifetime -w @conn/ui - run: npm run test:collaboration - working-directory: frontends/tauri - - run: npm run test:collaboration:harness - working-directory: frontends/tauri - - run: npm run test:context:harness - working-directory: frontends/tauri + - run: npm run test:input -w @conn/collaboration-tests + - run: npm run package:web -- --debug required: name: Required checks if: always() diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7d4e4f3..55da497 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -119,6 +119,9 @@ jobs: - name: Package Linux or Windows assets if: runner.os != 'macOS' run: python scripts/release.py package --target ${{ matrix.target }} --out release-artifacts + - name: Build and verify standalone Linux web package + if: runner.os == 'Linux' + run: npm run package:web -- --release-archive - name: Sign final updater artifacts env: TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }} diff --git a/CHANGELOG.md b/CHANGELOG.md index 90a9c9d..c95bc7c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,20 @@ ## Unreleased +## 0.8.7 — Preview · 2026-09-23 + +- Ship the shared UI/runtime refactor: native and standalone web mount the same Svelte app and use the same Rust owner, input ordering, permission decisions and lifecycle. A Linux x64 web archive includes the host, matching MCP CLI and UI; it runs locally without a build toolchain. +- Distinguish shared-screen admission, shell control and command execution. Control requests expand from the Conn badge and collapse without granting or denying; command review stays below the terminal. Session-wide allowances require opening an explicit scope choice. Ordinary terminal letters no longer approve a newly arrived command request. +- Bind approval reasons and available choices to the request, preserve the command's risk label in uncertain shells, and recheck the shell context and policy before executing. Detect the actual foreground SSH executable on Linux/macOS so compound shell entries do not silently receive a different remote command policy. +- Recover input after visible Backspace/Delete/Ctrl-W/Ctrl-U erasure, including coalesced echoes. Empty cursor motion no longer blocks collaboration; Home followed by Ctrl-U keeps remaining input protected. No human command line or hidden input is reconstructed or logged. +- Include the macOS long-input PTY deadlock fix and keep queued output ahead of the process-exit notification. Linux desktop startup defaults to the compatible WebKit DMA-BUF path, honoring an explicit environment override. + +한국어: 네이티브·웹의 공통 UI와 Rust 런타임을 배포합니다. 연결은 공유 화면 접근, 뱃지에서 펼쳐지는 요청은 입력 제어권, 하단 카드는 이번 명령 실행으로 구별합니다. 요청별 사유·승인 범위를 고정하고, 원격 환경 안내가 삭제 등 위험 사유를 덮어쓰지 않도록 했습니다. 빈 입력·커서 이동의 오판과 Home 후 Ctrl-U에 남는 입력의 보호를 함께 수정했습니다. Mac 긴 입력 교착 수정, 마지막 출력과 종료 알림의 순서 보장, Linux WebKit 시작 호환 설정도 포함합니다. Linux 독립 웹 패키지는 개발 도구 없이 로컬에서 실행할 수 있습니다. + +Validation and limits: [release verification](docs/release-0.8.7-validation.md). The earlier macOS native audit covers the shared-runtime/deadlock changes at `5df5e36`; this release's new control UI and input-state fixes are additionally tested on Linux with the real Rust web host, common UI and persistent MCP. They have not been re-run interactively on macOS. The user's gateway, physical IME, native notification center and complete installed-app upgrades remain separate acceptance work. The output queue remains unbounded; the report records the measured finite-load test, not a guarantee for indefinitely stalled consumers. + +한국어: [릴리스 검증 기록](docs/release-0.8.7-validation.md)에 자동 검사·브라우저·Mac 실기 범위를 구분했습니다. 새 제어 UI와 입력 판정을 Mac에서 다시 대화형 검증했다고 주장하지 않습니다. 사용자 게이트웨이·물리 IME·네이티브 알림·설치 앱 전체 업그레이드는 별도 인수 범위입니다. + ## 0.8.6 — Preview · 2026-09-22 - Keep terminal dimensions and shell output in the same order when an approval bar opens and closes, including in a fixed window. This fixes reproduced stale sizes and cursor disagreement after delayed resizes and shell redraws while retaining the existing motion. diff --git a/CONTRIBUTING.ko.md b/CONTRIBUTING.ko.md index f9dc9fb..d3c5bd9 100644 --- a/CONTRIBUTING.ko.md +++ b/CONTRIBUTING.ko.md @@ -37,16 +37,14 @@ npm run tauri dev ### 공유 UI를 브라우저에서 실행 -`frontends/tauri`에서: +저장소 루트에서: ```sh npm ci -npm run test:browser +npm run dev:web ``` -`http://127.0.0.1:1421/`을 엽니다. 로컬 WebSocket 어댑터를 통해 **같은 App과 Rust 프런트엔드 하네스**를 사용합니다. 별도 웹 제품이나 가짜 셸이 아니라 개발 보조 도구입니다. 명령은 로컬 사용자 권한으로 실행됩니다. 실행 스크립트가 별도 설정 폴더와 에이전트 연결 주소를 출력합니다. - -브라우저 새로고침·연결 종료는 실행 중인 세션을 끝냅니다. 버려도 되는 파일로 시험하고 필요한 때만 새로고침하세요. 수명과 연결 주소에 대한 내용은 [브라우저 테스트](docs/browser-testing.md)를 참고하세요. +`http://127.0.0.1:1429`에서 서버 연결 파일의 코드를 입력합니다. 웹과 네이티브는 같은 `@conn/ui`와 Rust `AppRuntime`을 사용합니다. 새로고침해도 서버가 실행 중이면 기존 셸을 유지합니다. 개발 실행·운영 패키지·실제 MCP 검사는 [웹 호스트와 브라우저 검증](docs/browser-testing.ko.md)을 참고하세요. ## 변경할 위치 찾기 @@ -55,8 +53,9 @@ npm run test:browser | `crates/core` | PTY, 세션 제어, 정책, 감사, IPC, 셸·백엔드 프로필 | | `crates/cli` | MCP 어댑터, 에이전트 명령, 로컬 프로필·로그 도구 | | `crates/frontend` | 공유 네이티브 프런트엔드 하네스와 명령 처리 | -| `crates/browser-harness` | 공유 하네스에 연결하는 로컬 브라우저 테스트 전송 계층 | -| `frontends/tauri/src` | 공유 Svelte UI, 터미널 렌더러, 타임라인, 설정, i18n | +| `crates/web` | 실제 AppRuntime을 운영하는 로컬 웹 서버 | +| `packages/ui` | 공통 Svelte UI, 앱별 룬 상태, 터미널 렌더러, 협업 액션, i18n | +| `frontends/tauri/src`, `frontends/web/src` | 네이티브·웹 진입점과 호스트 어댑터 | | `frontends/tauri/src-tauri` | Tauri 어댑터, 네이티브 설정, 패키징 | | `plugin` | 에이전트 작업 절차와 MCP 서버 정의 | | `packages` | 여러 도구가 함께 읽는 데이터: `brand`(이름·저장소·사이트 주소), `themes`(내장 터미널 테마) | @@ -92,7 +91,7 @@ cargo test --locked ```sh npm ci -npm test +npm run test:ui --prefix ../.. npm run build ``` diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index fc76d30..737b845 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -37,16 +37,14 @@ The wrapper builds the native CLI sidecar before starting Tauri. A native deskto ### Run the shared UI in a browser -From `frontends/tauri`: +From the repository root: ```sh npm ci -npm run test:browser +npm run dev:web ``` -Open `http://127.0.0.1:1421/`. This uses the **same App and Rust frontend harness** through a local WebSocket adapter. It is a development aid, not a separate web product or a simulated shell. Shell commands run as your local user. The launcher prints a separate settings directory and agent endpoint. - -Reloading or disconnecting the browser ends its live sessions. Test with disposable files and deliberate reloads. See [browser testing](docs/browser-testing.md) for lifecycle and endpoint details. +Open `http://127.0.0.1:1429` and enter the code from the server connection file. Web and native mount the same `@conn/ui` and use Rust `AppRuntime`. Reloading preserves shells while the server remains running. See [the web host and browser validation guide](docs/browser-testing.md) for development, operating a package and real MCP tests. ## Know where the change belongs @@ -55,8 +53,9 @@ Reloading or disconnecting the browser ends its live sessions. Test with disposa | `crates/core` | PTY, session control, policy, audit, IPC, shell/backend profiles | | `crates/cli` | MCP adapter, agent commands, local profile and log utilities | | `crates/frontend` | Owner-window harness, sharing, native extensions | -| `crates/browser-harness` | Local browser-test transport to the shared harness | -| `frontends/tauri/src` | Shared Svelte UI, terminal renderer, timeline, settings, i18n | +| `crates/web` | Local web server for the production AppRuntime | +| `packages/ui` | Common Svelte UI, app-scoped runes, terminal renderer, collaboration actions and i18n | +| `frontends/tauri/src`, `frontends/web/src` | Native/web entry points and host adapters | | `frontends/tauri/src-tauri` | Tauri adapter, native configuration, packaging | | `plugin` | Agent procedure and MCP server definition | | `packages` | Data shared across toolchains: `brand` (name, repository, site address) and `themes` (built-in terminal themes) | @@ -92,7 +91,7 @@ From `frontends/tauri`: ```sh npm ci -npm test +npm run test:ui --prefix ../.. npm run build ``` diff --git a/Cargo.lock b/Cargo.lock index 0458a10..7a2f521 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -696,7 +696,7 @@ dependencies = [ [[package]] name = "conn" -version = "0.8.6" +version = "0.8.7" dependencies = [ "clap", "conn-core", @@ -704,22 +704,9 @@ dependencies = [ "tempfile", ] -[[package]] -name = "conn-browser-harness" -version = "0.8.6" -dependencies = [ - "axum", - "conn-core", - "conn-frontend", - "futures-util", - "serde_json", - "tokio", - "uuid", -] - [[package]] name = "conn-core" -version = "0.8.6" +version = "0.8.7" dependencies = [ "chrono", "dirs 5.0.1", @@ -742,7 +729,7 @@ dependencies = [ [[package]] name = "conn-desktop" -version = "0.8.6" +version = "0.8.7" dependencies = [ "base64 0.22.1", "cc", @@ -764,12 +751,13 @@ dependencies = [ [[package]] name = "conn-frontend" -version = "0.8.6" +version = "0.8.7" dependencies = [ "base64 0.22.1", "conn-core", "jsonc-parser", "parking_lot", + "schemars 0.8.22", "serde", "serde_json", "sha2 0.11.0", @@ -778,6 +766,28 @@ dependencies = [ "uuid", ] +[[package]] +name = "conn-web" +version = "0.8.7" +dependencies = [ + "axum", + "base64 0.22.1", + "clap", + "conn-core", + "conn-frontend", + "dirs 5.0.1", + "futures-util", + "libc", + "parking_lot", + "percent-encoding", + "serde", + "serde_json", + "tempfile", + "tokio", + "tokio-tungstenite", + "uuid", +] + [[package]] name = "const-oid" version = "0.10.2" diff --git a/Cargo.toml b/Cargo.toml index 1386641..61e4ae2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,19 +1,19 @@ [workspace] resolver = "2" exclude = ["vendor/vt100"] -members = ["crates/core", "crates/cli", "crates/frontend", "crates/browser-harness", "frontends/tauri/src-tauri"] +members = ["crates/core", "crates/cli", "crates/frontend", "crates/web", "frontends/tauri/src-tauri"] # The desktop shell needs the platform webview toolchain; plain `cargo test` stays on the portable crates. -default-members = ["crates/core", "crates/cli", "crates/frontend", "crates/browser-harness"] +default-members = ["crates/core", "crates/cli", "crates/frontend", "crates/web"] [workspace.package] -version = "0.8.6" +version = "0.8.7" edition = "2021" license = "MIT" repository = "https://github.com/eggp-dev/conn" [workspace.dependencies] -conn-core = { path = "crates/core", version = "0.8.6" } -conn-frontend = { path = "crates/frontend", version = "0.8.6" } +conn-core = { path = "crates/core", version = "0.8.7" } +conn-frontend = { path = "crates/frontend", version = "0.8.7" } tokio = { version = "1", features = ["rt-multi-thread", "net", "io-util", "sync", "time", "macros", "signal"] } portable-pty = "0.8" vt100 = { path = "vendor/vt100", version = "0.15.2" } diff --git a/README.ko.md b/README.ko.md index 7a09c4f..3668d4f 100644 --- a/README.ko.md +++ b/README.ko.md @@ -29,13 +29,13 @@ curl -fsSL https://conn.eggp.dev/install.sh | sh Rust나 Node.js는 필요 없습니다. 에이전트 연결 도구가 함께 들어 있습니다. 두 방법 모두 아래 다운로드와 같은 서명된 릴리스 파일을 설치하며, 이후에는 앱 안에서 업데이트됩니다. Windows는 설치 파일을 사용하세요. -| 운영체제 | v0.8.6 프리뷰 | +| 운영체제 | v0.8.7 프리뷰 | |---|---| -| macOS · Apple Silicon | [Mac용 다운로드](https://github.com/eggp-dev/conn/releases/download/v0.8.6/conn-v0.8.6-aarch64-apple-darwin-desktop.dmg) | -| Windows · x64 | [설치 파일 다운로드](https://github.com/eggp-dev/conn/releases/download/v0.8.6/conn-v0.8.6-x86_64-pc-windows-msvc-setup.exe) | -| Ubuntu · x64 | [.deb 다운로드](https://github.com/eggp-dev/conn/releases/download/v0.8.6/conn-v0.8.6-x86_64-unknown-linux-gnu-desktop.deb) · [AppImage](https://github.com/eggp-dev/conn/releases/download/v0.8.6/conn-v0.8.6-x86_64-unknown-linux-gnu-desktop.AppImage) | +| macOS · Apple Silicon | [Mac용 다운로드](https://github.com/eggp-dev/conn/releases/download/v0.8.7/conn-v0.8.7-aarch64-apple-darwin-desktop.dmg) | +| Windows · x64 | [설치 파일 다운로드](https://github.com/eggp-dev/conn/releases/download/v0.8.7/conn-v0.8.7-x86_64-pc-windows-msvc-setup.exe) | +| Ubuntu · x64 | [.deb 다운로드](https://github.com/eggp-dev/conn/releases/download/v0.8.7/conn-v0.8.7-x86_64-unknown-linux-gnu-desktop.deb) · [AppImage](https://github.com/eggp-dev/conn/releases/download/v0.8.7/conn-v0.8.7-x86_64-unknown-linux-gnu-desktop.AppImage) | -Mac 배포 파일은 서명·공증되어 있습니다. Windows 프리뷰는 무서명이며, Linux는 Ubuntu 24.04에서 빌드하며, AppImage는 앱 안에서 업데이트되고 `.deb`는 새 패키지를 설치해 업데이트합니다. Intel Mac 배포는 잠시 중단했습니다. [설치·업데이트 안내](docs/getting-started.ko.md) · [전체 파일·체크섬](https://github.com/eggp-dev/conn/releases/tag/v0.8.6) +Mac 배포 파일은 서명·공증되어 있습니다. Windows 프리뷰는 무서명이며, Linux는 Ubuntu 24.04에서 빌드하며, AppImage는 앱 안에서 업데이트되고 `.deb`는 새 패키지를 설치해 업데이트합니다. Intel Mac 배포는 잠시 중단했습니다. [설치·업데이트 안내](docs/getting-started.ko.md) · [전체 파일·체크섬](https://github.com/eggp-dev/conn/releases/tag/v0.8.7) ## 처음 5분 diff --git a/README.md b/README.md index 61da86e..6a1c90f 100644 --- a/README.md +++ b/README.md @@ -29,13 +29,13 @@ curl -fsSL https://conn.eggp.dev/install.sh | sh No Rust or Node.js required; the agent connector is included. Both install the same signed release files as the downloads below, and the app updates itself afterwards. Windows: use the installer. -| Platform | v0.8.6 preview | +| Platform | v0.8.7 preview | |---|---| -| macOS · Apple Silicon | [Download for Mac](https://github.com/eggp-dev/conn/releases/download/v0.8.6/conn-v0.8.6-aarch64-apple-darwin-desktop.dmg) | -| Windows · x64 | [Download installer](https://github.com/eggp-dev/conn/releases/download/v0.8.6/conn-v0.8.6-x86_64-pc-windows-msvc-setup.exe) | -| Ubuntu · x64 | [Download .deb](https://github.com/eggp-dev/conn/releases/download/v0.8.6/conn-v0.8.6-x86_64-unknown-linux-gnu-desktop.deb) · [AppImage](https://github.com/eggp-dev/conn/releases/download/v0.8.6/conn-v0.8.6-x86_64-unknown-linux-gnu-desktop.AppImage) | +| macOS · Apple Silicon | [Download for Mac](https://github.com/eggp-dev/conn/releases/download/v0.8.7/conn-v0.8.7-aarch64-apple-darwin-desktop.dmg) | +| Windows · x64 | [Download installer](https://github.com/eggp-dev/conn/releases/download/v0.8.7/conn-v0.8.7-x86_64-pc-windows-msvc-setup.exe) | +| Ubuntu · x64 | [Download .deb](https://github.com/eggp-dev/conn/releases/download/v0.8.7/conn-v0.8.7-x86_64-unknown-linux-gnu-desktop.deb) · [AppImage](https://github.com/eggp-dev/conn/releases/download/v0.8.7/conn-v0.8.7-x86_64-unknown-linux-gnu-desktop.AppImage) | -Mac downloads are signed and notarized. Windows previews are unsigned. Linux builds use Ubuntu 24.04, and the AppImage updates in-app while the `.deb` updates by installing a new package; Intel Mac distribution is paused. [Installation and updates](docs/getting-started.md) · [All assets and checksums](https://github.com/eggp-dev/conn/releases/tag/v0.8.6) +Mac downloads are signed and notarized. Windows previews are unsigned. Linux builds use Ubuntu 24.04, and the AppImage updates in-app while the `.deb` updates by installing a new package; Intel Mac distribution is paused. [Installation and updates](docs/getting-started.md) · [All assets and checksums](https://github.com/eggp-dev/conn/releases/tag/v0.8.7) ## First five minutes diff --git a/crates/browser-harness/Cargo.toml b/crates/browser-harness/Cargo.toml deleted file mode 100644 index 07c547d..0000000 --- a/crates/browser-harness/Cargo.toml +++ /dev/null @@ -1,13 +0,0 @@ -[package] -name = "conn-browser-harness" -version.workspace = true -edition.workspace = true -license.workspace = true -[dependencies] -conn-core.workspace = true -conn-frontend.workspace = true -serde_json.workspace = true -tokio.workspace = true -uuid.workspace = true -axum = { version = "0.8", features = ["ws"] } -futures-util = "0.3" diff --git a/crates/browser-harness/src/main.rs b/crates/browser-harness/src/main.rs deleted file mode 100644 index f4796c8..0000000 --- a/crates/browser-harness/src/main.rs +++ /dev/null @@ -1,97 +0,0 @@ -//! Loopback test transport for the same native backend and frontend commands used by Tauri. -use std::{collections::HashMap, path::PathBuf, sync::{Arc, atomic::{AtomicBool, Ordering}}}; -use axum::{Router, routing::get, extract::{ws::{WebSocket, WebSocketUpgrade, Message}, State, Query}, http::{HeaderMap, StatusCode}, response::IntoResponse}; -use conn_core::{backend::Profile, policy::PolicyStore}; -use conn_frontend::Harness; -use futures_util::{SinkExt, StreamExt}; -use serde_json::{Value, json}; - -#[derive(Clone)] -struct Server { token: String, origin: String, dir: PathBuf, connected: Arc } -fn test_endpoint(port: &str, origin: &str) -> Result<(u16, String), String> { - let port = port.parse::().ok().filter(|p| *p != 0).ok_or("CONN_TEST_PORT must be between 1 and 65535")?; - let frontend_port = origin.strip_prefix("http://127.0.0.1:").and_then(|p| p.parse::().ok()).filter(|p| *p != 0) - .ok_or("CONN_TEST_ORIGIN must be http://127.0.0.1:")?; - if origin != format!("http://127.0.0.1:{frontend_port}") { - return Err("CONN_TEST_ORIGIN must be http://127.0.0.1: without a path".into()); - } - Ok((port, origin.into())) -} -async fn upgrade(State(s): State, Query(q): Query>, headers: HeaderMap, ws: WebSocketUpgrade) -> axum::response::Response { - if headers.get("origin").and_then(|v|v.to_str().ok()) != Some(s.origin.as_str()) || q.get("token") != Some(&s.token) { - return (StatusCode::FORBIDDEN,"invalid test origin or token").into_response(); - } - if s.connected.swap(true,Ordering::SeqCst) { return (StatusCode::CONFLICT,"one browser test client at a time").into_response(); } - ws.max_message_size(6*1024*1024).on_upgrade(move |socket| serve(socket,s)) -} -async fn serve(socket: WebSocket, server: Server) { - let (tx,mut rx) = tokio::sync::mpsc::unbounded_channel::(); - let emit_tx = tx.clone(); - let harness = Arc::new(Harness::with_setup_home(server.dir.clone(),server.dir.join("conn.sock"),Arc::new(move |name,payload| { let _ = emit_tx.send(json!({"event":name,"payload":payload})); }), Some(server.dir.join("agent-clients")))); - let (mut writer,mut reader) = socket.split(); - loop { - if rx.len() > 2048 { break; } // Disconnect on overload rather than silently dropping state transitions. - tokio::select! { - Some(value) = rx.recv() => { if writer.send(Message::Text(value.to_string().into())).await.is_err() { break; } }, - message = reader.next() => { - let Some(Ok(Message::Text(text))) = message else { break; }; - let Ok(v) = serde_json::from_str::(&text) else { break; }; - let id = v["id"].clone(); let name = v["name"].as_str().unwrap_or("").to_owned(); let args = v["args"].clone(); - let h = harness.clone(); - // Serialized commands preserve typing order and prevent racing start/open/close. - let result = tokio::task::spawn_blocking(move || h.invoke(&name,args)).await; - let response = match result { Ok(Ok(result))=>json!({"id":id,"result":result}), Ok(Err(e))=>json!({"id":id,"error":e}), Err(e)=>json!({"id":id,"error":e.to_string()}) }; - if writer.send(Message::Text(response.to_string().into())).await.is_err() { break; } - } - } - } - let _ = tokio::task::spawn_blocking(move || { harness.shutdown(); drop(harness); }).await; - server.connected.store(false,Ordering::SeqCst); -} -#[tokio::main] -async fn main() -> Result<(),Box> { - let dir = std::env::args().nth(1).map(PathBuf::from).ok_or("usage: conn-browser-harness TEST_DIRECTORY")?; - let (port, origin) = test_endpoint( - &std::env::var("CONN_TEST_PORT").unwrap_or_else(|_| "1423".into()), - &std::env::var("CONN_TEST_ORIGIN").unwrap_or_else(|_| "http://127.0.0.1:1421".into()), - )?; - std::fs::create_dir_all(&dir)?; - #[cfg(unix)] { use std::os::unix::fs::PermissionsExt; std::fs::set_permissions(&dir,std::fs::Permissions::from_mode(0o700))?; } - if !dir.join("profiles.json").exists() { - let workspace = dir.join("workspace"); std::fs::create_dir_all(&workspace)?; - let mut p=Profile::local("test-native-shell".into(), conn_core::engine::default_shell()); - p.name="Native shell · browser test".into();p.cwd=Some(workspace.to_string_lossy().into()); - std::fs::write(dir.join("profiles.json"),serde_json::to_vec_pretty(&conn_core::profiles::Profiles {version:1,revision:0,default_profile:p.id.clone(),profiles:vec![p]})?)?; - } - PolicyStore::open(&dir.join("policy.yaml"))?; - // A missing policy must never silently fall back to a simulated or permissive web policy. - conn_core::policy::Policy::load(&dir.join("policy.yaml"))?; - let listener = tokio::net::TcpListener::bind((std::net::Ipv4Addr::LOCALHOST, port)).await?; - let token = uuid::Uuid::new_v4().to_string(); - std::fs::write(dir.join("connection.json"),serde_json::to_vec(&json!({"url":format!("ws://127.0.0.1:{port}/ws"),"token":token}))?)?; - let server=Server{token,origin,dir:dir.clone(),connected:Arc::new(AtomicBool::new(false))}; - println!("Conn shared harness: 127.0.0.1:{port}; isolated state: {}",dir.display()); - axum::serve(listener,Router::new().route("/ws",get(upgrade)).with_state(server)).await?; - Ok(()) -} - -#[cfg(test)] -mod tests { - use super::test_endpoint; - - #[test] - fn accepts_default_and_isolated_loopback_ports() { - assert_eq!(test_endpoint("1423", "http://127.0.0.1:1421").unwrap().0, 1423); - assert_eq!(test_endpoint("1433", "http://127.0.0.1:1431").unwrap(), (1433, "http://127.0.0.1:1431".into())); - } - - #[test] - fn rejects_public_origins_paths_and_invalid_ports() { - for origin in ["http://example.com:1431", "http://0.0.0.0:1431", "https://127.0.0.1:1431", "http://127.0.0.1:1431/path", "http://127.0.0.1:0", "http://127.0.0.1:65536"] { - assert!(test_endpoint("1433", origin).is_err(), "{origin}"); - } - for port in ["0", "65536", "invalid"] { - assert!(test_endpoint(port, "http://127.0.0.1:1431").is_err(), "{port}"); - } - } -} diff --git a/crates/core/src/approval.rs b/crates/core/src/approval.rs index 73b2667..5186b71 100644 --- a/crates/core/src/approval.rs +++ b/crates/core/src/approval.rs @@ -23,6 +23,24 @@ pub enum Decision { AllowSession, } +/// Stable choices and context captured with the command, never inferred from a +/// later status poll. The owner still revalidates authority when deciding. +#[derive(Debug, Clone, PartialEq, Eq, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct ReviewContext { + pub reason: ReviewReason, + pub allow_session: bool, + pub remote: bool, + #[serde(skip)] + pub(crate) profile_revision: u64, + #[serde(skip)] + pub(crate) foreground: Option, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)] +#[serde(rename_all = "snake_case")] +pub enum ReviewReason { CommandPolicy, UnverifiedShell } + #[derive(Debug, Clone, Serialize)] pub struct ApprovalRequest { pub id: String, @@ -32,6 +50,7 @@ pub struct ApprovalRequest { pub conn: ConnId, pub cmd: String, pub label: String, + pub review: ReviewContext, #[serde(rename = "requestedAt")] pub requested_at: String, #[serde(skip)] @@ -59,7 +78,7 @@ impl ApprovalQueue { } #[allow(clippy::too_many_arguments)] - pub fn create_with(&mut self, agent_id: &str, conn: ConnId, cmd: &str, label: &str, now: Instant, intent: Option, analysis: Option) -> &ApprovalRequest { + pub fn create_with(&mut self, agent_id: &str, conn: ConnId, cmd: &str, label: &str, now: Instant, intent: Option, analysis: Option, review: ReviewContext) -> &ApprovalRequest { self.seq += 1; self.items.push(ApprovalRequest { id: format!("apr-{}", self.seq), @@ -67,6 +86,7 @@ impl ApprovalQueue { conn, cmd: cmd.to_string(), label: label.to_string(), + review, requested_at: chrono::Local::now().format("%H:%M:%S").to_string(), created: now, state: ApprovalState::Pending, diff --git a/crates/core/src/engine.rs b/crates/core/src/engine.rs index f03656c..ee12793 100644 --- a/crates/core/src/engine.rs +++ b/crates/core/src/engine.rs @@ -194,21 +194,50 @@ impl Engine { let exited = Arc::new(AtomicBool::new(false)); - // PTY → session - let pty_done = Arc::new(AtomicBool::new(false)); + // Drain the PTY independently of the session lock. A long input write + // holds that lock while readline echoes input; on macOS both PTY + // directions can fill, deadlocking write_all against the output reader. + // One FIFO consumer applies every chunk in order. Do not bound this + // channel with a blocking send: that would recreate the same cycle. + enum Output { Bytes(Vec), Fence(mpsc::Sender<()>) } + let pty_read_done = Arc::new(AtomicBool::new(false)); + let (output_tx, output_rx) = mpsc::channel::(); + let exit_output = output_tx.clone(); { let session = session.clone(); - let pty_done = pty_done.clone(); + std::thread::Builder::new().name("ss-pty-output".into()).spawn(move || { + while let Ok(message) = output_rx.recv() { + let mut bytes = match message { + Output::Bytes(bytes) => bytes, + Output::Fence(done) => { let _ = done.send(()); continue; } + }; + let mut fence = None; + // Readline often echoes a byte at a time. Coalesce only + // already queued bytes, with no delay and a bounded batch. + while bytes.len() < 16384 { + match output_rx.try_recv() { + Ok(Output::Bytes(next)) => bytes.extend_from_slice(&next), + Ok(Output::Fence(done)) => { fence = Some(done); break; } + Err(_) => break, + } + } + session.lock().pty_output(&bytes); + if let Some(done) = fence { let _ = done.send(()); } + } + })?; + } + { + let pty_read_done = pty_read_done.clone(); std::thread::Builder::new().name("ss-pty-read".into()).spawn(move || { let mut buf = [0u8; 16384]; loop { match pty_reader.read(&mut buf) { Err(e) if e.kind() == std::io::ErrorKind::WouldBlock => std::thread::sleep(Duration::from_millis(1)), Ok(0) | Err(_) => break, - Ok(n) => session.lock().pty_output(&buf[..n]), + Ok(n) => if output_tx.send(Output::Bytes(buf[..n].to_vec())).is_err() { break; }, } } - pty_done.store(true, Ordering::SeqCst); + pty_read_done.store(true, Ordering::SeqCst); })?; } @@ -236,9 +265,14 @@ impl Engine { std::thread::Builder::new().name("ss-child-wait".into()).spawn(move || { let code = child.wait().ok().map(|s| s.exit_code()); let deadline = Instant::now() + Duration::from_millis(300); - while !pty_done.load(Ordering::SeqCst) && Instant::now() < deadline { + while !pty_read_done.load(Ordering::SeqCst) && Instant::now() < deadline { std::thread::sleep(Duration::from_millis(10)); } + // A slow consumer may have much more than 300ms of output + // already queued. Fence that output before publishing exit. The + // read deadline only bounds descendants holding the slave open. + let (done, applied) = mpsc::channel(); + if exit_output.send(Output::Fence(done)).is_ok() { let _ = applied.recv(); } #[cfg(unix)] { let mut integration = integration.lock(); if let Some(hook) = integration.as_mut() { hook.drain(&mut session.lock(), pid); } diff --git a/crates/core/src/human_input.rs b/crates/core/src/human_input.rs new file mode 100644 index 0000000..4cea81f --- /dev/null +++ b/crates/core/src/human_input.rs @@ -0,0 +1,63 @@ +//! Content-free bookkeeping for human input. Never retain the bytes, a command, +//! passwords, or an editor buffer. Empty-line recovery uses only an echoed return +//! to the previously visible empty input boundary. +use crate::screen::ScreenModel; + +#[derive(Default)] +pub(crate) struct HumanInput { + pub pending: bool, + boundary: Option<(u16, u64)>, + reconcile: bool, + observed: bool, +} +impl HumanInput { + pub fn remember_empty(&mut self, screen: &ScreenModel) { + self.boundary = screen.input_boundary(); self.observed = false; + } + pub fn reset(&mut self) { *self = Self::default(); } + + pub fn note(&mut self, bytes: &[u8], screen: &ScreenModel, agent_pending: bool) { + if bytes.is_empty() { return; } + if matches!(bytes.last(), Some(b'\r' | b'\n' | 3)) { + self.reset(); + return; + } + // Navigation/redraw/erase cannot add text to a known empty line. Do not + // turn an empty Left or Ctrl-L into input_pending. Unknown sequences, + // history, completion, paste and printable input remain conservative. + let edit_only = only_empty_preserving_edits(bytes); + if !self.pending && !agent_pending && edit_only { return; } + if !self.pending { + if !agent_pending { self.remember_empty(screen); } + } + self.observed |= self.boundary.is_some() && screen.input_boundary().is_some() && self.boundary != screen.input_boundary(); + self.pending = true; + self.reconcile = edit_only; + } + + pub fn watch_column(&self) -> Option { + if self.pending && !self.observed { self.boundary.map(|b| b.0) } else { None } + } + + pub fn output(&mut self, screen: &ScreenModel, moved: bool) { + let boundary = screen.input_boundary(); + self.observed |= moved || (self.pending && self.boundary.is_some() && boundary.is_some() && self.boundary != boundary); + if self.pending && self.reconcile && self.observed && self.boundary.is_some() + && self.boundary == boundary { + self.reset(); + } + } +} + +fn only_empty_preserving_edits(mut bytes: &[u8]) -> bool { + while !bytes.is_empty() { + // Readline cursor motion and deletion. Ctrl-U is an edit, NOT proof of + // an empty line: with the cursor at Home it leaves the suffix intact. + if matches!(bytes[0], 1 | 2 | 5 | 6 | 8 | 11 | 12 | 21 | 23 | 127) { + bytes = &bytes[1..]; + } else if let Some(seq) = [b"\x1b[D".as_slice(), b"\x1b[C", b"\x1b[H", b"\x1b[F", b"\x1bOH", b"\x1bOF", b"\x1b[1~", b"\x1b[4~", b"\x1b[3~"].iter().find(|s| bytes.starts_with(s)) { + bytes = &bytes[seq.len()..]; + } else { return false; } + } + true +} diff --git a/crates/core/src/lib.rs b/crates/core/src/lib.rs index 2cb6dd5..43a52e0 100644 --- a/crates/core/src/lib.rs +++ b/crates/core/src/lib.rs @@ -39,3 +39,5 @@ pub mod shell_integration; pub use config::Pacing; pub use engine::{Engine, EngineConfig, LaunchSpec}; pub use session::{ServerEvent, Session, SessionConfig, SharedSession}; + +mod human_input; diff --git a/crates/core/src/policy.rs b/crates/core/src/policy.rs index 8bead3e..6c3eca2 100644 --- a/crates/core/src/policy.rs +++ b/crates/core/src/policy.rs @@ -509,8 +509,14 @@ impl PolicyStore { } } } - if !matches!(decision, Decision::Deny {..}) { decision=worst.clone(); } - if matches!(decision, Decision::Deny {..}) { worst=decision.clone(); } + // Keep the command's risk label. Environment uncertainty is a + // separate request reason, not a replacement for "delete files". + match &decision { + Decision::Deny { .. } => worst = decision.clone(), + Decision::Confirm { .. } if !matches!(worst, Decision::Deny { .. }) => worst = decision.clone(), + Decision::Allow => decision = Decision::Confirm { label: "Review command in this shell/remote environment".into() }, + _ => {} + } verdicts.push(SegmentVerdict {text:segment.text.clone(),command:segment.command.clone(),opaque:Some("Target syntax or filesystem requires human review".into()),decision,targets:vec![]}); } let isolation_violation = self.policy.isolate_dangerous && segments.len()>1; diff --git a/crates/core/src/screen.rs b/crates/core/src/screen.rs index 0a4f966..6850fb6 100644 --- a/crates/core/src/screen.rs +++ b/crates/core/src/screen.rs @@ -72,22 +72,35 @@ impl ScreenModel { /// Feed raw PTY output. Returns true if the visible screen changed. pub fn process(&mut self, bytes: &[u8]) -> bool { - if bytes.is_empty() { - return false; - } + self.process_observing(bytes, None).0 + } + + /// Observe the first visible cursor departure even when typing and erasing + /// are echoed in one read. Do not retain text or parse every byte thereafter. + pub(crate) fn process_observing(&mut self, bytes: &[u8], empty_col: Option) -> (bool, bool) { + if bytes.is_empty() { return (false, false); } let cursor = self.parser.screen().cursor_position(); let hidden = self.parser.screen().hide_cursor(); let alternate = self.parser.screen().alternate_screen(); - self.parser.process(bytes); + let mut moved = false; + if let Some(col) = empty_col { + for (i, byte) in bytes.iter().enumerate() { + self.parser.process(std::slice::from_ref(byte)); + if self.parser.screen().cursor_position().1 != col && !self.parser.screen().hide_cursor() + && !self.alternate_screen() && !self.cursor_line_hidden() { + moved = true; + self.parser.process(&bytes[i + 1..]); + break; + } + } + } else { self.parser.process(bytes); } let contents = self.rows().join("\n"); if contents != self.last_contents || cursor != self.parser.screen().cursor_position() || hidden != self.parser.screen().hide_cursor() || alternate != self.parser.screen().alternate_screen() { self.last_contents = contents; self.revision += 1; - true - } else { - false - } + (true, moved) + } else { (false, moved) } } pub fn resize(&mut self, rows: u16, cols: u16) { @@ -96,6 +109,11 @@ impl ScreenModel { self.revision += 1; } + /// Owner-only modeled rendering state; never use this for agent observation. + pub(crate) fn renderer_checkpoint(&self) -> Result, &'static str> { + self.parser.renderer_state_formatted() + } + pub fn revision(&self) -> u64 { self.revision } @@ -148,6 +166,32 @@ impl ScreenModel { }).collect() } + /// Fingerprint of the visible prompt row and following rows. Only used to + /// recognize an echoed return to an already empty input boundary. No input + /// content is retained. Conceal and alternate-screen state cannot certify it. + pub(crate) fn input_boundary(&self) -> Option<(u16, u64)> { + use std::hash::{Hash, Hasher}; + let screen = self.parser.screen(); + if screen.alternate_screen() || screen.hide_cursor() { return None; } + let (row, col) = screen.cursor_position(); + let (rows, cols) = screen.size(); + let mut hash = std::collections::hash_map::DefaultHasher::new(); + cols.hash(&mut hash); + // Ignore blank trailing rows, so Ctrl-L can redraw the same prompt at + // the top. Retain cells/spaces and row boundaries inside the footprint. + let end = (row..rows).rev().find(|r| (0..cols).any(|c| screen.cell(*r, c).is_some_and(|v| !v.contents().trim_end().is_empty()))).unwrap_or(row); + (end - row).hash(&mut hash); + for r in row..=end { + for c in 0..cols { + let cell = screen.cell(r, c)?; + if Self::hidden(cell) && cell.has_contents() { return None; } + cell.contents().trim_end().hash(&mut hash); + cell.is_wide_continuation().hash(&mut hash); + } + } + Some((col, hash.finish())) + } + /// The text of the row the cursor is on, right-trimmed. Policy input only: /// unlike `rows()` it keeps hidden text, so it must never reach an agent. pub fn cursor_line(&self) -> String { diff --git a/crates/core/src/session.rs b/crates/core/src/session.rs index ce7ab29..9b6c292 100644 --- a/crates/core/src/session.rs +++ b/crates/core/src/session.rs @@ -22,7 +22,7 @@ use serde::Serialize; use serde_json::json; use crate::affordance::{affordances_for, Actor, Affordance, AffordanceState}; -use crate::approval::{ApprovalQueue, ApprovalRequest, ApprovalState, Decision as ApprovalDecision}; +use crate::approval::{ApprovalQueue, ApprovalRequest, ApprovalState, ReviewContext, ReviewReason, Decision as ApprovalDecision}; use crate::audit::Audit; use crate::authority::{Authority, AuthorityError, ConnId, Controller, Lease, RevokeReason}; use crate::config::Pacing; @@ -191,7 +191,7 @@ pub enum SessionError { Authority(#[from] AuthorityError), #[error("the shell process has exited")] ProcessExited, - #[error("shell input is pending; clear or cancel it before changing mode")] + #[error("shell input is pending; ask the human to finish or explicitly cancel their input before continuing")] InputPending, #[error("invalid input: {0}")] InvalidInput(String), @@ -404,6 +404,10 @@ pub struct OutputFrame { pub generation: u64, pub size: crate::screen::Size, } +/// Owner-only checkpoint captured under the same Session lock as output frames. +/// Contains modeled terminal output, never human input or an agent projection. +pub type RendererCheckpoint = OutputFrame; + pub type OutputFrameSink = Box; pub struct SessionConfig { @@ -431,6 +435,7 @@ pub struct Session { surface_id: String, external_writer_active: bool, execution_profile: Option, + profile_revision: u64, ssh_transport: bool, ssh_foreground_sequence: Option, authority: Authority, @@ -438,12 +443,14 @@ pub struct Session { approvals: ApprovalQueue, screen: ScreenModel, input: InputTracker, - human_input_pending: bool, + human_input: crate::human_input::HumanInput, shell_integration: crate::shell_integration::IntegrationStatus, shell_command: Option, // Content-free state closes the input-to-async-shell-hook interval. shell_prompt_confirmed: bool, shell_submission_inflight: bool, + /// Only an idle cancel/empty submission may recover without a command end. + shell_idle_recovery: bool, shell_foreground_sequence: Option, shell_recording_ready: bool, shell_recording_armed: bool, @@ -534,11 +541,12 @@ impl Session { approvals: ApprovalQueue::new(Duration::from_secs(cfg.pacing.approval_ttl_secs)), screen: ScreenModel::new(cfg.rows, cfg.cols), input: InputTracker::new(), - human_input_pending: false, + human_input: Default::default(), shell_integration: crate::shell_integration::IntegrationStatus::unavailable(if external_private { "private_session" } else { "unsupported_shell" }), shell_command: None, shell_prompt_confirmed: false, shell_submission_inflight: false, + shell_idle_recovery: false, shell_foreground_sequence: None, shell_recording_ready: false, shell_recording_armed: false, @@ -567,6 +575,7 @@ impl Session { last_agent: None, last_agent_cmd: None, execution_profile: None, + profile_revision: 0, shell_pid: cfg.shell_pid, cwd_override: None, attended: true, @@ -585,6 +594,11 @@ impl Session { /// Native owner installs a log at the moment sharing is enabled, never at external startup. pub fn activate_shared_audit(&mut self, audit: Audit) { audit.set_enabled(self.participation.shared); self.audit = audit; } + pub fn renderer_checkpoint(&self) -> Result { + Ok(RendererCheckpoint { data: self.screen.renderer_checkpoint().map_err(str::to_owned)?, size: self.screen.size(), + output_seq: self.output_seq, generation: self.surface_generation }) + } + pub fn set_output_frame_sink(&mut self, sink: Option) { self.output_frame_sink = sink; } pub fn participant_allowed(&self, conn: ConnId) -> bool { self.participation.allows(conn) @@ -603,10 +617,42 @@ impl Session { self.execution_profile.as_ref().is_some_and(|profile| { profile.shell == crate::backend::ShellKind::Posix && (profile.backend == crate::backend::BackendKind::Ssh || self.ssh_transport - || (self.shell_integration.state == "active" && self.ssh_foreground_sequence.is_some())) + || (self.shell_integration.state == "active" && self.foreground_ssh().unwrap_or(self.ssh_foreground_sequence.is_some()))) }) } + fn foreground_id(&self) -> Option { + #[cfg(unix)] + { return self.master.as_ref()?.process_group_leader().filter(|pid| *pid > 0); } + #[cfg(not(unix))] + None + } + + /// The actual foreground process is stronger evidence than the complete + /// shell history entry (which may contain `printf ...; ssh ...`). Inspect + /// only executable identity, never argv, environment or authentication data. + fn foreground_ssh(&self) -> Option { + #[cfg(unix)] + { + let pid = self.foreground_id()?; + #[cfg(target_os = "linux")] + return std::fs::read_link(format!("/proc/{pid}/exe")).ok() + .map(|path| path.file_name().is_some_and(|name| name == "ssh")); + #[cfg(target_os = "macos")] + { + let mut path = [0u8; libc::PROC_PIDPATHINFO_MAXSIZE as usize]; + // SAFETY: owned writable buffer, valid size, no pointers retained. + let len = unsafe { libc::proc_pidpath(pid, path.as_mut_ptr().cast(), path.len() as u32) }; + if len <= 0 { return None; } + let end = path.iter().position(|b| *b == 0).unwrap_or(path.len()); + let path = std::str::from_utf8(&path[..end]).ok()?; + return Some(std::path::Path::new(path).file_name().is_some_and(|name| name == "ssh")); + } + } + #[allow(unreachable_code)] + None + } + pub(crate) fn set_ssh_transport(&mut self, ssh: bool) { self.ssh_transport = ssh; } pub fn completion_prompt_ready(&self) -> bool { @@ -672,7 +718,14 @@ impl Session { self.shell_integration.reason = None; self.shell_recording_ready = self.participation.shared && self.shell_prompt_confirmed; } + "prompt" if self.shell_integration.state == "active" && self.shell_idle_recovery && self.shell_foreground_sequence.is_none() && self.ssh_foreground_sequence.is_none() => { + self.shell_submission_inflight = false; + self.shell_idle_recovery = false; + self.shell_prompt_confirmed = true; + self.shell_recording_ready = self.participation.shared && self.shell_integration.state == "active"; + } "start" => { + self.shell_idle_recovery = false; self.shell_foreground_sequence = Some(sequence); // Retain only transport identity, including during a private login. // A word containing "ssh" (or a compound script) is not an SSH launch. @@ -686,6 +739,7 @@ impl Session { self.shell_foreground_sequence = None; self.ssh_foreground_sequence = None; self.shell_submission_inflight = false; + self.shell_idle_recovery = false; self.shell_prompt_confirmed = true; self.shell_recording_ready = self.participation.shared && self.shell_integration.state == "active"; self.shell_recording_armed = false; @@ -745,7 +799,7 @@ impl Session { pub fn write_external(&mut self, bytes: &[u8]) -> Result<(), SessionError> { if !self.external_writer_active() { return Err(SessionError::NotAvailable("session unavailable".into())); } self.write_terminal_response(bytes)?; - if !bytes.is_empty() { self.human_input_pending = !matches!(bytes.last(), Some(b'\r' | b'\n' | 3 | 21)); } + if !bytes.is_empty() { self.human_input.note(bytes, &self.screen, self.input.has_pending()); } Ok(()) } @@ -801,7 +855,7 @@ impl Session { /// The shell's current directory, read from the process (`lsof -d cwd`) so /// `cd` history does not have to be tracked. None when unknown. - pub fn set_execution_profile(&mut self, profile: crate::backend::Profile) { self.execution_profile = Some(profile); } + pub fn set_execution_profile(&mut self, profile: crate::backend::Profile) { self.profile_revision = self.profile_revision.wrapping_add(1); self.execution_profile = Some(profile); } pub fn shell_cwd(&self) -> Option { if self.execution_profile.as_ref().is_some_and(|p|p.backend != crate::backend::BackendKind::Local) { return None; } @@ -842,6 +896,14 @@ impl Session { fn write_pty(&mut self, bytes: &[u8]) { if bytes.iter().any(|byte| matches!(byte, b'\r' | b'\n' | 3 | 4)) { + // A late prompt event must not certify a command that has just been + // submitted. Only cancellation/empty Enter at a confirmed idle + // prompt can finish without a shell-authored command lifecycle. + let idle_input = bytes == b"\x03" || (bytes.iter().all(|byte| matches!(byte, b'\r' | b'\n')) + && !self.human_input.pending && !self.input.has_pending()); + self.shell_idle_recovery = idle_input && self.shell_foreground_sequence.is_none() + && self.ssh_foreground_sequence.is_none() + && (self.shell_idle_recovery || (self.shell_prompt_confirmed && !self.shell_submission_inflight)); self.shell_prompt_confirmed = false; self.shell_submission_inflight = true; } @@ -960,7 +1022,7 @@ impl Session { if self.is_private() { if !bytes.is_empty() { self.revoke_external(); - self.human_input_pending = !matches!(bytes.last(), Some(b'\r' | b'\n' | 3 | 21)); + self.human_input.note(bytes, &self.screen, self.input.has_pending()); } if self.process_alive { self.write_pty(bytes); } return; @@ -999,8 +1061,8 @@ impl Session { // Human bytes may be a password, an editor buffer, or a shell command. // Retain only whether a line may be unfinished, never its contents. if !bytes.is_empty() { + self.human_input.note(bytes, &self.screen, self.input.has_pending()); self.input.reset(); - self.human_input_pending = !matches!(bytes.last(), Some(b'\r' | b'\n' | 3 | 21)); } } @@ -1021,9 +1083,9 @@ impl Session { pub fn pty_output(&mut self, bytes: &[u8]) { if bytes.is_empty() { return; } self.output_seq = self.output_seq.saturating_add(1); - if self.screen.process(bytes) { - self.screen_dirty = true; - } + let (changed, moved) = self.screen.process_observing(bytes, self.human_input.watch_column()); + if changed { self.screen_dirty = true; } + self.human_input.output(&self.screen, moved); self.write_output(bytes); } @@ -1389,7 +1451,7 @@ impl Session { if self.mode == mode { return Ok(()); } // A mode switch must not leave physical shell input behind a ghost proposal. // Refuse rather than assume Ctrl-U has the same meaning in every shell/TUI. - if self.human_input_pending || self.input.has_pending() { return Err(SessionError::InputPending); } + if self.human_input.pending || self.input.has_pending() { return Err(SessionError::InputPending); } self.mode = mode; match mode { AgentMode::Observe => { @@ -1500,7 +1562,7 @@ impl Session { } // Attention changes can impose a Co-pilot cap without an explicit mode // switch. Never append a proposal to pre-existing physical shell input. - if self.human_input_pending || self.input.has_pending() { return Err(SessionError::InputPending); } + if self.human_input.pending || self.input.has_pending() { return Err(SessionError::InputPending); } let cmd = p.text.trim().to_string(); let col = self.screen.cursor().col; self.input.feed(p.text.as_bytes(), col); @@ -1624,7 +1686,7 @@ impl Session { return Err(SessionError::InvalidInput("text must not contain control characters".into())); } self.check_writer(conn, Affordance::Type)?; - if self.human_input_pending { return Err(SessionError::InputPending); } + if self.human_input.pending { return Err(SessionError::InputPending); } if self.effective_mode() == AgentMode::Copilot { self.proposal_mut(conn).text.push_str(text); self.last_agent_write = Some(Instant::now()); @@ -1633,6 +1695,7 @@ impl Session { } self.shell_recording_armed |= self.shell_recording_ready && self.shell_prompt_confirmed; let col = self.screen.cursor().col; + if !self.input.has_pending() { self.human_input.remember_empty(&self.screen); } self.input.feed(text.as_bytes(), col); self.write_pty(text.as_bytes()); self.note_agent_write(conn, text.len()); @@ -1651,7 +1714,7 @@ impl Session { return self.agent_interrupt(conn).map(|_| KeyResult::Sent); } self.check_writer(conn, Affordance::SendKey)?; - if self.human_input_pending { return Err(SessionError::InputPending); } + if self.human_input.pending { return Err(SessionError::InputPending); } if self.effective_mode() == AgentMode::Observe { return Err(SessionError::WrongMode(AgentMode::Observe)); } @@ -1747,7 +1810,14 @@ impl Session { } PolicyDecision::Confirm { label } => { self.last_agent_cmd = Some(cmd.clone()); - let req = self.approvals.create_with(&agent_id, conn, &cmd, &label, Instant::now(), intent.clone(), Some(analysis)).clone(); + let review = ReviewContext { + reason: if self.review_required() { ReviewReason::UnverifiedShell } else { ReviewReason::CommandPolicy }, + allow_session: !self.review_required(), + remote: self.remote_policy(), + profile_revision: self.profile_revision, + foreground: self.foreground_id(), + }; + let req = self.approvals.create_with(&agent_id, conn, &cmd, &label, Instant::now(), intent.clone(), Some(analysis), review).clone(); self.audit.record( &agent_id, "approval_requested", @@ -1836,7 +1906,7 @@ impl Session { self.reject_proposal_if(|p| p.conn == conn, "interrupted"); self.write_pty(b"\x03"); self.input.reset(); - self.human_input_pending = false; + self.human_input.reset(); let name = self.agent_name(conn); self.audit.record(&name, "interrupt", json!({})); self.note_agent_write(conn, 1); @@ -1868,14 +1938,24 @@ impl Session { /// Human decision on a pending approval. `by` is recorded in the audit log /// (e.g. "cli", "frontend"). pub fn resolve_approval(&mut self, id: &str, decision: ApprovalDecision, by: &str) -> Result { - if self.approvals.get(id).is_none() { - return Err(SessionError::NotFound(id.to_string())); - } - if decision == ApprovalDecision::AllowSession && self.review_required() { - return Err(SessionError::InvalidInput("this shell or remote environment requires review for every command; allow_session is unavailable".into())); + let request = self.approvals.get(id).ok_or_else(|| SessionError::NotFound(id.to_string()))?; + if decision == ApprovalDecision::AllowSession && (!request.review.allow_session || self.review_required() + || request.review.remote != self.remote_policy()) { + return Err(SessionError::InvalidInput("review_scope_unavailable: this request cannot allow a command category for the session".into())); } if decision != ApprovalDecision::Deny { self.require_shared()?; + if request.review.remote != self.remote_policy() + || request.review.profile_revision != self.profile_revision + || request.review.foreground != self.foreground_id() + || (request.review.reason == ReviewReason::CommandPolicy && self.review_required()) { + return Err(SessionError::InvalidInput("review_context_changed: dismiss this request and submit the command again".into())); + } + match self.analyse(&request.cmd).decision { + PolicyDecision::Deny { .. } => return Err(SessionError::InvalidInput("review_context_changed: current policy denies this command".into())), + PolicyDecision::Confirm { ref label } if label != &request.label => return Err(SessionError::InvalidInput("review_context_changed: the command needs a new review".into())), + _ => {} + } } let state = match decision { ApprovalDecision::Grant | ApprovalDecision::AllowSession => ApprovalState::Granted, @@ -2004,7 +2084,7 @@ impl Session { output_seq: self.output_seq, surface_available: self.participation.shared, completion_prompt_ready: self.completion_prompt_ready(), - input_pending: self.human_input_pending || self.input.has_pending(), + input_pending: self.human_input.pending || self.input.has_pending(), external_input_available: self.external_writer_active(), profile_id: self.execution_profile.as_ref().map(|p|p.id.clone()), profile_name: self.execution_profile.as_ref().map(|p|p.name.clone()), @@ -2125,4 +2205,33 @@ mod ssh_policy_tests { s.set_ssh_transport(true); assert!(s.review_required()); } + + #[test] + fn delayed_prompt_cannot_certify_a_new_submission_or_foreground() { + let mut s = session(); + s.human_input(b"\r"); + s.human_input(b"sleep 10\r"); + s.shell_event(2, "prompt", "", "", ""); + assert!(s.review_required(), "old empty-enter prompt does not certify a new command"); + s.shell_event(3, "start", "sleep 10", "", ""); + s.human_input(b"\x03"); + s.shell_event(4, "prompt", "", "", ""); + assert!(s.review_required(), "foreground cancellation still needs its matching end"); + s.shell_event(5, "end", "99", "", "130"); + assert!(s.review_required()); + s.shell_event(6, "end", "3", "", "130"); + assert!(!s.review_required()); + } + + #[test] + fn idle_prompt_recovery_does_not_end_remote_ssh() { + let mut s = session(); + s.shell_event(2, "start", "ssh host", "", ""); + s.human_input(b"\x03"); + s.shell_event(3, "prompt", "", "", ""); + assert!(s.remote_policy()); + s.shell_event(4, "end", "2", "", "0"); + assert!(!s.remote_policy()); + } + } diff --git a/crates/core/src/session/participation.rs b/crates/core/src/session/participation.rs index a71fbc6..3e43c4a 100644 --- a/crates/core/src/session/participation.rs +++ b/crates/core/src/session/participation.rs @@ -51,7 +51,7 @@ impl Session { { return Ok(()); } - if shared && (self.input.has_pending() || self.human_input_pending) { + if shared && (self.input.has_pending() || self.human_input.pending) { return Err(SessionError::InputPending); } Ok(()) @@ -86,7 +86,7 @@ impl Session { let unfinished_agent_input = self.input.has_pending(); self.revoke_external(); self.cancel_agent_work("sharing_changed"); - self.human_input_pending |= unfinished_agent_input && self.input.has_pending(); + self.human_input.pending |= unfinished_agent_input && self.input.has_pending(); if !shared { self.audit.record( "human", diff --git a/crates/core/src/shell_integration.rs b/crates/core/src/shell_integration.rs index 7b4e6f2..72ea3ab 100644 --- a/crates/core/src/shell_integration.rs +++ b/crates/core/src/shell_integration.rs @@ -205,7 +205,7 @@ fn parse(data: &[u8], pid: Option, sequence: u64) -> Option<(&str, &str, &s { return None; } - if !matches!(fields[3], "ready" | "start" | "end" | "gap" | "unavailable") { + if !matches!(fields[3], "ready" | "prompt" | "start" | "end" | "gap" | "unavailable") { return None; } Some((fields[3], fields[4], fields[5], fields[6])) diff --git a/crates/core/src/shell_integration/bash.sh b/crates/core/src/shell_integration/bash.sh index 5e09b72..667be3a 100644 --- a/crates/core/src/shell_integration/bash.sh +++ b/crates/core/src/shell_integration/bash.sh @@ -39,18 +39,20 @@ __conn_precmd() { __conn_active=0 __conn_history __conn_hist=$__conn_number + __conn_emit prompt '' '' return "$result" } __conn_arm() { __conn_at_prompt=1; } __conn_debug() { [[ $__conn_at_prompt == 1 && $BASH_COMMAND != __conn_precmd* ]] || return 0 # Never infer a command from BASH_COMMAND, screen contents, or typed bytes. - # If history did not retain a fresh complete entry, skip it. + # If history did not retain a fresh complete entry, leave its text empty. __conn_history - if (( __conn_number > __conn_hist )) && [[ -n $__conn_command ]]; then - __conn_at_prompt=0 - __conn_emit start "$__conn_command" '' && __conn_active=$__conn_seq - fi + # Lifecycle does not depend on history retention. A hidden/ignored history + # entry has no command text, but still brackets the foreground program. + __conn_at_prompt=0 + if ! (( __conn_number > __conn_hist )); then __conn_command=''; fi + __conn_emit start "$__conn_command" '' && __conn_active=$__conn_seq return 0 } __conn_history diff --git a/crates/core/src/shell_integration/zsh.sh b/crates/core/src/shell_integration/zsh.sh index bf2f867..c5b02fb 100644 --- a/crates/core/src/shell_integration/zsh.sh +++ b/crates/core/src/shell_integration/zsh.sh @@ -11,6 +11,7 @@ __conn_precmd() { local result=$? if (( __conn_active )); then __conn_emit end "$__conn_active" "$result"; fi __conn_active=0 + __conn_emit prompt '' '' return 0 } preexec_functions=(__conn_preexec ${preexec_functions:#__conn_preexec}) diff --git a/crates/core/tests/control_regressions.rs b/crates/core/tests/control_regressions.rs index 69ca254..9f50cab 100644 --- a/crates/core/tests/control_regressions.rs +++ b/crates/core/tests/control_regressions.rs @@ -36,7 +36,8 @@ fn cancelled_grace_retains_tracking_and_cannot_hide_pending_input() { let KeyResult::Scheduled { exec_id, .. } = h.session.agent_send_key(1, "ENTER").unwrap() else { panic!() }; h.session.cancel_exec(&exec_id).unwrap(); assert!(matches!(h.session.set_mode(AgentMode::Copilot), Err(SessionError::InputPending))); - h.session.human_input(b"\x15"); + // Explicit cancel; a Ctrl-U keystroke alone cannot prove line erasure. + h.session.human_input(b"\x03"); h.session.set_mode(AgentMode::Copilot).unwrap(); } @@ -257,3 +258,38 @@ fn human_input_denies_a_pending_approval_instead_of_editing_its_command() { assert!(h.session.resolve_approval(&approval_id, Decision::Grant, "human").is_err()); assert_eq!(h.pty_str(), "sudo ls\x15x", "nothing is submitted by a late approval"); } + +#[test] +fn review_choices_are_part_of_the_request_and_revalidated_at_decision() { + let mut h = Harness::new(); h.agent(1, "agent"); + h.session.agent_request_control(1).unwrap(); + h.session.agent_type(1, "rm synthetic.txt").unwrap(); + let KeyResult::Pending { approval_id, .. } = h.session.agent_send_key(1, "ENTER").unwrap() else { panic!() }; + let before = serde_json::to_value(&h.session.status().pending[0]).unwrap(); + assert_eq!(before["review"]["reason"], "command_policy"); + assert_eq!(before["review"]["allowSession"], true); + let mut profile = Profile::local("other".into(), "pwsh".into()); profile.shell = ShellKind::PowerShell; + h.session.set_execution_profile(profile); + let after = serde_json::to_value(&h.session.status().pending[0]).unwrap(); + assert_eq!(before, after, "a later status cannot change the choices on an existing request"); + assert!(h.session.resolve_approval(&approval_id, Decision::AllowSession, "test").is_err()); + assert!(h.session.resolve_approval(&approval_id, Decision::Grant, "test").is_err()); + assert_eq!(h.session.check_approval(&approval_id).unwrap().state, ApprovalState::Pending); + h.session.resolve_approval(&approval_id, Decision::Deny, "test").unwrap(); +} + +#[test] +fn uncertain_shell_preserves_delete_risk_and_disallows_broad_grant() { + let mut h = Harness::new(); h.agent(1, "agent"); + let mut profile = Profile::local("uncertain".into(), "bash".into()); profile.backend = BackendKind::Docker; + h.session.set_execution_profile(profile); + h.session.agent_request_control(1).unwrap(); + h.session.agent_type(1, "rm synthetic.txt").unwrap(); + let KeyResult::Pending { approval_id, label, .. } = h.session.agent_send_key(1, "ENTER").unwrap() else { panic!() }; + assert_eq!(label, "delete files"); + let before = serde_json::to_value(&h.session.status().pending[0]).unwrap(); + assert_eq!(before["review"]["reason"], "unverified_shell"); + assert_eq!(before["review"]["allowSession"], false); + h.session.set_execution_profile(Profile::local("local".into(), "bash".into())); + assert!(h.session.resolve_approval(&approval_id, Decision::AllowSession, "test").is_err(), "later context cannot widen a request's choices"); +} diff --git a/crates/core/tests/frontend.rs b/crates/core/tests/frontend.rs index 8cc56f9..8dd6adb 100644 --- a/crates/core/tests/frontend.rs +++ b/crates/core/tests/frontend.rs @@ -87,7 +87,9 @@ fn human_input_cancels_grace_window() { h.session.agent_request_control(1).unwrap(); h.session.agent_type(1, "echo hi").unwrap(); let KeyResult::Scheduled { exec_id, .. } = h.session.agent_send_key(1, "ENTER").unwrap() else { panic!() }; + h.session.pty_output(b"echo hi"); h.session.human_input(b"\x15"); + h.session.pty_output(b"\r\x1b[K"); let (state, reason) = h.session.exec_state(&exec_id).unwrap(); assert_eq!(state, ExecState::Cancelled); assert_eq!(reason.as_deref(), Some("human_input")); diff --git a/crates/core/tests/input_privacy.rs b/crates/core/tests/input_privacy.rs index 6c72097..789e580 100644 --- a/crates/core/tests/input_privacy.rs +++ b/crates/core/tests/input_privacy.rs @@ -87,3 +87,61 @@ fn real_hidden_password_input_in_an_ordinary_tab_is_not_audited() { assert!(!format!("{:?}",events.lock().unwrap()).contains("SYNTHETIC")); assert!(engine.session().lock().input_line().is_empty()); } + +#[test] +fn empty_cursor_motion_is_not_pending_and_erasure_requires_visible_evidence() { + let mut h = Harness::new(); + h.session.pty_output(b"prompt$ "); + for key in [b"\x1b[D".as_slice(), b"\x0c", b"\x7f", b"\x17"] { + h.session.human_input(key); + assert!(!h.session.status().input_pending); + } + h.session.human_input(b"abc"); + h.session.pty_output(b"abc"); + h.session.human_input(b"\x7f\x7f\x7f"); + assert!(h.session.status().input_pending, "keys alone never certify erasure"); + h.session.pty_output(b"\x08\x08\x08\x1b[K"); + assert!(!h.session.status().input_pending, "the shared grid returned to its empty boundary"); + assert!(h.session.input_line().is_empty()); +} + +#[test] +fn home_then_ctrl_u_keeps_suffix_blocked_and_redraw_does_not_clear_it() { + let mut h = Harness::new(); h.agent(1, "agent"); + h.session.pty_output(b"prompt$ "); + h.session.human_input(b"printf human"); h.session.pty_output(b"printf human"); + h.session.human_input(b"\x01\x15"); h.session.pty_output(b"\x1b[9G"); + assert!(h.session.status().input_pending); + h.session.human_input(b"\x0c"); h.session.pty_output(b"\x1b[2J\x1b[Hprompt$ printf human\x1b[9G"); + h.session.agent_request_control(1).unwrap(); + assert!(matches!(h.session.agent_type(1, "echo agent"), Err(SessionError::InputPending))); + assert!(matches!(h.session.agent_send_key(1, "ENTER"), Err(SessionError::InputPending))); + // Delete the suffix at Home; only its actual echo can reopen input. + h.session.human_input(b"\x0b"); h.session.pty_output(b"\x1b[K"); + assert!(!h.session.status().input_pending); + assert!(!format!("{:?}", h.audit_events()).contains("printf human")); +} + +#[test] +fn hidden_or_unechoed_input_is_not_inferred_from_empty_screen() { + let mut h = Harness::new(); + h.session.pty_output(b"Password: "); + h.session.human_input(b"SYNTHETIC_SECRET"); + h.session.human_input(b"\x15"); + h.session.pty_output(b"\x07"); + assert!(h.session.status().input_pending, "no visible edit was observed"); + assert!(h.session.input_line().is_empty()); + assert!(!format!("{:?}", h.audit_events()).contains("SYNTHETIC_SECRET")); + h.session.human_input(b"\x03"); + assert!(!h.session.status().input_pending); +} + +#[test] +fn typing_and_erasing_echoed_in_one_chunk_recovers_without_a_cancel() { + let mut h = Harness::new(); + h.session.pty_output(b"prompt$ "); + h.session.human_input(b"x"); + h.session.human_input(b"\x7f"); + h.session.pty_output(b"x\x08 \x08"); + assert!(!h.session.status().input_pending); +} diff --git a/crates/core/tests/output_drain.rs b/crates/core/tests/output_drain.rs new file mode 100644 index 0000000..38e7810 --- /dev/null +++ b/crates/core/tests/output_drain.rs @@ -0,0 +1,42 @@ +#![cfg(unix)] +mod common; +use conn_core::{Engine, EngineConfig, backend::Profile, session::{ConnKind, ServerEvent}}; +use std::{sync::{Arc, Mutex, atomic::{AtomicUsize, Ordering}}, time::{Duration, Instant}}; + +#[test] +fn slow_consumer_applies_every_byte_before_exit_without_holding_up_pty_reads() { + let payload_bytes: usize = std::env::var("CONN_OUTPUT_TEST_BYTES").ok().and_then(|n| n.parse().ok()).unwrap_or(4 * 1024 * 1024); + let dir = tempfile::tempdir().unwrap(); + let payload = dir.path().join("payload"); + std::fs::write(&payload, vec![b'x'; payload_bytes]).unwrap(); + let count = Arc::new(AtomicUsize::new(0)); + let tail = Arc::new(Mutex::new(Vec::::new())); + let capture_count = count.clone(); let capture_tail = tail.clone(); + let mut profile = Profile::local("output-test".into(), "/bin/sh".into()); + profile.args = vec!["-c".into(), "stty -opost; sleep 0.1; cat payload; printf '\nFINAL_OUTPUT\n'".into()]; + let started = Instant::now(); + let engine = Engine::spawn(EngineConfig { + cwd: Some(dir.path().into()), profile: Some(profile), + audit: Some(conn_core::audit::Audit::null()), + output_frame: Some(Box::new(move |frame| { + // Force a backlog much longer than the former exit timeout. + std::thread::sleep(Duration::from_millis(3)); + capture_count.fetch_add(frame.data.len(), Ordering::SeqCst); + let mut last = capture_tail.lock().unwrap(); + last.extend_from_slice(&frame.data); + if last.len() > 64 { let n = last.len()-64; last.drain(..n); } + })), ..Default::default() + }).unwrap(); + let events = Arc::new(Mutex::new(Vec::new())); + engine.session().lock().register_conn(1, ConnKind::Frontend, "test", Box::new(common::VecSink(events.clone()))); + let deadline = Instant::now()+Duration::from_secs(120); + while !engine.has_exited() { + assert!(Instant::now() vt100::Parser { + let c = s.renderer_checkpoint().unwrap(); + let Size { rows, cols } = c.size; + let mut restored = vt100::Parser::new(rows, cols, 5000); + restored.process(&c.data); + restored +} +fn same(a: &vt100::Screen, b: &vt100::Screen) { + assert_eq!(a.contents(), b.contents(), "visible contents"); + assert_eq!(a.cursor_position(), b.cursor_position(), "cursor"); + assert_eq!(a.alternate_screen(), b.alternate_screen(), "alternate screen"); + assert_eq!(a.hide_cursor(), b.hide_cursor()); + assert_eq!(a.application_keypad(), b.application_keypad()); + assert_eq!(a.application_cursor(), b.application_cursor()); + assert_eq!(a.bracketed_paste(), b.bracketed_paste()); + assert_eq!(a.mouse_protocol_mode(), b.mouse_protocol_mode()); + assert_eq!(a.mouse_protocol_encoding(), b.mouse_protocol_encoding()); + for row in 0..a.size().0 { + assert_eq!(a.row_wrapped(row), b.row_wrapped(row), "soft wrap row {row}"); + for col in 0..a.size().1 { assert_eq!(a.cell(row,col), b.cell(row,col), "cell {row}:{col}"); } + } +} +#[test] +fn checkpoint_preserves_output_state_and_following_bytes_at_every_split() { + let fixtures: Vec> = vec![ + format!("{}tail", "first-long-line-123456789012345678901234567890\r\n".repeat(12)).into_bytes(), + b"\x1b[1;2;5;9;31mstyled\x1b[22mnormal-dim\x1b[0m \x1b[2mDIM\x1b[1mBOTH\x1b[22mRESET".to_vec(), + b"\x1b[31;44;1mcolor\x1b[0m\r\n12345678901234567890NEXT\x1b[3;8H\x1b7\x1b[4;2Hhello\x1b8!".to_vec(), + "한글 🚀 combined e\u{301}\r\n\x1b[38;2;20;30;40m색상\x1b[0m".as_bytes().to_vec(), + b"NORMAL\x1b[2;4H\x1b[32m\x1b[?1049h\x1b[?25lALT\x1b[2;5r\x1b[?6h\x1b[2;3Hmore\nrows\x1b[?1049l!".to_vec(), + b"\x1b[?2004h\x1b[?1h\x1b=\x1b[?1002h\x1b[?1006h\x1b[?1004h\x1b[?7l123456789012345678901234\x1b[2;1H\x1b[4habc\x1b[1Ginsert\x1b[4l".to_vec(), + b"\x1b]2;checkpoint title\x1b\\before\x1b[31mred\x1b[4;\x08\x07;1Hafter".to_vec(), + ]; + let mut exported = Vec::new(); + for (fixture, bytes) in fixtures.iter().enumerate() { + for split in 0..=bytes.len() { + let mut h = common::Harness::new(); + h.session.resize(6, 20); + h.session.pty_output(&bytes[..split]); + let mut original = vt100::Parser::new(6,20,5000); + original.process(&bytes[..split]); + let mut restored = checkpoint(&h.session); + exported.push(serde_json::json!({"fixture":fixture,"split":split,"rows":6,"cols":20,"before":bytes[..split],"checkpoint":h.session.renderer_checkpoint().unwrap().data,"after":bytes[split..]})); + same(original.screen(), restored.screen()); + original.process(&bytes[split..]); restored.process(&bytes[split..]); + same(original.screen(), restored.screen()); + // Restored saved cursor/margins/attributes must affect subsequent IO. + original.process(b"\x1b8Z\nlast"); restored.process(b"\x1b8Z\nlast"); + same(original.screen(), restored.screen()); + assert!(h.session.renderer_checkpoint().is_ok(), "fixture {fixture} split {split}"); + } + } + if let Ok(path) = std::env::var("CONN_CHECKPOINT_FIXTURES") { std::fs::write(path, serde_json::to_vec(&exported).unwrap()).unwrap(); } +} +#[test] +fn checkpoint_is_owner_only_does_not_expose_hidden_input_or_change_sequence() { + let mut h = common::Harness::new(); + h.session.pty_output(b"shown\x1b[8mconcealed\x1b[28m"); + let before=h.session.output_seq(); + h.session.human_input(b"not-echoed-password"); + let c=h.session.renderer_checkpoint().unwrap(); + assert_eq!(c.output_seq,before); + assert!(!String::from_utf8_lossy(&c.data).contains("not-echoed-password")); + assert!(!h.session.authoritative_surface().unwrap().screen.join("\n").contains("concealed")); +} + + +#[test] +fn one_row_history_and_oversized_incomplete_control_state() { + let mut h = common::Harness::new(); + h.session.resize(1, 8); + let bytes = b"abcdefghijk\r\nABCDEFGHIJK\r\nlast"; + h.session.pty_output(bytes); + let mut original=vt100::Parser::new(1,8,5000); original.process(bytes); + let restored=checkpoint(&h.session); + same(original.screen(),restored.screen()); + h.session.pty_output(b"\x1b]"); + h.session.pty_output(&vec![b'x'; 65_537]); + assert!(h.session.renderer_checkpoint().is_err(), "never restore a truncated unfinished sequence"); + h.session.pty_output(b"\x07"); + assert!(h.session.renderer_checkpoint().is_ok()); +} diff --git a/crates/core/tests/screen.rs b/crates/core/tests/screen.rs index f17dd2c..9108b4b 100644 --- a/crates/core/tests/screen.rs +++ b/crates/core/tests/screen.rs @@ -108,6 +108,6 @@ fn cursor_only_conceal_rewrites_and_alternate_screen_advance_revision() { let mut s=ScreenModel::new(3,30);s.process(b"visible");let r=s.revision(); s.process(b"\r\x1b[8mvisible\x1b[0m");assert!(s.revision()>r);assert_eq!(s.rows()[0],""); let r=s.revision();s.process(b"\x1b[?25l");assert!(s.revision()>r);assert!(s.visible_cursor().is_none()); - s.process(b"\x1b[?1049hALT");assert!(s.alternate_screen());assert_eq!(s.rows()[0],"ALT"); + s.process(b"\x1b[?1049hALT");assert!(s.alternate_screen());assert_eq!(s.rows()[0]," ALT", "xterm alternate buffer inherits the current cursor"); s.process(b"\x1b[?1049l");assert!(!s.alternate_screen());assert!(!s.rows().join("\n").contains("ALT")); } diff --git a/crates/core/tests/shared_surface.rs b/crates/core/tests/shared_surface.rs index 06a6c36..d5dee34 100644 --- a/crates/core/tests/shared_surface.rs +++ b/crates/core/tests/shared_surface.rs @@ -45,7 +45,7 @@ fn physical_input_is_not_forgotten_by_sharing_transition() { assert!(matches!(h.session.set_shared_with_agents(true,vec![1]),Err(SessionError::InputPending))); assert!(h.session.is_private());assert_eq!(h.session.surface_generation(),generation); assert_eq!(h.audit_events().len(),audit_len);assert_eq!(h.pty_str(),"unfinished"); - h.session.human_input(b"\x15"); + h.session.human_input(b"\x03"); h.session.set_shared_with_agents(true,vec![1]).unwrap();present(&mut h.session,vec!["$".into()]); h.session.agent_request_control(1).unwrap(); h.session.agent_type(1,"typed by agent").unwrap(); @@ -56,7 +56,7 @@ fn physical_input_is_not_forgotten_by_sharing_transition() { assert!(h.pty_str().ends_with("typed by agent"), "revocation leaves physical input with its owner"); assert!(matches!(h.session.set_shared_with_agents(true,vec![1]),Err(SessionError::InputPending))); assert!(h.session.is_private()); - h.session.human_input(b"\x15"); + h.session.human_input(b"\x03"); assert!(!h.session.status().input_pending); h.session.set_shared_with_agents(true,vec![1]).unwrap(); h.session.set_shared(false).unwrap(); diff --git a/crates/core/tests/shell_integration.rs b/crates/core/tests/shell_integration.rs index eda21fe..87174a2 100644 --- a/crates/core/tests/shell_integration.rs +++ b/crates/core/tests/shell_integration.rs @@ -175,6 +175,7 @@ fn existing_prompt_command_and_exit_status_are_preserved() { h.run("false", 1); assert_eq!(h.ends()[0].fields["exitCode"], 1); h.until(|| String::from_utf8_lossy(&h.output.lock().unwrap()).contains("USER_PROMPT_STATUS=1")); + h.until(|| h.engine.session().lock().completion_prompt_ready()); h.run("true", 2); assert_eq!(h.ends()[1].fields["exitCode"], 0); } @@ -207,6 +208,7 @@ fn ignored_history_is_not_reconstructed_from_typed_input() { h.until(|| { String::from_utf8_lossy(&h.output.lock().unwrap()).contains("INTENTIONALLY_OMITTED") }); + h.until(|| h.engine.session().lock().completion_prompt_ready()); h.run("true", 2); assert!(!format!("{:?}", h.starts()).contains("INTENTIONALLY_OMITTED")); } @@ -237,6 +239,60 @@ fn agent_submission_links_to_shell_execution_without_human_attribution() { ); } +// macOS PTYs have small buffers. Readline can block echoing a long input while +// the parent is still writing it; the output reader must not wait for that +// writer's session lock before draining more bytes from the PTY. +fn long_input_does_not_block_output(agent: bool) { + use conn_core::session::ConnKind; + let h = Shell::new("/bin/bash", false); + let payload = "abcdef".repeat(500); + let command = format!("printf 'LONG_OUTPUT<%s>\\n' '{payload}'"); + let session = h.engine.session(); + if agent { + let mut s = session.lock(); + s.register_conn(7, ConnKind::Agent, "long-input", Box::new(|_| {})); + s.agent_request_control(7).unwrap(); + } + let (done, completion) = std::sync::mpsc::channel(); + let writer = std::thread::spawn(move || { + let mut s = session.lock(); + if agent { s.agent_type(7, &command).unwrap(); } + else { s.human_input(command.as_bytes()); } + drop(s); + let _ = done.send(()); + }); + let completed = completion.recv_timeout(Duration::from_secs(5)).is_ok(); + if !completed { + // Kill independently of the session lock so a regression fails rather + // than leaving the test runner stuck in the same deadlock. + h.engine.terminate().unwrap(); + } + assert!(completed, "long PTY input blocked the output reader"); + writer.join().unwrap(); + if agent { h.engine.session().lock().agent_send_key(7, "ENTER").unwrap(); } + else { h.engine.write_input(b"\r"); } + let expected = format!("LONG_OUTPUT<{payload}>\r\n"); + h.until(|| String::from_utf8_lossy(&h.output.lock().unwrap()).contains(&expected)); + if agent { h.engine.session().lock().agent_release_control(7).unwrap(); } + h.until(|| h.engine.session().lock().completion_prompt_ready()); + h.send("printf 'NEXT_OUTPUT_OK\\n'"); + // Bash/readline may emit bracketed-paste mode sequences between the echoed + // newline and command output. Check the rendered row, not adjacent raw bytes; + // the echoed printf command cannot satisfy this exact-line assertion. + h.until(|| h.engine.session().lock().screen().rows().iter() + .any(|row| row.trim_end() == "NEXT_OUTPUT_OK")); +} + +#[test] +fn long_agent_input_drains_pty_echo_without_deadlock() { + long_input_does_not_block_output(true); +} + +#[test] +fn long_human_paste_drains_pty_echo_without_deadlock() { + long_input_does_not_block_output(false); +} + #[test] fn bash_lifecycle_and_authentication_input() { lifecycle("/bin/bash"); @@ -364,3 +420,69 @@ fn delayed_private_hook_payloads_are_discarded_after_sharing() { assert_eq!(h.starts()[0].fields["cmd"],"true"); h.engine.terminate().unwrap(); } + + +#[test] +fn idle_cancel_empty_enter_and_ignored_history_restore_prompt_policy() { + use conn_core::policy::Decision; + let h = Shell::new("/bin/bash", false); + let session = h.engine.session(); + for input in [b"\x03".as_slice(), b"\r", b"\r\r"] { + assert!(session.lock().completion_prompt_ready()); + h.engine.write_input(input); + h.until(|| session.lock().completion_prompt_ready()); + assert!(!session.lock().review_required()); + assert!(matches!(session.lock().analyse_line("python3 --version").decision, Decision::Allow)); + } + { + let mut s = session.lock(); + s.register_conn(7, conn_core::session::ConnKind::Agent, "test", Box::new(|_| {})); + s.agent_request_control(7).unwrap(); + s.agent_interrupt(7).unwrap(); + s.agent_release_control(7).unwrap(); + } + h.until(|| session.lock().completion_prompt_ready()); + h.send("HISTCONTROL=ignorespace"); + h.until(|| session.lock().completion_prompt_ready()); + let records = h.starts().len(); + h.send(" sleep 0.25"); + h.until(|| session.lock().review_required()); + h.until(|| session.lock().completion_prompt_ready()); + assert_eq!(h.starts().len(), records, "history-excluded text is not recorded"); + assert!(matches!(session.lock().analyse_line("pwd; python3 --version").decision, Decision::Allow)); + h.engine.terminate().unwrap(); +} + +#[test] +fn actual_readline_empty_edits_and_midline_kill_preserve_command_boundary() { + let h = Shell::new("/bin/bash", false); + let session = h.engine.session(); + h.until(|| session.lock().screen().cursor_line().ends_with("conn-test$")); + for edit in [b"\x1b[D".as_slice(), b"\x0c", b"\x7f"] { + h.engine.write_input(edit); + assert!(!session.lock().status().input_pending); + } + for (text, erase) in [("abc", b"\x7f\x7f\x7f".as_slice()), ("oneword", b"\x17"), ("word", b"\x15"), ("word", b"\x01\x1b[3~\x1b[3~\x1b[3~\x1b[3~")] { + h.engine.write_input(text.as_bytes()); + h.until(|| session.lock().screen().cursor_line().ends_with(text)); + assert!(session.lock().status().input_pending); + h.engine.write_input(erase); + h.until(|| !session.lock().status().input_pending); + } + h.engine.write_input(b"printf HUMAN_SUFFIX"); + h.until(|| session.lock().screen().cursor_line().contains("HUMAN_SUFFIX")); + h.engine.write_input(b"\x01\x15"); + h.until(|| session.lock().screen().cursor().col == 11); + { + let mut s = session.lock(); + s.register_conn(1, conn_core::session::ConnKind::Agent, "agent", Box::new(common::VecSink(Default::default()))); + s.agent_request_control(1).unwrap(); + assert!(matches!(s.agent_type(1, "printf AGENT"), Err(conn_core::session::SessionError::InputPending))); + assert!(matches!(s.agent_send_key(1, "ENTER"), Err(conn_core::session::SessionError::InputPending))); + } + h.engine.write_input(b"\x0b"); + h.until(|| !session.lock().status().input_pending); + h.run("printf BOUNDARY_OK", 1); + assert!(!format!("{:?}", h.starts()).contains("HUMAN_SUFFIX")); + h.engine.terminate().unwrap(); +} diff --git a/crates/frontend/Cargo.toml b/crates/frontend/Cargo.toml index 52346d0..122fc75 100644 --- a/crates/frontend/Cargo.toml +++ b/crates/frontend/Cargo.toml @@ -15,3 +15,4 @@ sha2 = "0.11" tempfile.workspace = true toml_edit = { version = "0.25", features = ["serde"] } jsonc-parser = { version = "0.32", features = ["cst", "serde"] } +schemars = "0.8" diff --git a/crates/frontend/src/automation/tests.rs b/crates/frontend/src/automation/tests.rs index 7545929..2d73ad4 100644 --- a/crates/frontend/src/automation/tests.rs +++ b/crates/frontend/src/automation/tests.rs @@ -1,13 +1,13 @@ use super::*; -use crate::Harness; +use crate::AppRuntime; use conn_core::backend::Profile; use base64::Engine as _; fn caller() -> Caller { Caller { identity:"test-sender:1".into(), name:"Synthetic launcher".into(), still_alive:Arc::new(|| true) } } -fn harness() -> (tempfile::TempDir, Arc) { harness_with_ack(true) } -fn harness_with_ack(ack: bool) -> (tempfile::TempDir, Arc) { +fn harness() -> (tempfile::TempDir, Arc) { harness_with_ack(true) } +fn harness_with_ack(ack: bool) -> (tempfile::TempDir, Arc) { let (tmp,h,_) = harness_with_events(ack); (tmp,h) } -fn harness_with_events(ack: bool) -> (tempfile::TempDir, Arc, Arc>>) { +fn harness_with_events(ack: bool) -> (tempfile::TempDir, Arc, Arc>>) { let tmp = tempfile::tempdir().unwrap(); let config = tmp.path().join("config"); std::fs::create_dir_all(&config).unwrap(); let mut p = Profile::local("test-shell".into(), "/bin/sh".into()); @@ -15,10 +15,10 @@ fn harness_with_events(ack: bool) -> (tempfile::TempDir, Arc, Arc>> = Default::default(); + let target: Arc>> = Default::default(); let receiver = target.clone(); let events = Arc::new(Mutex::new(Vec::new())); let recorded = events.clone(); - let h = Arc::new(Harness::new(config, tmp.path().join("conn.sock"), Arc::new(move |name,value| { + let h = Arc::new(AppRuntime::new(config, tmp.path().join("conn.sock"), Arc::new(move |name,value| { recorded.lock().push((name.to_owned(),value.clone())); if ack && name == "ss:tab_opened" && value["externalStarting"] == true { if let Some(h) = receiver.lock().upgrade() { @@ -33,15 +33,15 @@ fn harness_with_events(ack: bool) -> (tempfile::TempDir, Arc, Arc String { h.automate(caller(),"session.create",json!({})).unwrap().as_str().unwrap().into() } -fn physical(h: &Harness, handle: &str) -> String { h.state.automation.bindings.lock()[handle].session_id.clone() } +fn ready(h: &AppRuntime) { h.invoke_in_window("main", "ui_ready", json!({})).unwrap(); } +fn enable(h: &AppRuntime) { h.invoke_in_window("main", "automation_save", json!({"config":{"enabled":true,"profiles":["test-shell"]}})).unwrap(); } +fn open(h: &AppRuntime) -> String { h.automate(caller(),"session.create",json!({})).unwrap().as_str().unwrap().into() } +fn physical(h: &AppRuntime, handle: &str) -> String { h.state.automation.bindings.lock()[handle].session_id.clone() } fn wait_for(mut condition: impl FnMut()->bool) { let until = Instant::now()+Duration::from_secs(5); while !condition() { assert!(Instant::now()Value { +fn done(h:&AppRuntime,id:&str)->Value { let mut value=Value::Null; wait_for(|| { value=h.automate(caller(),"request.status",json!({"requestId":id})).unwrap(); matches!(value["state"].as_str(),Some("delivered"|"cancelled"|"failed")) }); value } @@ -54,7 +54,7 @@ fn owner_output(events:&Arc>>,id:&str,window:&str)->St .collect(); String::from_utf8_lossy(&bytes).into_owned() } -fn assert_unrecorded(h:&Harness,secret:&str) { +fn assert_unrecorded(h:&AppRuntime,secret:&str) { let audit=h.state.config_dir.join("audit.jsonl"); let text=std::fs::read_to_string(audit).unwrap_or_default(); assert!(!text.contains(secret)); assert!(!text.contains("automation_opened") && !text.contains("control_requested") && !text.contains("lease_granted")); diff --git a/crates/frontend/src/integrations/mod.rs b/crates/frontend/src/integrations/mod.rs index 80df11a..1eb31dd 100644 --- a/crates/frontend/src/integrations/mod.rs +++ b/crates/frontend/src/integrations/mod.rs @@ -1,4 +1,4 @@ -//! Local MCP + skill registration, shared by the native app and browser harness. +//! Local MCP + skill registration, shared by the native app and web frontend. //! Clients own formats and paths; the engine owns preservation and lifecycle. mod adapters; mod config; diff --git a/crates/frontend/src/lib.rs b/crates/frontend/src/lib.rs index 178bab7..0c081bf 100644 --- a/crates/frontend/src/lib.rs +++ b/crates/frontend/src/lib.rs @@ -1,11 +1,13 @@ -//! Tauri side: one engine per tab, all behind one hub/socket. Output and lifecycle -//! events reach the webview tagged with the session id. +//! Shared app runtime: one engine per tab behind one agent hub/socket. +//! Native and web owner adapters share dispatch, attachment and output contracts. mod agent_setup; mod integrations; mod diagnostics; pub mod automation; mod windows; +pub mod owner; +pub use owner::{OwnerHello, OwnerMeta, OwnerRequest, PROTOCOL_VERSION}; mod surface_commands; mod extension_commands; mod extensions; @@ -38,7 +40,8 @@ struct AppState { automation: automation::Automation, extensions: extensions::Extensions, windows: parking_lot::Mutex, - output: parking_lot::Mutex>>>, + output: parking_lot::Mutex>, + owner: owner::Owners, integration_home: Option, config_dir: PathBuf, socket: PathBuf, @@ -59,22 +62,26 @@ impl AppHandle { let owner = self.state.upgrade().and_then(|s| s.windows.lock().owner(session)); let Some(owner) = owner else { return Ok(()); }; value["window"] = json!(owner); + if value.get("epoch").is_none() { if let Some(state)=self.state.upgrade() { value["epoch"]=json!(state.owner.epoch(&owner)); } } } (self.emit)(name, value); Ok(()) } } -pub struct Harness { state: Arc, app: AppHandle } -impl Harness { +#[derive(Default)] +struct OutputRoute { attached: bool, epoch: u64, stream_seq: u64 } + +pub struct AppRuntime { state: Arc, app: AppHandle } +impl AppRuntime { pub fn new(config_dir: PathBuf, socket: PathBuf, emit: Emit) -> Self { Self::with_setup_home(config_dir, socket, emit, None) } - /// The browser harness uses the same installer against disposable client files. + /// Tests may redirect the same agent installer into a disposable client home. pub fn with_setup_home(config_dir: PathBuf, socket: PathBuf, emit: Emit, integration_home: Option) -> Self { let defaults = std::fs::read_to_string(config_dir.join("app.json")).ok().and_then(|t| serde_json::from_str(&t).ok()).unwrap_or(json!({})); let automation = automation::Automation::load(&config_dir); let extensions = extensions::Extensions::load(&config_dir); - let state = Arc::new(AppState { pending_sessions: Default::default(), startup: Default::default(), automation, extensions, windows: Default::default(), output: Default::default(), integration_home, config_dir, socket, engines: Default::default(), hub: Hub::new(), server: Default::default(), seq: parking_lot::Mutex::new(0), defaults: parking_lot::Mutex::new(defaults) }); + let state = Arc::new(AppState { pending_sessions: Default::default(), startup: Default::default(), automation, extensions, windows: Default::default(), output: Default::default(), owner: owner::Owners::new(), integration_home, config_dir, socket, engines: Default::default(), hub: Hub::new(), server: Default::default(), seq: parking_lot::Mutex::new(0), defaults: parking_lot::Mutex::new(defaults) }); let app = AppHandle { state: Arc::downgrade(&state), emit }; state.hub.set_admission_policy(admission_policy(&state.defaults.lock())); let notify = app.clone(); @@ -84,6 +91,35 @@ impl Harness { state.hub.set_activity_listener(Arc::new(move || { let _ = notify.emit("ss:activity_changed", Value::Null); })); Self { state, app } } + pub fn runtime_id(&self) -> &str { self.state.owner.runtime_id() } + pub fn owner_attach(&self, window: &str, protocol: u32, takeover: bool) -> Result { + if protocol != PROTOCOL_VERSION { return Err("protocol_mismatch".into()); } + if !self.state.windows.lock().available(window) { return Err("Window closed".into()); } + self.state.owner.attach(window, takeover, |epoch| { + let ids = self.state.windows.lock().sessions(window); + let mut output = self.state.output.lock(); + for id in ids { if let Some(route) = output.get_mut(&id) { *route = OutputRoute {epoch, ..Default::default()}; } } + }) + } + pub fn owner_detach(&self, window: &str, epoch: u64) { + self.state.owner.detach(window, epoch, || { + let ids = self.state.windows.lock().sessions(window); + let mut output = self.state.output.lock(); + for id in ids { if let Some(route) = output.get_mut(&id) { route.attached = false; } } + }); + } + pub fn invoke_owner(&self, window: &str, request: OwnerRequest) -> Result { + self.state.owner.execute(window, request, |name, args| { + if matches!(name,"input"|"terminal_response") { + let id=args["session"].as_str().ok_or("session_required")?; + if !self.state.output.lock().get(id).is_some_and(|route|route.attached) { return Err("renderer_not_ready".into()); } + } + self.invoke_in_window(window, name, args) + }) + } + pub fn owner_outcome(&self, window: &str, epoch: u64, operation_id: u64) -> Result { + self.state.owner.outcome(window, epoch, operation_id) + } pub fn shutdown(&self) { cancel_all_pending(&self.state); self.state.automation.stop_all(); @@ -91,7 +127,7 @@ impl Harness { for id in self.state.hub.ids() { self.state.hub.remove(&id); } for e in self.state.engines.lock().drain().map(|(_,e)|e) { let _ = e.terminate(); } } - /// Trusted single-window adapter (the token-protected browser harness). + /// Trusted in-process single-window caller (tests and automation service). /// Agent IPC never reaches this owner command boundary. pub fn invoke(&self, name: &str, args: Value) -> Result { self.invoke_in_window("main", name, args) @@ -164,7 +200,7 @@ impl Harness { automation::dispatch(&self.app, &self.state, window, caller, operation, args) } } -impl Drop for Harness { fn drop(&mut self) { self.shutdown(); } } +impl Drop for AppRuntime { fn drop(&mut self) { self.shutdown(); } } fn defaults_path(state: &AppState) -> PathBuf { state.config_dir.join("app.json") } /// Apply the stored new-tab defaults to a fresh session. fn apply_defaults(defaults: &Value, engine: &Engine) { @@ -201,20 +237,12 @@ fn engine(state: &AppState, session: &str) -> Result, String> { /// Installed before the PTY reader starts. Never locks Session from its callback. fn terminal_output(app: AppHandle, session: String) -> conn_core::session::OutputFrameSink { Box::new(move |frame| { - use base64::Engine as _; if let Some(state) = app.state.upgrade() { - let data = base64::engine::general_purpose::STANDARD.encode(&frame.data); - let value = json!({"session":session,"data":data,"outputSeq":frame.output_seq,"generation":frame.generation,"size":frame.size}); let mut output = state.output.lock(); - match output.get_mut(&session) { - Some(Some(buffer)) => { - buffer.push(value); - while buffer.len() > 1 && buffer.iter().map(|v| v["data"].as_str().map_or(0, str::len)).sum::() > 1_400_000 { - buffer.remove(0); - } - } - Some(None) => { let _ = app.emit("ss:output", value); } - None => {}, + if let Some(route) = output.get_mut(&session).filter(|route| route.attached) { + route.stream_seq += 1; + let value = owner::OwnerOutput::frame(&session,frame,route.epoch,route.stream_seq,false); + let _ = app.emit("ss:output", value); } } }) @@ -241,7 +269,7 @@ fn spawn_tab_with(app: &AppHandle, state: &AppState, window: &str, mut rows: u16 }; if !state.windows.lock().available(window) { return Err("Window closed".into()); } state.windows.lock().add(window, &id); - state.output.lock().insert(id.clone(), Some(Vec::new())); + state.output.lock().insert(id.clone(), OutputRoute { epoch: state.owner.epoch(window), ..Default::default() }); if external_private { state.pending_sessions.lock().insert(id.clone(), PendingSession { profile_id: profile.id.clone(), profile_name: profile.name.clone(), rows, cols, @@ -608,16 +636,30 @@ fn dispatch(app: &AppHandle, state: &AppState, name: &str, args: Value) -> Resul "automation_revoke" => { cancel_all_pending(state); state.automation.stop_all(); Ok(Value::Null) }, "attach_output" => { let id: String = arg(&args, "session")?; - { + // Session then route is the same lock order as live PTY delivery. + // The checkpoint and the following live frames cannot cross here. + if let Ok(engine) = engine(state, &id) { + let session = engine.session(); + let session = session.lock(); + let checkpoint = session.renderer_checkpoint()?; let mut output = state.output.lock(); - if let Some(entry) = output.get_mut(&id) { - for frame in entry.take().unwrap_or_default() { app.emit("ss:output", frame)?; } - } - } - if let Some(pending) = state.pending_sessions.lock().get_mut(&id) { + let route = output.get_mut(&id).ok_or("Session output unavailable")?; + route.attached = true; + route.stream_seq += 1; + app.emit("ss:output", owner::OwnerOutput::frame(&id,&checkpoint,route.epoch,route.stream_seq,true))?; + } else if let Some(pending) = state.pending_sessions.lock().get_mut(&id) { if pending.cancelled { return Err("External session unavailable".into()); } + if let Some(route) = state.output.lock().get_mut(&id) { + route.attached = true; + route.stream_seq += 1; + // No PTY exists yet. A blank prepared surface lets the owner + // cancel startup with genuine input before the child starts. + app.emit("ss:output",json!({"session":id,"reset":true,"data":"", + "size":{"rows":pending.rows,"cols":pending.cols},"generation":0,"outputSeq":0, + "epoch":route.epoch,"streamSeq":route.stream_seq}))?; + } pending.attached = true; - } + } else { return Err("Session output unavailable".into()); } Ok(Value::Null) }, "open_release" => updates::open(&arg::(&args, "url")?).map(|_| Value::Null), diff --git a/crates/frontend/src/owner.rs b/crates/frontend/src/owner.rs new file mode 100644 index 0000000..91a2d5d --- /dev/null +++ b/crates/frontend/src/owner.rs @@ -0,0 +1,548 @@ +//! Owner renderer identity, ordered terminal operations and bounded outcomes. +//! Adapters authenticate the view; no web payload chooses a native window. +use parking_lot::{Condvar, Mutex, RwLock}; +use serde::{Deserialize, Serialize}; +use serde_json::{json, Value}; +use sha2::{Digest, Sha256}; +use std::{ + collections::{BTreeMap, HashMap}, + sync::{ + atomic::{AtomicU64, Ordering}, + Arc, + }, + time::{Duration, Instant}, +}; + +pub const PROTOCOL_VERSION: u32 = 1; +const OUTCOMES: u64 = 1024; +const MAX_SAFE_INTEGER: u64 = 9_007_199_254_740_991; +fn read_only(name: &str) -> bool { + matches!( + name, + "profiles_test" + | "profiles_discover" + | "profiles_catalog" + | "diagnostics" + | "agent_integrations" + | "cli_status" + | "extensions_status" + | "automation_settings" + | "status" + | "sharing_participants" + | "sharing_state" + | "agents" + | "policy_rules" + | "policy_read" + | "policy_test" + | "audit_tail" + | "pending_admissions" + | "admission_snapshot" + | "admission_policy" + | "activity_snapshot" + ) +} + +#[derive(Clone, Debug, Serialize, Deserialize, schemars::JsonSchema)] +#[serde(rename_all = "camelCase", deny_unknown_fields)] +pub struct OwnerMeta { + pub epoch: u64, + pub operation_id: u64, + #[serde(default)] + pub sequence: Option, +} +#[derive(Clone, Debug, Serialize, Deserialize, schemars::JsonSchema)] +#[serde(rename_all = "camelCase", deny_unknown_fields)] +pub struct OwnerRequest { + pub name: String, + #[serde(default)] + pub args: Value, + #[serde(flatten)] + pub meta: OwnerMeta, +} +#[derive(Clone, Debug, Serialize, Deserialize, schemars::JsonSchema)] +#[serde(rename_all = "camelCase")] +pub struct OwnerHello { + pub protocol: u32, + pub runtime_id: String, + pub build_version: String, + pub epoch: u64, + pub view_id: String, +} +#[derive(Clone, Debug, Serialize, Deserialize, schemars::JsonSchema)] +pub struct OwnerSize { + pub rows: u16, + pub cols: u16, +} +#[derive(Clone, Debug, Serialize, Deserialize, schemars::JsonSchema)] +#[serde(rename_all = "camelCase")] +pub struct OwnerOutput { + pub session: String, + pub data: String, + pub output_seq: u64, + pub generation: u64, + pub size: OwnerSize, + pub epoch: u64, + pub stream_seq: u64, + #[serde(default, skip_serializing_if = "std::ops::Not::not")] + pub reset: bool, +} +impl OwnerOutput { + pub(crate) fn frame( + session: &str, + frame: &conn_core::session::OutputFrame, + epoch: u64, + stream_seq: u64, + reset: bool, + ) -> Value { + use base64::Engine as _; + serde_json::to_value(Self { + session: session.into(), + data: base64::engine::general_purpose::STANDARD.encode(&frame.data), + output_seq: frame.output_seq, + generation: frame.generation, + size: OwnerSize { + rows: frame.size.rows, + cols: frame.size.cols, + }, + epoch, + stream_seq, + reset, + }) + .unwrap() + } +} +#[derive(Default)] +struct Lane { + next: u64, + running: bool, +} +struct Operation { + fingerprint: Vec, + result: Option>, +} +#[derive(Default)] +struct ViewState { + epoch: u64, + attached: bool, + high: u64, + operations: BTreeMap, + archived: BTreeMap<(u64, u64), Option>>, + lanes: HashMap, +} +#[derive(Default)] +struct View { + current_epoch: AtomicU64, + fence: RwLock<()>, + state: Mutex, + changed: Condvar, +} +pub(crate) struct Owners { + runtime: String, + views: Mutex>>, +} +impl Owners { + pub fn new() -> Self { + Self { + runtime: uuid::Uuid::new_v4().to_string(), + views: Default::default(), + } + } + pub fn runtime_id(&self) -> &str { + &self.runtime + } + fn view(&self, window: &str) -> Arc { + self.views.lock().entry(window.into()).or_default().clone() + } + pub fn epoch(&self, window: &str) -> u64 { + self.view(window).current_epoch.load(Ordering::Acquire) + } + pub fn attach( + &self, + window: &str, + takeover: bool, + reset: impl FnOnce(u64), + ) -> Result { + let view = self.view(window); + let _fence = view.fence.write(); + let mut state = view.state.lock(); + if state.attached && !takeover { + return Err("owner_attached".into()); + } + let previous = state.epoch; + for (id, op) in std::mem::take(&mut state.operations) { + state.archived.insert((previous, id), op.result); + } + while state.archived.len() > OUTCOMES as usize { + state.archived.pop_first(); + } + state.epoch += 1; + state.attached = true; + state.high = 0; + state.lanes.clear(); + let epoch = state.epoch; + view.current_epoch.store(epoch, Ordering::Release); + reset(epoch); + view.changed.notify_all(); + Ok(OwnerHello { + protocol: PROTOCOL_VERSION, + runtime_id: self.runtime.clone(), + build_version: env!("CARGO_PKG_VERSION").into(), + epoch, + view_id: window.into(), + }) + } + pub fn detach(&self, window: &str, epoch: u64, reset: impl FnOnce()) { + let view = self.view(window); + let _fence = view.fence.write(); + let mut state = view.state.lock(); + if state.epoch == epoch { + state.attached = false; + reset(); + view.changed.notify_all(); + } + } + pub fn outcome(&self, window: &str, epoch: u64, id: u64) -> Result { + let view = self.view(window); + let state = view.state.lock(); + let record = if epoch == state.epoch { + state.operations.get(&id).map(|op| &op.result) + } else { + state.archived.get(&(epoch, id)) + }; + Ok(match record { + Some(Some(Ok(v))) => json!({"status":"completed","result":v}), + Some(Some(Err(e))) => json!({"status":"completed","error":e}), + Some(None) => json!({"status":"pending"}), + None => json!({"status":"unknown"}), + }) + } + + pub fn execute( + &self, + window: &str, + request: OwnerRequest, + run: impl FnOnce(&str, Value) -> Result, + ) -> Result { + let view = self.view(window); + let id = request.meta.operation_id; + let epoch = request.meta.epoch; + if id == 0 || id > MAX_SAFE_INTEGER { + return Err("invalid_operation_id".into()); + } + let lane_key = if matches!( + request.name.as_str(), + "input" | "terminal_response" | "resize" + ) { + if request + .meta + .sequence + .is_none_or(|n| n == 0 || n > MAX_SAFE_INTEGER) + { + return Err("terminal_sequence_required".into()); + } + Some( + request.args["session"] + .as_str() + .ok_or("session_required")? + .to_owned(), + ) + } else { + None + }; + // Dedup retains a digest, never raw password/editor input. + let fingerprint = Sha256::digest( + serde_json::to_vec(&(request.name.as_str(), &request.args, request.meta.sequence)) + .unwrap(), + ) + .to_vec(); + let deadline = Instant::now() + Duration::from_secs(10); + // Wait without holding the epoch fence, so a takeover can retire a missing sequence. + { + let mut state = view.state.lock(); + loop { + if state.epoch != epoch || !state.attached { + return Err("attachment_fenced".into()); + } + if let Some(op) = state.operations.get(&id) { + if op.fingerprint != fingerprint { + return Err("operation_id_conflict".into()); + } + if let Some(result) = &op.result { + return result.clone(); + } + if Instant::now() >= deadline { + return Err("outcome_pending".into()); + } + view.changed.wait_for(&mut state, Duration::from_millis(50)); + continue; + } + if id <= state.high.saturating_sub(OUTCOMES) { + return Err("outcome_unknown".into()); + } + if let Some(key) = &lane_key { + let lane = state.lanes.entry(key.clone()).or_insert(Lane { + next: 1, + running: false, + }); + let sequence = request.meta.sequence.unwrap(); + if sequence < lane.next { + return Err("terminal_sequence_stale".into()); + } + if sequence != lane.next || lane.running { + if Instant::now() >= deadline { + return Err("terminal_sequence_gap".into()); + } + view.changed.wait_for(&mut state, Duration::from_millis(50)); + continue; + } + lane.running = true; + } + state.high = state.high.max(id); + let floor = state.high.saturating_sub(OUTCOMES); + state + .operations + .retain(|n, op| *n > floor || op.result.is_none()); + if state.operations.len() >= OUTCOMES as usize { + if let Some(key) = &lane_key { + state.lanes.get_mut(key).unwrap().running = false; + } + return Err("owner_busy".into()); + } + state.operations.insert( + id, + Operation { + fingerprint, + result: None, + }, + ); + break; + } + } + // Slow observations do not postpone handoff. Mutations finish atomically + // before epoch replacement; stale queued mutations never start. + let _fence = (!read_only(&request.name)).then(|| view.fence.read()); + let mut state = view.state.lock(); + if state.epoch != epoch || !state.attached { + let rejected = Some(Err("attachment_fenced".to_owned())); + if state.epoch == epoch { + if let Some(operation) = state.operations.get_mut(&id) { + operation.result = rejected; + } + } else if let Some(outcome) = state.archived.get_mut(&(epoch, id)) { + *outcome = rejected; + } + view.changed.notify_all(); + return Err("attachment_fenced".into()); + } + drop(state); + let result = run(&request.name, request.args); + state = view.state.lock(); + if state.epoch != epoch { + if let Some(outcome) = state.archived.get_mut(&(epoch, id)) { + *outcome = Some(result); + } + view.changed.notify_all(); + return Err("attachment_fenced".into()); + } + if let Some(op) = state.operations.get_mut(&id) { + op.result = Some(result.clone()); + } + if let Some(key) = &lane_key { + let lane = state.lanes.get_mut(key).unwrap(); + lane.running = false; + lane.next += 1; + } + view.changed.notify_all(); + result + } +} + +/// Machine-readable source for the generated TypeScript owner transport contract. +pub fn contract() -> Value { + json!({"protocol":PROTOCOL_VERSION,"request":schemars::schema_for!(OwnerRequest), + "meta":schemars::schema_for!(OwnerMeta),"hello":schemars::schema_for!(OwnerHello),"output":schemars::schema_for!(OwnerOutput)}) +} + +#[cfg(test)] +mod tests { + use super::*; + fn request(epoch: u64, id: u64, seq: Option, name: &str) -> OwnerRequest { + OwnerRequest { + name: name.into(), + args: json!({"session":"a"}), + meta: OwnerMeta { + epoch, + operation_id: id, + sequence: seq, + }, + } + } + #[test] + fn session_operations_wait_for_their_sequence_not_worker_scheduling() { + let owner = Arc::new(Owners::new()); + let epoch = owner.attach("main", false, |_| {}).unwrap().epoch; + let out = Arc::new(Mutex::new(Vec::new())); + let o = owner.clone(); + let recorded = out.clone(); + let later = std::thread::spawn(move || { + o.execute("main", request(epoch, 2, Some(2), "resize"), |_, _| { + recorded.lock().push(2); + Ok(Value::Null) + }) + }); + std::thread::sleep(Duration::from_millis(25)); + owner + .execute("main", request(epoch, 1, Some(1), "input"), |_, _| { + out.lock().push(1); + Ok(Value::Null) + }) + .unwrap(); + later.join().unwrap().unwrap(); + assert_eq!(*out.lock(), vec![1, 2]); + } + #[test] + fn slow_independent_work_does_not_block_terminal_input_or_event_callback() { + let owner = Arc::new(Owners::new()); + let epoch = owner.attach("main", false, |_| {}).unwrap().epoch; + let (started, ready) = std::sync::mpsc::channel(); + let (release, wait) = std::sync::mpsc::channel(); + let o = owner.clone(); + let slow = std::thread::spawn(move || { + o.execute("main", request(epoch, 1, None, "profiles_test"), |_, _| { + started.send(()).unwrap(); + wait.recv().unwrap(); + Ok(Value::Null) + }) + }); + ready.recv().unwrap(); + let start = Instant::now(); + owner + .execute("main", request(epoch, 2, Some(1), "input"), |_, _| { + Ok(json!("input")) + }) + .unwrap(); + assert!(start.elapsed() < Duration::from_millis(100)); + release.send(()).unwrap(); + slow.join().unwrap().unwrap(); + } + #[test] + fn slow_read_does_not_delay_takeover_or_write_into_the_new_epoch_outcome() { + let owner = Arc::new(Owners::new()); + let epoch = owner.attach("main", false, |_| {}).unwrap().epoch; + let (started, ready) = std::sync::mpsc::channel(); + let (release, wait) = std::sync::mpsc::channel(); + let o = owner.clone(); + let slow = std::thread::spawn(move || { + o.execute("main", request(epoch, 1, None, "profiles_test"), |_, _| { + started.send(()).unwrap(); + wait.recv().unwrap(); + Ok(json!("old")) + }) + }); + ready.recv().unwrap(); + let next = owner.attach("main", true, |_| {}).unwrap(); + owner + .execute("main", request(next.epoch, 1, None, "status"), |_, _| { + Ok(json!("new")) + }) + .unwrap(); + release.send(()).unwrap(); + assert_eq!(slow.join().unwrap().unwrap_err(), "attachment_fenced"); + assert_eq!( + owner.outcome("main", next.epoch, 1).unwrap()["result"], + "new" + ); + } + #[test] + fn retry_returns_the_same_outcome_and_never_reexecutes_evicted_operation() { + let owner = Owners::new(); + let epoch = owner.attach("main", false, |_| {}).unwrap().epoch; + let req = request(epoch, 1, None, "take"); + assert_eq!( + owner + .execute("main", req.clone(), |_, _| Ok(json!("first"))) + .unwrap(), + json!("first") + ); + assert_eq!( + owner + .execute("main", req.clone(), |_, _| panic!("duplicate mutation")) + .unwrap(), + json!("first") + ); + for id in 2..=1030 { + owner + .execute("main", request(epoch, id, None, "status"), |_, _| { + Ok(Value::Null) + }) + .unwrap(); + } + assert_eq!( + owner + .execute("main", req, |_, _| panic!("expired mutation rerun")) + .unwrap_err(), + "outcome_unknown" + ); + } + #[test] + fn explicit_handoff_fences_old_queued_input_and_duplicate_views() { + let owner = Arc::new(Owners::new()); + let first = owner.attach("main", false, |_| {}).unwrap(); + assert_eq!( + owner.attach("main", false, |_| {}).unwrap_err(), + "owner_attached" + ); + let o = owner.clone(); + let late = std::thread::spawn(move || { + o.execute("main", request(first.epoch, 2, Some(2), "input"), |_, _| { + panic!("old input executed") + }) + }); + std::thread::sleep(Duration::from_millis(20)); + let next = owner.attach("main", true, |_| {}).unwrap(); + assert_eq!(late.join().unwrap().unwrap_err(), "attachment_fenced"); + owner.detach("main", first.epoch, || { + panic!("old disconnect detached current owner") + }); + owner + .execute("main", request(next.epoch, 1, Some(1), "input"), |_, _| { + Ok(Value::Null) + }) + .unwrap(); + } + #[test] + fn lost_mutation_outcome_can_be_queried_after_reconnect_without_reexecution() { + let owner = Owners::new(); + let first = owner.attach("main", false, |_| {}).unwrap(); + owner + .execute("main", request(first.epoch, 1, None, "take"), |_, _| { + Ok(json!({"retained":true})) + }) + .unwrap(); + owner.detach("main", first.epoch, || {}); + let second = owner.attach("main", false, |_| {}).unwrap(); + assert!(second.epoch > first.epoch); + assert_eq!( + owner.outcome("main", first.epoch, 1).unwrap()["result"]["retained"], + true + ); + assert_eq!( + owner + .execute( + "main", + request(first.epoch, 1, None, "take"), + |_, _| panic!("old mutation reexecuted") + ) + .unwrap_err(), + "attachment_fenced" + ); + } + #[test] + fn owner_wire_contract_deserializes_flat_metadata() { + let r: OwnerRequest = serde_json::from_value( + json!({"name":"input","args":{"session":"a"},"epoch":1,"operationId":1,"sequence":1}), + ) + .unwrap(); + assert_eq!(r.meta.sequence, Some(1)); + } +} diff --git a/crates/frontend/src/surface_commands.rs b/crates/frontend/src/surface_commands.rs index 1e2101d..5e27c5f 100644 --- a/crates/frontend/src/surface_commands.rs +++ b/crates/frontend/src/surface_commands.rs @@ -65,7 +65,7 @@ pub(crate) fn dispatch( } else { None }; - state.automation.transition_session(&id, || { + let status = state.automation.transition_session(&id, || { let mut s = session.lock(); if expected.is_some_and(|revision| revision != s.participation_generation()) { return Err("sharing_changed".into()); @@ -85,6 +85,10 @@ pub(crate) fn dispatch( s.set_shared_with_agents(shared, selected) .map_err(|e| conn_core::ipc::RpcError::from(e).code)?; Ok(json!(s.status())) - }) + })?; + // Resolve fulfilled preparation requests after releasing the session + // lock, so a newly shared shell does not leave a second stale card. + state.hub.activity_snapshot(); + Ok(status) })()) } diff --git a/crates/frontend/tests/admission_harness.rs b/crates/frontend/tests/admission_harness.rs index 87dd280..5d6f936 100644 --- a/crates/frontend/tests/admission_harness.rs +++ b/crates/frontend/tests/admission_harness.rs @@ -1,17 +1,17 @@ #![cfg(unix)] //! The desktop app asks before a new agent connection joins, and remembers the owner's setting. use conn_core::ipc::{Client, ClientError}; -use conn_frontend::Harness; +use conn_frontend::AppRuntime; use serde_json::{json, Value}; use std::sync::{Arc, Mutex}; use std::time::{Duration, Instant}; -fn harness(dir: &std::path::Path, events: Arc>>) -> Harness { +fn harness(dir: &std::path::Path, events: Arc>>) -> AppRuntime { let mut profile = conn_core::backend::Profile::local("test".into(), "/bin/bash".into()); profile.args = vec!["--noprofile".into(), "--norc".into()]; profile.cwd = Some(dir.to_string_lossy().into()); std::fs::write(dir.join("profiles.json"), serde_json::to_vec(&conn_core::profiles::Profiles { version: 1, revision: 0, default_profile: "test".into(), profiles: vec![profile] }).unwrap()).unwrap(); - let h = Harness::new(dir.into(), dir.join("conn.sock"), Arc::new(move |name, v| { if name == "ss:admission" { events.lock().unwrap().push(v); } })); + let h = AppRuntime::new(dir.into(), dir.join("conn.sock"), Arc::new(move |name, v| { if name == "ss:admission" { events.lock().unwrap().push(v); } })); h.invoke("start", json!({"rows":24,"cols":80})).unwrap(); h } diff --git a/crates/frontend/tests/native_harness.rs b/crates/frontend/tests/native_harness.rs index f666f3c..be66231 100644 --- a/crates/frontend/tests/native_harness.rs +++ b/crates/frontend/tests/native_harness.rs @@ -1,5 +1,5 @@ #![cfg(unix)] -use conn_frontend::Harness; +use conn_frontend::AppRuntime; use serde_json::json; use std::{sync::Arc, time::{Duration, Instant}}; @@ -29,7 +29,7 @@ fn invalid_policy_prevents_shell_start_and_can_be_corrected() { let path = dir.path().join("policy.yaml"); let malformed = "confirm: [\n"; std::fs::write(&path, malformed).unwrap(); - let h = Harness::new(dir.path().into(), dir.path().join("conn.sock"), Arc::new(|_, _| {})); + let h = AppRuntime::new(dir.path().into(), dir.path().join("conn.sock"), Arc::new(|_, _| {})); let error = h.invoke("start", json!({"rows":24,"cols":80})).unwrap_err(); assert!(error.contains("Could not load policy") && error.contains("policy.yaml"), "{error}"); let events = conn_core::audit::read_events(&dir.path().join("audit.jsonl")).unwrap(); @@ -49,7 +49,7 @@ fn invalid_policy_reload_retains_last_good_rules_and_blocks_new_tabs() { configure_profile(dir.path()); let path = dir.path().join("policy.yaml"); std::fs::write(&path, "default: deny\n").unwrap(); - let h = Harness::new(dir.path().into(), dir.path().join("conn.sock"), Arc::new(|_, _| {})); + let h = AppRuntime::new(dir.path().into(), dir.path().join("conn.sock"), Arc::new(|_, _| {})); let started = h.invoke("start", json!({"rows":24,"cols":80})).unwrap(); let session = &started["session"]; // Settings validate before overwriting a good file. @@ -80,7 +80,7 @@ fn shared_commands_execute_native_shell_and_preserve_tab_defaults() { std::fs::write(dir.path().join("profiles.json"), serde_json::to_vec(&conn_core::profiles::Profiles { version: 1, revision: 0, default_profile: "test".into(), profiles: vec![profile], }).unwrap()).unwrap(); - let h = Harness::new(dir.path().into(), dir.path().join("conn.sock"), Arc::new(|_, _| {})); + let h = AppRuntime::new(dir.path().into(), dir.path().join("conn.sock"), Arc::new(|_, _| {})); h.invoke("set_defaults", json!({"defaults":{"gate":true}})).unwrap(); let started = h.invoke("start", json!({"rows":24,"cols":80})).unwrap(); let id = started["session"].as_str().unwrap(); @@ -106,7 +106,7 @@ fn native_windows_keep_tabs_output_and_close_lifecycle_separate() { configure_profile(dir.path()); let events = Arc::new(std::sync::Mutex::new(Vec::new())); let recorded = events.clone(); - let h = Harness::new(dir.path().into(), dir.path().join("conn.sock"), Arc::new(move |name, value| { + let h = AppRuntime::new(dir.path().into(), dir.path().join("conn.sock"), Arc::new(move |name, value| { recorded.lock().unwrap().push((name.to_owned(), value)); })); let main = h.invoke("start", json!({"rows":24,"cols":80})).unwrap(); @@ -149,9 +149,9 @@ fn private_output_and_terminal_responses_are_confined_to_the_owning_native_windo configure_profile(dir.path()); let events = Arc::new(std::sync::Mutex::new(Vec::new())); let recorded = events.clone(); - let target: Arc>> = Default::default(); + let target: Arc>> = Default::default(); let receiver = target.clone(); - let h = Arc::new(Harness::new(dir.path().into(), dir.path().join("conn.sock"), Arc::new(move |name, value| { + let h = Arc::new(AppRuntime::new(dir.path().into(), dir.path().join("conn.sock"), Arc::new(move |name, value| { recorded.lock().unwrap().push((name.to_owned(), value.clone())); if name == "ss:tab_opened" && value["externalStarting"] == true { if let Some(h) = receiver.lock().unwrap().upgrade() { diff --git a/crates/frontend/tests/surface_harness.rs b/crates/frontend/tests/surface_harness.rs index aea92a1..1130d20 100644 --- a/crates/frontend/tests/surface_harness.rs +++ b/crates/frontend/tests/surface_harness.rs @@ -1,16 +1,16 @@ #![cfg(unix)] -use conn_frontend::Harness; +use conn_frontend::AppRuntime; use serde_json::{json,Value}; use std::{sync::{Arc,Mutex},time::{Duration,Instant}}; -fn setup() -> (tempfile::TempDir,Harness,Arc>>,String) { +fn setup() -> (tempfile::TempDir,AppRuntime,Arc>>,String) { let dir=tempfile::tempdir().unwrap(); let mut profile=conn_core::backend::Profile::local("test".into(),"/bin/bash".into()); profile.args=vec!["--noprofile".into(),"--norc".into()]; profile.cwd=Some(dir.path().to_string_lossy().into()); std::fs::write(dir.path().join("profiles.json"),serde_json::to_vec(&conn_core::profiles::Profiles{version:1,revision:0,default_profile:"test".into(),profiles:vec![profile]}).unwrap()).unwrap(); let output=Arc::new(Mutex::new(Vec::new()));let capture=output.clone(); - let h=Harness::new(dir.path().into(),dir.path().join("conn.sock"),Arc::new(move |name,v| {if name=="ss:output" {capture.lock().unwrap().push(v);}})); + let h=AppRuntime::new(dir.path().into(),dir.path().join("conn.sock"),Arc::new(move |name,v| {if name=="ss:output" {capture.lock().unwrap().push(v);}})); let start=h.invoke("start",json!({"rows":24,"cols":80})).unwrap(); let id=start["session"].as_str().unwrap().to_string(); h.invoke("attend",json!({"session":id})).unwrap(); @@ -19,7 +19,7 @@ fn setup() -> (tempfile::TempDir,Harness,Arc>>,String) { while output.lock().unwrap().is_empty() {assert!(Instant::now()Value { +fn frame(h:&AppRuntime,id:&str,revision:u64)->Value { let status=h.invoke("status",json!({"session":id})).unwrap(); json!({"surfaceId":"owner-renderer","generation":status["surfaceGeneration"],"revision":revision,"outputSeq":status["outputSeq"],"rows":24,"cols":80,"cursor":null,"screen":["visible synthetic frame"],"alternateScreen":false,"visible":true}) } diff --git a/crates/web/Cargo.toml b/crates/web/Cargo.toml new file mode 100644 index 0000000..e889a47 --- /dev/null +++ b/crates/web/Cargo.toml @@ -0,0 +1,23 @@ +[package] +name = "conn-web" +version.workspace = true +edition.workspace = true +license.workspace = true +[dependencies] +conn-core.workspace = true +conn-frontend.workspace = true +serde.workspace = true +serde_json.workspace = true +tokio = { workspace = true, features = ["fs"] } +uuid.workspace = true +clap.workspace = true +dirs.workspace = true +parking_lot.workspace = true +axum = { version = "0.8", features = ["ws"] } +futures-util = "0.3" +percent-encoding = "2" +[dev-dependencies] +tempfile.workspace = true +tokio-tungstenite = "0.29" +base64.workspace = true +libc.workspace = true diff --git a/crates/web/src/lib.rs b/crates/web/src/lib.rs new file mode 100644 index 0000000..5ca0b7d --- /dev/null +++ b/crates/web/src/lib.rs @@ -0,0 +1,563 @@ +//! Authenticated loopback host for the production AppRuntime. A socket attaches +//! a renderer; neither a socket nor a page reload owns a shell's lifetime. +use axum::{ + extract::{ + ws::{Message, WebSocket, WebSocketUpgrade}, + State, + }, + http::{HeaderMap, HeaderValue, StatusCode, Uri}, + response::{IntoResponse, Response}, + routing::{get, post}, + Json, Router, +}; +use conn_frontend::{AppRuntime, OwnerMeta, OwnerRequest, PROTOCOL_VERSION}; +use futures_util::{SinkExt, StreamExt}; +use serde::Deserialize; +use serde_json::{json, Value}; +use std::{ + path::PathBuf, + sync::{ + atomic::{AtomicBool, Ordering}, + Arc, + }, + time::Duration, +}; +use tokio::sync::{mpsc, watch, Semaphore}; + +pub struct Config { + pub state_dir: PathBuf, + pub host: String, + pub port: u16, + pub ui_dir: Option, + pub dev_origin: Option, + pub setup_home: Option, + pub connection_file: Option, +} +#[derive(Clone)] +struct Client { + epoch: u64, + tx: mpsc::Sender, + stop: watch::Sender>, + closed: watch::Receiver, +} +struct SocketCompletion(watch::Sender); +impl Drop for SocketCompletion { + fn drop(&mut self) { + self.0.send_replace(true); + } +} +#[derive(Default)] +struct Delivery { + client: parking_lot::Mutex>, +} +impl Delivery { + fn emit(&self, name: &str, payload: Value) { + if let Some(client) = self.client.lock().as_ref() { + if payload + .get("epoch") + .and_then(Value::as_u64) + .is_some_and(|epoch| epoch != client.epoch) + { + return; + } + if client + .tx + .try_send(json!({"event":name,"payload":payload,"epoch":client.epoch})) + .is_err() + { + let _ = client.stop.send(Some("resync_required")); + } + } + } +} +struct Shared { + runtime: Arc, + delivery: Arc, + origin: String, + dev_origin: Option, + token: String, + cookie: String, + cookie_value: String, + ui_dir: Option, + _lock: std::fs::File, + attachment: tokio::sync::Mutex<()>, + stopping: AtomicBool, +} +pub struct WebHost { + listener: tokio::net::TcpListener, + shared: Arc, + connection_file: PathBuf, +} +impl WebHost { + pub async fn bind(config: Config) -> Result> { + // Remote hosting is intentionally not enabled by a bind-address option. + if config.host != "127.0.0.1" { + return Err("Only 127.0.0.1 is supported by the local web host".into()); + } + if let Some(origin) = &config.dev_origin { + validate_origin(origin)?; + } + let ui_dir = config + .ui_dir + .filter(|path| path.join("index.html").is_file()) + .map(|p| p.canonicalize()) + .transpose()?; + if ui_dir.is_none() && config.dev_origin.is_none() { + return Err("Built web UI missing; provide --ui-dir with index.html".into()); + } + std::fs::create_dir_all(&config.state_dir)?; + #[cfg(unix)] + { + use std::os::unix::fs::PermissionsExt; + std::fs::set_permissions(&config.state_dir, std::fs::Permissions::from_mode(0o700))?; + } + let lock = std::fs::OpenOptions::new() + .read(true) + .write(true) + .create(true) + .truncate(false) + .open(config.state_dir.join("web.lock"))?; + lock.try_lock() + .map_err(|_| "This web state directory is already in use")?; + let listener = tokio::net::TcpListener::bind((config.host.as_str(), config.port)).await?; + let origin = format!("http://127.0.0.1:{}", listener.local_addr()?.port()); + let delivery = Arc::new(Delivery::default()); + let output = delivery.clone(); + let socket = config.state_dir.join("conn.sock"); + let runtime = Arc::new(AppRuntime::with_setup_home( + config.state_dir.clone(), + socket.clone(), + Arc::new(move |name, payload| output.emit(name, payload)), + config.setup_home, + )); + let token = uuid::Uuid::new_v4().to_string(); + let cookie_value = uuid::Uuid::new_v4().to_string(); + let cookie = format!("conn_owner_{}", runtime.runtime_id().replace('-', "")); + let connection_file = config + .connection_file + .unwrap_or_else(|| config.state_dir.join("connection.json")); + let metadata = json!({"url":origin,"wsUrl":format!("{}/api/ws",origin.replace("http:","ws:")),"bootstrapToken":token, + "runtimeId":runtime.runtime_id(),"protocol":PROTOCOL_VERSION,"buildVersion":env!("CARGO_PKG_VERSION"),"agentSocket":socket}); + if let Some(parent) = connection_file.parent() { + std::fs::create_dir_all(parent)?; + } + let mut options = std::fs::OpenOptions::new(); + options.write(true).create(true).truncate(true); + #[cfg(unix)] + { + use std::os::unix::fs::OpenOptionsExt; + options.mode(0o600); + } + use std::io::Write; + let mut file = options.open(&connection_file)?; + file.write_all(serde_json::to_string_pretty(&metadata)?.as_bytes())?; + #[cfg(unix)] + { + use std::os::unix::fs::PermissionsExt; + file.set_permissions(std::fs::Permissions::from_mode(0o600))?; + } + Ok(Self { + listener, + connection_file, + shared: Arc::new(Shared { + runtime, + delivery, + origin, + dev_origin: config.dev_origin, + token, + cookie, + cookie_value, + ui_dir, + _lock: lock, + attachment: tokio::sync::Mutex::new(()), + stopping: AtomicBool::new(false), + }), + }) + } + pub fn origin(&self) -> &str { + &self.shared.origin + } + pub fn connection_file(&self) -> &std::path::Path { + &self.connection_file + } + pub fn runtime(&self) -> Arc { + self.shared.runtime.clone() + } + pub async fn serve(self) -> Result<(), std::io::Error> { + let shared = self.shared.clone(); + let shutdown = shared.clone(); + let result = axum::serve( + self.listener, + Router::new() + .route("/api/bootstrap", post(bootstrap)) + .route("/api/info", get(info)) + .route("/api/ws", get(upgrade)) + .fallback(static_file) + .with_state(self.shared), + ) + .with_graceful_shutdown(async move { + shutdown_signal().await; + // Stop upgraded owner connections before asking HTTP to drain. + shutdown.begin_shutdown(); + }) + .await; + shared.begin_shutdown(); + let closed = shared + .delivery + .client + .lock() + .as_ref() + .map(|client| client.closed.clone()); + if let Some(mut closed) = closed { + // Flush the stopping event/close even when the page remains open. + // An unresponsive browser cannot hold process termination forever. + let _ = tokio::time::timeout(Duration::from_secs(2), async { + while !*closed.borrow_and_update() { + if closed.changed().await.is_err() { + break; + } + } + }) + .await; + } + let _ = tokio::task::spawn_blocking(move || shared.runtime.shutdown()).await; + result + } +} +fn validate_origin(origin: &str) -> Result<(), &'static str> { + let port = origin + .strip_prefix("http://127.0.0.1:") + .and_then(|s| s.parse::().ok()) + .filter(|p| *p != 0) + .ok_or("Development origin must be http://127.0.0.1:")?; + if origin != format!("http://127.0.0.1:{port}") { + return Err("Invalid development origin"); + } + Ok(()) +} +impl Shared { + fn begin_shutdown(&self) { + self.stopping.store(true, Ordering::Release); + if let Some(client) = self.delivery.client.lock().as_ref() { + let _ = client.stop.send(Some("server_stopping")); + } + } + fn host_valid(&self, headers: &HeaderMap) -> bool { + headers + .get("host") + .and_then(|h| h.to_str().ok()) + .is_some_and(|h| { + h == self.origin.trim_start_matches("http://") + || self + .dev_origin + .as_ref() + .is_some_and(|o| h == o.trim_start_matches("http://")) + }) + } + fn origin_valid(&self, headers: &HeaderMap) -> bool { + headers + .get("origin") + .and_then(|h| h.to_str().ok()) + .is_some_and(|o| o == self.origin || self.dev_origin.as_deref() == Some(o)) + } + fn authorized(&self, headers: &HeaderMap) -> bool { + headers + .get("cookie") + .and_then(|h| h.to_str().ok()) + .is_some_and(|cookies| { + cookies + .split(';') + .any(|part| part.trim() == format!("{}={}", self.cookie, self.cookie_value)) + }) + } +} +#[derive(Deserialize)] +struct Bootstrap { + token: String, +} +async fn bootstrap( + State(s): State>, + headers: HeaderMap, + Json(body): Json, +) -> Response { + if !s.host_valid(&headers) || !s.origin_valid(&headers) || body.token != s.token { + return (StatusCode::FORBIDDEN, "Owner authentication failed").into_response(); + } + let mut response = Json(json!({"authenticated":true})).into_response(); + response.headers_mut().insert( + "set-cookie", + HeaderValue::from_str(&format!( + "{}={}; HttpOnly; SameSite=Strict; Path=/api; Max-Age=86400", + s.cookie, s.cookie_value + )) + .unwrap(), + ); + response + .headers_mut() + .insert("cache-control", HeaderValue::from_static("no-store")); + response +} +async fn info(State(s): State>, headers: HeaderMap) -> Response { + if !s.host_valid(&headers) { + return StatusCode::FORBIDDEN.into_response(); + } + Json(json!({"protocol":PROTOCOL_VERSION,"runtimeId":s.runtime.runtime_id(),"buildVersion":env!("CARGO_PKG_VERSION"),"authenticated":s.authorized(&headers)})).into_response() +} +async fn upgrade( + State(s): State>, + headers: HeaderMap, + uri: Uri, + ws: WebSocketUpgrade, +) -> Response { + if s.stopping.load(Ordering::Acquire) { + return StatusCode::SERVICE_UNAVAILABLE.into_response(); + } + if uri.query().is_some() + || !s.host_valid(&headers) + || !s.origin_valid(&headers) + || !s.authorized(&headers) + { + return (StatusCode::FORBIDDEN, "Owner authentication required").into_response(); + } + ws.max_message_size(2 * 1024 * 1024) + .on_upgrade(move |socket| serve_socket(socket, s)) +} +async fn serve_socket(mut socket: WebSocket, s: Arc) { + let Some(Ok(Message::Text(text))) = + tokio::time::timeout(std::time::Duration::from_secs(10), socket.recv()) + .await + .ok() + .flatten() + else { + return; + }; + let Ok(hello) = serde_json::from_str::(&text) else { + return; + }; + if hello["type"] != "hello" { + return; + } + let protocol = hello["protocol"] + .as_u64() + .and_then(|p| u32::try_from(p).ok()) + .unwrap_or(0); + let takeover = hello["takeover"].as_bool().unwrap_or(false); + let runtime = s.runtime.clone(); + // Epoch replacement and delivery installation are one attachment operation. + // Otherwise two concurrent takeovers could install the older emitter last. + let registration = s.attachment.lock().await; + if s.stopping.load(Ordering::Acquire) { + return; + } + let attached = + tokio::task::spawn_blocking(move || runtime.owner_attach("main", protocol, takeover)).await; + let hello = match attached { + Ok(Ok(v)) => v, + other => { + drop(registration); + let error = match other { + Ok(Err(e)) => e, + Err(e) => e.to_string(), + _ => unreachable!(), + }; + let _ = socket + .send(Message::Text( + json!({"type":"error","error":error}).to_string().into(), + )) + .await; + return; + } + }; + let epoch = hello.epoch; + if s.stopping.load(Ordering::Acquire) { + drop(registration); + let _ = tokio::task::spawn_blocking(move || s.runtime.owner_detach("main", epoch)).await; + return; + } + let (tx, mut rx) = mpsc::channel::(1024); + let (stop, mut stopped) = watch::channel(None); + let (completed, closed) = watch::channel(false); + let _completion = SocketCompletion(completed); + { + let mut current = s.delivery.client.lock(); + if let Some(old) = current.replace(Client { + epoch, + tx: tx.clone(), + stop: stop.clone(), + closed, + }) { + let _ = old.stop.send(Some("attachment_fenced")); + } + } + drop(registration); + let mut hello = serde_json::to_value(hello).unwrap(); + hello["type"] = json!("hello"); + if socket + .send(Message::Text(hello.to_string().into())) + .await + .is_err() + { + s.runtime.owner_detach("main", epoch); + return; + } + let (mut writer, mut reader) = socket.split(); + let writer_stop = stop.clone(); + let writer_task = tokio::spawn(async move { + loop { + tokio::select! {biased; + changed=stopped.changed()=>{if changed.is_err(){break;}let reason=*stopped.borrow_and_update();if let Some(reason)=reason{let _=tokio::time::timeout(Duration::from_millis(500),writer.send(Message::Text(json!({"type":reason,"epoch":epoch}).to_string().into()))).await;break;}}, + value=rx.recv()=>{let Some(value)=value else{break;};if !matches!(tokio::time::timeout(Duration::from_millis(500),writer.send(Message::Text(value.to_string().into()))).await,Ok(Ok(()))){break;}} + } + } + let _ = tokio::time::timeout(Duration::from_millis(500), writer.close()).await; + writer_stop.send_if_modified(|reason| { + if reason.is_none() { + *reason = Some("disconnected"); + true + } else { + false + } + }); + }); + let limit = Arc::new(Semaphore::new(64)); + let mut reader_stop = stop.subscribe(); + loop { + if reader_stop.borrow().is_some() { + break; + } + let message = + tokio::select! { _=reader_stop.changed()=>break, message=reader.next()=>message }; + let Some(Ok(message)) = message else { + break; + }; + let Message::Text(text) = message else { + if matches!(message, Message::Close(_)) { + break; + } + continue; + }; + let Ok(v) = serde_json::from_str::(&text) else { + break; + }; + let id = v["id"].clone(); + let tx = tx.clone(); + let runtime = s.runtime.clone(); + let host = s.clone(); + let Ok(permit) = limit.clone().try_acquire_owned() else { + let _ = tx + .send(json!({"id":id,"error":"owner_busy","code":"owner_busy"})) + .await; + continue; + }; + tokio::spawn(async move { + let _permit = permit; + let result=tokio::task::spawn_blocking(move||{ + if host.stopping.load(Ordering::Acquire) {return Err("server_stopping".into());} + if v["type"]=="outcome" {return runtime.owner_outcome("main",v["epoch"].as_u64().unwrap_or(0),v["operationId"].as_u64().unwrap_or(0));} + let request=OwnerRequest{name:v["name"].as_str().unwrap_or("").to_owned(),args:v["args"].clone(),meta:serde_json::from_value::(json!({"epoch":v["epoch"],"operationId":v["operationId"],"sequence":v["sequence"]})).map_err(|_|"invalid_owner_request")?}; + if request.meta.epoch!=epoch{return Err("attachment_fenced".into());} + runtime.invoke_owner("main",request) + }).await; + let response = match result { + Ok(Ok(value)) => json!({"id":id,"result":value}), + Ok(Err(error)) => json!({"id":id,"error":error,"code":error}), + Err(_) => json!({"id":id,"error":"outcome_unknown","code":"outcome_unknown"}), + }; + let _ = tx.send(response).await; + }); + } + stop.send_if_modified(|reason| { + if reason.is_none() { + *reason = Some("disconnected"); + true + } else { + false + } + }); + let _ = writer_task.await; + { + let mut client = s.delivery.client.lock(); + if client.as_ref().is_some_and(|c| c.epoch == epoch) { + client.take(); + } + } + let _ = tokio::task::spawn_blocking(move || s.runtime.owner_detach("main", epoch)).await; +} +async fn static_file(State(s): State>, headers: HeaderMap, uri: Uri) -> Response { + if !s.host_valid(&headers) { + return StatusCode::FORBIDDEN.into_response(); + } + if uri.path().starts_with("/api/") { + return StatusCode::NOT_FOUND.into_response(); + } + let Some(root) = s.ui_dir.as_ref() else { + return ( + StatusCode::NOT_FOUND, + "Use the configured development frontend", + ) + .into_response(); + }; + let Ok(path) = percent_encoding::percent_decode_str(uri.path()).decode_utf8() else { + return StatusCode::BAD_REQUEST.into_response(); + }; + let relative = path.trim_start_matches('/'); + if std::path::Path::new(relative) + .components() + .any(|p| !matches!(p, std::path::Component::Normal(_))) + { + return StatusCode::NOT_FOUND.into_response(); + } + let candidate = root.join(if relative.is_empty() { + "index.html" + } else { + relative + }); + let file = if candidate.is_file() { + candidate + } else if std::path::Path::new(relative).extension().is_none() { + root.join("index.html") + } else { + return StatusCode::NOT_FOUND.into_response(); + }; + let Ok(file) = file.canonicalize() else { + return StatusCode::NOT_FOUND.into_response(); + }; + if !file.starts_with(root) { + return StatusCode::NOT_FOUND.into_response(); + } + let Ok(bytes) = tokio::fs::read(&file).await else { + return StatusCode::NOT_FOUND.into_response(); + }; + let mime = match file.extension().and_then(|e| e.to_str()).unwrap_or("") { + "html" => "text/html; charset=utf-8", + "js" | "mjs" => "text/javascript; charset=utf-8", + "css" => "text/css; charset=utf-8", + "json" => "application/json", + "svg" => "image/svg+xml", + "png" => "image/png", + "woff2" => "font/woff2", + _ => "application/octet-stream", + }; + ( + [ + ("content-type", mime), + ("cache-control", "no-cache"), + ("x-content-type-options", "nosniff"), + ], + bytes, + ) + .into_response() +} + +async fn shutdown_signal() { + #[cfg(unix)] + { + if let Ok(mut terminate) = + tokio::signal::unix::signal(tokio::signal::unix::SignalKind::terminate()) + { + tokio::select! {_=tokio::signal::ctrl_c()=>{},_=terminate.recv()=>{}}; + return; + } + } + let _ = tokio::signal::ctrl_c().await; +} diff --git a/crates/web/src/main.rs b/crates/web/src/main.rs new file mode 100644 index 0000000..de8f759 --- /dev/null +++ b/crates/web/src/main.rs @@ -0,0 +1,74 @@ +use clap::{Parser, Subcommand}; +use std::path::PathBuf; +#[derive(Parser)] +#[command(name = "conn-web", version, about = "Conn local web host")] +struct Cli { + #[command(subcommand)] + command: Command, +} +#[derive(Subcommand)] +enum Command { + Serve { + #[arg(long)] + state_dir: Option, + #[arg(long, default_value = "127.0.0.1")] + host: String, + #[arg(long, default_value_t = 1423)] + port: u16, + #[arg(long)] + ui_dir: Option, + #[arg(long)] + dev_origin: Option, + #[arg(long)] + setup_home: Option, + #[arg(long)] + connection_file: Option, + }, + Contract, +} +#[tokio::main] +async fn main() -> Result<(), Box> { + match Cli::parse().command { + Command::Contract => println!( + "{}", + serde_json::to_string_pretty(&conn_frontend::owner::contract())? + ), + Command::Serve { + state_dir, + host, + port, + ui_dir, + dev_origin, + setup_home, + connection_file, + } => { + let state_dir = state_dir.unwrap_or_else(|| { + dirs::config_dir() + .unwrap_or_else(std::env::temp_dir) + .join("conn-web") + }); + let ui_dir = ui_dir.or_else(|| { + std::env::current_exe() + .ok() + .and_then(|p| p.parent().map(|p| p.join("ui"))) + }); + let host = conn_web::WebHost::bind(conn_web::Config { + state_dir, + host, + port, + ui_dir, + dev_origin, + setup_home, + connection_file, + }) + .await?; + println!("Conn web: {}", host.origin()); + println!( + "Owner bootstrap: use the private connection file {}", + host.connection_file().display() + ); + host.serve().await?; + } + } + Ok(()) +} diff --git a/crates/web/tests/owner_lifecycle.rs b/crates/web/tests/owner_lifecycle.rs new file mode 100644 index 0000000..f21b555 --- /dev/null +++ b/crates/web/tests/owner_lifecycle.rs @@ -0,0 +1,538 @@ +#![cfg(unix)] +use base64::Engine as _; +use conn_web::{Config, WebHost}; +use futures_util::{SinkExt, StreamExt}; +use serde_json::{json, Value}; +use std::time::Duration; +use tokio::{ + io::{AsyncReadExt, AsyncWriteExt}, + net::TcpStream, +}; +use tokio_tungstenite::{ + connect_async, + tungstenite::{client::IntoClientRequest, Message}, +}; +type Socket = tokio_tungstenite::WebSocketStream>; + +struct TestServer(std::process::Child); +impl Drop for TestServer { + fn drop(&mut self) { + let _ = self.0.kill(); + let _ = self.0.wait(); + } +} + +#[tokio::test(flavor = "multi_thread")] +async fn sigterm_ends_live_owner_socket_and_shell_without_client_close() { + let dir = tempfile::tempdir().unwrap(); + let state = dir.path().join("state"); + std::fs::create_dir(&state).unwrap(); + let ui = dir.path().join("ui"); + std::fs::create_dir(&ui).unwrap(); + std::fs::write(ui.join("index.html"), "Conn shutdown test").unwrap(); + let pid_file = dir.path().join("shell.pid"); + std::fs::write(state.join("profiles.json"), json!({"version":1,"revision":0,"defaultProfile":"test","profiles":[{"id":"test","name":"Test","program":"/bin/sh","args":[],"shell":"posix","cwd":dir.path()}]}).to_string()).unwrap(); + let mut server = TestServer( + std::process::Command::new(env!("CARGO_BIN_EXE_conn-web")) + .args(["serve", "--port", "0", "--state-dir"]) + .arg(&state) + .arg("--ui-dir") + .arg(ui) + .env("CONN_SHUTDOWN_PID", &pid_file) + .stdin(std::process::Stdio::null()) + .stdout(std::process::Stdio::null()) + .stderr(std::process::Stdio::inherit()) + .spawn() + .unwrap(), + ); + let metadata: Value = tokio::time::timeout(Duration::from_secs(5), async { + loop { + if let Ok(bytes) = std::fs::read(state.join("connection.json")) { + if let Ok(metadata) = serde_json::from_slice(&bytes) { + break metadata; + } + } + assert!( + server.0.try_wait().unwrap().is_none(), + "Server exited before startup" + ); + tokio::time::sleep(Duration::from_millis(10)).await; + } + }) + .await + .unwrap(); + let origin = metadata["url"].as_str().unwrap(); + let cookie = authenticate(origin, metadata["bootstrapToken"].as_str().unwrap()).await; + let (mut socket, hello) = connect(origin, &cookie, false).await; + let epoch = hello["epoch"].as_u64().unwrap(); + let (started, _) = call( + &mut socket, + epoch, + 1, + "start", + json!({"rows":24,"cols":80}), + None, + ) + .await; + let session = started["result"]["session"].clone(); + assert!(session.is_string(), "{started}"); + let (attached, _) = call( + &mut socket, + epoch, + 2, + "attach_output", + json!({"session":session}), + None, + ) + .await; + assert!(attached.get("error").is_none(), "{attached}"); + let (input, _) = call( + &mut socket, + epoch, + 3, + "input", + json!({"session":session,"data":"printf '%s\\n' \"$$\" > \"$CONN_SHUTDOWN_PID\"\r"}), + Some(1), + ) + .await; + assert!(input.get("error").is_none(), "{input}"); + let shell_pid: i32 = tokio::time::timeout(Duration::from_secs(5), async { + loop { + if let Ok(text) = std::fs::read_to_string(&pid_file) { + if let Ok(pid) = text.trim().parse() { + break pid; + } + } + tokio::time::sleep(Duration::from_millis(10)).await; + } + }) + .await + .unwrap(); + assert_eq!( + unsafe { libc::kill(shell_pid, 0) }, + 0, + "PTY shell was not alive before SIGTERM" + ); + assert_eq!( + unsafe { libc::kill(server.0.id() as i32, libc::SIGTERM) }, + 0 + ); + // Keep the owner WebSocket open; the server must initiate termination itself. + let exit = tokio::time::timeout(Duration::from_secs(5), async { + loop { + if let Some(status) = server.0.try_wait().unwrap() { + break status; + } + tokio::time::sleep(Duration::from_millis(10)).await; + } + }) + .await + .expect("Server did not stop while its owner WebSocket stayed open"); + assert!(exit.success(), "{exit}"); + let mut stopping = false; + tokio::time::timeout(Duration::from_secs(2), async { + while let Some(Ok(message)) = socket.next().await { + match message { + Message::Text(text) => { + let value: Value = serde_json::from_str(&text).unwrap(); + stopping |= value["type"] == "server_stopping"; + } + Message::Close(_) => break, + _ => {} + } + } + }) + .await + .unwrap(); + assert!(stopping, "Server closed the owner without a stopping event"); + tokio::time::timeout(Duration::from_secs(2), async { + while unsafe { libc::kill(shell_pid, 0) } == 0 { + tokio::time::sleep(Duration::from_millis(10)).await; + } + }) + .await + .expect("PTY shell survived its server"); +} +async fn http_get(origin: &str, path: &str, host: Option<&str>) -> String { + let addr = origin.trim_start_matches("http://"); + let mut tcp = TcpStream::connect(addr).await.unwrap(); + tcp.write_all( + format!( + "GET {path} HTTP/1.1\r\nHost: {}\r\nConnection: close\r\n\r\n", + host.unwrap_or(addr) + ) + .as_bytes(), + ) + .await + .unwrap(); + let mut out = Vec::new(); + tcp.read_to_end(&mut out).await.unwrap(); + String::from_utf8(out).unwrap() +} +async fn authenticate(origin: &str, token: &str) -> String { + let addr = origin.trim_start_matches("http://"); + let mut tcp = TcpStream::connect(addr).await.unwrap(); + let body = json!({"token":token}).to_string(); + let req=format!("POST /api/bootstrap HTTP/1.1\r\nHost: {addr}\r\nOrigin: {origin}\r\nContent-Type: application/json\r\nContent-Length: {}\r\nConnection: close\r\n\r\n{body}",body.len()); + tcp.write_all(req.as_bytes()).await.unwrap(); + let mut out = Vec::new(); + tcp.read_to_end(&mut out).await.unwrap(); + let response = String::from_utf8(out).unwrap(); + assert!(response.starts_with("HTTP/1.1 200"), "{response}"); + response + .lines() + .find_map(|line| line.strip_prefix("set-cookie: ")) + .unwrap() + .split(';') + .next() + .unwrap() + .into() +} +async fn connect(origin: &str, cookie: &str, takeover: bool) -> (Socket, Value) { + let mut request = format!("{}/api/ws", origin.replace("http:", "ws:")) + .into_client_request() + .unwrap(); + request + .headers_mut() + .insert("origin", origin.parse().unwrap()); + request + .headers_mut() + .insert("cookie", cookie.parse().unwrap()); + let (mut socket, _) = connect_async(request).await.unwrap(); + socket + .send(Message::Text( + json!({"type":"hello","protocol":1,"takeover":takeover}) + .to_string() + .into(), + )) + .await + .unwrap(); + let hello = receive(&mut socket).await; + (socket, hello) +} +async fn receive(socket: &mut Socket) -> Value { + loop { + let message = tokio::time::timeout(Duration::from_secs(5), socket.next()) + .await + .unwrap() + .unwrap() + .unwrap(); + if let Message::Text(text) = message { + return serde_json::from_str(&text).unwrap(); + } + } +} +async fn call( + socket: &mut Socket, + epoch: u64, + id: u64, + name: &str, + args: Value, + sequence: Option, +) -> (Value, Vec) { + socket.send(Message::Text(json!({"id":id,"operationId":id,"epoch":epoch,"name":name,"args":args,"sequence":sequence}).to_string().into())).await.unwrap(); + let mut events = Vec::new(); + loop { + let v = receive(socket).await; + if v["id"] == id { + return (v, events); + } + events.push(v); + } +} +#[tokio::test(flavor = "multi_thread")] +async fn reload_and_explicit_handoff_keep_shell_but_fence_old_attachment() { + let dir = tempfile::tempdir().unwrap(); + let ui = dir.path().join("ui"); + std::fs::create_dir(&ui).unwrap(); + std::fs::write(ui.join("index.html"), "Conn test").unwrap(); + let state = dir.path().join("state"); + std::fs::create_dir(&state).unwrap(); + std::fs::write(state.join("profiles.json"),json!({"version":1,"revision":0,"defaultProfile":"test","profiles":[{"id":"test","name":"Test","program":"/bin/sh","args":[],"shell":"posix","cwd":dir.path()}]}).to_string()).unwrap(); + let host = WebHost::bind(Config { + state_dir: state, + host: "127.0.0.1".into(), + port: 0, + ui_dir: Some(ui), + dev_origin: None, + setup_home: Some(dir.path().join("clients")), + connection_file: None, + }) + .await + .unwrap(); + let origin = host.origin().to_owned(); + let runtime = host.runtime(); + let metadata: Value = + serde_json::from_slice(&std::fs::read(host.connection_file()).unwrap()).unwrap(); + let serve = tokio::spawn(host.serve()); + let page = http_get(&origin, "/", None).await; + assert!(page.starts_with("HTTP/1.1 200") && page.contains("Conn test")); + assert!(http_get(&origin, "/", Some("attacker.invalid")) + .await + .starts_with("HTTP/1.1 403")); + assert!(http_get(&origin, "/%2e%2e/connection.json", None) + .await + .starts_with("HTTP/1.1 404")); + let mut unauth = format!("{}/api/ws", origin.replace("http:", "ws:")) + .into_client_request() + .unwrap(); + unauth + .headers_mut() + .insert("origin", origin.parse().unwrap()); + assert!(connect_async(unauth).await.is_err()); + let cookie = authenticate(&origin, metadata["bootstrapToken"].as_str().unwrap()).await; + let mut bad_origin = format!("{}/api/ws", origin.replace("http:", "ws:")) + .into_client_request() + .unwrap(); + bad_origin + .headers_mut() + .insert("origin", "http://attacker.invalid".parse().unwrap()); + bad_origin + .headers_mut() + .insert("cookie", cookie.parse().unwrap()); + assert!(connect_async(bad_origin).await.is_err()); + let mut old_query = format!( + "{}/api/ws?token=not-accepted", + origin.replace("http:", "ws:") + ) + .into_client_request() + .unwrap(); + old_query + .headers_mut() + .insert("origin", origin.parse().unwrap()); + old_query + .headers_mut() + .insert("cookie", cookie.parse().unwrap()); + assert!(connect_async(old_query).await.is_err()); + + let (mut first, hello) = connect(&origin, &cookie, false).await; + assert_eq!(hello["type"], "hello"); + let epoch = hello["epoch"].as_u64().unwrap(); + let (start, _) = call( + &mut first, + epoch, + 1, + "start", + json!({"rows":24,"cols":80}), + None, + ) + .await; + assert!(start.get("error").is_none(), "{start}"); + let id = start["result"]["session"].clone(); + let (attached, frames) = call( + &mut first, + epoch, + 2, + "attach_output", + json!({"session":id}), + None, + ) + .await; + assert!(attached.get("error").is_none(), "{attached}"); + assert!( + frames.iter().any(|v| v["payload"]["reset"] == true), + "{frames:?}" + ); + let (input, _) = call( + &mut first, + epoch, + 3, + "input", + json!({"session":id,"data":"CONN_REATTACH=kept; printf 'BEFORE_RELOAD\\n'\r"}), + Some(1), + ) + .await; + assert!(input.get("error").is_none()); + tokio::time::sleep(Duration::from_millis(100)).await; + // A real blocking connection check must not stall owner input or PTY events. + let delayed = tokio::net::TcpListener::bind("127.0.0.1:0").await.unwrap(); + let slow_port = delayed.local_addr().unwrap().port(); + let (accepted, ready) = tokio::sync::oneshot::channel(); + let (release, hold) = tokio::sync::oneshot::channel(); + let peer = tokio::spawn(async move { + let (mut socket, _) = delayed.accept().await.unwrap(); + let mut bytes = [0; 256]; + let _ = socket.read(&mut bytes).await; + let _ = accepted.send(()); + let _ = hold.await; + }); + first.send(Message::Text(json!({"id":10,"operationId":10,"epoch":epoch,"name":"profiles_test","args":{"profile":{"id":"slow","name":"Slow loopback greeting","backend":"ssh","target":"127.0.0.1","port":slow_port}}}).to_string().into())).await.unwrap(); + tokio::time::timeout(Duration::from_secs(5), ready) + .await + .unwrap() + .unwrap(); + let (input, events) = call( + &mut first, + epoch, + 11, + "input", + json!({"session":id,"data":"printf 'INPUT_WHILE_PROFILE_PENDING\\n'\r"}), + Some(2), + ) + .await; + assert!(input.get("error").is_none(), "{input}"); + assert!(!events.iter().any(|v| v["id"] == 10)); + let mut live = events + .iter() + .filter_map(|v| v["payload"]["data"].as_str()) + .flat_map(|data| { + base64::engine::general_purpose::STANDARD + .decode(data) + .unwrap_or_default() + }) + .collect::>(); + while !String::from_utf8_lossy(&live).contains("INPUT_WHILE_PROFILE_PENDING\r\n") { + let event = receive(&mut first).await; + assert_ne!(event["id"], 10); + if let Some(data) = event["payload"]["data"].as_str() { + live.extend( + base64::engine::general_purpose::STANDARD + .decode(data) + .unwrap(), + ); + } + } + release.send(()).unwrap(); + peer.await.unwrap(); + loop { + if receive(&mut first).await["id"] == 10 { + break; + } + } + + let (mut duplicate, rejected) = connect(&origin, &cookie, false).await; + assert_eq!(rejected["error"], "owner_attached"); + let _ = duplicate.close(None).await; + let (mut second, next) = connect(&origin, &cookie, true).await; + let epoch2 = next["epoch"].as_u64().unwrap(); + assert!(epoch2 > epoch); + assert_eq!(hello["runtimeId"], next["runtimeId"]); + let (start, _) = call( + &mut second, + epoch2, + 1, + "start", + json!({"rows":24,"cols":80}), + None, + ) + .await; + assert_eq!(start["result"]["session"], id); + let (_, frames) = call( + &mut second, + epoch2, + 2, + "attach_output", + json!({"session":id}), + None, + ) + .await; + let checkpoint = frames + .iter() + .find(|v| v["payload"]["reset"] == true) + .unwrap(); + assert_eq!(checkpoint["payload"]["epoch"], epoch2); + let (old, _) = call( + &mut second, + epoch, + 3, + "input", + json!({"session":id,"data":"BAD\r"}), + Some(2), + ) + .await; + assert_eq!(old["error"], "attachment_fenced"); + let _ = first.close(None).await; + let (input, events) = call( + &mut second, + epoch2, + 3, + "input", + json!({"session":id,"data":"printf 'AFTER_%s\\n' \"$CONN_REATTACH\"\r"}), + Some(1), + ) + .await; + assert!(input.get("error").is_none()); + // The output bytes are real PTY frames. Retained shell state proves no new process was spawned. + let mut bytes = Vec::new(); + for event in events { + if event["event"] == "ss:output" { + bytes.extend( + base64::engine::general_purpose::STANDARD + .decode(event["payload"]["data"].as_str().unwrap()) + .unwrap(), + ); + } + } + for _ in 0..20 { + if String::from_utf8_lossy(&bytes).contains("AFTER_kept") { + break; + } + let event = receive(&mut second).await; + if event["event"] == "ss:output" { + bytes.extend( + base64::engine::general_purpose::STANDARD + .decode(event["payload"]["data"].as_str().unwrap()) + .unwrap(), + ); + } + } + assert!( + String::from_utf8_lossy(&bytes).contains("AFTER_kept"), + "{bytes:?}" + ); + let _ = second.close(None).await; + tokio::time::sleep(Duration::from_millis(80)).await; + let (mut third, resumed) = connect(&origin, &cookie, false).await; + assert_eq!(resumed["type"], "hello"); + let epoch3 = resumed["epoch"].as_u64().unwrap(); + let (start, _) = call( + &mut third, + epoch3, + 1, + "start", + json!({"rows":24,"cols":80}), + None, + ) + .await; + assert_eq!(start["result"]["session"], id); + let _ = third.close(None).await; + // Competing explicit takeovers must install delivery for the newest epoch. + // Neither an older registration nor its late disconnect may detach the winner. + for _ in 0..8 { + let ((mut left, a), (mut right, b)) = tokio::join!( + connect(&origin, &cookie, true), + connect(&origin, &cookie, true) + ); + let newest = a["epoch"] + .as_u64() + .unwrap() + .max(b["epoch"].as_u64().unwrap()); + let (winner, loser) = if a["epoch"].as_u64().unwrap() == newest { + (&mut left, &mut right) + } else { + (&mut right, &mut left) + }; + let _ = loser.close(None).await; + let (response, frames) = call( + winner, + newest, + 1, + "attach_output", + json!({"session":id}), + None, + ) + .await; + assert!(response.get("error").is_none(), "{response}"); + assert!( + frames + .iter() + .any(|v| v["payload"]["reset"] == true && v["payload"]["epoch"] == newest), + "{frames:?}" + ); + let _ = winner.close(None).await; + } + tokio::task::spawn_blocking(move || runtime.shutdown()) + .await + .unwrap(); + serve.abort(); +} diff --git a/docs/PRD.ko.md b/docs/PRD.ko.md index d8f15f5..60e5e30 100644 --- a/docs/PRD.ko.md +++ b/docs/PRD.ko.md @@ -5,6 +5,30 @@ Conn은 사람과 에이전트가 같은 터미널 화면을 보고 제어권을 교환하는 앱입니다. 사람이 경로를 고치거나 암호를 입력한 뒤, 같은 셸에서 협업을 이어갑니다. +## 사람이 관리할 수 있는 협업 — 제품 불변식 + +Conn의 핵심 가치는 사람과 에이전트가 공유하는 실제 PTY에서 에이전트의 활동을 +사람이 이해하고 효과적으로 관리할 수 있게 하는 UX와 어포던스입니다. + +> 사용자는 내부 권한 구조를 외우지 않고도, 에이전트가 지금 무엇을 할 수 있는지와 +> 이번 선택으로 무엇이 달라지는지 이해할 수 있어야 합니다. +> 반복되는 요청이 무심코 승인하는 습관을 만들어서는 안 됩니다. + +- 현재 에이전트·대상 셸·활동 상태와 제어권 회수 방법을 찾을 수 있어야 합니다. +- 같은 판단은 같은 구조로 표시하고, 다른 권한은 제목·범위·행동 문구로 구별합니다. + 색상이나 펼치기 유무만으로 차이를 전달하지 않습니다. +- 이미 허용된 범위의 작업은 이어집니다. 새 판단 요청은 이전 허용과 달라지는 점을 + 설명합니다. 반복을 줄이려고 명령 검토를 생략하거나 권한을 묵시적으로 확대하지 않습니다. +- 연결 승인·참여·제어권·명령 검토는 내부에서 분리하되 하나의 협업 흐름으로 경험하게 합니다. +- 알림은 요청을 찾게 하고, 승인 화면은 판단하게 합니다. 알림 클릭은 권한을 주지 않습니다. +- 승인 중 대상·범위·버튼이 늦은 상태 조회 때문에 바뀌지 않습니다. 실제 조건 변경은 + 이유를 표시하고 오래된 선택이 실행되지 않게 합니다. +- 현재의 시각 효과와 공간을 여는 모션을 유지하되, 반복 강조로 의미를 무디게 만들거나 + 터미널의 입력·크기·포커스를 흔들어서는 안 됩니다. + +이는 2026-09-23에 확정한 설계·리뷰 기준입니다. 현 구현이 모두 충족한다는 뜻은 아닙니다. +[제어 경험 감사와 설계 제안](control-experience.ko.md)을 참고하세요. + ## 핵심 계약 - 세션은 PTY·프로세스, 화면은 현재 터미널 그리드, 액터는 개별 연결 신원을 담당합니다. diff --git a/docs/PRD.md b/docs/PRD.md index 11d518e..914f035 100644 --- a/docs/PRD.md +++ b/docs/PRD.md @@ -13,6 +13,33 @@ request, work together. Settings use progressive disclosure; English and Korean share the same components and motion. Extensions support this path without turning the terminal into a configuration dashboard. +## Human-manageable collaboration — product invariant + +Conn's core value is the UX and affordances that let a person understand and +effectively manage an agent working in their shared, real PTY. + +> People must understand what an agent can do now and what their next choice +> changes without memorizing the internal permission model. Repeated requests +> must not train people to approve without thinking. + +- Make the current agent, target shell, activity and way to reclaim input control discoverable. +- Present the same decision consistently; distinguish different permissions through + titles, scope and action labels, never through color or disclosure alone. +- Work within an existing grant continues. A new decision explains what differs + from the previous grant. Reducing repetition must not bypass command review or + silently broaden permission. +- Keep admission, participation, control and command review separate internally, + while presenting a coherent collaboration flow. +- Notifications locate requests; decision surfaces explain choices. Opening a + notification never grants permission. +- Delayed status updates must not change a pending decision's target, scope or + available actions. Explain genuine condition changes and reject stale choices. +- Preserve Conn's visual effects and space-opening motion without repetitive + emphasis that dulls meaning or disrupts terminal input, geometry or focus. + +Established 2026-09-23 as a design and review requirement, not a claim that all +current behavior complies. See the [control experience audit and proposal](control-experience.md). + ## Responsibilities | Concept | Owns | diff --git a/docs/UX-MOTION.md b/docs/UX-MOTION.md index 89455a0..9d677d9 100644 --- a/docs/UX-MOTION.md +++ b/docs/UX-MOTION.md @@ -5,6 +5,31 @@ Supporting UI makes room for the terminal instead of covering its working area. 보조 UI는 터미널 작업 영역 위를 덮는 대신 필요한 공간을 열고, 닫힐 때 돌려준다. +Motion serves the [human-manageable collaboration invariant](PRD.md#human-manageable-collaboration--product-invariant). +움직임은 [사람이 관리할 수 있는 협업 불변식](PRD.ko.md)을 따른다. +Preserve the existing visual language; make a new decision distinguishable by its +meaning, scope and action, not by giving every request a different animation. +기존 시각 언어는 유지한다. 새 판단은 의미·범위·행동으로 구별하며 요청마다 다른 애니메이션을 만들지 않는다. +The [control experience proposal](control-experience.md) defines notification, +decision and persistent-status roles; those proposed changes are not implemented yet. +[제어 경험 제안](control-experience.ko.md)은 알림·판단·상시 상태의 역할을 정하며 아직 구현되지 않았다. + +## Control-request direction / 제어권 요청 방향 (proposed / 구현 전) + +The existing top-right Conn badge expands into the control request and returns to +its source when collapsed, following the continuity of +[Morphing Dialog](https://motion-primitives.com/docs/morphing-dialog). +오른쪽 Conn 뱃지가 제어권 요청으로 확장되고 접으면 원래 자리로 돌아온다. +위치·크기·모서리의 연속성을 참고하며 액체 모양이나 연결 줄기를 그리지 않는다. +Command review keeps the bottom dock. Consistency means predictable motion for +the same decision, while different decisions remain distinguishable. +명령 실행 승인은 기존 하단 도크를 유지한다. 같은 판단은 같은 움직임으로, 다른 판단은 구별되게 표현한다. +Dismissal is not denial; unresolved requests remain in the badge. The prototype +must settle modality, placement, keyboard focus and reduced motion without using +animation geometry as a stream of PTY resize events. +접기는 거절이 아니며 미해결 요청은 뱃지에 남는다. 모달 여부·위치·키보드 포커스·동작 줄이기는 +프로토타입에서 검증하고, 시각적 크기 변화를 연속 PTY 리사이즈로 전달하지 않는다. + ## Shared behavior / 공통 동작 - The handback hint and timeline use the same bottom-dock motion. @@ -28,7 +53,7 @@ Supporting UI makes room for the terminal instead of covering its working area. ## Implementation / 구현 -Shared tokens and surface transition: `frontends/tauri/src/lib/motion.ts`. +Shared tokens and surface transition: `packages/ui/src/lib/motion.ts`. Dock geometry: `App.svelte`. Terminal visual offset: `components/Term.svelte`. This is a product motion convention, not a claim that hardware acceleration is enabled on every device. diff --git a/docs/architecture.ko.md b/docs/architecture.ko.md index 3f8b216..214da1a 100644 --- a/docs/architecture.ko.md +++ b/docs/architecture.ko.md @@ -1,10 +1,13 @@ # 구조 -**공유 세션 화면 · v0.8.0 프리뷰.** [제품 계약](PRD.ko.md) · [English](architecture.md) +**공유 세션 화면 · 미배포 리팩터링.** [제품 계약](PRD.ko.md) · [English](architecture.md) + +공통 UI와 로컬 웹 호스트를 워크스페이스 패키지로 구현했습니다. +[경계 설계](web-harness-design.ko.md)와 [운영·검증 안내](browser-testing.ko.md)를 함께 참고하세요. ```mermaid flowchart LR - H[사람] --> U[네이티브 소유자 UI] + H[사람] --> U[공통 ConnApp UI] U -->|입력과 결정| S[세션 제어권과 정책] S --> P[PTY와 자식 프로세스] P -->|순서가 매겨진 출력| U @@ -25,7 +28,7 @@ flowchart LR 공유 전환을 하나의 잠금 아래에서 순서대로 처리합니다. - 네이티브 소유자는 PTY 읽기가 시작되기 전에 순서가 매겨진 출력 콜백을 등록합니다. 출력 버퍼링이 시작 화면의 렌더링을 보존하며, 콜백은 세션을 다시 잠그지 않습니다. -- Tauri와, 토큰·Origin으로 보호되는 브라우저 하네스는 같은 `conn-frontend::Harness`를 씁니다. +- Tauri와, 쿠키·Origin으로 보호되는 웹 호스트는 같은 `conn-frontend::AppRuntime`를 씁니다. 각 명령에는 어댑터가 확인한 소유 창이 붙으며, 공개 호출자가 주장하는 창 신원은 쓰지 않습니다. - Svelte/xterm 렌더러는 출력을 보여 줄 뿐 관찰을 허가하지 않습니다. 코어 스냅샷에는 스크롤백과 숨겨진 셀이 들어가지 않습니다. @@ -83,3 +86,11 @@ UI의 앱 연결 계약과 세션 이벤트 계약은 분리됩니다. 공통 확장 호스트는 PTY나 소유자 경로를 받지 않습니다. [확장 계약](extensions.ko.md), [프로토콜](protocol.md), [신뢰 모델](security.md)을 참고하세요. + +## 공통 UI와 소유자 화면 연결 + +`packages/ui`는 앱별 Svelte 룬 상태, 액션, 구독, 타이머와 터미널 렌더러를 소유합니다. 각 ConnApp은 호스트 포트를 받으며 네이티브·웹 진입점에는 별도 승인 UI가 없습니다. `crates/frontend::AppRuntime`은 명령 처리, 세션별 입력·크기 변경 순서와 화면 연결 epoch를 소유합니다. 생성한 TypeScript DTO가 Rust 소유자 전송 계약을 따릅니다. + +웹 서버의 프로세스 수명은 WebSocket과 독립적입니다. 새로고침은 같은 셸에 새 화면을 연결하고, 소유자 전용 체크포인트 뒤에 순번이 있는 출력을 이어받습니다. 같은 셸 묶음의 입력과 크기는 활성 소유자 화면 하나가 결정하며 명시적 인계는 이전 화면을 차단합니다. 과거 입력을 자동 재전송하지 않습니다. 출력 누락 시 재동기화까지 입력을 멈춥니다. 에이전트 스냅샷은 허용된 현재 그리드이며 렌더러 체크포인트를 에이전트 API로 제공하지 않습니다. + +현재 패키지는 루프백만 지원합니다. 원격 배포·인증은 후속 범위이며 별도로 실행한 데스크톱 앱을 미러링하지 않습니다. 네이티브 알림과 플랫폼 업데이트는 호스트 기능으로 남습니다. diff --git a/docs/architecture.md b/docs/architecture.md index 89fe1a6..dfd961f 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -1,10 +1,13 @@ # Architecture -**Shared session screen · v0.8.0 preview.** [Product contract](PRD.md) · [한국어](architecture.ko.md) +**Shared session screen · unreleased refactor.** [Product contract](PRD.md) · [한국어](architecture.ko.md) + +The common UI and local web host are implemented as workspace packages. +See the [boundary design](web-harness-design.md) and [operation/validation guide](browser-testing.md). ```mermaid flowchart LR - H[Human] --> U[Native owner UI] + H[Human] --> U[Common ConnApp UI] U -->|input and decisions| S[Session authority and policy] S --> P[PTY and child] P -->|sequenced output| U @@ -21,7 +24,7 @@ flowchart LR mode, policy, proposals, grace and sharing transitions under one lock. - The native owner supplies a sequenced output callback before PTY reading begins. Output buffering preserves startup rendering; callbacks never relock Session. -- Tauri and the token/Origin-protected browser harness use `conn-frontend::Harness`. +- Tauri and the cookie/Origin-protected web host use `conn-frontend::AppRuntime`. Each command carries the adapter-established owning window, never a public caller's claimed window identity. - The Svelte/xterm renderer displays output; it does not authorize observation. @@ -78,3 +81,11 @@ Themes are bounded data; arbitrary code and global event buses are not extension contracts. The selected theme and installed themes persist in `extensions.json`. See [extension contract](extensions.md), [protocol](protocol.md) and [trust model](security.md). + +## Shared UI and owner attachment + +`packages/ui` owns app-scoped Svelte runes, actions, subscriptions, timers and the terminal renderer. Each mounted ConnApp receives host ports; native and web entry points have no separate decision UI. `crates/frontend::AppRuntime` owns command dispatch, per-session input/resize order and renderer attachment epochs. Generated TypeScript DTOs track the Rust owner wire contract. + +The web server owns process lifetime independently of a WebSocket. Reload attaches a new renderer to the existing shells using an owner-only checkpoint, followed by sequenced deltas. One active human view supplies input and dimensions per shell set; explicit takeover fences the old view. Old input is never automatically replayed. Output gaps stop input until resynchronization. Agent snapshots remain the authorized current grid; renderer checkpoints are not agent APIs. + +The current package is loopback-only. Remote deployment/authentication remains future work; the package does not mirror a separately running desktop instance. Native attention and platform updates remain host capabilities. diff --git a/docs/automation-design.ko.md b/docs/automation-design.ko.md index 77c71f6..e20f707 100644 --- a/docs/automation-design.ko.md +++ b/docs/automation-design.ko.md @@ -299,7 +299,7 @@ SSH·tmux 터미널 상태만으로 내부 암호 입력을 구분할 수 없습 - [엔진](../crates/core/src/engine.rs)·[백엔드](../crates/core/src/backend.rs): 직접 실행 명세와 저장된 프로필·시작 로그 분리. - [세션](../crates/core/src/session.rs)·[IPC](../crates/core/src/ipc.rs): 입력 출처, 소유권·입력 중재, 기록·AI 접근 제한. - [macOS 어댑터](../frontends/tauri/src-tauri/src/macos.rs)·[사전](../frontends/tauri/src-tauri/Conn.sdef): 문법 호환과 원문 없는 오류. -- [UI](../frontends/tauri/src/App.svelte)·[타임라인](../frontends/tauri/src/lib/timeline.ts): 고정 제목, 자동화 카드·저장 제거, 비공유 상태 번역. +- [UI](../packages/ui/src/ConnApp.svelte)·[타임라인](../packages/ui/src/lib/timeline.ts): 고정 제목, 자동화 카드·저장 제거, 비공유 상태 번역. - 사용법·보안 모델·아키텍처·예제도 미배포 구현에 맞춰 수정했습니다. macOS 실기 검증은 배포 전에 별도로 통과해야 합니다. diff --git a/docs/automation-design.md b/docs/automation-design.md index 55fa60f..349d277 100644 --- a/docs/automation-design.md +++ b/docs/automation-design.md @@ -334,7 +334,7 @@ categories or real deployment details. Use synthetic examples only. source, ownership arbitration, no private history and agent visibility gates. - [Native adapter](../frontends/tauri/src-tauri/src/macos.rs) and [dictionary](../frontends/tauri/src-tauri/Conn.sdef): argument compatibility and generic errors. -- [UI](../frontends/tauri/src/App.svelte) and [timeline](../frontends/tauri/src/lib/timeline.ts): +- [UI](../packages/ui/src/ConnApp.svelte) and [timeline](../packages/ui/src/lib/timeline.ts): stable labels, no automation cards or persistence, localized private-session state. - Automation guides, security model, architecture and examples describe the unreleased replacement. Native macOS acceptance remains a release gate. diff --git a/docs/browser-testing.ko.md b/docs/browser-testing.ko.md new file mode 100644 index 0000000..064179e --- /dev/null +++ b/docs/browser-testing.ko.md @@ -0,0 +1,93 @@ +# Conn 웹 호스트와 브라우저 검증 + +[English](browser-testing.md) · [아키텍처](architecture.ko.md) · [경계 설계](web-harness-design.ko.md) + +웹 프런트엔드는 모노레포의 `@conn/web` 패키지입니다. 네이티브 앱과 같은 `@conn/ui`의 ConnApp, 컴포넌트, 룬 상태, 터미널 큐와 협업 액션을 사용합니다. `conn-web`과 Tauri는 같은 Rust `AppRuntime`을 호출합니다. 호스트 전송, 네이티브 알림, 링크 열기와 업데이트 기능만 어댑터가 담당합니다. + +## 로컬 실행 + +저장소 루트에서 고정된 Rust 도구 체인과 Node 24 이상으로 실행합니다. + +```sh +npm ci +npm run dev:web +``` + +`http://127.0.0.1:1429`를 열고 서버가 출력한 비공개 연결 파일의 `bootstrapToken`을 입력합니다. 브라우저는 HttpOnly·SameSite 쿠키로 연결을 기억합니다. 토큰을 WebSocket 쿼리나 localStorage에 저장하지 않습니다. 개발 실행기는 `conn-web`과 같은 소스의 MCP 실행 파일 `conn`을 함께 빌드합니다. + +기본 상태 폴더는 `~/.config/conn-web-dev`이며 `CONN_WEB_STATE`로 변경합니다. 프런트엔드·백엔드 포트는 1429·1430이며 `CONN_WEB_PORT`, `CONN_WEB_BACKEND_PORT`로 바꿉니다. `CONN_WEB_SETUP_HOME`은 실험용 에이전트 설정 파일의 저장 위치를 분리합니다. + +MCP 클라이언트에는 같은 버전의 실행 파일과 연결 파일에 기록된 `agentSocket`을 사용합니다. + +```sh +target/debug/conn --socket /path/to/state/conn.sock mcp --agent-id your-agent +``` + +여러 단계의 작업 동안 MCP 프로세스를 유지해야 합니다. 새 프로세스는 새 연결이며 다시 연결 승인을 받습니다. 소유자 연결 코드는 에이전트 접속 정보와 다릅니다. + +## 빌드된 패키지 운영 + +[릴리스 다운로드](https://github.com/eggp-dev/conn/releases)에 Linux x64 독립 웹 압축 파일을 제공합니다. 압축을 풀고 아래 실행 명령을 사용하면 됩니다. 다른 대상이나 개발용 빌드에만 개발 도구가 필요합니다. 서버·MCP CLI·UI·소스 매니페스트·라이선스·체크섬을 함께 제공합니다. + +```sh +npm run package:web +``` + +출력된 폴더에는 `conn-web`, 같은 빌드의 `conn`, `ui/`, 매니페스트, 체크섬과 시작 안내가 들어갑니다. Node와 Vite는 빌드할 때만 필요합니다. + +```sh +./conn-web serve --state-dir /path/to/conn-state --port 1423 +``` + +셸은 서버를 실행한 사용자 권한으로 동작합니다. 첫 구현은 루프백 연결만 지원합니다. 원격 운영을 확장할 어댑터 경계는 있지만 원격 인증·TLS·배포·다중 사용자 운영까지 구현된 것은 아닙니다. + +## 수명과 제어 + +- PTY는 서버 프로세스가 소유합니다. 브라우저를 새로고침하거나 연결을 끊어도 실행 중인 셸을 유지합니다. 서버를 종료하면 셸도 끝나며 서버 재시작은 셸 복구가 아닙니다. +- 같은 셸 묶음에서 입력·크기를 결정하는 사람의 화면은 하나입니다. 두 번째 화면에서 명시적으로 이어가면 이전 화면의 입력이 중지됩니다. 에이전트 권한은 부여하지 않습니다. +- 화면은 체크포인트를 먼저 파싱하고 순번이 붙은 출력을 이어받습니다. 복원이 끝나기 전에는 입력할 수 없습니다. 출력이 누락되면 다시 복원하며 사용자 입력을 재전송하지 않습니다. +- 입력·터미널 응답·크기 변경은 두 클라이언트와 Rust 소유자에서 같은 세션별 순서를 지킵니다. 느린 다른 작업은 터미널 전달을 직렬화하지 않습니다. +- 연결 승인·선택한 세션 공유·제어권·명령 승인은 구분합니다. 같은 이름의 새 에이전트 연결이 이전 권한을 상속하지 않습니다. + +## 검증 재현 + +```sh +cargo test --locked +cargo build --locked -p conn-web -p conn +npm run build:web +npm run test:ui +npm run test:screen -w @conn/ui +npm run test:checkpoint -w @conn/ui +npm run test:app-lifetime -w @conn/ui +npm run test:collaboration +node scripts/generate-owner-contract.mjs --check +node scripts/check-ui-boundaries.mjs +``` + +Chromium이 없으면 먼저 `npm exec -w @conn/collaboration-tests -- playwright install chromium`을 실행합니다. 협업 검사는 임시 포트에서 프로덕션 웹 번들과 실제 Rust 백엔드를 실행하고, 지속 연결한 실제 MCP 프로세스와 소유자 화면의 클릭·키 입력으로 진행합니다. 앱 내부 상태를 가져오거나 승인 화면을 합성하지 않습니다. 증거는 출력된 임시 폴더에 저장합니다. + +앱 수명 검사는 실제 ConnApp을 통제된 호스트 포트와 함께 여러 개 마운트해 격리·실패·정리를 확인하는 별도 검사입니다. 실제 셸이나 네이티브 IPC의 증거는 아닙니다. 파서·체크포인트 검사는 실제 Rust 모델과 설치된 xterm을 비교하지만 모든 터미널 확장의 호환성을 의미하지는 않습니다. + +## SSH 입력·커서·승인 회귀 검사 + +```sh +npm run test:input -w @conn/collaboration-tests +``` + +기본값은 로컬 Bash PTY입니다. 폐기 가능한 SSH 픽스처를 시험하려면 `CONN_AUTH_FIXTURE_RUNTIME`을 `.runtime` 폴더로 지정합니다. 합성 암호와 고정한 호스트 키를 사용하는 픽스처가 `127.0.0.1:22222`에서 실행 중이어야 합니다. 인증도 화면에 보이는 PTY로 입력하며 실제 MCP·프로덕션 UI·Rust 호스트를 사용합니다. 화면 행·커서 비교와 스크린샷은 저장소 밖에 남깁니다. + +macOS 등에서 계정을 새로 만들지 않고 시험하려면 폐기 가능한 키 인증 OpenSSH 픽스처의 클라이언트 설정을 지정할 수 있습니다. + +```sh +CONN_SSH_FIXTURE_CONFIG=/path/to/disposable/client.conf \ + npm run test:input -w @conn/collaboration-tests +``` + +이 설정에는 `validation-host` 별칭, 루프백 주소, 시험 포트, 폐기 가능한 키와 고정한 호스트 키가 있어야 합니다. 원격 셸은 `remote$` 프롬프트를 제공해야 합니다. 스크립트가 `ssh -F validation-host`를 화면으로 실행하며, 종료 후 로컬 셸 복귀까지 검사합니다. 실제 계정의 키·SSH 설정을 사용하거나 바꾸지 마세요. 설정 경로에는 영문·숫자·`_./-`만 허용합니다. 두 픽스처 변수를 함께 지정하면 키 인증 설정을 우선합니다. + +브라우저 결과는 실행한 운영체제의 Chromium 증거입니다. macOS WebKit·네이티브 운영체제 알림·설치·배포 완료를 입증하지 않습니다. 이번 [공통 런타임 macOS 실기 결과](shared-runtime-macos-validation-results.ko.md)와 이전 [SSH 입력 검증 기록](ssh-input-review-results.ko.md)은 별도로 구분합니다. + + +같은 SSH 픽스처에 복합 명령으로 진입하려면 입력 검사 명령에 `CONN_SSH_COMPOUND_ENTRY=1`을 추가한다. 한글 검사는 원격 UTF-8 로케일(예: `LC_ALL=C.UTF-8`)이 필요하다. 사용자 서버가 아닌 폐기 가능한 픽스처에만 설정한다. + +빌드된 배포 파일 자체를 검사하려면 `CONN_TEST_WEB_BUNDLE=/path/to/conn-web-0.8.7-linux-x64 npm run test:collaboration`을 실행한다. 구성 요소를 다시 빌드하지 않으며, 별도 상태 디렉터리에서 묶음의 실제 UI·서버·지속 MCP CLI를 사용한다. diff --git a/docs/browser-testing.md b/docs/browser-testing.md index af1f621..9dae355 100644 --- a/docs/browser-testing.md +++ b/docs/browser-testing.md @@ -1,118 +1,82 @@ -# Browser testing with the native backend +# Conn web host and browser validation -Run from `frontends/tauri`: +[한국어](browser-testing.ko.md) · [Architecture](architecture.md) · [Boundary design](web-harness-design.md) + +The web frontend is a workspace package, `@conn/web`. It mounts the same `@conn/ui` ConnApp, components, runes, terminal queues and collaboration actions as the native app. `conn-web` and Tauri call the same Rust `AppRuntime`. Only host transport, native attention, links and updates differ. + +## Run locally + +From the repository root, with the pinned Rust toolchain and Node 24 or newer: ```sh npm ci -npm run test:browser +npm run dev:web ``` -Open http://127.0.0.1:1421/ in one browser tab. Multiple shell tabs work inside it. - -The browser loads the existing Svelte entry point, App, components and stores. -Only command/event transport changes: Tauri IPC in the desktop, a loopback -WebSocket in browser-test mode. Both adapters call `conn-frontend::Harness`, -which owns the existing native Engine, PTY, profiles, policy, audit and agent hub. -There is no WASM shell or separate web UI/state implementation. +Open `http://127.0.0.1:1429`. Enter `bootstrapToken` from the private connection file printed by the server. The browser receives an HttpOnly, SameSite cookie; the token is not a WebSocket query parameter or a localStorage value. The dev launcher builds both `conn-web` and the matching `conn` MCP binary. It keeps state in `~/.config/conn-web-dev` unless `CONN_WEB_STATE` is set. `CONN_WEB_PORT` and `CONN_WEB_BACKEND_PORT` override the frontend/backend ports (1429/1430). Use `CONN_WEB_SETUP_HOME` to isolate agent setup files during experiments. -The launcher builds the Rust test server and starts Vite. Rust and the normal -frontend Node dependencies are required; the test server does not need WebKit. -Ports 1421 and 1423 must be free. The WebSocket checks the exact frontend origin -and a per-run token. This is a local development harness, not a deployed service. +For an MCP client, use the matching binary and `agentSocket` from that connection file: -Profiles, policy, audit, defaults and the agent endpoint live in the printed -`/tmp/conn-browser-test-*` directory (the platform temporary directory on Windows). -Set `CONN_TEST_STATE` to an existing directory to reuse its settings. -The shell is a real native shell with the current user's filesystem access; -the separate settings directory is not an OS sandbox. - -The desktop session is separate and remains running. Browser reload/disconnect -ends this harness's sessions. HMR is disabled to preserve shells while editing; -reload deliberately when ready to test frontend edits. Stop the launcher with -Ctrl-C. Never share the connection token or expose these ports publicly. +```sh +target/debug/conn --socket /path/to/state/conn.sock mcp --agent-id your-agent +``` -Native desktop builds use the same shared commands through the thin Tauri -adapter. Changes to shared UI therefore apply to both execution paths. +Keep the MCP process alive across steps. Starting a new process creates a new connection and correctly requires fresh admission. The connection code belongs to the human owner, not the agent endpoint. -## Separate recording session +## Operate a built package -Use another state directory and pair of ports to record the same UI without -restarting an existing test session. Build from the repository root: +The release includes a prebuilt Linux x64 web archive in [release downloads](https://github.com/eggp-dev/conn/releases). Extract it and use the command below; building is only necessary for other targets or local development. The archive contains the same-build server, MCP CLI, UI, source manifest, license and checksums. ```sh -cargo build -p conn-browser-harness --locked -CONN_TEST_PORT=1433 CONN_TEST_ORIGIN=http://127.0.0.1:1431 \ - target/debug/conn-browser-harness /tmp/conn-film +npm run package:web ``` -In a second terminal, from `frontends/tauri`: +The printed directory contains `conn-web`, matching `conn`, `ui/`, a manifest, checksums and startup instructions. Node and Vite are build tools; the assembled package runs without them: ```sh -CONN_TEST_STATE=/tmp/conn-film \ - node node_modules/vite/bin/vite.js --mode browser-test --host 127.0.0.1 --port 1431 +./conn-web serve --state-dir /path/to/conn-state --port 1423 ``` -Open http://127.0.0.1:1431/. `CONN_TEST_PORT` defaults to `1423`; -`CONN_TEST_ORIGIN` defaults to `http://127.0.0.1:1421` and accepts only an exact -`http://127.0.0.1:` origin. The backend always binds to loopback and retains -its per-run token check. These overrides apply to the manual launch above; the -`npm run test:browser` launcher continues to use its default ports. +Shells run as the host user. Only loopback binding is supported in this first implementation. The adapter boundary allows future remote operation, but remote authentication, TLS, deployment and multiple users are not implemented by this local package. + +## Lifetime and control -Prepare `profiles.json` and `app.json` in the new state directory before opening -the page to select a demo working directory, clean shell prompt and pacing. -The new browser origin and state directory keep its timeline separate. Use a -disposable demo project; state separation still does not sandbox shell access. +- The server process owns PTYs. Browser reload or disconnection detaches the renderer and retains running shells. Stopping the server ends them; restarting a server is not shell recovery. +- A shell set has one active human input/size renderer. A second view asks to continue there; accepting it fences the previous view. It does not grant an agent admission or control. +- A renderer receives a checkpoint and subsequent sequenced output. Until the checkpoint is parsed, input is disabled. Gaps request a fresh checkpoint, never replay user input. +- `input`, `terminal_response` and `resize` share a per-session FIFO in both clients and the Rust owner. Slow unrelated work does not serialize terminal delivery. +- Admission, selected sharing, a control lease and command review remain separate. Reconnecting an agent by the same name inherits none of the old connection's permissions. -## Agent setup isolation +## Reproduce verification -The harness supplies `/agent-clients` as the client home for integration -setup. The Settings UI and native installer are unchanged; only path resolution -is injected. Clicking Set up, Update setup or Remove setup changes these disposable -files, never your real Codex/Claude/Cursor/Copilot configuration. Do not launch a -client against this temporary configuration unless you intend to connect it to -the test backend. CLI staging and backups remain under the test state directory. +```sh +cargo test --locked +cargo build --locked -p conn-web -p conn +npm run build:web +npm run test:ui +npm run test:screen -w @conn/ui +npm run test:checkpoint -w @conn/ui +npm run test:app-lifetime -w @conn/ui +npm run test:collaboration +node scripts/generate-owner-contract.mjs --check +node scripts/check-ui-boundaries.mjs +``` + +Install the pinned Chromium browser first with `npm exec -w @conn/collaboration-tests -- playwright install chromium` if needed. Collaboration tests serve the production web bundle with the real Rust backend on temporary ports, then use a persistent real MCP process and owner UI clicks/keys. They do not import app state, replace the app or synthesize its approvals. Evidence is written to a printed temporary directory. + +The separate app-lifetime test mounts actual ConnApp instances with controlled host ports to test isolation, error paths and disposal. It is not evidence of a real shell or native IPC. Parser/checkpoint tests compare the real Rust terminal model and installed xterm; their fixtures do not establish compatibility with every terminal extension. -## Pure state checks +## SSH input, cursor and approval regression -Run `npm test` in `frontends/tauri` for the timeline, icon-state, -connection-status and terminal-input checks. They need neither a browser nor the native backend. +```sh +npm run test:input -w @conn/collaboration-tests +``` -## Collaboration context and screen parity +The default is a local Bash PTY. For the disposable SSH fixture, set `CONN_AUTH_FIXTURE_RUNTIME` to its `.runtime` directory. The fixture must already listen on `127.0.0.1:22222` with a synthetic password and pinned known-hosts file. Authentication is typed into the visible PTY. The test uses real MCP, the production UI and Rust host, and stores rendered row/cursor comparisons and screenshots outside the checkout. -Build `cargo build -p conn-browser-harness --locked` at the repository root, then run -`npm run test:context:harness` from `frontends/tauri`. This uses the same UI, Rust backend, -real local PTYs and persistent agent sockets. It covers background tab requests and notification -targets, human takeover, fresh connection admission, retained shell state, Observe navigation, -sessionless preparation, explicit sharing, EN/KO and a narrow viewport. It uses ports 1461/1463; -override `CONN_HARNESS_UI_PORT` and `CONN_HARNESS_PORT` if needed. -Screenshots, video, state and grid comparisons are written under the printed temporary directory. -`CONN_CONTEXT_OUTPUT` overrides the evidence location. Native attention delivery is not simulated. +Browser results are Linux Chromium evidence. They do not establish macOS WebKit, native window-manager notifications, native installation or release completion. Previous native results remain documented separately in [SSH input review results](ssh-input-review-results.md). -`npm run test:screen` compares the installed xterm parser with a JSON-lines probe of the real Rust -`ScreenModel`. It checks rows and cursor positions after ASCII, Korean, combining marks, emoji, -soft wraps, scroll, height/width changes and alternate-screen transitions. The browser test separately -compares actual rendered rows against agent snapshots. Neither test proves every terminal program, -Unicode sequence, SSH connection or native window-manager behavior. -## SSH input, cursor and approval regression +To test the same SSH fixture through compound shell entry, add `CONN_SSH_COMPOUND_ENTRY=1` to the input-test command. Unicode cases require a UTF-8 remote locale (for example `LC_ALL=C.UTF-8`); configure only the disposable fixture, not a user server. -After building the Rust harness, run `npm run test:input:harness` from -`frontends/tauri`. It uses ports 1471/1473 and writes screenshots plus rendered-grid -and cursor comparisons to the printed temporary directory (`CONN_INPUT_REVIEW_OUTPUT` -overrides it). The default uses a local Bash PTY. - -To exercise real SSH, set `CONN_AUTH_FIXTURE_RUNTIME` to the disposable -`terminal-auth-fixtures/.runtime` directory before running it. The fixture must -already be listening on `127.0.0.1:22222`; the test accepts only its synthetic -password and pinned known-hosts file. It authenticates through the same visible PTY -and uses remote Bash with `LC_ALL=C.UTF-8` and `TERM=xterm-256color`. - -Coverage includes long ASCII/Unicode input, short/wrapped JSON with no trailing newline versus -LF/CRLF (including prompt placement), settings modal open/close without PTY -resizing, intentionally delayed resizes to expose native IPC and output ordering, and fixed-window -approval open/deny with actual terminal motion and a delayed dock shrink. It also checks pane coverage -at several emulated pixel densities, a long risky command held for approval while resizing the window, the -session-allow button and its limited scope, a separate risk still requesting approval, -policy denial, human cursor movement/insertion, takeover, and return from SSH to the -original local shell. No privileged command is approved. This is Linux Chromium -coverage of the production UI and real Rust/PTY/SSH path, not macOS WebKit acceptance. +To exercise an extracted release without rebuilding its components, run `CONN_TEST_WEB_BUNDLE=/path/to/conn-web-0.8.7-linux-x64 npm run test:collaboration`. The test still uses disposable state and drives the real packaged UI, server and persistent MCP CLI. diff --git a/docs/collaboration-refactor-results.ko.md b/docs/collaboration-refactor-results.ko.md index 2069d3d..2384930 100644 --- a/docs/collaboration-refactor-results.ko.md +++ b/docs/collaboration-refactor-results.ko.md @@ -1,5 +1,7 @@ # 협업 경계 리팩터링 — 구현과 검증 결과 +이 문서는 당시 검증 기록입니다. 하드컷 이후 현재 실행 명령은 [웹 호스트 검증 안내](browser-testing.ko.md)를 따릅니다. + [English](collaboration-refactor-results.md) · [작업 계획](collaboration-refactor-plan.ko.md) 2026-09-21 · `263f255`를 기준으로 작업 트리에 구현. diff --git a/docs/collaboration-refactor-results.md b/docs/collaboration-refactor-results.md index 6d393c5..5cab5a2 100644 --- a/docs/collaboration-refactor-results.md +++ b/docs/collaboration-refactor-results.md @@ -1,5 +1,7 @@ # Collaboration boundaries — implementation and validation +This is a historical validation record. After the hard cut, use the [web host validation guide](browser-testing.md) for current commands. + [한국어](collaboration-refactor-results.ko.md) · [Plan](collaboration-refactor-plan.md) 2026-09-21 · Implementation based on `263f255`, in the working tree. diff --git a/docs/control-experience.ko.md b/docs/control-experience.ko.md new file mode 100644 index 0000000..c3de63b --- /dev/null +++ b/docs/control-experience.ko.md @@ -0,0 +1,109 @@ +# Conn 제어 경험 — 설계 기준과 방향 + +> **0.8.7 릴리스 후보에 구현했습니다.** 제어 요청은 오른쪽 위 배지에서 320ms 모션으로 펼쳐지고, 명령 검토는 하단에 유지됩니다. 연결 요청은 위쪽에 별도 공간을 확보합니다. [검증 결과와 Mac 실기 범위](release-0.8.7-validation.ko.md). 아래 설계 과정의 미구현 표시는 합의 당시 기록입니다. + +[English](control-experience.md) · [제품 계약](PRD.ko.md) · [모션 규칙](UX-MOTION.md) + +상태: **제품 불변식 기록 / 인터랙션 방향 합의 / UI 구현 전** · 2026-09-23. +레이아웃·전환 시간·키보드 동작의 최종 선택과 네이티브 검증은 남아 있다. + +## 핵심 가치 + +Conn의 가치는 사람이 에이전트와 같은 실제 PTY를 보며 에이전트의 활동을 이해하고 +효과적으로 관리할 수 있게 하는 UX와 어포던스다. + +> 사용자는 내부 권한 구조를 외우지 않고도, 에이전트가 지금 무엇을 할 수 있는지와 +> 이번 선택으로 무엇이 달라지는지 이해할 수 있어야 한다. +> 반복되는 요청이 무심코 승인하는 습관을 만들어서는 안 된다. + +**일관성은 같은 의미의 요청이 같은 위치·움직임·행동을 갖는 것이다.** +모든 요청을 비슷한 카드와 `허용` 버튼으로 만드는 것은 이 기준을 충족하지 않는다. +연결·참여·제어권·명령 검토는 내부에서 분리하되, 사용자는 이어지는 협업으로 이해해야 한다. + +## 사용자와 정한 시각 방향 + +현재의 어두운 터미널, 에이전트 색상, 테두리 효과, 뱃지와 공간을 여는 모션을 유지한다. +제어권 요청은 **오른쪽 Conn 뱃지에서 시작하는 확장 전환**, 명령 실행 승인은 +**현재처럼 아래에서 공간을 열며 나타나는 카드**로 구별한다. + +참조: [Motion Primitives — Morphing Dialog](https://motion-primitives.com/docs/morphing-dialog). +2026-09-23에 브라우저에서 예제의 열기·닫기와 설명을 확인했다. +참조하는 것은 작은 트리거와 확장된 내용 사이의 위치·크기·모서리 연결감이다. +뱃지에서 실제 액체 형태나 연결 줄기를 그리는 방향은 채택하지 않는다. +배경 블러·전체 화면 잠금·포커스 이동은 예제에서 그대로 복제할 계약이 아니다. + +### 제어권: 뱃지가 요청으로 펼쳐진다 + +1. 새 요청은 오른쪽 뱃지에 대기 상태를 만든다. +2. 같은 시각 요소가 상단 또는 중앙의 읽기 쉬운 요청 패널로 이어진다. + 별도 팝업이 갑자기 생성되는 느낌이나 장식적인 물방울을 피한다. +3. 에이전트·대상 셸·목적·이번에 맡기는 범위를 보여준다. + `이 셸의 입력을 맡길까요?`처럼 판단 자체가 제목이 된다. +4. `입력 맡기기 / 거절`은 서로 다른 결과가 분명한 행동이다. + 실제 모드와 정책을 따른다. 모든 셸에서 일반 명령이 자동 실행된다고 약속하지 않는다. +5. 접으면 같은 뱃지로 돌아간다. 접기는 거절·허용이 아니며 미해결 요청은 남는다. + 승인하면 뱃지는 현재 제어 주체를 표시한다. 제어 허용은 명령 승인이 아니다. + +새 요청 자동 펼침 여부, 상단과 중앙 중 최종 위치는 움직이는 프로토타입에서 결정한다. +타이핑 중 포커스를 빼앗거나 입력 중인 키를 승인 단축키로 소비해서는 안 된다. +명시적으로 패널에 진입한 뒤의 키보드 이동·닫기·포커스 복귀는 함께 설계한다. + +### 명령: 실행 내용을 아래에서 검토한다 + +- 기존 하단 도크의 공간 확보와 모션을 유지한다. +- 제목은 `명령 실행 승인`, 본문은 무엇이 바뀌는지와 왜 확인이 필요한지를 설명한다. + 명령·대상·허용 범위는 펼치지 않아도 판단할 수 있어야 한다. +- 기본 행동은 `한 번 실행 / 거절`. 더 넓은 허용이 제공된다면 적용 대상·규칙·종료 조건을 + 명시한 별도 선택으로 다룬다. `세션 허용`이라는 짧은 문구로 범위를 숨기지 않는다. +- 필요한 경우 `제어권은 이미 허용됨` 같은 짧은 맥락을 보여준다. + 매번 연결부터 반복하게 만드는 단계형 마법사로 만들지 않는다. +- 펼치기는 상세 분석을 보조한다. 위험·대상·범위를 원문 JSON 뒤에 숨기지 않는다. + +### 알림: 요청으로 안내한다 + +- 다른 탭이나 앱 밖의 알림은 `어느 셸에서 어떤 판단이 필요한가`를 알려준다. + 클릭하면 해당 요청으로 이동하며 승인·공유·제어권 부여를 하지 않는다. +- 같은 요청의 알림·뱃지·패널은 하나의 요청 신원을 따른다. 여러 건처럼 강조하지 않는다. +- 연결 허용은 `공유 화면 접근`, 제어권 허용은 `이 셸의 입력`, 명령 승인은 `이번 실행`을 + 각각 말해야 한다. 연결 허용은 위쪽 도크에 별도 공간을 확보한다. +- 일반적인 진행·완료 안내는 조용히 전달한다. 지속적인 반짝임이나 반복 확대를 쓰지 않는다. +- 해결·거절·취소·만료를 구별하고 오래된 알림으로 끝난 요청을 되살리지 않는다. + +## 구현 전 관찰 기록 + +이번 검토에서는 별도 상태 디렉터리와 합성 파일을 사용하는 실제 Rust 웹 호스트·MCP·공통 UI를 +인앱 브라우저에서 조작했다. 사용자 작업 셸과 실제 파일을 변경하지 않았다. + +| 단계 | 확인한 동작 | 평가 | +| --- | --- | --- | +| 1. 기본 셸 | 터미널과 Conn 뱃지 중심의 간결한 화면 | 유지할 기반 | +| 2. 연결 허용 | 공유 화면 접근 설명과 `Allow / Deny` | 제어권 허용과 행동 문구가 같음 | +| 3. 제어 요청·펼치기 | 같은 하단 카드, `Allow`, 원문·JSON 상세 | 범위 차이보다 내부 요청 구조를 강조 | +| 4. 일반 명령 | 허용 뒤 합성 파일 읽기가 자동 실행됨 | 정상 흐름; 모든 환경의 보장 아님 | +| 5. 삭제 검토 | 대상·명령·단일 승인과 세션 허용 표시 | 넓은 허용의 범위가 기본 문구에서 불명확 | +| 6. 다른 탭으로 이동·복귀 | 대기 요청 링크로 정확한 탭에 돌아옴; 승인은 계속 대기 | 유지할 동작 | +| 7. 거절·제어권 회수 | 합성 삭제를 거절하고 제어 센터에서 회수 | 회수 동작은 있으나 별도 패널 안에 있음 | + +이 표는 구현 전 상태 관찰이다. 새 모핑 전환의 구현·접근성·macOS 실기 검증을 뜻하지 않는다. +화면 캡처만으로 대비 수치, 스크린리더 동작, 짧은 창·확대·동작 줄이기를 통과했다고 말하지 않는다. + +## 구현 전에 고정할 상태 계약 + +- 승인 사유·대상·허용 범위·가능한 선택은 같은 요청 상태에 속한다. + 늦은 상태 조회 때문에 같은 카드의 버튼이나 사유가 바뀌어서는 안 된다. +- 실제 권한 조건이 달라지면 이유를 표시하고 오래된 선택을 거절한다. + 버튼만 고정해 백엔드의 최신 권한 검사를 생략하지 않는다. +- 명령 위험과 셸 상태 확인 실패를 분리한다. 불확실한 셸 상태를 복구하는 일이 + 명령 검토를 없애거나 권한을 확대하는 일이 되어서는 안 된다. +- 제어권 회수는 새 에이전트 입력을 막는 것과 이미 실행 중인 프로세스를 중단하는 것을 + 구분해서 설명한다. 제어권 회수만으로 모든 작업이 종료된다고 표현하지 않는다. +- 모핑의 시각적 크기 변화와 실제 PTY 크기를 분리한다. 하단 도크는 최종 크기에 맞춰 + 공간을 확보하고, 애니메이션 프레임마다 PTY를 리사이즈하지 않는다. + +## 다음 검증 + +정지 이미지 추가보다 **뱃지 → 제어권 요청 → 뱃지 → 하단 명령 검토**의 실제 전환을 먼저 비교한다. +같은 공통 컴포넌트·룬·Rust 경계를 사용하며 별도 하네스 전용 승인 UX를 만들지 않는다. +검증은 반복 요청, 동시 요청, 다른 탭, 취소·만료, 재연결, 느린 상태 응답, 키보드·동작 줄이기, +긴 명령·짧은 창과 실제 macOS 셸까지 포함한다. 각 승인에서 사용자에게 +`지금 무엇을 허용했고, 다음에는 무엇을 다시 물을 수 있는가`를 설명하게 해 이해도를 확인한다. diff --git a/docs/control-experience.md b/docs/control-experience.md new file mode 100644 index 0000000..2d57fc4 --- /dev/null +++ b/docs/control-experience.md @@ -0,0 +1,110 @@ +# Conn control experience — principles and direction + +[한국어](control-experience.ko.md) · [Product contract](PRD.md) · [Motion rules](UX-MOTION.md) + +Status: **implemented in the 0.8.7 release candidate** · 2026-09-23. +[Validation and native acceptance limits](release-0.8.7-validation.md). Control expands at the top right with a 320 ms surface morph; command review stays in the bottom dock. Admission reserves space above the terminal. + +## Product invariant + +Conn's value is the UX and affordances that let people understand and manage an +agent working in their shared, real PTY. + +> People must understand what an agent can do now and what their next choice +> changes without memorizing the internal permission model. Repeated requests +> must not train people to approve without thinking. + +Consistency means **the same meaning has a predictable location, motion and action**. +Making every request a similar card with an Allow button does not meet this rule. +Admission, participation, control and command review remain separate responsibilities +within one understandable collaboration flow. + +## Direction selected with the user + +Preserve the dark terminal, agent colors, perimeter effects, badge and space-opening +motion. **Control requests expand from the existing top-right Conn badge. Command +execution reviews keep the existing bottom dock.** + +Reference: [Motion Primitives — Morphing Dialog](https://motion-primitives.com/docs/morphing-dialog). +Its documentation and opening/closing example were inspected in the browser on +2026-09-23. The reference is continuity of position, size and corners between a +small trigger and expanded content. Literal liquid shapes or connecting tendrils +are not the direction. Background blur, modality and focus changes are not adopted +automatically from the example. + +### Control: the badge becomes the request + +1. A new request creates a pending state in the top-right badge. +2. The same visual element expands into a readable upper or central panel. +3. Show the agent, target shell, purpose and scope. Ask whether to hand over input + in this shell, rather than making people interpret an internal permission name. +4. Use explicit actions such as `Hand over input / Deny`. Describe the actual mode + and policy; do not promise automatic ordinary commands in every environment. +5. Collapsing returns to the badge and leaves the request pending. It is neither + approval nor denial. Granting updates the controller display and does not approve a command. + +New requests expand automatically at the top right, without moving terminal geometry. +Do not steal focus or turn a key typed into the terminal into an approval shortcut. +After explicit entry into the panel, specify keyboard navigation, dismissal and focus return. + +### Commands: review execution below the terminal + +- Keep the current bottom dock and reserved space. +- Lead with command execution review, the concrete effect and why review is required. + The command, target and scope must be understandable without expanding details. +- Default actions are `Run once / Deny`. Any broader grant is a separate choice + with explicit targets, policy scope and termination conditions, not an ambiguous session label. +- Briefly show existing permission when helpful, such as control already granted. + Do not turn each request into a mandatory connection-to-execution wizard. +- Details supplement a decision; raw JSON must not hide its consequences or scope. + +### Notifications: locate the decision + +- Cross-tab and system notifications identify the shell and kind of decision. + Opening them never grants permission, shares a session or takes control. +- Notification, badge and panel follow one request identity without presenting it + as multiple unrelated requests. +- Admission means access to shared screens; control means input in a specific + shell; command approval means this execution. Admission uses a separate upper dock with reserved terminal space. +- Keep routine progress quiet. Avoid perpetual pulsing or repeated expansion. +- Distinguish resolution, denial, cancellation and expiry; stale notices cannot revive work. + +## Flow observed before implementation + +The in-app browser used the common UI with the real Rust web host and MCP, a separate +state directory and synthetic fixtures. The user's working shell and files were untouched. + +| Step | Observation | Assessment | +| --- | --- | --- | +| 1. Idle shell | Minimal terminal and Conn badge | Preserve | +| 2. Admission | Shared-screen scope, Allow / Deny | Same action wording as control | +| 3. Control and details | Bottom card, Allow, raw request/JSON disclosure | Internal structure dominates scope distinction | +| 4. Ordinary command | Synthetic file read runs after control grant | Valid observed path, not every environment | +| 5. Deletion review | Target, command, single and session grants | Broad grant scope unclear in default label | +| 6. Other tab and return | Pending link navigates to correct shell; approval remains pending | Preserve | +| 7. Denial and takeover | Synthetic deletion denied; control reclaimed through control center | Working affordance inside another panel | + +These observations do not validate the proposed morphing interaction, native macOS, +screen readers, contrast ratios, small windows, zoom or reduced motion. + +## State contract before implementation + +- Reason, target, scope and available actions belong to one coherent pending request. + Delayed status replies must not change the same card's actions or rationale. +- Explain genuine condition changes and reject stale decisions. A stable UI must + not bypass the backend's current authorization checks. +- Separate command risk from unconfirmed shell state. Recovery must not bypass + command review or expand permissions. +- Distinguish reclaiming input from terminating a process already running. +- Separate visual morphing from PTY geometry. Reserve final dock space and do not + resize the PTY on every animation frame. + +## Further acceptance + +The implemented **badge → control request → badge → bottom command review** +transition and Linux evidence are recorded in the [release validation](release-0.8.7-validation.md). Use common components, runes and +Rust boundaries rather than a separate harness approval experience. +Cover repeated/concurrent requests, other tabs, cancellation, expiry, reconnects, +delayed status, keyboard use, reduced motion, long commands, short windows and +native macOS shells. Ask people to explain what they just permitted and what can +still require a separate decision. diff --git a/docs/getting-started.ko.md b/docs/getting-started.ko.md index 51385c8..c824b79 100644 --- a/docs/getting-started.ko.md +++ b/docs/getting-started.ko.md @@ -13,37 +13,37 @@ brew install --cask eggp-dev/tap/conn curl -fsSL https://conn.eggp.dev/install.sh | sh # Linux x86_64 ``` -cask는 서명·공증된 DMG를 설치하며 릴리스와 함께 공개된 SHA-256으로 확인합니다. Linux 스크립트는 AppImage를 내려받아 릴리스의 `SHA256SUMS`와 대조한 뒤 내 계정에만 설치합니다(`~/.local/bin`, 앱 메뉴 항목, sudo 불필요). 체크섬이 맞지 않으면 설치하지 않습니다. `CONN_VERSION=v0.8.6`로 버전을 고정할 수 있습니다. AppImage는 FUSE 2가 필요합니다. Ubuntu 24.04 이상에서는 `sudo apt install libfuse2t64`를 실행하세요. 두 방법 모두 이후에는 앱 안에서 업데이트됩니다. 셸에 넘기기 전에 스크립트를 읽어 보셔도 좋습니다: [`scripts/install.sh`](../scripts/install.sh). +cask는 서명·공증된 DMG를 설치하며 릴리스와 함께 공개된 SHA-256으로 확인합니다. Linux 스크립트는 AppImage를 내려받아 릴리스의 `SHA256SUMS`와 대조한 뒤 내 계정에만 설치합니다(`~/.local/bin`, 앱 메뉴 항목, sudo 불필요). 체크섬이 맞지 않으면 설치하지 않습니다. `CONN_VERSION=v0.8.7`로 버전을 고정할 수 있습니다. AppImage는 FUSE 2가 필요합니다. Ubuntu 24.04 이상에서는 `sudo apt install libfuse2t64`를 실행하세요. 두 방법 모두 이후에는 앱 안에서 업데이트됩니다. 셸에 넘기기 전에 스크립트를 읽어 보셔도 좋습니다: [`scripts/install.sh`](../scripts/install.sh). 직접 파일을 받으려면: -OS와 CPU에 맞는 [v0.8.6 프리뷰](https://github.com/eggp-dev/conn/releases/tag/v0.8.6)를 받으세요. 실제 서명 상태와 실행 검증 결과는 릴리스 안내에서 확인할 수 있습니다. +OS와 CPU에 맞는 [v0.8.7 프리뷰](https://github.com/eggp-dev/conn/releases/tag/v0.8.7)를 받으세요. 실제 서명 상태와 실행 검증 결과는 릴리스 안내에서 확인할 수 있습니다. | 플랫폼 | 다운로드 | 설치 | |---|---|---| -| Ubuntu x64 | [`.deb`](https://github.com/eggp-dev/conn/releases/download/v0.8.6/conn-v0.8.6-x86_64-unknown-linux-gnu-desktop.deb) | 아래 명령으로 설치한 뒤 앱 목록에서 Conn을 엽니다. | -| Ubuntu x64 | [AppImage](https://github.com/eggp-dev/conn/releases/download/v0.8.6/conn-v0.8.6-x86_64-unknown-linux-gnu-desktop.AppImage) | 실행 권한을 준 뒤 파일을 엽니다. | -| macOS Apple Silicon | [`.dmg`](https://github.com/eggp-dev/conn/releases/download/v0.8.6/conn-v0.8.6-aarch64-apple-darwin-desktop.dmg) | DMG를 열고 Conn을 Applications로 옮긴 뒤 그곳에서 실행합니다. | -| Windows x64 | [설치 `.exe`](https://github.com/eggp-dev/conn/releases/download/v0.8.6/conn-v0.8.6-x86_64-pc-windows-msvc-setup.exe) | 설치 파일을 실행하고 시작 메뉴에서 Conn을 엽니다. | +| Ubuntu x64 | [`.deb`](https://github.com/eggp-dev/conn/releases/download/v0.8.7/conn-v0.8.7-x86_64-unknown-linux-gnu-desktop.deb) | 아래 명령으로 설치한 뒤 앱 목록에서 Conn을 엽니다. | +| Ubuntu x64 | [AppImage](https://github.com/eggp-dev/conn/releases/download/v0.8.7/conn-v0.8.7-x86_64-unknown-linux-gnu-desktop.AppImage) | 실행 권한을 준 뒤 파일을 엽니다. | +| macOS Apple Silicon | [`.dmg`](https://github.com/eggp-dev/conn/releases/download/v0.8.7/conn-v0.8.7-aarch64-apple-darwin-desktop.dmg) | DMG를 열고 Conn을 Applications로 옮긴 뒤 그곳에서 실행합니다. | +| Windows x64 | [설치 `.exe`](https://github.com/eggp-dev/conn/releases/download/v0.8.7/conn-v0.8.7-x86_64-pc-windows-msvc-setup.exe) | 설치 파일을 실행하고 시작 메뉴에서 Conn을 엽니다. | 새 릴리스의 Intel Mac 배포는 잠시 중단합니다. 기존 Intel 파일은 [이전 릴리스](https://github.com/eggp-dev/conn/releases)에 유지하며 Intel Mac에 Apple Silicon 파일을 설치하지 마세요. Ubuntu에서는 다운로드한 폴더에서 실행합니다. ```sh -sudo apt install ./conn-v0.8.6-x86_64-unknown-linux-gnu-desktop.deb +sudo apt install ./conn-v0.8.7-x86_64-unknown-linux-gnu-desktop.deb ``` AppImage를 선택했다면 다음과 같이 실행합니다. ```sh -chmod +x ./conn-v0.8.6-x86_64-unknown-linux-gnu-desktop.AppImage -./conn-v0.8.6-x86_64-unknown-linux-gnu-desktop.AppImage +chmod +x ./conn-v0.8.7-x86_64-unknown-linux-gnu-desktop.AppImage +./conn-v0.8.7-x86_64-unknown-linux-gnu-desktop.AppImage ``` Linux 빌드 대상은 Ubuntu 24.04·26.04 x64이며 AppImage에도 시스템 라이브러리가 필요합니다. Windows 프리뷰는 의도적으로 무서명 배포하므로 SmartScreen·알 수 없는 배포자 경고가 나올 수 있고 관리되는 PC에서는 설치가 차단될 수 있습니다. Mac 공개 파일은 릴리스의 Developer ID 서명·공증 검사를 통과해야 합니다. 각 대상의 범위는 [플랫폼 지원](platform-support.ko.md)을 참고하세요. -원하면 파일과 함께 [SHA256SUMS](https://github.com/eggp-dev/conn/releases/download/v0.8.6/SHA256SUMS)를 받으세요. Linux는 `sha256sum --ignore-missing -c SHA256SUMS`, macOS는 `shasum -a 256 <파일>` 결과와 해당 줄 비교, Windows는 `Get-FileHash <파일> -Algorithm SHA256`을 사용합니다. 체크섬은 파일 손상을 확인하며 코드 서명과는 별개입니다. +원하면 파일과 함께 [SHA256SUMS](https://github.com/eggp-dev/conn/releases/download/v0.8.7/SHA256SUMS)를 받으세요. Linux는 `sha256sum --ignore-missing -c SHA256SUMS`, macOS는 `shasum -a 256 <파일>` 결과와 해당 줄 비교, Windows는 `Get-FileHash <파일> -Algorithm SHA256`을 사용합니다. 체크섬은 파일 손상을 확인하며 코드 서명과는 별개입니다. ## 2. 터미널 설정 diff --git a/docs/getting-started.md b/docs/getting-started.md index e0a8f7d..6663e28 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -13,37 +13,37 @@ brew install --cask eggp-dev/tap/conn curl -fsSL https://conn.eggp.dev/install.sh | sh # Linux x86_64 ``` -The cask installs the signed and notarized DMG and checks it against the SHA-256 published with the release. The Linux script downloads the AppImage, verifies it against the release's `SHA256SUMS`, and installs it for your user only (`~/.local/bin`, an app-menu entry, no sudo); it refuses to install on a checksum mismatch. `CONN_VERSION=v0.8.6` pins a release. AppImages need FUSE 2: on Ubuntu 24.04 and newer, `sudo apt install libfuse2t64`. Both keep updating from inside the app. Read the script before piping it to a shell if you like: [`scripts/install.sh`](../scripts/install.sh). +The cask installs the signed and notarized DMG and checks it against the SHA-256 published with the release. The Linux script downloads the AppImage, verifies it against the release's `SHA256SUMS`, and installs it for your user only (`~/.local/bin`, an app-menu entry, no sudo); it refuses to install on a checksum mismatch. `CONN_VERSION=v0.8.7` pins a release. AppImages need FUSE 2: on Ubuntu 24.04 and newer, `sudo apt install libfuse2t64`. Both keep updating from inside the app. Read the script before piping it to a shell if you like: [`scripts/install.sh`](../scripts/install.sh). Or download a file yourself: -Download the [v0.8.6 preview](https://github.com/eggp-dev/conn/releases/tag/v0.8.6) for your OS and CPU. See the release notes for the exact signing and runtime verification results. +Download the [v0.8.7 preview](https://github.com/eggp-dev/conn/releases/tag/v0.8.7) for your OS and CPU. See the release notes for the exact signing and runtime verification results. | Platform | Download | Install | |---|---|---| -| Ubuntu x64 | [`.deb`](https://github.com/eggp-dev/conn/releases/download/v0.8.6/conn-v0.8.6-x86_64-unknown-linux-gnu-desktop.deb) | Run the command below, then open Conn from your applications. | -| Ubuntu x64 | [AppImage](https://github.com/eggp-dev/conn/releases/download/v0.8.6/conn-v0.8.6-x86_64-unknown-linux-gnu-desktop.AppImage) | Make the file executable, then open it. | -| macOS Apple Silicon | [`.dmg`](https://github.com/eggp-dev/conn/releases/download/v0.8.6/conn-v0.8.6-aarch64-apple-darwin-desktop.dmg) | Open the DMG, drag Conn into Applications, then launch it there. | -| Windows x64 | [Installer `.exe`](https://github.com/eggp-dev/conn/releases/download/v0.8.6/conn-v0.8.6-x86_64-pc-windows-msvc-setup.exe) | Run the installer, then open Conn from the Start menu. | +| Ubuntu x64 | [`.deb`](https://github.com/eggp-dev/conn/releases/download/v0.8.7/conn-v0.8.7-x86_64-unknown-linux-gnu-desktop.deb) | Run the command below, then open Conn from your applications. | +| Ubuntu x64 | [AppImage](https://github.com/eggp-dev/conn/releases/download/v0.8.7/conn-v0.8.7-x86_64-unknown-linux-gnu-desktop.AppImage) | Make the file executable, then open it. | +| macOS Apple Silicon | [`.dmg`](https://github.com/eggp-dev/conn/releases/download/v0.8.7/conn-v0.8.7-aarch64-apple-darwin-desktop.dmg) | Open the DMG, drag Conn into Applications, then launch it there. | +| Windows x64 | [Installer `.exe`](https://github.com/eggp-dev/conn/releases/download/v0.8.7/conn-v0.8.7-x86_64-pc-windows-msvc-setup.exe) | Run the installer, then open Conn from the Start menu. | Intel Mac distribution is paused for future releases. Previously published Intel packages remain in [past releases](https://github.com/eggp-dev/conn/releases); do not install the Apple Silicon package on an Intel Mac. For Ubuntu, run the matching command in your download directory: ```sh -sudo apt install ./conn-v0.8.6-x86_64-unknown-linux-gnu-desktop.deb +sudo apt install ./conn-v0.8.7-x86_64-unknown-linux-gnu-desktop.deb ``` Or, for AppImage: ```sh -chmod +x ./conn-v0.8.6-x86_64-unknown-linux-gnu-desktop.AppImage -./conn-v0.8.6-x86_64-unknown-linux-gnu-desktop.AppImage +chmod +x ./conn-v0.8.7-x86_64-unknown-linux-gnu-desktop.AppImage +./conn-v0.8.7-x86_64-unknown-linux-gnu-desktop.AppImage ``` The Linux build targets Ubuntu 24.04 and 26.04 x64; AppImage still depends on system libraries. Windows previews are intentionally unsigned, so SmartScreen or an unknown-publisher prompt may appear; managed PCs may block installation. Public Mac assets must pass the release's Developer ID signing and notarization checks. See [platform support](platform-support.md) for the limits of each target. -Optional: download [SHA256SUMS](https://github.com/eggp-dev/conn/releases/download/v0.8.6/SHA256SUMS) alongside your file. On Linux, run `sha256sum --ignore-missing -c SHA256SUMS`; on macOS, compare `shasum -a 256 ` with its line; on Windows, use `Get-FileHash -Algorithm SHA256`. Checksums detect corruption and are separate from code signing. +Optional: download [SHA256SUMS](https://github.com/eggp-dev/conn/releases/download/v0.8.7/SHA256SUMS) alongside your file. On Linux, run `sha256sum --ignore-missing -c SHA256SUMS`; on macOS, compare `shasum -a 256 ` with its line; on Windows, use `Get-FileHash -Algorithm SHA256`. Checksums detect corruption and are separate from code signing. ## 2. Set up your terminal diff --git a/docs/platform-support.ko.md b/docs/platform-support.ko.md index 6dc8291..58d2527 100644 --- a/docs/platform-support.ko.md +++ b/docs/platform-support.ko.md @@ -2,7 +2,7 @@ [English](platform-support.md) · 한국어 · [설치](getting-started.ko.md) · [릴리스](releasing.ko.md) -Conn은 MIT 라이선스 소스와 네이티브 바이너리를 [GitHub Releases](https://github.com/eggp-dev/conn/releases/tag/v0.8.6)로 제공합니다. 모든 데스크톱 패키지는 같은 Rust 엔진과 Svelte UI를 사용하며 브라우저 하네스는 개발용 어댑터입니다. +Conn은 MIT 라이선스 소스와 네이티브 바이너리를 [GitHub Releases](https://github.com/eggp-dev/conn/releases/tag/v0.8.7)로 제공합니다. 모든 데스크톱 패키지는 같은 Rust 엔진과 Svelte UI를 사용하며 브라우저 하네스는 개발용 어댑터입니다. ## 다음 프리뷰 릴리스 대상 @@ -59,3 +59,7 @@ SSH·Docker·WSL·Git Bash는 프로필 옵션입니다. 실제 시험한 외부 워크플로는 바이너리·설치 파일 7개, Mac 업데이트 아카이브, 업데이트 서명 3개, `latest.json`, Mac 서명 보고서, `SHA256SUMS`를 담은 **Draft prerelease**를 준비하며 자동 공개하지 않습니다. Mac 서명 근거가 없거나 검사에 실패하면 초안 업로드를 막습니다. Windows 무서명은 명시적인 프리뷰 방침입니다. 관리자는 공개 전에 [릴리스 검사](releasing.ko.md)를 검토하고 실제 실행 결과와 한계를 기록하며 다운로드 링크가 파일과 일치하는지 확인합니다. v0.6.0부터 macOS·Windows·AppImage는 서명된 앱 내 업데이트를 지원합니다. deb는 수동 또는 패키지 관리자 업데이트를 사용합니다. 기존 버전은 한 번 직접 업그레이드해야 합니다. [업데이트 안내](getting-started.ko.md#업데이트-v060-이상)를 참고하세요. + +### Linux WebKit 시작 호환 설정 + +환경 변수가 없으면 데스크톱 실행 파일이 GTK 초기화 전에 `WEBKIT_DISABLE_DMABUF_RENDERER=1`을 설정합니다. 확인된 NVIDIA 환경의 GBM/EGL 시작 중단을 피하기 위한 설정이며, 사용자가 지정한 값은 유지합니다. 정상 동작하는 드라이버에서 DMA-BUF를 다시 사용하려면 `WEBKIT_DISABLE_DMABUF_RENDERER=0`을 명시할 수 있습니다. 렌더링 전달 방식의 변경이며 WebKit 샌드박스를 해제하지 않습니다. 다른 드라이버·컴포지터의 네이티브 검증까지 보장하지 않습니다. diff --git a/docs/platform-support.md b/docs/platform-support.md index dc25eb9..f082f1c 100644 --- a/docs/platform-support.md +++ b/docs/platform-support.md @@ -2,7 +2,7 @@ English · [한국어](platform-support.ko.md) · [Install](getting-started.md) · [Release](releasing.md) -Conn provides its MIT-licensed source and native binaries through [GitHub Releases](https://github.com/eggp-dev/conn/releases/tag/v0.8.6). All desktop packages use the same Rust engine and Svelte UI. The browser harness is a development adapter. +Conn provides its MIT-licensed source and native binaries through [GitHub Releases](https://github.com/eggp-dev/conn/releases/tag/v0.8.7). All desktop packages use the same Rust engine and Svelte UI. The browser harness is a development adapter. ## Targets for upcoming preview releases @@ -59,3 +59,7 @@ SSH, Docker, WSL and Git Bash are profile options. Claim verified support only f The workflow prepares a **draft prerelease** with seven binaries/installers, a macOS updater archive, three updater signatures, `latest.json`, one Mac signing report, and `SHA256SUMS`. It does not publish automatically. Missing or failed Mac signing evidence blocks the release draft upload; unsigned Windows assets are the explicit preview policy. Before publishing, maintainers review the [release checks](releasing.md), record runtime results and limitations, and confirm that download links match the assets. Updates from v0.6.0 use the signed Tauri updater on macOS, Windows and AppImage. Debian packages remain manually/package-manager updated. Older installations need one manual upgrade. See [updates](getting-started.md#updates-v060-and-later). Native installed-app upgrades still require hands-on verification; CI verifies build and artifact contracts. + +### Linux WebKit startup compatibility + +The desktop binary sets `WEBKIT_DISABLE_DMABUF_RENDERER=1` before GTK starts when the variable is unset. This avoids the reproduced GBM/EGL startup abort on the tested NVIDIA setup. An explicit value is preserved; set `WEBKIT_DISABLE_DMABUF_RENDERER=0` only to opt back into DMA-BUF on a working driver. This changes a rendering transport, not the WebKit sandbox. Other drivers and desktop compositors still need native testing. diff --git a/docs/product-backlog.ko.md b/docs/product-backlog.ko.md index 911a72a..b6143e1 100644 --- a/docs/product-backlog.ko.md +++ b/docs/product-backlog.ko.md @@ -2,6 +2,9 @@ [English](product-backlog.md) · 한국어 · [기존 리팩터링 계획](collaboration-refactor-plan.ko.md) +최신 인수 상태: [2026-09-23 Mac 수정 수신·Linux 회귀·남은 작업](shared-runtime-follow-up.ko.md). +아래 날짜별 기록과 설치된 공개 릴리스의 상태를 구분한다. + ## 2026-09-21 — 실제 원격 셸 협업 피드백 상태: v0.8.4 필수 협업 범위 구현 및 공통 하네스 검증 완료. [구현 범위와 남은 검증](collaboration-context-results.ko.md)을 참고한다. @@ -40,6 +43,9 @@ ### UX-01 · 긴 출력의 표시 정확성 +- 2026-09-23: 미배포 공통 런타임 브랜치에서 Mac 긴 입력 교착을 수정하고 네이티브 로컬·루프백 + SSH 및 고정 창 승인 패널을 재검증했다. Linux 회귀도 통과했다. + [인수 정리](shared-runtime-follow-up.ko.md)를 따르며 사용자 고유 게이트웨이·물리 IME는 미검증이다. - 2026-09-22: **v0.8.5 이후에도 미해결**. 업데이트·재시작 뒤에도 고정 창에서 알림·승인 바가 움직일 때 가로·세로 영역 제한과 입력 위치 깨짐이 보고됐다. 크기 변경·출력 순서 결함을 재현하고 v0.8.6에서 수정했으나 실제 설치된 네이티브·원격 환경은 미검증이다. @@ -60,6 +66,9 @@ ### UX-03 · 대기 상태와 lease 안내 +- 2026-09-23: [제어 경험 감사와 설계 제안](control-experience.ko.md)에 승인 단계의 + 혼동, 넓은 허용의 범위, 일관된 요청 표시와 검증 기준을 구체화했다. + [제품 불변식](PRD.ko.md)을 따른다. 설계 기록이며 UI 수정 완료를 뜻하지 않는다. - 문제: 연결 승인, 제어 승인, 명령 검토, lease 만료가 사용자와 에이전트에게 번거롭거나 불명확하다. - 범위: 각 상태의 이유, 기다리는 주체, 다음 행동과 제어권 만료 정보를 일관되게 표현한다. - 완료 기준: 만료 전후·갱신·거절·취소·사람 입력으로 회수되는 경우를 검증한다. diff --git a/docs/product-backlog.md b/docs/product-backlog.md index d12ebb5..59e5664 100644 --- a/docs/product-backlog.md +++ b/docs/product-backlog.md @@ -2,6 +2,9 @@ English · [한국어](product-backlog.ko.md) · [Existing refactor plan](collaboration-refactor-plan.md) +Latest handoff: [2026-09-23 Mac fixes, Linux regressions and remaining work](shared-runtime-follow-up.md). +Keep the dated records below separate from the installed public release's status. + ## 2026-09-21 — Feedback from real remote-shell collaboration Status: essential collaboration scope implemented and verified in the shared harness for v0.8.4. @@ -41,6 +44,9 @@ Do not retain real addresses, accounts, command payloads or authentication respo ### UX-01 · Display fidelity for long output +- 2026-09-23: The unreleased common-runtime branch fixes the Mac long-input deadlock and validates + native local/loopback SSH input and fixed-window approval panels. Linux regressions also pass. + See the [handoff summary](shared-runtime-follow-up.md); the user's gateway and physical IME remain unverified. - 2026-09-22: **still open after v0.8.5**. The user reports constrained width/height and misplaced input after updating/restarting, even with a fixed window when notification/approval bars animate. Resize and output ordering defects were reproduced and fixed in v0.8.6; the exact installed native/remote @@ -61,6 +67,10 @@ Do not retain real addresses, accounts, command payloads or authentication respo ### UX-03 · Explain waiting and lease state +- 2026-09-23: The [control experience audit and proposal](control-experience.md) + defines scope clarity, consistent pending requests and validation under the + [product invariant](PRD.md). The direction uses a Conn-badge morph for control + requests and retains bottom command review. This records design, not completed UI changes. - Problem: admission, control approval, command review and lease expiry create friction or ambiguity. - Scope: consistently explain the reason, waiting actor, next action and lease expiration. - Acceptance: cover renewal, expiry, denial, cancellation and human takeover. Remaining time agrees diff --git a/docs/release-0.8.7-validation.ko.md b/docs/release-0.8.7-validation.ko.md new file mode 100644 index 0000000..def4d4b --- /dev/null +++ b/docs/release-0.8.7-validation.ko.md @@ -0,0 +1,71 @@ +# 0.8.7 릴리스 검증 + +[English](release-0.8.7-validation.md) · [Mac 인수 검증](shared-runtime-macos-validation-results.ko.md) · [제어 UX 원칙](control-experience.ko.md) + +2026-09-23. 릴리스 후보 소스의 검증 기록이다. 네이티브 빌드·서명·공증·배포는 +해당 태그의 GitHub Actions와 공개 산출물에서 별도로 확인하며, 이 문서에서 미리 성공으로 선언하지 않는다. + +## 이번에 반영한 내용 + +- 데스크톱과 웹은 같은 Svelte 컴포넌트·룬, owner 계약, 세션·PTY·정책 엔진을 사용한다. + 웹은 별도 로컬 호스트이며 데스크톱 세션을 복제하지 않는다. Linux x64 웹 배포 묶음에는 + 서버·같은 빌드의 MCP CLI·공통 UI·빌드 정보·체크섬이 포함된다. +- 연결 요청은 터미널 위에 공간을 확보한다. 제어 요청은 오른쪽 Conn 배지에서 펼쳐지고, + 명령 승인은 하단에 유지한다. 접기·Escape는 거절이 아니며 요청은 배지에 남는다. + 자동 펼치기는 입력 포커스를 빼앗지 않고, 알림 이동은 승인하지 않는다. +- 승인 사유와 가능한 범위를 요청 자체에 고정했다. 늦은 상태 조회가 같은 요청의 버튼을 + 바꾸지 않는다. 프로필·전경 프로세스가 달라지면 오래된 허용을 거절하고 현재 정책을 재검사한다. + 넓은 범위의 허용은 별도 펼치기 안에서 선택하며, 확인되지 않은 셸에서는 제공하지 않는다. +- 실제 전경 실행 파일로 SSH 여부를 확인한다. 인자·환경·인증 내용을 읽지 않는다. + 단독 SSH와 `printf ...; ssh ...` 복합 진입을 실제 OpenSSH에서 검증했다. +- 사람 입력 원문을 저장하지 않고 빈 프롬프트의 보이는 화면 경계를 추적한다. 빈 줄에서 + 이동·삭제·화면 정리 키를 눌렀다고 에이전트를 막지 않는다. 입력을 지운 뒤 화면이 실제 빈 경계로 + 돌아왔을 때만 회복한다. Home → Ctrl-U로 남은 뒷부분을 빈 줄로 오판하지 않는다. +- Mac 긴 입력 교착 수정을 유지하고, 큐에 도착한 출력보다 프로세스 종료가 먼저 전달되는 문제를 + 수정했다. Linux에서는 WebKit 렌더러 우회 설정을 기본 적용하되 사용자의 명시적 설정을 존중한다. +- 브라우저에서 포커스 이동 뒤 앱 전체가 가로·세로로 밀리는 현상, 연결 카드가 메뉴를 가리는 현상, + 작은 창에서 제어 버튼이 가려지는 현상을 직접 발견해 수정했다. 사용자 Mac 게이트웨이의 + 화면 문제까지 동일 원인으로 확정한 것은 아니다. + +## Linux 검사 결과 + +Rust 1.95.0, Node 26.8.1. 별도 상태 디렉터리·폐기 가능한 셸과 파일을 사용했다. + +| 검사 | 결과 | +| --- | ---: | +| Rust 기본 워크스페이스 | 282 PASS, 1 ignored | +| 공통 UI | 66 PASS | +| 실제 Rust·웹 UI·지속 MCP 협업 | 10 PASS | +| 실제 로컬 Bash 입력·렌더링 | 23 PASS | +| 실제 OpenSSH·원격 Bash | 24 PASS | +| 복합 명령으로 SSH 진입 | 24 PASS | +| 코어/xterm 그리드·커서 | 85 PASS | +| 체크포인트 복원 | 984 PASS | +| 앱 수명·격리·재연결 | 21항목 PASS; 실제 UI와 통제된 host/IPC 픽스처 | +| 릴리스 도구 | 81 PASS | +| owner 계약·공통 UI 의존성 경계 | PASS | +| 웹·데스크톱 프런트엔드 빌드 | PASS; Svelte 오류 0, 기존 경고 17 | + +Rust 숫자에는 네이티브 Tauri가 포함되지 않는다. 설치되지 않은 zsh 경로는 내부적으로 생략했다. +SSH는 사용자 서버가 아닌 폐기 가능한 루프백 서버다. 첫 실행은 픽스처의 비 UTF-8 로케일 때문에 +한글 검사에 실패했고, `C.UTF-8`로 바로잡은 뒤 전체 통과했다. 모든 원격 로케일에 대한 보장은 아니다. + +느린 소비자 회귀 검사는 기본 4 MiB를 처리한다. 별도 64 MiB 검사에서는 출력 콜백마다 3ms를 +지연시켜도 20.61초에 전체 바이트와 마지막 마커를 종료 이벤트보다 먼저 확인했다. +최대 RSS는 88,508 KiB였으며 시험 데이터 할당을 포함한 프로세스 전체 수치다. +큐는 여전히 무제한이다. 생산이 소비보다 계속 빠르면 메모리가 증가할 수 있으며, +이 유한 부하 검사를 무제한 출력 안전성 보장으로 해석하면 안 된다. + +[스크린샷과 체크섬](validation/release-0.8.7/)은 합성 세션만 담는다. 1280×800과 +640×420·동작 줄이기 조건을 비교했다. 인앱 브라우저에서도 1280×720에서 +펼치기·접기·다시 열기·거절과 입력 포커스를 확인했다. 선택한 +[모션 참고](https://motion-primitives.com/docs/morphing-dialog)는 표면의 연결된 전환만 적용하며, +램프 이미지·중앙 모달·배경 흐림을 복제하는 요구는 아니다. + +## 검증 한계 + +기존 Mac 실기 결과는 `5df5e36` 기준이다. 새 제어 UI와 이번 추가 코어 수정은 이 Linux 세션에서 +물리 Mac으로 다시 조작하지 않았다. Mac CI·서명·공증·Homebrew 설치 검사는 실제 협업 UI 검증과 +구분한다. 사용자 고유 게이트웨이, 물리 IME 조합, 네이티브 알림 센터와 네이티브 IPC 장애 주입은 +미검증이다. 로컬 GTK 개발 패키지는 없어 네이티브 컴파일은 CI의 플랫폼별 검사로 확인한다. +원격 웹 운영·서버 재시작 후 기존 PTY 복원·권한 자동 복원을 제공한다고 주장하지 않는다. diff --git a/docs/release-0.8.7-validation.md b/docs/release-0.8.7-validation.md new file mode 100644 index 0000000..4c179b5 --- /dev/null +++ b/docs/release-0.8.7-validation.md @@ -0,0 +1,91 @@ +# 0.8.7 release validation + +[한국어](release-0.8.7-validation.ko.md) · [Mac baseline](shared-runtime-macos-validation-results.ko.md) · [Control design](control-experience.md) + +2026-09-23. This records source validation for the release candidate. The tag's +GitHub Actions and release assets separately establish native build, signing, +notarization and distribution results; this document does not predeclare those results. + +## Changes and evidence + +- Native desktop and web use the same Svelte components/runes, owner contract, + session coordinator, PTY and policy engine. Web is a separate local host, not a + mirror of the desktop process or a second simulated UI. The Linux x64 web archive + includes the server, matching MCP CLI, compiled UI, manifest and checksums. +- Admission reserves an upper strip, control expands from the top-right Conn + badge, and command review stays below the terminal. Collapse/Escape preserves + the pending control request; automatic expansion does not steal typing focus. + Notifications navigate to decisions without granting authority. +- A pending command carries its own review reason and eligible scope. Delayed + global status cannot change its buttons. Profile/foreground changes invalidate + a stale grant, and the backend still checks current policy. Session-wide grants + require an explicit scope disclosure and remain unavailable for unverified shells. +- SSH foreground detection reads executable identity, never process arguments or + credentials. Both direct SSH and `printf ...; ssh ...` were tested through real + OpenSSH with the same remote policy behavior. Unknown contexts still require review. +- Human input bookkeeping retains no input bytes or command buffer. Navigation at + a known empty prompt does not block the agent. Erasure must return the visible + terminal to a previously observed empty boundary; Home followed by Ctrl-U cannot + falsely clear a remaining suffix. No echo/hidden input is not inferred empty. +- The Mac long-input deadlock fix is retained. An ordered output fence prevents + the process-exit event overtaking already queued output. The Linux entry point + defaults the WebKit DMABUF renderer workaround while honoring explicit overrides. +- Browser QA reproduced whole-frame panning after focus/resize, a menu covered by + admission, and hidden compact control buttons. Frame clipping, overlay stacking + and panel height fix those observed defects. This does not prove the reported + Mac gateway display issue had the same cause. + +## Linux results + +Linux, Rust 1.95.0, Node 26.8.1; production web build, real Rust host and persistent +MCP. Tests use isolated state directories and disposable files, not user work. + +| Check | Result | Boundary | +| --- | --- | --- | +| Rust default workspace | 282 passed, 1 ignored | Native Tauri excluded; missing local zsh cases internally skipped | +| Common UI | 66 passed | State isolation, request-scoped review actions and existing behavior | +| Web/MCP collaboration | 10 passed | Real PTY; no browser page errors; control collapse/reopen, focus, compact/reduced motion, risk denial, human takeover, tab location and reconnect | +| Local input/rendering | 23 passed | Actual Bash, long input, editing, wrapped LF/CRLF output, fixed-window docks and density changes | +| Direct SSH input/rendering | 24 passed | Disposable loopback OpenSSH, remote Bash, UTF-8 locale | +| Compound SSH entry | 24 passed | Same fixture entered through `printf ...; ssh ...`, including ordinary commands and scoped review | +| Core/xterm screen parity | 85 passed | Current grid and cursor | +| Checkpoint restoration | 984 passed | Grid, history, cursor, styles, modes, continuation and resize | +| App lifetime | PASS | Real common UI with minimal host/IPC fixtures; 21 isolation/recovery checks, not native OS execution | +| Release tooling | 81 passed | Version, asset matrix, checksums, signing evidence, unsafe archive paths and source identity | +| Contract and UI boundaries | PASS | Generated owner contract; no alternate browser runtime | +| Web and desktop frontend builds | PASS | Zero Svelte errors; 17 pre-existing warnings and bundle-size warning remain | + +The first SSH run used a non-UTF-8 fixture locale and failed Unicode checks. The +fixture was corrected to `C.UTF-8`, then all cases passed. This is a test-environment +correction, not evidence that every remote locale renders Unicode identically. + +### Output load + +The slow-consumer regression drains 4 MiB in ordinary CI. A separate 64 MiB run +with a 3 ms delay per output callback completed in 20.61 seconds, preserving every +byte and the final marker before process exit. Maximum process RSS was 88,508 KiB +(measured with GNU time, including payload allocation and the rest of the test). +The queue remains unbounded: sustained production faster than consumption can +increase memory without limit. Blocking the reader on a bounded queue would +reintroduce the observed PTY echo deadlock. This finite test is not an unlimited-load guarantee. + +## Visual evidence + +[Screenshots and checksums](validation/release-0.8.7/) show synthetic sessions only. +Desktop cases are 1280×800 at device scale 1; compact/reduced-motion is 640×420. +The in-app browser additionally verified collapse → badge → reopen → denial, +without focus theft or automatic approval, at 1280×720. The selected +[Motion Primitives reference](https://motion-primitives.com/docs/morphing-dialog) +was opened alongside the implementation: its surface continuity is the reference, +not its lamp image, centered modal, blur or typography. + +## Acceptance limits + +The incoming Mac native/local/loopback SSH evidence belongs to commit `5df5e36`. +The new control design and additional core fixes were not interactively rerun on a +physical Mac in this Linux session. macOS CI/build/signing and Homebrew install +checks are separate evidence, not a substitute for native collaboration acceptance. +The user's gateway, physical IME composition, native notification center and native +IPC fault injection remain unverified. Native Linux GTK development packages were +unavailable locally; platform compilation is delegated to the release CI matrix. +No remote web hosting, restored PTYs after server restart or restored grants are promised. diff --git a/docs/shared-runtime-follow-up.ko.md b/docs/shared-runtime-follow-up.ko.md new file mode 100644 index 0000000..c3e6c4d --- /dev/null +++ b/docs/shared-runtime-follow-up.ko.md @@ -0,0 +1,80 @@ +# 공통 런타임 — Mac 인수 후 작업 정리 + +> 아래는 인수 당시의 기록입니다. 남은 구현은 0.8.7 릴리스 후보에 반영했습니다. 현재 결과와 검증 한계는 [릴리스 검증 기록](release-0.8.7-validation.ko.md)을 확인하세요. + +[English](shared-runtime-follow-up.md) · [Mac 실기 보고서](shared-runtime-macos-validation-results.ko.md) +· [제어 UX 방향](control-experience.ko.md) · [제품 백로그](product-backlog.ko.md) + +2026-09-23 · 버전 `0.8.6` 유지 · **브랜치 개발 빌드 검증, 미배포**. + +## 받아온 변경 + +`codex/shared-runtime-macos-validation`을 `7fa5723`에서 +`5df5e3667ebb6a820fc8ac5e6b544beb7b68fe52`로 fast-forward했다. +다른 브랜치 병합·메인 병합·태그·배포는 하지 않았다. 기존 미커밋 설계 문서 7개는 +받기 전후 SHA-256이 같았으며, 이후 작업 정리 링크만 추가했다. + +| 커밋 | 내용 | +| --- | --- | +| `1d30c87` | 긴 입력에서 PTY 출력 읽기가 입력 쓰기의 세션 잠금을 기다리던 교착 수정. FIFO 소비자와 사람·에이전트 회귀 검사 추가 | +| `5df5e36` | macOS 네이티브·웹 실기 결과, 검증 스크립트 보완, 증거 이미지 12장 | + +Mac 이미지 12장의 SHA-256은 저장소의 증거 매니페스트와 모두 일치했다. +이는 증거 파일 무결성 확인이며 이 Linux 실행에서 Mac 검사를 다시 했다는 뜻이 아니다. + +## Linux에서 발견하고 보완한 검사 문제 + +원격 HEAD 그대로 실행한 첫 `cargo test --locked`는 새 회귀 검사 2개에서 실패했다. +긴 입력과 전체 출력, 다음 명령은 완료됐지만 Linux Bash/readline이 명령 출력 앞에 +bracketed-paste 모드 제어 문자를 넣었다. 검사에서 기대한 연속 원시 바이트 +`CRLF + NEXT_OUTPUT_OK + CRLF`와 일치하지 않아 시간 초과로 판정됐다. + +`crates/core/tests/shell_integration.rs`의 후속 출력 확인을 코어의 현재 터미널 그리드에서 +`NEXT_OUTPUT_OK`가 독립된 행인지 검사하도록 보완했다. 입력 쓰기의 5초 제한과 +3KB 전체 출력 검사는 유지했다. 명령 에코만으로는 새 조건을 통과할 수 없다. +런타임 수정은 추가하지 않았으며 이 검사 보완은 아직 로컬 미커밋 변경이다. + +## 이번 Linux 회귀 결과 + +환경: Linux, Rust 1.95.0, Node 26.8.1. `npm ci`를 다시 실행했다. +아래는 `5df5e36`과 위 테스트 보완을 기준으로 한 결과다. + +| 검사 | 결과 | 범위 | +| --- | --- | --- | +| `cargo test --locked` | **274 PASS, 1 ignored** | 기본 워크스페이스 멤버. 네이티브 Tauri 제외; zsh 미설치 사례 내부 skip | +| `cargo build --locked -p conn-web -p conn` | **PASS** | 실제 Rust 웹 호스트와 MCP CLI | +| `npm run build:web` | **PASS** | Svelte 오류 0, 기존 경고 17개와 번들 크기 경고 유지 | +| `npm run test:ui` | **65 PASS** | 공통 UI 상태·동작 | +| `npm run test:collaboration` | **8 PASS** | 빌드된 공통 웹 UI·실제 Rust·지속 MCP, 페이지 오류 없음 | +| `npm run test:input -w @conn/collaboration-tests` | **23 PASS** | 로컬 Bash 입력·렌더링. 이번 실행은 SSH 픽스처를 지정하지 않음 | +| `npm run test:screen -w @conn/ui` | **85 PASS** | 코어/xterm 현재 그리드·커서 비교 | +| `npm run test:checkpoint -w @conn/ui` | **984 PASS** | 체크포인트 복원·후속 출력·크기 변경 | +| `npm run test:app-lifetime -w @conn/ui` | **PASS** | 실제 공통 UI + 통제한 호스트/IPC 픽스처. 네이티브 OS·실제 PTY·MCP 검사는 아님 | +| 생성 owner 계약 / 공통 UI 의존성 경계 | **PASS / PASS** | Rust/TS 계약 일치, 얇은 앱 진입점 유지 | + +의존성 설치가 보고한 기존 low 등급 항목 2개는 강제 업데이트하지 않았다. +이번에 Linux 네이티브 앱, 물리 IME, 사용자 서버, 시스템 알림을 재검증하지 않았다. +Mac의 실제 루프백 SSH 24개 결과는 Mac 보고서에 속하며 위 Linux 수치에 합산하지 않는다. + +## 완료와 미완료를 나누는 기준 + +완료된 것은 공통 UI·런타임 리팩터링, Mac에서 발견한 긴 입력 교착 수정, 보고서에 명시된 +Mac 실기 경로, 위 Linux 회귀다. 설치된 공개 v0.8.6에 이 미배포 브랜치 변경이 들어갔다고 +표현하지 않는다. Mac의 승인 단계 기능 PASS도 단계의 구별성과 사용자 이해도 PASS를 뜻하지 않는다. + +| 남은 작업 | 판단 / 다음 완료 기준 | +| --- | --- | +| **P1 · 사람 입력 상태 판정** | [#65](https://github.com/eggp-dev/conn/issues/65). 빈 프롬프트를 막는 경우와 남은 사람 입력에 에이전트 입력이 붙는 경우를 함께 해결. 제어 문자 끝 바이트만 보는 현행 판정이 남아 있음 | +| **P1 · 승인 요청 상태의 일관성** | 승인 사유·대상·범위·가능한 버튼을 하나의 일관된 상태로 전달. 지연된 세션 상태가 같은 요청의 버튼·설명을 바꾸지 않게 하고 서버의 최신 권한 검사는 유지 | +| **P1 · 승인 이유의 정확성** | 명령 위험과 셸 맥락 불확실성을 구분. 복합 명령을 통한 SSH 진입 차이를 별도 재현하고 설명; 비공유나 플랫폼 UI 차이로 단정하지 않음 | +| **제어 UX · 합의한 방향의 구현** | 오른쪽 Conn 뱃지에서 Morphing Dialog처럼 제어권 요청이 확장·복귀. 명령 실행 검토는 하단 유지. 공통 컴포넌트·룬으로 구현하고 반복·다른 탭·키보드·동작 줄이기 검증 | +| **출시 전 런타임 부하 검증** | 무제한 출력 큐의 장시간·대량 출력·느린 소비자에서 메모리, 지연, 종료 시 마지막 출력 순서 측정. 단순히 대기형 유한 큐로 바꾸면 교착을 재도입할 수 있음 | +| **Linux 설치판 시작 문제** | 이 대화에서 확인한 렌더러 환경 변수 우회는 로컬 조치. 이번 Mac 커밋은 설치판 수정이나 다른 장치의 동작 검증을 포함하지 않음 | +| **환경별 인수·릴리스** | 실제 사용자 SSH 게이트웨이, 물리 IME, 네이티브 알림, 네이티브 IPC 장애 주입과 배포 서명·공증·업데이트 산출물은 별도 검증 | + +작업 순서는 **입력·승인 상태의 정확성 → 합의한 제어 UX 구현 → 같은 실제 경로의 인수 검증**으로 +잡는다. 출력 큐 부하 검증은 독립된 출시 전 항목이다. 새 UI가 오래된 상태 결함을 가리거나 +일반적인 반복 작업마다 다시 승인하게 만들어서는 안 된다. + +현재 로컬 변경은 제품 불변식·제어 UX 설계·작업 정리 문서와 Linux 회귀 테스트 보완이다. +새 모핑 UI 구현, 커밋·푸시, 메인 병합·태그·배포는 이번 인수 작업에 포함하지 않았다. diff --git a/docs/shared-runtime-follow-up.md b/docs/shared-runtime-follow-up.md new file mode 100644 index 0000000..a31f2d9 --- /dev/null +++ b/docs/shared-runtime-follow-up.md @@ -0,0 +1,84 @@ +# Shared runtime — follow-up after Mac validation + +> Historical handoff baseline. The remaining implementation is now included in the 0.8.7 release candidate. See [release validation](release-0.8.7-validation.md) for current results and limits. + +[한국어](shared-runtime-follow-up.ko.md) · [Mac report](shared-runtime-macos-validation-results.ko.md) +· [Control UX direction](control-experience.md) · [Product backlog](product-backlog.md) + +2026-09-23 · version remains `0.8.6` · **branch development validation, unreleased**. + +## Incoming changes + +Fast-forwarded `codex/shared-runtime-macos-validation` from `7fa5723` to +`5df5e3667ebb6a820fc8ac5e6b544beb7b68fe52`. No other branch merge, main merge, +tag or deployment was performed. All seven existing uncommitted design documents +retained identical SHA-256 hashes across the update; follow-up links were added afterward. + +| Commit | Change | +| --- | --- | +| `1d30c87` | Drain PTY output independently of the input writer's session lock; ordered FIFO consumer and two long-input regressions | +| `5df5e36` | Native macOS/web validation, test-script improvements and twelve evidence images | + +All twelve image hashes match the Mac evidence manifest. This verifies file +integrity, not a new Mac validation run on this Linux host. + +## Linux test portability correction + +The first unmodified `cargo test --locked` failed the two new regression tests. +Long input, its complete output and the following command all completed. Linux +Bash/readline inserted a bracketed-paste mode escape before command output, so the +assertion requiring adjacent raw `CRLF + NEXT_OUTPUT_OK + CRLF` bytes timed out. + +Updated the follow-up assertion in `crates/core/tests/shell_integration.rs` to +require an exact `NEXT_OUTPUT_OK` row in the core's current terminal grid. The +five-second write deadline and full 3KB output check remain. Command echo alone +cannot satisfy the new assertion. This is an uncommitted local test correction; +no additional runtime change was made. + +## Linux results from this run + +Linux, Rust 1.95.0, Node 26.8.1; dependencies reinstalled with `npm ci`. +Results use `5df5e36` plus the test correction above. + +| Check | Result | Scope | +| --- | --- | --- | +| `cargo test --locked` | **274 passed, 1 ignored** | Default workspace members, excluding native Tauri; unavailable zsh cases internally skipped | +| `cargo build --locked -p conn-web -p conn` | **PASS** | Actual Rust web host and MCP CLI | +| `npm run build:web` | **PASS** | Zero Svelte errors; 17 existing warnings and bundle-size warning remain | +| `npm run test:ui` | **65 passed** | Common UI state and behavior | +| `npm run test:collaboration` | **8 passed** | Production common UI, real Rust and persistent MCP; no page errors | +| `npm run test:input -w @conn/collaboration-tests` | **23 passed** | Local Bash input/rendering; no SSH fixture configured in this run | +| `npm run test:screen -w @conn/ui` | **85 passed** | Core/xterm current grid and cursor | +| `npm run test:checkpoint -w @conn/ui` | **984 passed** | Checkpoint restoration, continuation and resize | +| `npm run test:app-lifetime -w @conn/ui` | **PASS** | Actual common UI with controlled host/IPC fixtures, not native OS, real PTY or MCP | +| Generated owner contract / common UI import boundary | **PASS / PASS** | Rust/TS contract and thin app entry points | + +The two existing low-severity dependency findings were not force-upgraded. Native +Linux UI, physical IME, user servers and system notifications were not rerun. +The Mac report's 24 loopback SSH cases remain Mac evidence and are not added to Linux counts. + +## Completed work and remaining work + +Completed: common UI/runtime refactor, the Mac long-input deadlock fix, the named +Mac native paths and the Linux regression checks above. These branch changes are +not claimed to be in the installed public v0.8.6. Functional approval-stage PASS +does not establish that people can distinguish and understand those stages. + +| Remaining work | Next acceptance boundary | +| --- | --- | +| **P1: human input state** | [#65](https://github.com/eggp-dev/conn/issues/65): fix both false blocks at empty prompts and unsafe appending to remaining human input; last-byte heuristics remain | +| **P1: coherent approval state** | Deliver reason, target, scope and eligible actions together; delayed status must not change the same request's buttons or rationale; retain current backend checks | +| **P1: accurate review reasons** | Separate command risk from uncertain shell context; reproduce compound-command SSH differences rather than attributing them to privacy or platform UI | +| **Agreed control UX** | Morph the top-right Conn badge into and out of control requests; keep command review below; implement with common components/runes and validate repetition, other tabs, keyboard and reduced motion | +| **Runtime load before release** | Measure unbounded queue memory, latency and final output ordering under sustained output and slow consumption; a blocking bounded queue can reintroduce the deadlock | +| **Linux installed-app startup** | The renderer environment-variable workaround confirmed in this conversation is local; the Mac commits contain neither an installer fix nor validation on other devices | +| **Environment and release acceptance** | User SSH gateway, physical IME, native notifications, native IPC fault injection, signed/notarized release and updater artifacts need separate checks | + +Sequence: **input and approval-state correctness → agreed control UX → acceptance +through the same real paths**. Queue load testing is an independent pre-release +item. New visual polish must not conceal stale state or ask again throughout +ordinary work already within a grant. + +Local changes comprise the product invariant, control UX design, this work summary +and the Linux test correction. Morphing UI implementation, commit/push, main merge, +tags and deployment were not performed during this handoff. diff --git a/docs/shared-runtime-macos-validation-results.ko.md b/docs/shared-runtime-macos-validation-results.ko.md new file mode 100644 index 0000000..59ae560 --- /dev/null +++ b/docs/shared-runtime-macos-validation-results.ko.md @@ -0,0 +1,98 @@ +# 공통 UI·런타임 macOS 실기 검증 + +2026-09-22~23 · 버전 `0.8.6` · 개발 빌드 검증, 미배포 + +**기준 소스에서 macOS PTY 교착을 재현했고 수정 후 같은 네이티브 입력 경로와 실제 SSH 경로를 재검증했다. 확인한 기능 경로는 PASS다.** 배포 서명·공증·업데이트 산출물, 사용자 고유 SSH 게이트웨이와 물리 한글 IME 조합은 이 결과에 포함하지 않는다. + +## 소스와 격리 + +- 저장소: `eggp-dev/conn`, 브랜치: `codex/shared-runtime-macos-validation`. +- 기준 커밋: `7fa572385f92740ab2107f23e7fcfc081b56a79f`. +- 런타임 수정 커밋: `1d30c87d69b6231a9b3c37c171bebc7038f6b1a4`. 최종 앱과 Rust 호스트는 이 커밋과 같은 런타임 소스로 빌드했다. 후속 변경은 검증 스크립트·문서·증거다. +- 별도 `conn-runtime-validation` worktree를 만들었다. 기존 두 checkout, 설치된 `/Applications/Conn.app`, 기본 Conn 설정·소켓·기존 MCP 프로세스는 보존했다. 프로젝트/상위 경로에 적용되는 `AGENTS.md`는 없었다. +- macOS 27.0, Rust 1.95.0, Node 24.13.0. 장치 이름·계정·개인 경로는 공개 기록에서 제외했다. +- 별도 제품명 **Conn Runtime Validation**, 번들 식별자 `dev.eggp.conn.runtimevalidation.7fa5723`, 독립 `CONN_CONFIG_DIR`·`CONN_SOCKET`으로 실행했다. 시험용 웹 호스트도 별도 설정·소켓을 사용했다. +- 실제 실행 파일은 worktree 기준 `frontends/tauri/src-tauri/target/debug/bundle/macos/Conn Runtime Validation.app/Contents/MacOS/conn-desktop`이다. MCP는 같은 번들의 `Contents/MacOS/conn`을 사용했다. 절대 경로와 바이너리 SHA-256은 저장소 밖 실행 기록에 보관했다. +- `npm ci` 후 Rust 데스크톱과 앱 번들을 빌드했다. 외부 Tauri 설정으로 제품명·식별자를 바꾸고 `--debug --bundles app`, `APPLE_SIGNING_IDENTITY=-`를 사용했다. 설치용 배포 빌드가 아니다. + +실기 조작은 Computer Use의 네이티브 앱·브라우저 UI로 수행했다. MCP는 실제 CLI의 stdio 프로세스를 여러 단계 동안 유지했다. 소유자 승인에 내부 IPC를 대신 사용하지 않았다. 네이티브와 웹은 같은 Bash 프로필, 기본 정책, autopilot, 승인/lease 시간과 합성 명령을 사용했다. 두 프로세스가 PTY를 자동 공유한다고 가정하지 않았다. + +## 재현한 결함과 수정 + +**FAIL → 수정 → PASS: 긴 입력 중 PTY 교착.** 기준 앱에서 약 3KB의 `printf` 명령을 `terminal_type`으로 보내자 응답과 다음 입력이 멈췄다. 실제 Rust 웹 호스트의 지속 MCP 검사도 같은 길이의 입력에서 멈췄다. 프로세스 스택에서는 쓰기가 세션 잠금을 잡은 채 PTY 버퍼를 기다리고, PTY 출력 리더는 같은 잠금을 기다렸다. macOS PTY에서 readline echo가 양방향 버퍼를 채우며 생기는 대기였다. + +`crates/core/src/engine.rs`에서 PTY 읽기와 세션 반영을 분리했다. 리더는 계속 읽고 FIFO 소비자 하나가 바이트 순서대로 세션에 반영한다. 이미 도착한 작은 조각만 묶어 처리하며 추가 지연을 넣지 않는다. 출력 완료 표시는 마지막 read가 아니라 소비자의 반영 완료 뒤에 세운다. 권한·정책·입력 순서나 불확실한 입력의 재전송 규칙은 바꾸지 않았다. + +교착을 다시 만들지 않도록 채널의 send는 용량 때문에 대기하지 않는다. 따라서 소비자가 장시간 밀리면 큐 메모리가 늘 수 있다. 이번 입력·출력 시나리오의 통과를 무제한 출력 부하 검증으로 해석하면 안 된다. + +회귀 검사 `long_agent_input_drains_pty_echo_without_deadlock`, `long_human_paste_drains_pty_echo_without_deadlock`를 추가했다. 각각 3KB 입력 쓰기가 제한 시간 안에 끝나고 전체 출력과 다음 명령까지 이어지는지 검사한다. 실패 시 독립 경로로 시험 셸을 종료하여 테스트 자체가 교착에 갇히지 않게 했다. + +실제 앱 재검증은 다음을 포함했다. + +- 로컬 MCP: 긴 명령 완료 후 `AFTER_LONG_INPUT_OK`. [수정 직후 화면](validation/shared-runtime-macos/native-08-long-input-fixed.jpg). 이 이미지는 출력 FIFO 수정 직후이며, 뒤에 작은 출력 조각 합치기를 추가했다. +- 최종 네이티브 + 실제 SSH: 3,029자 명령 뒤 `FINAL_AFTER_LONG_OK`, `한글 FINAL_LINE_TWO`, `remote$`가 각각 올바른 줄에 표시됐다. [최종 SSH 화면](validation/shared-runtime-macos/native-14-final-long-ssh.jpg). +- 최종 네이티브 로컬 사람 입력: Computer Use로 3KB를 붙여넣고 Enter, 이어서 한글을 포함한 여러 줄을 붙여넣었다. `LOCAL_AFTER_LONG_OK`, `한글 LOCAL_TWO`, `LOCAL_THREE`와 프롬프트를 확인했다. [창 크기 복원 후 화면](validation/shared-runtime-macos/native-17-local-human-long-restored.jpg). + +[기준 앱 정지 당시 화면](validation/shared-runtime-macos/native-07-long-input-stall.jpg)만으로 교착을 판단하지 않았다. 응답 정지, 스택과 실제 호스트 재현을 함께 사용했다. 원본 스택·인증 로그는 공개하지 않는다. + +검증 스크립트도 두 곳을 수정했다. 설정 단축키를 macOS에서도 동작하는 `ControlOrMeta`로 바꾸고, 새 OS 계정이나 실제 개인 키 없이 OpenSSH를 시험하는 `CONN_SSH_FIXTURE_CONFIG` 경로를 추가했다. 기존 합성 암호 픽스처 경로는 유지한다. + +## 실제 화면·협업 결과 + +| 항목 | 판정과 관찰 | +| --- | --- | +| 네이티브 빌드·실행 | **PASS.** 실제 Tauri Rust 데스크톱과 별도 `.app` 실행. 설치 앱과 다른 경로·제품명으로 확인했다. | +| 고정 창의 승인 패널 | **PASS.** 1120×720 창에서 위험 명령 검토를 반복하고 거절했다. 터미널은 137열을 유지하고, 열린 패널에서 30행, 닫힌 뒤 41행으로 복원됐다. [열린 화면](validation/shared-runtime-macos/native-11-panel-review.jpg), [복원·후속 명령](validation/shared-runtime-macos/native-13-restored-after-review.jpg). 캡처 진단 중 별도 요청 하나는 만료됐으며 거절 성공으로 세지 않았다. | +| 긴 입력·줄끝·한글·붙여넣기 | **PASS, 확인한 범위.** 로컬·SSH에서 긴 영문과 한글 혼합을 입력하고 줄끝 이동·삭제·대체 후 `END_Y`를 확인했다. [로컬 편집 결과](validation/shared-runtime-macos/native-06-same-name-new-admission.jpg), [SSH 편집 결과](validation/shared-runtime-macos/native-09-ssh-unicode-edited.jpg). 확정 문자열과 붙여넣기 검사이며 물리 IME 조합 검사와 구분한다. | +| 줄바꿈·커서·다음 출력 | **PASS, 확보한 현재 화면.** 긴 행이 오른쪽까지 사용되고 여러 줄 출력 뒤 새 프롬프트가 분리된다. MCP 그리드·커서와 화면을 대조했다. 실제 Chromium에서는 전체 행/커서 자동 비교도 수행했다. 네이티브의 모든 프레임을 픽셀 단위로 비교한 것은 아니다. | +| 연결 승인과 공유 | **PASS.** 연결을 허용해도 비공유 셸 목록은 0개였다. 사람의 선택 공유 후 세션이 보였으나 제어권 없는 쓰기는 `not_controller`였다. | +| 제어권과 명령 승인 | **PASS.** 별도 제어 요청을 UI에서 승인했다. 공유 직후 첫 일반 명령은 환경 검토가 필요했고, 승인 후 다음 일반 명령은 같은 MCP 프로세스에서 추가 연결 승인 없이 실행됐다. [첫 명령 검토](validation/shared-runtime-macos/native-03-initial-review.jpg). | +| 위험 명령과 사람 개입 | **PASS.** 시험 경로의 `rm -rf`는 검토 카드로 보냈고 거절했다. 거절 후 입력을 취소하고 다음 일반 명령이 실행됐다. 사람이 커서를 편집하면 에이전트 쓰기와 Enter 모두 `not_controller`; 명시적 제어 반환도 성공했다. | +| 같은 이름의 새 프로세스 | **PASS.** 별도 MCP 프로세스를 같은 표시 이름으로 연결하자 새 연결 승인 카드가 나타났다. 기존 권한을 이어받지 않았으며 새 요청은 거절했다. [화면](validation/shared-runtime-macos/native-06-same-name-new-admission.jpg). | +| 에이전트 새 탭·알림 | **PASS.** 새 탭에 에이전트 이름·요청 배지와 `Needs you`가 표시되고 사람의 기존 SSH 탭은 유지됐다. 앱 내부 알림도 확인했다. [네이티브 화면](validation/shared-runtime-macos/native-15-background-agent-tab.jpg). 웹에서도 같은 흐름을 확인했다. | +| 웹 새로고침·화면 인계 | **PASS.** 실제 화면에서 설정한 `CONN_RETAINED=web_retained_42`가 새로고침과 `Continue here` 인계 뒤 유지됐다. 이전 화면은 `Open in another view`로 입력이 차단됐다. [인계 뒤 출력](validation/shared-runtime-macos/web-04-handoff-retained.jpg). | +| 입력 실패·화면 복구 | **PASS, 검사별 범위.** 실제 웹/Rust/MCP 검사는 첫 입력 응답의 `owner_busy` 주입 후 명시적 재연결, 기존 PTY 유지, 불확실한 입력 재전송 없음, 새 입력 순서 회복을 확인했다. 체크포인트 실패·소켓 종료 경합은 공통 UI와 앱 수명 검사로 확인했다. 실제 네이티브 IPC에 고장을 주입한 결과는 아니다. | +| 웹 서버 수명 | **PASS.** 시험 서버 종료 시 기존 Bash PTY 두 개도 종료됐음을 확인했다. 같은 설정·포트로 재시작하여 새 연결 코드로 접속하자 `RESTART_unset`인 새 셸이 생겼다. [재시작 화면](validation/shared-runtime-macos/web-06-host-restarted.jpg). 서버 재시작 후 셸 복구 기능은 아니다. | + +### SSH와 플랫폼 차이 + +실제 `/usr/sbin/sshd`를 루프백 시험 포트에서 실행했다. 폐기 가능한 호스트 키·클라이언트 키, 고정한 known-hosts, 별도 `ssh -F` 설정과 원격 Bash를 사용했다. 개인 SSH 키, 에이전트 소켓과 기존 SSH 설정은 사용하지 않았다. 암호 인증·PAM·포트 포워딩도 사용하지 않았다. 호스트의 기존 실행 계정 권한에서 돌린 시험이며 별도 원격 사용자나 사용자 게이트웨이 환경은 아니다. + +네이티브에서도 SSH `exit` 뒤 로컬 `validation$`로 복귀하고 `NATIVE_LOCAL_RETURN_OK`를 실행했다. 같은 로컬 PTY가 살아 있고 사람 제어 상태임을 MCP 그리드로 확인했다. 시험을 마친 뒤 이번에 시작한 MCP·웹 호스트·sshd·화면 유지 프로세스를 종료했다. 검증 앱은 사람 제어의 로컬 셸로 남겼다. + +처음에는 `printf ...; ssh ...`처럼 복합 명령으로 진입하여 추가 환경 검토가 나타났다. 같은 설정에서 단독 `ssh ...`로 다시 진입하자 안전 명령 자동 실행과 위험 명령 검토를 확인했다. 코어는 단일 SSH 명령의 셸 수명만 SSH 전송으로 추적한다(`Session::shell_integration_event`, `remote_policy`). 이 차이는 셸 상태/명령 분석 경계이며 네이티브·웹 UI 분기나 사적 셸이라는 추정으로 설명하지 않았다. + +네이티브는 Tauri IPC·WebKit, 웹은 WebSocket·브라우저 인증과 명시적 화면 인계를 사용한다. 공유 화면·승인 카드는 공통 UI이고 권한·정책은 공통 런타임/코어에 있다. 이번 동일 조건 비교에서 이를 벗어나는 정책 차이는 찾지 못했다. 네이티브 운영체제 알림 센터의 전달·클릭, 업데이트·외부 링크 기능은 별도 플랫폼 어댑터 실기 범위다. + +### 화면 캡처 제한 + +화면 잠금/백그라운드 구간에 macOS 캡처 오류와 과거 프레임이 발생했다. WebKit 콘솔에서 `document.visibilityState === "hidden"`과 `ResizeObserver loop completed with undelivered notifications`도 관찰했다. AX 상태와 픽셀이 다른 캡처는 PASS 근거에서 제외했다. 창 메뉴로 창을 다시 올린 뒤 패널 복원 화면을 확보했고, 마지막 로컬 붙여넣기는 창을 확대했다가 원래 1120×720으로 복원한 후 현재 출력을 확보했다. + +이 관찰로 앱의 전경 렌더링 결함이 확정됐다고 판단하지 않았다. 반대로 백그라운드에서 매 프레임 즉시 그려진다고 보증하지도 않는다. `native-10`, `native-12`, `native-16` 원본은 진단 자료로만 보관하며 공개 PASS 증거에 넣지 않았다. 별도 크기 변경으로 확보한 마지막 로컬 화면은 고정 창 패널 반복 검사의 증거로 사용하지 않았다. + +## macOS에서 다시 실행한 자동 검사 + +| 검사 | 결과 | +| --- | --- | +| `cargo test --locked` | **274 PASS, 1 ignored**. 기준 272개에서 교착 회귀 2개 추가 | +| Tauri manifest의 `cargo test --locked` | **4 PASS, 1 ignored**. ignored는 최종 릴리스 서명 산출물 필요 | +| `npm run test:ui` | **65 PASS** | +| 실제 Rust·프로덕션 웹·지속 MCP | **8 PASS** | +| 로컬 입력·렌더링 | **23 PASS** | +| 실제 루프백 OpenSSH 입력·렌더링 | **24 PASS**, 로컬 셸 복귀 포함 | +| 코어/xterm 그리드·커서 | **85 PASS** | +| 실제 xterm 체크포인트 복원 | **984 PASS** | +| 앱 수명·격리·실패 처리 | **PASS** | +| 네이티브 앱 / 웹 UI 빌드 | **PASS / PASS** | +| 생성된 owner 계약·공통 UI import 경계 | **PASS** | + +웹 자동 검사는 이 macOS에서 실행한 Chromium 결과다. 네이티브 Computer Use 증거와 합산하여 같은 종류의 테스트 수로 표현하지 않았다. 기존 프런트엔드 경고와 npm 의존성의 low 등급 항목 2개는 이번 수정 대상이 아니다. + +## 판정과 남은 범위 + +- **FAIL 해결:** 기준 커밋의 3KB 입력 교착. 공통 코어 수정과 사람/에이전트 회귀 검사, 네이티브 로컬·SSH 재실행으로 확인했다. +- **PASS:** 위 표에 명시한 개발 빌드·실제 화면·지속 MCP·루프백 SSH·웹 수명 경로. +- **BLOCKED / 범위 밖:** 사용자 고유 원격 게이트웨이·인증 환경은 시험 접속 조건이 없어 검증하지 않았다. 물리 한글 IME 조합, 네이티브 알림 센터, 실제 네이티브 IPC 장애 주입도 수행하지 않았다. 자동 검사나 문자열 붙여넣기로 해당 검증을 대신했다고 표시하지 않는다. +- **배포 판정 없음:** 배포 서명·공증·업데이트 최종 산출물은 검증하지 않았다. 원격 웹 인증·TLS·다중 사용자 운영, 별도 데스크톱과 웹의 자동 PTY 공유, 서버 재시작 복구도 이번 구현의 기능이 아니다. 메인 병합·태그·배포를 수행하지 않았다. + +공개 [요약 증거와 이미지 SHA-256](validation/shared-runtime-macos/evidence.json)은 계정·장치 식별 정보, 실제 키·연결 토큰, 원본 인증 로그를 포함하지 않는다. 이미지는 Computer Use가 반환한 원본 JPEG 바이트이며 내용을 수정하지 않았다. 전체 명령 응답·빌드 로그·인증 픽스처·절대 실행 경로는 저장소 밖 격리된 기록에 보관했다. diff --git a/docs/validation/release-0.8.7/SHA256SUMS b/docs/validation/release-0.8.7/SHA256SUMS new file mode 100644 index 0000000..6753dbc --- /dev/null +++ b/docs/validation/release-0.8.7/SHA256SUMS @@ -0,0 +1,6 @@ +583e04c9d4f64495b63d59cd0a28593f8eb560d4f04c4209f4df7ada3dd32436 background-agent-tab.png +fab89cec952957293e3dee3c86277b442b95f7b5d90bb7565c3ab1b26d01bd4c command-review.png +bf2e2a91f8cdb6248a22fb9cd02218d18219a5a1c18d0525969b694f53c6d78e connection-admission.png +28f42ed8082b24a5379d4f3037860b7b9edf38e45ce6505f8f4d5d7311161575 control-collapsed.png +d859a13081f8312daf888f9a216ff1be878450177a77aa9cd8f38f707956dbec control-compact-reduced.png +b80c53348ea8910396c73a264890c1324e0f9eda876943451df121cb5694871f control-open.png diff --git a/docs/validation/release-0.8.7/background-agent-tab.png b/docs/validation/release-0.8.7/background-agent-tab.png new file mode 100644 index 0000000..2c6979c Binary files /dev/null and b/docs/validation/release-0.8.7/background-agent-tab.png differ diff --git a/docs/validation/release-0.8.7/command-review.png b/docs/validation/release-0.8.7/command-review.png new file mode 100644 index 0000000..0fb6445 Binary files /dev/null and b/docs/validation/release-0.8.7/command-review.png differ diff --git a/docs/validation/release-0.8.7/connection-admission.png b/docs/validation/release-0.8.7/connection-admission.png new file mode 100644 index 0000000..8db4321 Binary files /dev/null and b/docs/validation/release-0.8.7/connection-admission.png differ diff --git a/docs/validation/release-0.8.7/control-collapsed.png b/docs/validation/release-0.8.7/control-collapsed.png new file mode 100644 index 0000000..76cc52a Binary files /dev/null and b/docs/validation/release-0.8.7/control-collapsed.png differ diff --git a/docs/validation/release-0.8.7/control-compact-reduced.png b/docs/validation/release-0.8.7/control-compact-reduced.png new file mode 100644 index 0000000..ad7d130 Binary files /dev/null and b/docs/validation/release-0.8.7/control-compact-reduced.png differ diff --git a/docs/validation/release-0.8.7/control-open.png b/docs/validation/release-0.8.7/control-open.png new file mode 100644 index 0000000..4935b65 Binary files /dev/null and b/docs/validation/release-0.8.7/control-open.png differ diff --git a/docs/validation/shared-runtime-macos/evidence.json b/docs/validation/shared-runtime-macos/evidence.json new file mode 100644 index 0000000..7d6751f --- /dev/null +++ b/docs/validation/shared-runtime-macos/evidence.json @@ -0,0 +1,191 @@ +{ + "baseline": "7fa572385f92740ab2107f23e7fcfc081b56a79f", + "runtimeFix": "1d30c87d69b6231a9b3c37c171bebc7038f6b1a4", + "version": "0.8.6", + "testEnvironment": { + "os": "macOS 27.0", + "rust": "1.95.0", + "node": "24.13.0", + "nativeWindow": { + "width": 1120, + "height": 720 + }, + "localShell": "Bash", + "sshFixture": "Loopback OpenSSH, disposable key, remote Bash" + }, + "results": { + "privateSessionVisibleTabs": 0, + "sharedBeforeControl": { + "isError": true, + "message": "not_controller: you do not hold control of this session — call terminal_request_control first (tools/list has changed)" + }, + "afterHumanType": { + "isError": true, + "message": "not_controller: you do not hold control of this session — call terminal_request_control first (tools/list has changed)" + }, + "afterHumanEnter": { + "isError": true, + "message": "not_controller: you do not hold control of this session — call terminal_request_control first (tools/list has changed)" + }, + "firstSharedCommand": "pending", + "firstSharedCommandDecision": "granted", + "nextSafeCommand": "executed", + "approvalPanelOpen": { + "size": { + "cols": 137, + "rows": 30 + }, + "cursor": { + "col": 38, + "row": 29 + }, + "processAlive": true + }, + "approvalPanelRestored": { + "size": { + "cols": 137, + "rows": 41 + }, + "cursor": { + "col": 8, + "row": 40 + }, + "processAlive": true + }, + "nativeLocalLongHuman": { + "size": { + "cols": 137, + "rows": 41 + }, + "cursor": { + "col": 12, + "row": 40 + }, + "processAlive": true + }, + "nativeSshLongInput": { + "typed": 3029 + }, + "nativeSshFollowingCommand": { + "cmd": "printf 'FINAL_AFTER_LONG_OK\\n한글 FINAL_LINE_TWO\\n'", + "status": "executed" + }, + "release": { + "released": true + }, + "webHostStop": { + "ptyChildrenBeforeStop": 2, + "survivors": 0 + }, + "webReloadAndHandoffVariable": "web_retained_42", + "webRestartVariable": "unset", + "nativeSshExit": { + "localPromptReturned": true, + "followupMarker": "NATIVE_LOCAL_RETURN_OK", + "processAlive": true + } + }, + "automated": { + "rust": { + "passed": 274, + "ignored": 1 + }, + "nativeRust": { + "passed": 4, + "ignored": 1 + }, + "ui": 65, + "collaboration": 8, + "localInput": 23, + "sshInput": 24, + "gridCursor": 85, + "checkpoint": 984, + "appLifetime": "PASS" + }, + "screenshots": [ + { + "file": "native-03-initial-review.jpg", + "sha256": "fc286ae352b6184f75dc9d6514632092f24a66aec75cdf353bea92e3cc7edeb9", + "width": 1120, + "height": 720, + "sourcePhase": "baseline" + }, + { + "file": "native-06-same-name-new-admission.jpg", + "sha256": "18a5fb6f2e0aff088eafb87e64501a79e6d23aae265c133003c8413bc348ced1", + "width": 1120, + "height": 720, + "sourcePhase": "baseline" + }, + { + "file": "native-07-long-input-stall.jpg", + "sha256": "89cf4ba57ea2406c65c2756280081d56b2b17440e8fb0ad975e8bc8dea7fae80", + "width": 1120, + "height": 720, + "sourcePhase": "baseline" + }, + { + "file": "native-08-long-input-fixed.jpg", + "sha256": "6c163e08166b76231f99d8d0e5ddada7aeb33f781487d87c4c856470fc2caee2", + "width": 1120, + "height": 720, + "sourcePhase": "initial FIFO fix before output coalescing" + }, + { + "file": "native-09-ssh-unicode-edited.jpg", + "sha256": "70f321845fd8a9b1197e2bcb33cca407d8ae8ab28aba3eb28cded39bbb4cd614", + "width": 1120, + "height": 720, + "sourcePhase": "final runtime fix" + }, + { + "file": "native-11-panel-review.jpg", + "sha256": "ff1ca00eeb0870ec17fd206fa973ce9f3e935f89d5795e05163ad59a05f6cb78", + "width": 1120, + "height": 720, + "sourcePhase": "final runtime fix" + }, + { + "file": "native-13-restored-after-review.jpg", + "sha256": "50e6fc32c04664ac67aa9ca890654d7df12463100b130b7e9b0da8d38827e8e9", + "width": 1120, + "height": 720, + "sourcePhase": "final runtime fix" + }, + { + "file": "native-14-final-long-ssh.jpg", + "sha256": "93ef07d167f9bed89c5d9abe2ed6dd8df47be767c8ee5abff207d73b563246c3", + "width": 1120, + "height": 720, + "sourcePhase": "final runtime fix" + }, + { + "file": "native-15-background-agent-tab.jpg", + "sha256": "6a811bcdd554b58fba05453f23b6986d238a22c8845d3c93f1bb1b12ceaadc22", + "width": 1120, + "height": 720, + "sourcePhase": "final runtime fix" + }, + { + "file": "native-17-local-human-long-restored.jpg", + "sha256": "0df4dbff857cd3d1995250ca4e6ce5cc454a15c6d8c2ab76ec610424d60e6b61", + "width": 1120, + "height": 720, + "sourcePhase": "final runtime fix" + }, + { + "file": "web-04-handoff-retained.jpg", + "sha256": "e8587879ab34b4c2e95b63ccd09eda17b86c72f402049066bc01e484d7f0167d", + "width": 736, + "height": 583, + "sourcePhase": "final runtime fix" + }, + { + "file": "web-06-host-restarted.jpg", + "sha256": "3aac131f9ce79a6d6a9dad068f7d048923197ea2476577f62aef7d8a70742258", + "width": 736, + "height": 863, + "sourcePhase": "final runtime fix" + } + ] +} diff --git a/docs/validation/shared-runtime-macos/native-03-initial-review.jpg b/docs/validation/shared-runtime-macos/native-03-initial-review.jpg new file mode 100644 index 0000000..d769b0b Binary files /dev/null and b/docs/validation/shared-runtime-macos/native-03-initial-review.jpg differ diff --git a/docs/validation/shared-runtime-macos/native-06-same-name-new-admission.jpg b/docs/validation/shared-runtime-macos/native-06-same-name-new-admission.jpg new file mode 100644 index 0000000..69deacd Binary files /dev/null and b/docs/validation/shared-runtime-macos/native-06-same-name-new-admission.jpg differ diff --git a/docs/validation/shared-runtime-macos/native-07-long-input-stall.jpg b/docs/validation/shared-runtime-macos/native-07-long-input-stall.jpg new file mode 100644 index 0000000..698c023 Binary files /dev/null and b/docs/validation/shared-runtime-macos/native-07-long-input-stall.jpg differ diff --git a/docs/validation/shared-runtime-macos/native-08-long-input-fixed.jpg b/docs/validation/shared-runtime-macos/native-08-long-input-fixed.jpg new file mode 100644 index 0000000..4b83629 Binary files /dev/null and b/docs/validation/shared-runtime-macos/native-08-long-input-fixed.jpg differ diff --git a/docs/validation/shared-runtime-macos/native-09-ssh-unicode-edited.jpg b/docs/validation/shared-runtime-macos/native-09-ssh-unicode-edited.jpg new file mode 100644 index 0000000..ba53092 Binary files /dev/null and b/docs/validation/shared-runtime-macos/native-09-ssh-unicode-edited.jpg differ diff --git a/docs/validation/shared-runtime-macos/native-11-panel-review.jpg b/docs/validation/shared-runtime-macos/native-11-panel-review.jpg new file mode 100644 index 0000000..716365f Binary files /dev/null and b/docs/validation/shared-runtime-macos/native-11-panel-review.jpg differ diff --git a/docs/validation/shared-runtime-macos/native-13-restored-after-review.jpg b/docs/validation/shared-runtime-macos/native-13-restored-after-review.jpg new file mode 100644 index 0000000..5c79c7c Binary files /dev/null and b/docs/validation/shared-runtime-macos/native-13-restored-after-review.jpg differ diff --git a/docs/validation/shared-runtime-macos/native-14-final-long-ssh.jpg b/docs/validation/shared-runtime-macos/native-14-final-long-ssh.jpg new file mode 100644 index 0000000..72c97d9 Binary files /dev/null and b/docs/validation/shared-runtime-macos/native-14-final-long-ssh.jpg differ diff --git a/docs/validation/shared-runtime-macos/native-15-background-agent-tab.jpg b/docs/validation/shared-runtime-macos/native-15-background-agent-tab.jpg new file mode 100644 index 0000000..5398ddb Binary files /dev/null and b/docs/validation/shared-runtime-macos/native-15-background-agent-tab.jpg differ diff --git a/docs/validation/shared-runtime-macos/native-17-local-human-long-restored.jpg b/docs/validation/shared-runtime-macos/native-17-local-human-long-restored.jpg new file mode 100644 index 0000000..6a4a853 Binary files /dev/null and b/docs/validation/shared-runtime-macos/native-17-local-human-long-restored.jpg differ diff --git a/docs/validation/shared-runtime-macos/web-04-handoff-retained.jpg b/docs/validation/shared-runtime-macos/web-04-handoff-retained.jpg new file mode 100644 index 0000000..8a4f0d6 Binary files /dev/null and b/docs/validation/shared-runtime-macos/web-04-handoff-retained.jpg differ diff --git a/docs/validation/shared-runtime-macos/web-06-host-restarted.jpg b/docs/validation/shared-runtime-macos/web-06-host-restarted.jpg new file mode 100644 index 0000000..6c6f259 Binary files /dev/null and b/docs/validation/shared-runtime-macos/web-06-host-restarted.jpg differ diff --git a/docs/web-harness-design.ko.md b/docs/web-harness-design.ko.md new file mode 100644 index 0000000..2edbfd8 --- /dev/null +++ b/docs/web-harness-design.ko.md @@ -0,0 +1,211 @@ +# 공통 앱과 운영 가능한 웹 하네스 설계 + +[English](web-harness-design.md) · [현재 아키텍처](architecture.ko.md) · [현재 브라우저 테스트](browser-testing.md) + +**구현 상태:** 로컬 공통 앱·실행 경계와 독립 웹 패키지를 하드컷으로 구현했습니다(미배포). 아래는 구현의 기준이 된 설계이며, 현재 실행 방법과 검증 범위는 [웹 호스트 안내](browser-testing.ko.md)를 따릅니다. 후속 [macOS 네이티브 검증 결과](shared-runtime-macos-validation-results.ko.md)를 별도로 기록했습니다. 원격 운영은 후속 범위입니다. + +2026-09-22 · 기준 소스 `6470ba5` / v0.8.6 · **하드컷 구현의 기준 설계** + +범위: 로컬 사용부터 완성하고, 이후 원격 운영을 추가할 수 있도록 설계한다. 아래 패키지명과 명령은 기준 설계이며 현재 실행 방법은 연결된 운영 안내를 따른다. 이번 문서는 배포나 운영 준비 완료를 뜻하지 않는다. + +## 1. 목표와 판단 기준 + +웹 하네스를 모노레포의 정식 실행 패키지로 만든다. 사용자는 같은 Conn 화면으로 실제 셸에서 에이전트와 작업하고, 개발자는 그 실행 경로에 검증 시나리오를 적용한다. 테스트용 화면이나 정책 구현을 따로 두지 않는다. + +공통화의 단위는 컴포넌트뿐 아니라 **앱 상태의 소유자, 명령 처리 순서, 출력 전달, 세션 수명, 권한 전환**이다. Tauri IPC와 WebSocket은 운송 수단이며 업무 규칙을 소유하지 않는다. 플랫폼 차이는 명시적인 기능 계약으로 남긴다. + +- 사람과 에이전트는 같은 PTY와 현재 터미널 그리드를 사용한다. 공유 전환은 SSH·프로세스를 교체하지 않는다. +- 연결 허용, 세션 참여, 제어권 lease, 명령 승인은 코어의 기존 책임을 유지한다. +- 창 포커스·선택 탭·렌더러 heartbeat를 에이전트 접근 조건으로 추가하지 않는다. +- 새 연결은 같은 이름이라는 이유로 기존 권한을 상속하지 않는다. +- 기존 UI·모션·영문/한국어·위험도 정책을 공통 구현에서 제공한다. +- 패키지 수 증가보다 책임 소유와 실행 경로의 일치를 우선한다. + +## 2. 현재 코드에서 출발하는 이유 + +현재 `conn-frontend::Harness`와 `conn-core`는 이미 양쪽에서 사용된다. Svelte 앱도 하나다. 다만 다음 경계가 아직 공통 계약이 아니다. + +| 현재 위치 | 문제 | 목표 | +| --- | --- | --- | +| `frontends/tauri/src/lib/transport.ts` | 공통 UI가 Tauri와 `tests/browser`를 직접 선택 | 앱 진입점에서 adapter 주입 | +| `attention.ts`, `nativeUpdates.svelte.ts` | Tauri import와 `browser-test` 분기가 상태 로직에 섞임 | 공통 상태 + host 기능 구현 | +| `store.svelte.ts`, request action map | 모듈 전역 상태·타이머가 앱 인스턴스에 묶이지 않음 | 앱별 룬 상태와 명시적인 정리 | +| `crates/browser-harness` | WebSocket마다 runtime 생성, 명령 대기 중 이벤트 송신 정지 | 프로세스 수명의 runtime + 독립 송신 | +| `tests/browser/transport.ts` | 웹만 출력 재전송·timeout 규칙을 가짐 | 양쪽이 따르는 출력·응답 계약 | +| `scripts/browser-test.mjs` | CLI를 함께 빌드하지 않고 개발 서버에 의존 | 같은 빌드의 서버·UI·MCP CLI를 실행 | + +이미 공통인 `Session`, 정책, 공유 전환, shell integration을 웹에서 다시 구현하지 않는다. 별도로 발견한 빈 Enter/Ctrl-C 후 프롬프트 상태 오류도 공통 코어에서 고친다. 패키지 이동만으로 그 버그가 해결되지는 않는다. + +## 3. 패키지 구성 + +```text +packages/ + ui/ @conn/ui — 공통 Conn 앱 + src/ConnApp.svelte + src/components/ 터미널, 탭, 승인, 설정, 팔레트, 알림 + src/state/ 앱·세션·요청별 .svelte.ts 룬 조합 + src/runtime/ 타입, client, 이벤트 조정, host 계약 + src/terminal/ 입력·resize·출력 큐 + src/i18n/ 영문·한국어 + src/styles/ 공통 토큰·레이아웃·모션 + themes/ 기존 @conn/themes + brand/ 기존 @conn/brand +frontends/ + tauri/ 기존 데스크톱 진입점 + Tauri adapter + web/ @conn/web — 웹 진입점 + WebSocket adapter +crates/ + core/ 기존 PTY·화면·권한·정책 + frontend/ 공통 앱 runtime·owner dispatch·view 수명 + web/ conn-web — 웹 host library + 실행 파일 + cli/ 기존 conn mcp +tests/ + collaboration/ 공통 시나리오·fixture·host별 실행 binding +``` + +`@conn/ui`와 `@conn/web`을 npm workspace로 추가한다. 기존 `conn-browser-harness`는 `conn-web`으로 전환하고, 같은 역할의 서버를 두 개 유지하지 않는다. `conn-frontend` crate는 유지하되 테스트처럼 읽히는 `Harness`의 역할을 실제 앱 runtime API로 명확히 한다. 필요 시 이름을 옮기면서 내부 호출부를 함께 변경하며, 동작이 다른 wrapper를 덧붙이지 않는다. + +초기에는 transport 중립 client와 계약을 `@conn/ui/runtime`에 둔다. 별도 비-Svelte 소비자가 없는데 범용 상태 프레임워크나 여러 작은 패키지를 만들지 않는다. 공개 npm 배포는 이 모노레포 분리의 필수 조건이 아니다. + +```mermaid +flowchart TB + D[Desktop entry] --> U["@conn/ui: ConnApp + runes + terminal queues"] + W[Web entry] --> U + U --> C[Common typed client and host ports] + C --> T[Tauri adapter] + C --> B[WebSocket adapter] + T --> R[conn-frontend app runtime] + B --> R + R --> S[conn-core Session / Engine] + M[Actual conn mcp] --> H[Agent Hub / IPC] + H --> S + S --> P[Same PTY and current terminal grid] +``` + +그림의 공통 runtime은 같은 구현을 뜻한다. 실행 중인 desktop과 standalone web이 자동으로 같은 프로세스가 된다는 뜻은 아니다. + +## 4. UI와 룬 상태의 소유 + +`ConnApp`은 한 번만 구현한다. 양쪽 진입점은 연결과 host 기능을 구성해 같은 root에 전달한다. 공통 컴포넌트는 `frontends/*`, `@tauri-apps/*`, 테스트 코드, 빌드 모드를 import하지 않는다. + +```ts +// 목표 형태. Tauri와 Web 진입점의 차이는 ports 구성뿐이다. +mount(ConnApp, { target, props: { ports } }); +// ConnApp 초기화 안에서 createConnApp(ports)를 만들고 context로 제공한다. +``` + +| 소유자 | 내용 | +| --- | --- | +| `createConnApp` | 세션 목록·활성 탭·connection 상태·앱 전체 요청·설정 열림 상태 | +| 세션별 룬 조합 | backend snapshot의 UI 투영, 타임라인, 해당 셸의 표시·모션 | +| 요청별 룬 조합 | session/request ID에 묶인 busy/error/retry; 카드·단축키·팔레트가 공유 | +| 공통 client | 구독·snapshot/event 조정·호출 결과·중복 응답·연결 상태 | +| 터미널 모듈 | 실제 사용자 입력과 단말 응답의 구분, resize 요청, 순서 있는 출력 적용 | +| host ports | OS 알림·창 작업·업데이트·clipboard 등 환경 기능 | +| backend | 참여·제어권·명령 허용의 유일한 권위 | + +앱 root가 구독과 타이머를 시작하고 dispose한다. 모듈 전역 singleton 때문에 다른 mount의 상태나 오래된 요청이 섞이지 않게 한다. 세션 종료 시 세션별 큐와 요청 상태도 정리한다. Svelte effect의 수명도 root/component에 귀속시킨다. + +기존 reducer와 `Reconciler`, `decision()` 및 terminal queues를 옮기고 보완한다. 한 번에 새로운 상태 라이브러리로 대체하지 않는다. snapshot을 받았다고 UI가 권한을 임의 복원하거나, 현재 활성 탭을 읽어 과거 요청의 승인 대상을 바꾸지 않는다. + +테마·i18n·layout·motion은 공유한다. 웹 전용 승인 카드, PRIVATE 전용 별도 앱, 테스트 전용 store를 만들지 않는다. PRIVATE와 origin의 차이는 같은 컴포넌트가 실제 상태를 받아 표시한다. + +## 5. 명령·이벤트 계약과 플랫폼 경계 + +owner 명령/응답/이벤트 DTO의 기준은 공통 Rust runtime이다. 그 schema에서 TS 계약을 생성하고 CI에서 일치를 확인한다. 버전 handshake에는 protocol, runtime instance, build, UI와 CLI의 호환 정보가 포함된다. 같은 경로의 구버전 CLI도 진단할 수 있어야 한다. + +호환되지 않는 protocol은 명확한 오류를 반환한다. 서로 호환되는 빌드의 차이는 진단으로 표시하며 버전 문자열 차이를 임의의 접근 제한으로 쓰지 않는다. 재현 시험과 공식 묶음은 같은 소스 빌드를 사용한다. + +호스트 adapter는 실제 Tauri window 또는 인증된 웹 attachment에서 owner view 신원을 결정한다. payload의 `window`, `viewId`를 믿지 않는다. owner 경로는 기존 agent IPC와 별도로 유지하며, agent 도구가 owner 승인을 호출할 수 없게 한다. UI capability는 기능 표시를 위한 것이며 backend 권한 검사를 대신하지 않는다. + +### 실행 순서 + +- 느린 연결 검사·파일 조회가 다른 세션의 입력이나 이벤트 전송을 막지 않도록 독립 작업으로 실행한다. +- 같은 세션의 사람 입력·단말 응답·resize는 공통 client와 runtime에서 순서 규칙을 갖는다. attachment epoch와 작업 sequence로 오래된 입력을 거절하고, 승인 결과와 제어권 변경은 core의 현재 상태에서 다시 검증한다. +- 최신 크기로 합치는 최적화는 연속된 대기 resize에만 적용한다. 중간의 입력·응답을 건너뛰어 순서를 바꾸지 않는다. agent 쓰기와 owner 작업은 최종적으로 같은 Session 권한·출력 경계에서 처리된다. +- 결과 전송과 이벤트 송신은 별도 경로다. 출력 callback이 네트워크를 기다리며 Session lock을 잡지 않는다. 큐는 유한하게 두고, 느린 소비자는 명시적인 재동기화 상태로 이동한다. +- 출력의 `generation`, `outputSeq`, 적용 크기와 renderer write 완료 순서는 양쪽 client에서 같은 규칙으로 처리한다. 중복·낡은 frame은 버리고, 전달 누락은 명시적인 stream sequence로 감지한다. 현재 `outputSeq`가 반드시 1씩 증가한다고 가정하지 않는다. +- timeout은 실패 확정이나 취소 완료를 뜻하지 않는다. 전송 후 응답을 잃은 mutation은 같은 operation ID로 결과를 조회하며 자동 재실행하지 않는다. 서버의 제한된 dedup 기록이 사라졌으면 결과 미확인으로 표시하고 상태를 재조회한다. + +명령마다 새 MCP를 실행하거나, 네이티브 전체를 직렬화하여 웹과 맞추는 방식은 사용하지 않는다. + +### host 기능 + +| 기능 | Desktop | Web | +| --- | --- | --- | +| 화면·요청·정책 표시·모션 | 공통 | 공통 | +| OS attention | Dock/taskbar adapter | 공통 앱 알림; 브라우저 알림은 지원·허용 상태를 표시 | +| 앱 업데이트 | 기존 native updater | 서버 패키지 버전/업데이트 안내; 없는 updater를 성공으로 반환하지 않음 | +| 외부 실행기 | 실제 OS adapter | 로컬 웹 host에서 지원하는 실제 경로만 표시; fixture는 테스트 runner에만 존재 | +| 창 관리 | native window | 브라우저 owner view; 창 기능과 PTY 종료를 구분 | + +기능 차이는 같은 설정 UI에 capability와 이유로 표현한다. `browser-test` 조건문으로 화면이나 정책을 갈라놓지 않는다. + +## 6. 출력, 새로고침, 같은 셸로 돌아오기 + +웹 서버가 runtime과 PTY를 소유한다. WebSocket 수명은 renderer attachment 수명이다. 새로고침·일시 단절로 Engine을 폐기하지 않는다. 셸 종료, owner view 연결 해제, 앱 종료를 공통 runtime의 서로 다른 연산으로 둔다. Desktop의 명시적인 창 닫기 동작은 기존 의미를 보존하고 이 공통 종료 연산에 연결한다. + +재연결에는 양쪽 adapter에서 검증하는 **공통 renderer attach 계약**이 필요하다. + +1. 인증·owner view 소유를 확인한 후 runtime instance와 살아 있는 세션을 확인한다. +2. 같은 락 경계에서 terminal checkpoint와 출력 sequence 기준점을 취하고 그 이후 사건을 이어 붙인다. +3. 크기·커서·스타일·wrap·alternate screen·단말 모드 등을 복원하고 뒤이은 출력은 정확한 순서로 적용한다. +4. 동기화 완료 뒤 입력을 활성화한다. 오래된 attachment의 지연 입력·resize·단말 응답은 거절한다. + +현재 agent용 텍스트 snapshot이나 임의의 최근 512KiB 재전송은 renderer 복구 계약이 아니다. checkpoint 지원 상태를 먼저 조사하고, 상태 복원 전후의 실제 xterm/core 화면과 후속 입력 동작으로 검증한다. 불완전한 byte stream을 재생한 화면을 정상으로 표시하지 않는다. 이 검증은 운영용 웹 제공의 완료 조건이다. + +agent 관찰 API는 계속 공유 세션의 현재 그리드만 제공한다. renderer 복구는 인증된 owner 내부 경로이며 새 history/비공유 관찰 도구로 노출하지 않는다. 숨겨진 입력이나 비공유 활동을 복원용 기록으로 수집하지 않는다. + +렌더러 연결 단절을 포커스 기반 접근 제한의 대체 수단으로 쓰지 않는다. 살아 있는 core의 참여·lease·승인 TTL이 계속 기준이다. 재접속은 권한을 추가하거나 만료된 권한을 재생성하지 않는다. 실제 agent 연결 종료는 기존처럼 그 연결의 권한을 정리한다. 서버 프로세스 재시작 뒤 PTY·SSH·공유 권한까지 복원된다고 약속하지 않는다. + +동일 PTY에 서로 다른 크기를 보내는 두 owner 화면을 무작정 붙이지 않는다. 첫 로컬 웹 버전은 같은 셸 집합에 한 활성 입력·크기 소유 view와 명시적인 view 인계를 지원한다. 복제 브라우저는 동시 writer가 되지 않으며, handoff는 backend에서 신원을 확인해 이전 attachment를 fence한다. 서로 다른 셸을 소유하는 기존 desktop 다중 창은 유지한다. 이는 MCP의 백그라운드 탭 관찰을 제한하는 규칙이 아니다. 동일 셸의 다중 owner 동시 편집은 별도 기능이다. + +## 7. 로컬 운영과 원격 확장 + +### 로컬 사용자 실행 + +목표 사용자 명령은 `conn-web serve`이다. 기본은 웹 전용 persistent state이며 `--state-dir `로 작업별 위치를 지정할 수 있다. 서버는 빌드된 UI와 WebSocket을 같은 origin으로 제공한다. 설치 패키지에 서버·정적 UI·호환되는 `conn mcp` CLI와 build manifest를 함께 제공하여 사용자 실행에 Vite/Node/Rust 개발 환경이 필요하지 않게 한다. 초기 배포는 실제 검증한 플랫폼에 한하며 기존 desktop 지원 표를 그대로 복사하지 않는다. + +- persistent state 디렉터리와 전용 agent endpoint를 사용하고 중복 인스턴스는 명확히 거절한다. desktop의 설정·socket을 암묵적으로 덮어쓰지 않는다. +- 기본은 loopback이다. 최초 owner 인증을 간단한 로컬 bootstrap으로 처리하고 재연결 가능한 인증 attachment로 바꾼다. 인증 재료를 query string이나 로그에 남기지 않고 Host/Origin과 세션을 검증한다. +- 사용자 셸은 서버 프로세스를 실행한 계정 권한으로 동작한다. 설정 디렉터리 분리는 파일시스템 sandbox가 아니다. +- 앱에는 어느 호스트·셸인지 명확히 표시하고, 버전·endpoint·연결 신원 같은 진단은 필요할 때 펼쳐 본다. +- 사용자의 실제 에이전트 설정은 명시적인 설정 작업으로만 바꾼다. 자동 탐색 결과를 곧바로 설치하거나 덮어쓰지 않는다. + +개발자는 목표상 `npm run dev -w @conn/web`로 같은 앱과 서버를 실행한다. 테스트 runner는 임시 state·합성 profile·격리 agent setup 경로를 주입한다. 이 차이는 실행 옵션이며 다른 앱·정책·transport 구현이 아니다. 기존 `test:browser`는 이 경로로 위임하는 호환 명령으로 바꾼다. + +Desktop와 standalone web은 기본적으로 별도 runtime instance다. 브라우저에서 이미 열린 desktop 셸을 보려면 미래에 **그 runtime에 owner adapter를 부착**해야 하며 새 PTY를 복제해 같은 셸인 것처럼 보이면 안 된다. 이를 위해 `conn-web`의 웹 host는 library와 얇은 binary로 나누되 desktop 웹 접근을 이번 로컬 버전에서 자동으로 켜지 않는다. + +### 원격 운영을 위한 경계 + +host의 인증 단계가 principal과 workspace/owner view를 결정하고 공통 runtime에 전달하도록 한다. 이후 TLS·설정된 공개 origin·원격 인증·세션 폐기·접근 기록을 갖춘 배포 host를 추가해도 컴포넌트·룬·정책을 복제하지 않는다. query의 경로나 view 이름으로 임의 workspace를 열 수 없어야 한다. + +원격 셸은 서버 쪽에서 실행되며 브라우저 이용자 PC의 셸과 구별한다. 에이전트 endpoint도 해당 runtime을 가리킨다. 다중 tenant, 원격 계정 관리, 인터넷 공개 배포는 초기 로컬 완료 범위에 포함하지 않는다. 원격 지원 전에 그 인증·격리 경계를 별도로 검증한다. + +## 8. 이행 순서와 완료 기준 + +각 단계에서 desktop과 web이 함께 실행 가능해야 한다. 파일 이동과 행동 변경을 구분하여 검토한다. + +| 단계 | 작업 | 완료 근거 | +| --- | --- | --- | +| W0 | 이번 감사의 재현을 회귀 검사로 남기고 core 프롬프트 상태 오류 수정 | 빈 Enter/Ctrl-C/history 제외/실제 MCP에서 정책·프롬프트 복구; 지연 hook과 foreground 입력은 잘못 신뢰하지 않음 | +| W1 | 공통 UI 패키지와 앱별 룬 수명, host ports 추출 | 양쪽이 같은 root·components·state 사용; UI 패키지의 Tauri/테스트/host import 없음; EN/KO와 기존 모션 유지 | +| W2 | owner 계약·실행 순서·독립 이벤트 송신 공통화 | 느린 작업 중 다른 입력/출력/승인 처리, 병렬 resize/input, 오래된 응답·취소·중복 mutation 검증 | +| W3 | conn-web와 @conn/web, 공통 attach/복구, 로컬 패키지 | Vite 없는 설치 실행, 한 번 연결한 실제 MCP로 다단 작업, reload 후 동일 PTY·SSH·정확한 화면, view 인계와 종료 검증 | +| W4 | 기존 시험을 공통 시나리오로 이동하고 CI·Mac 수용 검사 연결 | 아래 행렬 통과; 실제 외부 실행기와 사용자 SSH 경로를 구분한 결과 기록 | + +| 공통 시나리오 | 필요한 검증 | +| --- | --- | +| 연결→참여→제어→명령→반환 | 실제 persistent MCP, 실제 PTY, 실제 공통 UI; 위험 명령·세션 허용·다른 위험도·거절 | +| 사람 개입 | 타이핑·빈 Enter·Ctrl-C·커서 편집·탭 변경·제어 회수 중 오래된 agent 작업 실행 방지 | +| 터미널 표시 | 고정 창에서 승인바 motion, 긴 ASCII/Unicode, 빠른 열기/거절, 행·열·커서·화면 비교 | +| 셸 경로 | 일반 탭, UI PRIVATE→공유, 외부 origin→공유, 직접 SSH, nested SSH; Bash와 별도 sh fixture | +| 수명/복구 | output 중 reload/단절/재접속, checkpoint 후 단말 모드·입력, alt screen, 명시 종료, 새 agent 연결의 신규 허용 | +| 구현 일치 | source import 경계, 생성 DTO, UI/server/CLI manifest, 같은 packaged web build의 시험과 운영 | +| 실제 Mac | WebKit/Tauri IPC, OS 외부 실행기, 실제 원격 셸 식별, native 입력·IME·알림 | + +단위 검사나 raw socket probe는 계속 유용하지만, 실제 MCP+UI+PTY 경로를 대신하지 않는다. 새 원격 기능 전까지도 Linux 브라우저 성공을 Mac 외부 실행기 수용 완료로 보고하지 않는다. 실패·미검증 항목은 릴리스 근거에 분리한다. + +설계의 완료 기준은 “웹에서도 실행된다”가 아니라 **같은 상태 전이가 같은 공통 코드를 지나며, 사용자가 셸과 제어권을 잃지 않고 작업을 이어갈 수 있다**는 것이다. + + +[구현 및 검증 결과](web-harness-refactor-results.ko.md). diff --git a/docs/web-harness-design.md b/docs/web-harness-design.md new file mode 100644 index 0000000..f2926e2 --- /dev/null +++ b/docs/web-harness-design.md @@ -0,0 +1,211 @@ +# Shared app and an operable web harness + +[한국어](web-harness-design.ko.md) · [Current architecture](architecture.md) · [Current browser testing](browser-testing.md) + +**Implementation status:** The shared local app/runtime boundary and standalone web package have been implemented as a hard cut (unreleased). The design below records the implementation baseline; see [the web host guide](browser-testing.md) for current commands and evidence limits. Remote operation and native macOS revalidation remain separate work. + +2026-09-22 · Baseline `6470ba5` / v0.8.6 · **Design baseline for the hard cut** + +Scope: complete local use first, with boundaries that allow remote operation later. Package names and commands below are targets, not current installation instructions. This document is not a deployment or operational-readiness claim. + +## 1. Goal and constraints + +Make the web harness a first-class executable package in the monorepo. Users collaborate with agents in a real shell through the same Conn app; developers apply verification scenarios to that execution path. There is no separate test UI or policy implementation. + +Share **state ownership, command ordering, output delivery, session lifetime and permission transitions**, as well as components. Tauri IPC and WebSocket carry messages; they do not own collaboration rules. Platform differences remain explicit capabilities. + +- Human and agent use the same PTY and current terminal grid. Sharing preserves SSH and child processes. +- Admission, participation, control leases and command approval retain their existing core owners. +- Focus, selected tabs and renderer heartbeats do not become agent access conditions. +- A fresh connection cannot inherit permissions through a matching name. +- Components, motion, English/Korean strings and risk policy have common implementations. +- Prefer clear owners and matching execution semantics over more packages. + +## 2. Starting from the current code + +Both hosts already use `conn-frontend::Harness`, `conn-core` and one Svelte app. These remaining boundaries lack a common contract: + +| Current location | Problem | Target | +| --- | --- | --- | +| `frontends/tauri/src/lib/transport.ts` | Shared UI selects Tauri or `tests/browser` directly | Inject adapters at app entry points | +| `attention.ts`, `nativeUpdates.svelte.ts` | Platform imports and build-mode branches mixed into state | Shared state with host implementations | +| `store.svelte.ts`, request action map | Module-global state and timers lack app-instance ownership | App-scoped runes and explicit disposal | +| `crates/browser-harness` | Runtime per socket; command waits stall events | Process-owned runtime and independent delivery | +| `tests/browser/transport.ts` | Browser-only replay and timeout rules | Common output and response contracts | +| `scripts/browser-test.mjs` | Builds no matching CLI; depends on dev server | Run matching server, UI and MCP CLI builds | + +Do not reimplement Session, policy, sharing transitions or shell integration for the web. The separately reproduced empty-Enter/Ctrl-C prompt recovery defect belongs in the common core. Moving packages does not fix it. + +## 3. Package layout + +```text +packages/ + ui/ @conn/ui — shared Conn app + src/ConnApp.svelte + src/components/ terminal, tabs, decisions, settings, palette, notices + src/state/ app/session/request .svelte.ts rune compositions + src/runtime/ types, client, reconciliation, host contracts + src/terminal/ input, resize and output queues + src/i18n/ English and Korean + src/styles/ tokens, layout and motion + themes/ existing @conn/themes + brand/ existing @conn/brand +frontends/ + tauri/ existing desktop entry and Tauri adapter + web/ @conn/web — web entry and WebSocket adapter +crates/ + core/ existing PTY, screen, authority and policy + frontend/ common app runtime, owner dispatch, view lifetime + web/ conn-web — web host library and executable + cli/ existing conn mcp +tests/ + collaboration/ shared scenarios, fixtures and host bindings +``` + +Add `@conn/ui` and `@conn/web` to npm workspaces. Evolve `conn-browser-harness` into `conn-web`; do not retain two equivalent servers. Keep the `conn-frontend` crate and clarify that its current `Harness` is the actual app runtime. If its API is renamed, migrate callers together instead of adding wrappers with different behavior. + +Initially keep the transport-neutral client and contracts under `@conn/ui/runtime`. Without a separate non-Svelte consumer, no generic state framework or extra small packages are needed. Public npm publication is not required for this monorepo separation. + +```mermaid +flowchart TB + D[Desktop entry] --> U["@conn/ui: ConnApp + runes + terminal queues"] + W[Web entry] --> U + U --> C[Common typed client and host ports] + C --> T[Tauri adapter] + C --> B[WebSocket adapter] + T --> R[conn-frontend app runtime] + B --> R + R --> S[conn-core Session / Engine] + M[Actual conn mcp] --> H[Agent Hub / IPC] + H --> S + S --> P[Same PTY and current terminal grid] +``` + +The diagram represents a shared implementation. Running desktop and standalone web does not automatically put them in the same process. + +## 4. Component and rune ownership + +Implement `ConnApp` once. Each entry point constructs transport and host ports and passes them to that root. Shared components must not import `frontends/*`, `@tauri-apps/*`, tests or host-selecting build modes. + +```ts +// Target shape; only the construction of ports differs between hosts. +mount(ConnApp, { target, props: { ports } }); +// ConnApp creates createConnApp(ports) during initialization and provides context. +``` + +| Owner | Responsibility | +| --- | --- | +| `createConnApp` | Session catalog, active tab, connection state, app-wide requests, open settings | +| Session rune composition | UI projection of backend snapshots, timeline, display and motion | +| Request rune composition | Busy/error/retry keyed by session/request; shared by cards, keys and palette | +| Common client | Subscriptions, snapshot/event reconciliation, results, duplicate responses, connection state | +| Terminal module | Human input versus terminal replies; resize requests; ordered output application | +| Host ports | Native attention, window operations, updates and clipboard capabilities | +| Backend | Sole authority for participation, control and command permission | + +The app root starts and disposes subscriptions and timers. Another mount must not inherit module-global state or stale requests. Session closure disposes its queues and request state. Reactive effects belong to the root/component lifetime. + +Move and improve the existing reducers, `Reconciler`, `decision()` and terminal queues. Do not replace them with a new state library wholesale. Snapshots cannot restore authority on the client's initiative, and changing the active tab cannot change the target of an earlier approval. + +Share themes, i18n, layout and motion. Do not introduce web-only approval cards, a separate PRIVATE app or test-only stores. The same components display actual participation and origin state. + +## 5. Commands, events and platform boundaries + +Common Rust runtime DTOs are the authority for owner commands, responses and events. Generate their TypeScript contracts and check consistency in CI. The handshake includes protocol, runtime instance, build and UI/CLI compatibility information, including an old CLI at an unchanged path. + +Incompatible protocols return a clear error. Compatible build differences are diagnostic, not an arbitrary access restriction. Reproduction tests and official bundles use matching source builds. + +The adapter establishes owner-view identity from the actual Tauri window or authenticated web attachment, never a claimed `window`/`viewId` in payloads. Keep the owner boundary separate from agent IPC; agent tools cannot invoke owner approvals. UI capabilities describe availability and never replace backend authorization. + +### Ordering and execution + +- Slow profile tests and file operations run independently of other sessions' input and event delivery. +- Human input, terminal responses and resize for one session follow a common client/runtime ordering contract. Attachment epochs and operation sequences reject stale input. Approval and authority transitions revalidate current core state. +- Coalesce only adjacent pending resize operations. Never move a resize across intervening input/replies. Agent writes and owner operations ultimately meet the same Session authority/output boundary. +- Results and events have independent delivery paths. Output callbacks do not wait on a network while holding Session locks. Queues are bounded; slow consumers explicitly enter resynchronization. +- Both clients use the same rules for output `generation`, `outputSeq`, applied dimensions and renderer write completion. Discard duplicate/stale frames and detect delivery gaps through an explicit stream sequence. Do not assume the existing `outputSeq` always increments by one. +- A timeout is not proof of failure or cancellation. A sent mutation with a lost response is queried using the same operation ID rather than automatically re-executed. If bounded deduplication history has expired, report an unknown outcome and reconcile state. + +Do not restart MCP for each command or globally serialize native execution to match the browser. + +### Host capabilities + +| Capability | Desktop | Web | +| --- | --- | --- | +| Screens, decisions, policy display, motion | Common | Common | +| Attention | Dock/taskbar adapter | Common in-app notices; browser notification support/permission shown truthfully | +| Updates | Existing native updater | Server package version/update guidance; no simulated successful updater | +| External launch | Actual OS adapter | Only genuinely supported local host routes; fixtures belong in the test runner | +| Windows | Native windows | Browser owner views; distinguish view operations from PTY termination | + +Explain availability through the same settings UI. Do not fork screens or policy with `browser-test` conditionals. + +## 6. Output, reload and returning to the same shell + +The web server owns the runtime and PTYs. WebSocket lifetime represents renderer attachment, not Engine lifetime. Reload or temporary disconnection must not destroy shells. Distinguish shell close, owner-view detach and app shutdown in the common runtime. Preserve the desktop's existing explicit window-close semantics through the common close operation. + +Both adapters need a verified **common renderer attach contract**: + +1. Authenticate and verify owner-view ownership, runtime instance and live sessions. +2. Obtain a terminal checkpoint and output watermark atomically, then stream subsequent events. +3. Restore dimensions, cursor, style, wrapping, alternate screen and terminal modes, then apply continuation in order. +4. Enable input after synchronization. Reject delayed input, resize and replies from old attachments. + +The agent text snapshot and an arbitrary last 512KiB replay are not renderer recovery contracts. First audit checkpoint support, then compare actual xterm/core state and subsequent input behavior after restoration. Do not label a partial replay synchronized. This is a prerequisite for an operable web release. + +Agent observation remains the shared session's current grid. Renderer recovery is an authenticated owner operation, not a new history/private observation tool. Do not collect hidden input or reconstruct prior private activity for recovery. + +Renderer disconnection must not substitute for the rejected focus gate. The live core remains authoritative for participation, leases and approval TTLs. Reattachment adds no permissions and revives none that expired. Actual agent disconnect cleans up that connection's authority as before. Server process restart does not promise PTY/SSH or sharing restoration. + +Do not attach two owner displays that race to size the same PTY. The first local web version has one active input/size view per shared set of shells with explicit view handoff. A duplicated browser cannot silently become another writer; authenticated handoff fences the old attachment. Existing desktop windows owning separate shells remain supported. This does not restrict MCP observation of background tabs. Concurrent human owners of the same shell are a separate feature. + +## 7. Local operation and future remote hosting + +### Local user execution + +The proposed user command is `conn-web serve`, defaulting to dedicated persistent web state with an optional `--state-dir ` override. Serve built UI assets and WebSocket from the same origin. Package the server, static UI, compatible `conn mcp` CLI and build manifest together, so users need no Vite/Node/Rust toolchain. Initially distribute only for verified platforms; do not copy the desktop support matrix without testing. + +- Use persistent state and a dedicated agent endpoint; reject conflicting instances clearly. Do not silently overwrite desktop settings/socket. +- Bind to loopback by default. A simple local bootstrap establishes authenticated, reconnectable owner attachment. Keep authentication material out of query strings/logs and validate Host, Origin and sessions. +- Shells run with the server account's filesystem permissions. State-directory isolation is not an OS sandbox. +- Identify the host and shell clearly. Keep build, endpoint and connection diagnostics in progressive disclosure. +- Change actual agent-client configuration only through an explicit setup action, not automatic discovery. + +The proposed contributor command is `npm run dev -w @conn/web`, using the same app/server. Tests inject temporary state, synthetic profiles and isolated agent-setup locations as runtime options, not alternate app/policy/transport code. Keep `test:browser` as a compatibility entry delegating to this path. + +Desktop and standalone web have separate runtime instances by default. Future browser access to an existing desktop shell must **attach an owner adapter to that runtime**, never clone a PTY and claim it is the same shell. Split the web host into a library and thin binary to allow this, but do not automatically enable desktop web access in the initial version. + +### Remote-hosting boundary + +Host authentication resolves the principal and workspace/owner view before invoking the common runtime. A later deployment host can add TLS, a configured public origin, remote authentication, credential-session revocation and access records without duplicating UI, runes or policy. Query-supplied paths or view names cannot open arbitrary workspaces. + +Remote shells run on the server, which must be distinguished from the browser user's computer. Agent endpoints refer to the same runtime. Multi-tenancy, remote account management and public internet deployment are outside the initial local release. Validate their authentication and isolation boundaries before claiming remote support. + +## 8. Migration and acceptance + +Keep desktop and web runnable throughout migration. Separate file movement from behavior changes for review. + +| Stage | Work | Required evidence | +| --- | --- | --- | +| W0 | Preserve audit regressions and fix core prompt recovery | Empty Enter/Ctrl-C/history suppression/actual MCP recover correctly; delayed hooks and foreground input remain untrusted where appropriate | +| W1 | Extract shared UI, app-scoped runes and host ports | Same root/components/state; no Tauri/test/host imports in UI; EN/KO and motion retained | +| W2 | Common owner contracts, ordering and independent event delivery | Slow work does not block other input/output/decisions; parallel resize/input, stale results, cancellation and duplicate mutations tested | +| W3 | conn-web, @conn/web, common reattach and local distribution | Runs without Vite; real persistent MCP collaboration; same PTY/SSH and faithful screen after reload; view handoff and explicit termination | +| W4 | Shared scenarios, CI and Mac acceptance | Matrix below passes with actual external launch and user SSH coverage distinguished | + +| Shared scenario | Verification | +| --- | --- | +| Admission → participation → control → commands → release | Actual persistent MCP, real PTY, shared UI; risky commands, session allowance, distinct risk, denial | +| Human intervention | Typing, empty Enter, Ctrl-C, cursor editing, tab switching and takeover; no delayed revoked agent writes | +| Terminal rendering | Fixed window with approval motion; long ASCII/Unicode; rapid open/deny; rows, columns, cursor and screen comparisons | +| Shell paths | Ordinary tabs, UI PRIVATE→shared, external-origin→shared, direct SSH, nested SSH; Bash and separate sh fixtures | +| Lifetime/recovery | Reload/disconnect during output; checkpoint continuation and terminal-mode input; alternate screen; close; fresh agent admission | +| Implementation parity | Import boundaries, generated DTOs, UI/server/CLI manifest, same packaged web build tested and used | +| Actual Mac | WebKit/Tauri IPC, OS external launcher, identified remote shell, native input/IME/attention | + +Unit tests and raw-socket probes remain useful but cannot replace actual MCP+UI+PTY coverage. Even before remote features, Linux browser success is not Mac external-launch acceptance. Report failures and untested scope separately in release evidence. + +Completion means **the same state transitions run through common code and the person can continue without losing the shell or control context**, not merely that a page runs in a browser. + + +[Implementation and verification results](web-harness-refactor-results.md). diff --git a/docs/web-harness-refactor-results.ko.md b/docs/web-harness-refactor-results.ko.md new file mode 100644 index 0000000..76ca506 --- /dev/null +++ b/docs/web-harness-refactor-results.ko.md @@ -0,0 +1,53 @@ +# 공통 앱·웹 호스트 리팩터링 결과 + +[English](web-harness-refactor-results.md) · [설계](web-harness-design.ko.md) · [실행·검증 안내](browser-testing.ko.md) + +2026-09-22 · `6470ba5` / v0.8.6 기반 미배포 변경입니다. 이 기록은 커밋·푸시·공개 배포 완료를 뜻하지 않습니다. + +후속 [macOS 네이티브 실기 검증](shared-runtime-macos-validation-results.ko.md)은 `7fa5723` 기준의 별도 결과입니다. 아래 Linux 결과와 네이티브 증거를 구분합니다. + +## 구현한 경계 + +| 소유자 | 책임 | +| --- | --- | +| `packages/ui` / `@conn/ui` | ConnApp 하나, 공통 컴포넌트·한영 문구, 앱별 룬 상태·요청·타이머·정리, 터미널 렌더링·명령 순서·출력 복구 | +| `frontends/tauri` | 얇은 네이티브 시작 화면, IPC·알림·클립보드/링크·업데이트 포트 | +| `frontends/web` / `@conn/web` | 얇은 브라우저 시작 화면, 쿠키 인증·WebSocket 전송·호스트 업데이트 안내 | +| `crates/frontend::AppRuntime` | 공통 소유자 명령, 연결 epoch, 세션별 입력·응답·resize 순서, 중복 실행 방지·결과 조회·독립 출력 전달 | +| `crates/web` / `conn-web` | 루프백 프로세스 소유자, 인증한 화면 연결, 정적 UI 제공·서버 수명 | +| `crates/core` | 기존 PTY·정책·공유·제어권, 소유자 화면 체크포인트·셸 프롬프트 수명 수정 | + +기존 `crates/browser-harness`, 데스크톱의 browser-test 모드, 테스트 전용 전송과 대체 앱 픽스처는 제거했습니다. 순수 UI 검사는 공통 UI와 함께 옮겼습니다. 협업 검사는 같은 빌드의 지속 `conn mcp` 프로세스, 실제 Rust PTY, 빌드된 웹 UI를 사용하며 소유자 결정은 실제 화면으로 조작합니다. + +새로고침은 기존 세션에 재연결합니다. 명시적 인계는 입력·크기를 담당하는 화면 하나를 옮기며 에이전트 권한을 부여하지 않습니다. 대기 입력을 무조건 재전송하지 않습니다. 체크포인트와 순번이 있는 출력으로 화면을 복원하고 누락이 생기면 복구까지 입력을 막습니다. 체크포인트는 에이전트 관찰 API가 아니며 에이전트는 허용된 현재 그리드를 계속 봅니다. + +순서가 있는 작업의 결과가 불확실하거나 순서 처리가 실패한 경우, 초기·복구 체크포인트를 받지 못한 경우에는 해당 연결을 중단하고 명시적 재연결을 안내합니다. 대기 입력은 폐기하며 다시 연결한 뒤 터미널과 현재 요청 상태를 확인하고 재시도하도록 안내합니다. 소켓 종료 알림이 대기 중인 입력의 실패 응답보다 먼저 도착하는 경우에도 적용합니다. 기존 웹 쿠키를 사용하는 재연결은 자동 인계를 요청하지 않습니다. + +공유 전환은 사적인 명령 맥락에 대한 지식을 초기화하므로 첫 명령에 환경 검토가 필요할 수 있습니다. 실제 셸 완료가 확인되면 일반 프롬프트 상태를 다시 판단합니다. 연결 승인·공유·제어권·명령 승인은 별개로 유지합니다. + +## 검증 근거 + +| 검사 | 확인한 결과 | +| --- | --- | +| 네이티브 데스크톱 제외 Rust 워크스페이스 | 272개 통과, 기존 1개 무시. 샌드박스의 EPERM 이후 실제 PTY·소켓 검사를 제한 밖에서 실행했습니다. zsh 미설치로 해당 사례는 내부 skip입니다. | +| 공통 UI 단위 회귀 | 65개 통과: 상태 병합·결정·세션별 순서·출력 누락·연결 종료 차단·입력 순서/체크포인트 실패 후 명시적 재연결·터미널 입출력·크기 변경 | +| 앱·호스트 수명 | 실제 ConnApp 동시 마운트의 언어·동일 ID 요청·링크·타이머 격리, unmount 후 구독 해제와 늦은 작업 차단. 실제 시작 컴포넌트·웹 전송을 통제한 HTTP/WS·IPC 픽스처에 연결하여 첫 방문 인증·한영 일치·명시적 인계·복구 체크포인트 실패·대기 입력 차단·소켓 종료/입력 실패 경합을 확인했습니다. 실제 네이티브 IPC·PTY·MCP를 실행한 검사는 아닙니다. | +| 프로덕션 웹 + 실제 지속 MCP | 8개 시나리오 통과: 비공유/선택 공유·세션 없는 준비 요청·연결/제어·연속 일반 명령·위험 명령 거절·긴 입력·새로고침·화면 인계·백그라운드 탭·같은 이름 새 연결 승인. 추가 사례는 실제 프로덕션 UI·Rust·MCP의 WebSocket 경로에서 첫 입력 응답에만 `owner_busy`를 주입하고 명시적 재연결·기존 PTY 유지·이전 입력 재전송 없음·신규 입력 순서 회복을 확인했습니다. 최초 샌드박스 PTY EPERM 이후 격리 픽스처를 제한 밖에서 다시 실행해 통과했습니다. | +| 로컬 입력·렌더링 | Linux Chromium + Bash에서 23개 통과: 지연 resize·배율 변경·고정 창 승인 모션·긴/유니코드 입력·줄끝·설정·세션 허용·커서 편집 | +| 실제 SSH 입력·렌더링 | 기존 폐기 가능한 OpenSSH 픽스처·원격 Bash·기존 로컬 셸 복귀까지 24개 통과. 시험용 컨테이너만 시작·정지하고 키·인증 파일의 바이트 일치를 확인했습니다. | +| 파서·체크포인트 | 그리드/커서 비교 85개, 실제 xterm 복원 비교 984개. 바이트 분할·이어지는 출력·히스토리/reflow·지원하는 모드 포함 | +| 도구 | Python 79개, 버전 0.8.6 일치, Rust/TS 생성 계약, 공통 UI import 경계, 변경 예정 소스·문서 링크 검사 통과 | +| 프런트엔드 빌드 | 네이티브·웹 프로덕션 프런트엔드 빌드 통과. 기존 Svelte 경고 17개는 남습니다. | +| 사이트·데모 | 사이트 프로덕션 빌드 29페이지, 데모 TypeScript 검사 통과. 사이트 동기화로 추적 파일 변경은 발생하지 않았습니다. | +| 개발 화면 새로고침 | 컴포넌트 HMR 대신 소스 변경을 전체 페이지 새로고침으로 반영합니다. 수동 검증에서 시작 소스를 touch해 자동 전체 새로고침을 유발하고 같은 터미널 세션·PTY 유지를 확인했습니다. | +| 독립 실행 패키지 | 최종 로컬 release 프로필 번들: `release-artifacts/conn-web-0.8.6-linux-x64-cWEYiG`. 서버·같은 MCP·빌드 UI·매니페스트·체크섬을 생성하고 Node/Vite 없이 HTML·자산·API·버전 응답을 확인했습니다. 매니페스트에 미커밋 소스 상태가 기록되어 있으며 공개 릴리스가 아닙니다. | + +[검증 안내](browser-testing.ko.md)의 명령으로 재현할 수 있으며 검사는 증거 폴더를 출력합니다. 임시 로그·스크린샷·인증정보·패키지 바이너리는 소스 변경에 넣지 않습니다. + +최종 앱·호스트 픽스처 기록은 `/tmp/conn-app-lifetime-slRIee/result.json`입니다. 프로덕션 웹/MCP 8개 사례는 `/tmp/conn-web-mcp-IJThcw/evidence/results.json`에 기록되어 있으며 페이지 오류는 없었습니다. 모두 이번 로컬 검증 실행의 경로이며 배포 산출물은 아닙니다. + +## 남은 범위 + +macOS WebKit·IME·네이티브 알림이나 사용자의 실제 SSH 게이트웨이 경로를 검증한 결과는 아닙니다. 이 Linux 호스트에는 GTK 개발 라이브러리가 없어 네이티브 Rust 데스크톱 컴파일을 완료하지 못했습니다. 네이티브 프런트엔드 빌드와 구분합니다. + +현재 패키지는 로컬 루프백용입니다. 원격 인증·TLS·다중 사용자 운영·별도 데스크톱 인스턴스 미러링은 구현하지 않았습니다. 서버가 종료되면 PTY도 끝나며 프로세스 재시작이 이를 복구하거나 권한을 되살리지 않습니다. 고급 문자 집합·사용자 지정 탭 간격·OSC 링크 등은 이번 체크포인트 호환성 검증 범위 밖입니다. diff --git a/docs/web-harness-refactor-results.md b/docs/web-harness-refactor-results.md new file mode 100644 index 0000000..81eac14 --- /dev/null +++ b/docs/web-harness-refactor-results.md @@ -0,0 +1,51 @@ +# Shared app and web host refactor results + +[한국어](web-harness-refactor-results.ko.md) · [Design](web-harness-design.md) · [Run and verify](browser-testing.md) + +2026-09-22 · Unreleased changes based on `6470ba5` / v0.8.6. No commit, push or public release is implied by this report. + +## Implemented boundary + +| Owner | Responsibility | +| --- | --- | +| `packages/ui` / `@conn/ui` | One ConnApp, common components and EN/KO messages; per-app runes, requests, timers and disposal; terminal rendering, command ordering and output recovery | +| `frontends/tauri` | Thin native bootstrap, IPC, attention, clipboard/links and updater ports | +| `frontends/web` / `@conn/web` | Thin browser bootstrap, cookie authentication, WebSocket transport and host-managed update guidance | +| `crates/frontend::AppRuntime` | Shared owner commands, attachment epochs, per-session input/response/resize sequence, operation deduplication/outcome query and independent output delivery | +| `crates/web` / `conn-web` | Loopback process owner, authenticated owner attachment, static UI serving and server lifetime | +| `crates/core` | Existing PTY, policy, sharing and control authority; owner renderer checkpoint and shell prompt lifecycle repair | + +The old `crates/browser-harness`, desktop browser-test mode, test transport and alternate app fixtures were removed. Pure UI tests moved with the UI. Production collaboration tests use a matching persistent `conn mcp` process, actual Rust PTYs and the built web UI; owner decisions use rendered controls. + +Browser reload reconnects to existing sessions. Explicit takeover moves the single input/size renderer without granting agent permissions. Pending input is never blindly replayed. A checkpoint and sequenced frames restore the owner screen; output gaps block input until recovery. The checkpoint is not an agent observation API. Agent observation remains the authorized current terminal grid. + +An uncertain ordered operation, a sequence failure or a failed initial/recovery checkpoint retires the attachment and presents explicit reconnection. Queued input is discarded. The UI asks the user to check the terminal and current request state after reconnecting before retrying. This also applies when the socket-close notification arrives before the pending input rejects. Reconnecting with an existing web cookie does not automatically request takeover. + +Sharing still invalidates knowledge of private command context. An initial environment review can therefore be necessary after sharing; the first confirmed shell completion restores ordinary prompt knowledge. Connection admission, sharing, control approval and command approval remain distinct. + +## Verification evidence + +| Check | Observed result | +| --- | --- | +| Rust workspace, excluding native desktop | 272 passed, 1 existing ignored test. Actual PTY/socket tests were run outside the restrictive sandbox after EPERM there. A zsh integration case internally skips when zsh is absent. | +| Shared UI unit regressions | 65 passed: reconciliation, decisions, per-session ordering, output gaps, disconnect fencing, explicit reattachment after ordered/checkpoint failures, terminal input/output and resize | +| App/host lifetime | Actual simultaneous ConnApp mounts isolate language, same-ID requests, links and timers; unmount detaches listeners and fences late work. Actual bootstrap components and web transport verify first-visit authentication, EN/KO consistency, explicit takeover, recovery checkpoint failure, queued-input fencing and the socket-close/input-rejection race with controlled HTTP/WS and IPC fixtures. This does not execute native IPC, a PTY or MCP. | +| Production web + actual persistent MCP | 8 scenarios passed: private/selected sharing, sessionless preparation, admission/control, repeated safe commands, risk denial, long input, reload, explicit owner takeover, background tabs and fresh admission for a same-name new process. The added case injects `owner_busy` into the first input response over the actual production UI/Rust/MCP WebSocket path, then verifies explicit reattachment, the same PTY, no old-input replay and restored ordering for new input. The initial sandbox PTY EPERM was resolved by rerunning the isolated fixture outside that restriction. | +| Local input/rendering | 23 scenarios passed in Linux Chromium + Bash: delayed resize, density changes, fixed-window approval motion, long/Unicode input, line endings, settings, session allow and cursor editing | +| Actual SSH input/rendering | 24 scenarios passed with the existing disposable OpenSSH fixture, remote Bash and return to the original local shell. Only the fixture container was started/stopped; keys and authentication files remained byte-identical. | +| Parser and checkpoint | 85 grid/cursor comparisons and 984 actual xterm checkpoint comparisons, including byte splits, continuation, history/reflow and supported modes | +| Tooling | 79 Python tests, synchronized 0.8.6 manifests, generated Rust/TypeScript contract, shared UI import boundary and prospective source/link hygiene checks passed | +| Frontend builds | Native and web production frontend builds passed; 17 existing Svelte warnings remain | +| Site and demo | Site production build passed with 29 pages; demo TypeScript check passed. Site synchronization produced no tracked changes. | +| Development reload | Component HMR is disabled; source edits trigger a full page reload. Touching the entry source during manual verification triggered that reload and preserved the same terminal session and PTY. | +| Standalone package | Final local release-profile bundle: `release-artifacts/conn-web-0.8.6-linux-x64-cWEYiG`. Server + matching MCP + compiled UI, manifest and checksums were generated; packaged HTML/assets/API/version routes served without Node or Vite. The manifest records the uncommitted source state; this is not a public release. | + +Tests print temporary evidence directories and can be rerun using the [validation guide](browser-testing.md). Temporary logs, screenshots, credentials and packaged binaries are excluded from source changes. + +The final app/host fixture record is `/tmp/conn-app-lifetime-slRIee/result.json`. The eight production web/MCP cases are recorded in `/tmp/conn-web-mcp-IJThcw/evidence/results.json`, with no page errors. These are paths from this local validation run and are not distributed artifacts. + +## Limits + +This does not establish macOS WebKit/IME/native notification behavior or the user's actual SSH gateway route. Native Rust desktop compilation on this Linux host was blocked by missing GTK development libraries. Native frontend compilation is separate evidence. + +The package is local and loopback-only. Remote authentication, TLS, multi-user service deployment and mirroring a separately running desktop instance are not implemented. Server termination ends its PTYs; a process restart does not recover them or resurrect permissions. Checkpoint fixtures do not prove every VT extension: advanced character sets, custom tab stops and OSC hyperlinks remain outside the tested terminal model. diff --git a/frontends/tauri/package.json b/frontends/tauri/package.json index 3419897..f75452e 100644 --- a/frontends/tauri/package.json +++ b/frontends/tauri/package.json @@ -1,33 +1,21 @@ { "name": "conn-desktop", "private": true, - "version": "0.8.6", + "version": "0.8.7", "type": "module", "scripts": { "dev": "vite", "build": "svelte-check --threshold error && vite build", - "tauri": "node scripts/tauri.mjs", - "test:browser": "node scripts/browser-test.mjs", - "test": "node tests/timeline/events.test.ts && node tests/icon/state.test.ts && node tests/connections/status.test.ts && node tests/terminal/input.test.ts && node tests/terminal/resize.test.ts && node tests/terminal/output.test.ts && node tests/collaboration/state.test.ts", - "test:collaboration": "node scripts/collaboration-test.mjs", - "test:collaboration:harness": "node scripts/collaboration-harness-test.mjs", - "test:context:harness": "node scripts/context-harness-test.mjs", - "test:input:harness": "node scripts/input-review-harness-test.mjs", - "test:screen": "node scripts/screen-parity-test.mjs" + "tauri": "node scripts/tauri.mjs" }, "dependencies": { - "@conn/brand": "*", - "@conn/themes": "*", "@tauri-apps/api": "^2", - "@xterm/addon-fit": "^0.11.0", - "@xterm/addon-unicode11": "0.9.0", - "@xterm/xterm": "^6.0.0" + "@conn/ui": "*" }, "devDependencies": { "@sveltejs/vite-plugin-svelte": "^5.1.1", "@tauri-apps/cli": "^2", "@tsconfig/svelte": "^5.0.8", - "playwright": "1.63.0", "svelte": "^5.57.0", "svelte-check": "^4.7.6", "typescript": "^5.6.0", diff --git a/frontends/tauri/scripts/browser-test.mjs b/frontends/tauri/scripts/browser-test.mjs deleted file mode 100644 index e79fc60..0000000 --- a/frontends/tauri/scripts/browser-test.mjs +++ /dev/null @@ -1,20 +0,0 @@ -import { mkdtemp, access } from "node:fs/promises"; -import { tmpdir } from "node:os"; -import { join, resolve } from "node:path"; -import { spawn } from "node:child_process"; -const state=process.env.CONN_TEST_STATE ?? await mkdtemp(join(tmpdir(),"conn-browser-test-")); -const children=[]; -const run=(command,args,options={})=>{const child=spawn(command,args,{stdio:"inherit",...options});children.push(child);return child;}; -const build=run("cargo",["build","-p","conn-browser-harness","--locked"],{cwd:resolve("../.."),env:{...process.env,CARGO_INCREMENTAL:"0",CARGO_PROFILE_DEV_DEBUG:"0"}}); -await new Promise((resolve,reject)=>{build.on("error",reject);build.on("exit",code=>code===0?resolve():reject(new Error(`Harness build failed: ${code}`)));}); -// The standard launcher owns its ports; manual recording overrides stay manual. -const shellEnv={...process.env,CONN_TEST_PORT:"1423",CONN_TEST_ORIGIN:"http://127.0.0.1:1421"}; -delete shellEnv.npm_config_prefix; -const server=run(resolve(`../../target/debug/conn-browser-harness${process.platform==="win32"?".exe":""}`),[state],{env:shellEnv}); -for(let i=0;;i++){try{await access(join(state,"connection.json"));break;}catch{if(i>100||server.exitCode!==null)throw new Error("Harness did not start");await new Promise(r=>setTimeout(r,100));}} -const vite=run(process.execPath,["node_modules/vite/bin/vite.js","--mode","browser-test","--host","127.0.0.1","--port","1421"],{env:{...process.env,CONN_TEST_STATE:state}}); -console.log(`Test state: ${state}\nBrowser: http://127.0.0.1:1421/`); -let stopping=false; -function stop(){if(stopping)return;stopping=true;for(const c of children)c.kill("SIGTERM");} -process.on("SIGINT",stop);process.on("SIGTERM",stop); -vite.on("exit",stop);server.on("exit",stop); diff --git a/frontends/tauri/scripts/collaboration-browser.mjs b/frontends/tauri/scripts/collaboration-browser.mjs deleted file mode 100644 index 5f21853..0000000 --- a/frontends/tauri/scripts/collaboration-browser.mjs +++ /dev/null @@ -1,31 +0,0 @@ -// One browser connection per test run; context isolation per fixture. -import { chromium } from 'playwright'; -export async function collaborationBrowser() { - const browser = await chromium.launch(); - let context, page; - const open = async url => { - await context?.close(); - context = await browser.newContext({ viewport: {width: 1280, height: 900} }); - page = await context.newPage(); - page.setDefaultTimeout(15000); - await page.goto(url); - }; - const run = async (action, ...args) => { - switch (action) { - case 'open': return open(args[0]); - case 'close': return browser.close(); - case 'gone': return page.locator(args[0]).waitFor({state: 'detached'}); - case 'wait': return page.locator(args[0]).waitFor({state: 'visible'}); - case 'click': return page.locator(args[0]).click(); - case 'type': return page.locator(args[0]).pressSequentially(args[1]); - case 'press': return page.keyboard.press(args[0]); - case 'eval': return page.evaluate(args[0]); - case 'screenshot': return page.screenshot({path: args[0]}); - case 'set': - if (args[0] === 'viewport') return page.setViewportSize({width: Number(args[1]), height: Number(args[2])}); - if (args[0] === 'media') return page.emulateMedia({colorScheme: args[1], reducedMotion: 'reduce'}); - } - throw Error(`Unknown browser action: ${action}`); - }; - return {run, value: source => page.evaluate(source), open}; -} diff --git a/frontends/tauri/scripts/collaboration-harness-test.mjs b/frontends/tauri/scripts/collaboration-harness-test.mjs deleted file mode 100644 index 2e02809..0000000 --- a/frontends/tauri/scripts/collaboration-harness-test.mjs +++ /dev/null @@ -1,52 +0,0 @@ -import { collaborationBrowser } from './collaboration-browser.mjs'; -// Real Rust Harness + production UI + a persistent socket agent. No alternate UI. -import {spawn} from 'node:child_process'; -import {mkdtempSync,writeFileSync,existsSync,mkdirSync,openSync} from 'node:fs'; -import {tmpdir} from 'node:os'; -import {join,resolve} from 'node:path'; -import net from 'node:net'; -import {strict as assert} from 'node:assert'; -const dir=mkdtempSync(join(tmpdir(),'conn-collaboration-')); -const port=process.env.CONN_HARNESS_UI_PORT??'1437', backend=process.env.CONN_HARNESS_PORT??'1438'; -const output=resolve('../../artifacts/collaboration-refactor');mkdirSync(output,{recursive:true}); -const env={...process.env,CONN_TEST_PORT:backend,CONN_TEST_ORIGIN:`http://127.0.0.1:${port}`,CONN_TEST_STATE:dir};delete env.npm_config_prefix; -writeFileSync(join(dir,'app.json'),JSON.stringify({mode:'autopilot',gate:true,pacing:{enterGraceMs:0,minWriteIntervalMs:0,leaseTtlSecs:120,approvalTtlSecs:120}})); -const log=openSync(join(dir,'harness.log'),'w'); -const server=spawn(resolve('../../target/debug/conn-browser-harness'),[dir],{env,stdio:['ignore',log,log]}); -let vite,socket;const pending=new Map();let seq=0,buffer=''; -const {run} = await collaborationBrowser(); -const delay=ms=>new Promise(r=>setTimeout(r,ms)); -const call=(method,params={})=>new Promise((resolve,reject)=>{const id=++seq;const timer=setTimeout(()=>{pending.delete(id);reject(Error(`RPC timeout: ${method}`));},18000);pending.set(id,{resolve,reject,timer});socket.write(JSON.stringify({id,method,params})+'\n');}); -try { - for(let i=0;!existsSync(join(dir,'connection.json'));i++){if(i>100||server.exitCode!==null)throw Error('Harness startup failed');await delay(100);} - vite=spawn(process.execPath,['node_modules/vite/bin/vite.js','--mode','browser-test','--host','127.0.0.1','--port',port],{env,stdio:'ignore'}); - for(let i=0;;i++){try{if((await fetch(`http://127.0.0.1:${port}/`)).ok)break;}catch{}if(i>100)throw Error('Vite startup failed');await delay(100);} - await run('open',`http://127.0.0.1:${port}/`);await run('wait','.xterm-helper-textarea'); - await run('click','.xterm-helper-textarea');await run('type','.xterm-helper-textarea','export CONN_COLLAB_PROCESS=retained_42');await run('press','Enter');await delay(350); - await run('wait','button.dot:not(.hidden)');await run('click','button.dot:not(.hidden)');await run('wait','.center');await run('click','.sharing-row button');await run('click','.sharing footer .ghost');await run('wait','.sharing-trigger'); - socket=net.createConnection(join(dir,'conn.sock'));await new Promise((r,j)=>{socket.once('connect',r);socket.once('error',j);}); - socket.on('data',chunk=>{buffer+=chunk;let at;while((at=buffer.indexOf('\n'))>=0){const message=JSON.parse(buffer.slice(0,at));buffer=buffer.slice(at+1);const p=pending.get(message.id);if(p){clearTimeout(p.timer);pending.delete(message.id);message.error?p.reject(Object.assign(Error(message.error.message),message.error)):p.resolve(message.result);}}}); - const hello=await call('hello',{kind:'agent',agentId:'collaboration-test'});assert.equal(hello.admission,'pending'); - await run('wait','.decision-card');await run('screenshot',resolve(output,'harness-private-admission.png'));await run('click','.decision-card .primary');await delay(300);await run('screenshot',resolve(output,'harness-after-allow.png')); - const hidden=await call('list_tabs');assert.equal(hidden.tabs,0); - await run('click','.sharing-trigger');await run('click','.sharing-row button');await run('click','.sharing input[type=checkbox]');await run('click','.sharing footer .btn:not(.ghost)'); - await delay(200);assert.equal((await call('list_tabs')).tabs,1); - const control=call('request_control',{reason:'Verify the existing shell survives sharing.'}); - await run('wait','.decision-card');await run('click','.decision-card .primary');await control; - await call('type',{text:'printf "%s\\n" "$CONN_COLLAB_PROCESS"'}); - const execution=await call('send_key',{key:'ENTER',intent:'Read the marker already set in this shell.'}); - if(execution.status === 'pending') { await run('wait','.decision-card .btn.ok');await run('click','.decision-card .btn.ok'); } - else assert.equal(execution.status,'executed'); - let snapshot; - for(let i=0;i<20;i++){await delay(100);snapshot=await call('snapshot');if(snapshot.screen.some(row=>row.trim()==='retained_42'))break;} - assert.ok(snapshot.screen.some(row=>row.trim()==='retained_42'), "standalone command output proves process state survived"); - await call('release_control'); - await run('screenshot',resolve(output,'harness-shared-execution.png')); - await run('wait','button.dot:not(.hidden)');await run('click','button.dot:not(.hidden)');await run('wait','.center');await run('click','.sharing-row button');await run('click','.sharing footer .ghost'); - await delay(150);assert.equal((await call('list_tabs')).tabs,0); - console.log('PASS real Harness: private admission, selected sharing, owner control grant, execution, same PTY marker, stop sharing'); - console.log(`Isolated evidence: ${dir}`); -} finally { - for(const p of pending.values())clearTimeout(p.timer);socket?.destroy(); - try{await run('close');}catch{}vite?.kill();server.kill(); -} diff --git a/frontends/tauri/scripts/collaboration-test.mjs b/frontends/tauri/scripts/collaboration-test.mjs deleted file mode 100644 index 7b56d14..0000000 --- a/frontends/tauri/scripts/collaboration-test.mjs +++ /dev/null @@ -1,66 +0,0 @@ -import { collaborationBrowser } from './collaboration-browser.mjs'; -// Runs the production App against an isolated contract fixture. Uses an isolated Playwright browser. -import { spawn } from 'node:child_process'; -import { strict as assert } from 'node:assert'; -import { resolve } from 'node:path'; -import { mkdirSync } from 'node:fs'; -const port=process.env.CONN_UI_TEST_PORT ?? '1435'; -const base=`http://127.0.0.1:${port}/tests/collaboration/`; -const output=resolve('../../artifacts/collaboration-refactor');mkdirSync(output,{recursive:true}); -const {run, value, open: openBrowser} = await collaborationBrowser(); -let server; -async function openFixture(query) { await openBrowser(base+query); } -try { - try { await fetch(base); } catch { server=spawn(process.execPath,['node_modules/vite/bin/vite.js','--host','127.0.0.1','--port',port],{stdio:'ignore'}); } - for(let i=0;i<100;i++){try{if((await fetch(base)).ok)break;}catch{}if(i===99)throw Error('Vite did not start');await new Promise(r=>setTimeout(r,100));} - await openFixture('?fail-admission');await run('wait','.decision-card'); - assert.equal(await value('document.querySelectorAll(".decision-card").length'),1); - await run('click','.decision-card .primary'); - assert.match(await value('document.querySelector("[role=alert]").textContent'),/try again/); - assert.equal(await value('document.querySelector(".decision-card .primary").disabled'),false); - await run('screenshot',resolve(output,'admission-retry.png')); - await run('click','.decision-card .primary'); - await run('gone','.decision-card'); - assert.equal(await value('document.querySelectorAll(".decision-card").length'),0); - console.log('PASS private admission visible, failure retained, retry resolves'); - await openFixture('?fail-sharing');await run('wait','.decision-card');await run('click','.decision-card .primary'); - await run('click','.sharing-trigger');await run('click','.sharing-row button'); - await run('wait','.sharing');await run('click','.sharing input[type=checkbox]');await run('click','.sharing footer .btn:not(.ghost)'); - const error=await value('document.querySelector(".sharing [role=alert]").textContent'); - await new Promise(r=>setTimeout(r,2800)); - assert.equal(await value('document.querySelector(".sharing [role=alert]").textContent'),error); - assert.match(error,/input|typing|command/i); - await run('screenshot',resolve(output,'sharing-failure.png')); - console.log('PASS sharing error survives participant polling'); - await openFixture('?fail-stale');await run('wait','.decision-card');await run('click','.decision-card .primary'); - await run('click','.sharing-trigger');await run('click','.sharing-row button'); - await run('wait','.sharing');await run('click','.sharing input[type=checkbox]');await run('click','.sharing footer .btn:not(.ghost)'); - assert.match(await value('document.querySelector(".sharing [role=alert]").textContent'),/another window/); - assert.equal(await value('document.querySelector(".sharing footer .btn:not(.ghost)").disabled'),true); - await run('click','.sharing .body > .btn'); - assert.equal(await value('document.querySelector(".sharing input[type=checkbox]").checked'),false); - await run('click','.sharing input[type=checkbox]');await run('click','.sharing footer .btn:not(.ghost)'); - await run('gone','.sharing'); - assert.equal(await value('document.querySelectorAll(".sharing").length'),0); - console.log('PASS stale sharing requires reloading the current selection'); - for (const state of ['empty', 'preparing', 'settings']) { - await openFixture('?'+state);await run('wait','.decision-card'); - assert.equal(await value('document.querySelector(".decision-card .primary").closest("[inert]") === null'),true); - if(state === 'settings') assert.ok((await value('document.querySelector(".sheet").textContent')).includes('Agents')); - await run('click','.decision-card .primary'); - await run('gone','.decision-card'); - assert.equal(await value('document.querySelectorAll(".decision-card").length'),0); - } - console.log('PASS admission in empty, preparing, and settings views'); - await openFixture('?lang=ko&delayed');await run('set','media','dark','reduced-motion');await run('set','viewport','390','700'); - await run('eval','window.dispatchEvent(new Event("fixture:request"))');await run('wait','.decision-card'); - assert.equal(await value('document.documentElement.scrollWidth <= innerWidth'),true); - assert.equal(await value('document.querySelector(".decision-card").getBoundingClientRect().right <= innerWidth'),true); - await run('screenshot',resolve(output,'admission-ko-narrow.png')); - assert.equal(await value('matchMedia("(prefers-reduced-motion: reduce)").matches'),true); - assert.equal(await value('document.querySelector(".decision-card").getAnimations().length'),0); - await run('eval','document.querySelector(".decision-card .primary").focus()');await run('press','Enter'); - await run('gone','.decision-card'); - assert.equal(await value('document.querySelectorAll(".decision-card").length'),0); - console.log('PASS Korean narrow layout, reduced motion, and keyboard approval'); -} finally {try{await run('close');}catch{}server?.kill();} diff --git a/frontends/tauri/scripts/context-harness-test.mjs b/frontends/tauri/scripts/context-harness-test.mjs deleted file mode 100644 index c568181..0000000 --- a/frontends/tauri/scripts/context-harness-test.mjs +++ /dev/null @@ -1,132 +0,0 @@ -// Production UI, Rust owner boundary, real PTYs and persistent agent sockets. -// Synthetic fixtures only. Evidence lives outside the checkout by default. -import {chromium} from 'playwright'; -import {spawn} from 'node:child_process'; -import {mkdtempSync,writeFileSync,existsSync,mkdirSync,openSync,readFileSync} from 'node:fs'; -import {tmpdir} from 'node:os'; -import {join,resolve} from 'node:path'; -import net from 'node:net'; -import {strict as assert} from 'node:assert'; -const dir=mkdtempSync(join(tmpdir(),'conn-context-')); -const output=process.env.CONN_CONTEXT_OUTPUT ?? join(dir,'evidence');mkdirSync(output,{recursive:true}); -const port=process.env.CONN_HARNESS_UI_PORT??'1461',backend=process.env.CONN_HARNESS_PORT??'1463'; -const env={...process.env,CONN_TEST_PORT:backend,CONN_TEST_ORIGIN:`http://127.0.0.1:${port}`,CONN_TEST_STATE:dir}; -writeFileSync(join(dir,'app.json'),JSON.stringify({mode:'autopilot',gate:true,pacing:{enterGraceMs:0,minWriteIntervalMs:0,leaseTtlSecs:120,approvalTtlSecs:120}})); -writeFileSync(join(dir,'profiles.json'),JSON.stringify({version:1,revision:0,defaultProfile:'fixture',profiles:[{id:'fixture',name:'Fixture',program:'/bin/bash',args:['--noprofile','--norc'],cwd:dir}]})); -const log=openSync(join(dir,'harness.log'),'w'); -const server=spawn(resolve('../../target/debug/conn-browser-harness'),[dir],{env,stdio:['ignore',log,log]}); -const delay=ms=>new Promise(r=>setTimeout(r,ms)); -let vite,browser,context,page;const clients=[],errors=[],stages=[]; -async function connect(name){ - const socket=net.createConnection(join(dir,'conn.sock'));let seq=0,buffer='';const pending=new Map(); - await new Promise((r,j)=>{socket.once('connect',r);socket.once('error',j)}); - socket.on('data',chunk=>{buffer+=chunk;let at;while((at=buffer.indexOf('\n'))>=0){const m=JSON.parse(buffer.slice(0,at));buffer=buffer.slice(at+1);const p=pending.get(m.id);if(p){clearTimeout(p.timer);pending.delete(m.id);m.error?p.reject(Object.assign(Error(m.error.message),m.error)):p.resolve(m.result)}}}); - const client={call:(method,params={})=>new Promise((resolve,reject)=>{const id=++seq,timer=setTimeout(()=>{pending.delete(id);reject(Error(`RPC timeout: ${method}`))},18000);pending.set(id,{resolve,reject,timer});socket.write(JSON.stringify({id,method,params})+'\n')}),close(){for(const p of pending.values())clearTimeout(p.timer);socket.destroy();}}; - clients.push(client);client.hello=await client.call('hello',{kind:'agent',agentId:name});return client; -} -const state=()=>page.evaluate(async()=>{const {st}=await import('/src/lib/store.svelte.ts');return {active:st.active,order:st.order,tabs:st.tabs,activity:st.activity,notice:st.announcement};}); -async function capture(name,extra={}){await delay(500);stages.push({name,...await state(),...extra});writeFileSync(join(output,'states.json'),JSON.stringify(stages,null,2));await page.screenshot({path:join(output,`${name}.png`)});console.log(`PASS ${name}`);} -async function until(test,what){for(let i=0;i<100;i++){if(await test())return;await delay(100)}throw Error(`Timed out: ${what}`);} -async function allow(agent){await page.locator('.decision-card .primary').click();await until(async()=>(await state()).activity.connections.some(a=>a.connId===agent.hello.conn),'admission resolved');} -// fill() cannot deliver terminal input; keyboard insertion emits the real onData path. -async function typeHuman(text){const input=page.locator('.xterm-helper-textarea:visible');await input.click();await page.keyboard.insertText(text);await input.press('Enter');await delay(300);} -async function select(id){const s=await state();await page.getByRole('tab').nth(s.order.indexOf(id)).click();await delay(250);} -async function shareDialog(){await page.locator('button.dot:not(.hidden), .sharing-trigger').first().click();await page.locator('.sharing-row button').click();await page.locator('.sharing').waitFor();} -async function stopSharing(){await page.locator('.pill').waitFor({state:'detached'});await shareDialog();await page.locator('.sharing footer .ghost').click();await page.locator('.sharing').waitFor({state:'detached'});await until(async()=>{const s=await state();return !s.tabs[s.active].shared},'sharing stopped');} -async function shareSelected(){await page.locator('.sharing input[type=checkbox]').first().check();await page.locator('.sharing footer .btn:not(.ghost)').click();await page.locator('.sharing').waitFor({state:'detached'});} -async function grantBackground(agent,session){ - const pending=agent.call('request_control',{reason:'Print a synthetic fixture marker.'});pending.catch(()=>{}); - await until(async()=>!!(await state()).tabs[session]?.ctlReq,'background request'); - assert.notEqual((await state()).active,session); - await page.locator('.pill').click();await until(async()=>(await state()).active===session,'notice navigation'); - await until(async()=>page.evaluate(()=>document.activeElement?.getAttribute('data-request-key')?.includes(':control:')),'focus exact request card'); - assert.equal((await state()).tabs[session].controller.type,'human','navigation never grants'); - await page.locator('.decision-card .primary').click();await pending; -} -async function marker(agent,text){ - await agent.call('type',{text:`printf '%s\\n' ${text}`}); - const result=await agent.call('send_key',{key:'ENTER',intent:'Print synthetic test output.'});assert.equal(result.status,'executed'); - await until(async()=>(await agent.call('snapshot')).screen.some(r=>r===text),'standalone output'); -} -async function grid(agent,label){ - await delay(700); - const snapshot=await agent.call('snapshot'); - const visible=await page.locator('.xterm-rows:visible > div').allTextContents(); - const rows=visible.map(row=>row.replace(/\u00a0/g,' ').trimEnd()); - const result={label,size:snapshot.size,core:snapshot.screen,visible:rows,equal:JSON.stringify(snapshot.screen)===JSON.stringify(rows)}; - writeFileSync(join(output,`grid-${label}.json`),JSON.stringify(result,null,2));return result; -} -try{ - for(let i=0;!existsSync(join(dir,'connection.json'));i++){if(i>100||server.exitCode!==null)throw Error(`Rust startup failed: ${readFileSync(join(dir,'harness.log'),'utf8')}`);await delay(100)} - vite=spawn(process.execPath,['node_modules/vite/bin/vite.js','--mode','browser-test','--host','127.0.0.1','--port',port,'--strictPort'],{env,stdio:['ignore',log,log]}); - await until(async()=>{try{return (await fetch(`http://127.0.0.1:${port}/`)).ok}catch{return false}},'Vite'); - browser=await chromium.launch();context=await browser.newContext({viewport:{width:1440,height:960},recordVideo:{dir:output,size:{width:1440,height:960}}}); - await context.addInitScript(()=>localStorage.setItem('ss:lang','ko'));page=await context.newPage();page.setDefaultTimeout(12000);page.on('pageerror',e=>errors.push(e.message)); - await page.goto(`http://127.0.0.1:${port}/`);await page.locator('.xterm-helper-textarea').waitFor();await delay(500); - await typeHuman('export CONN_CONTEXT_MARKER=retained_shell_42');const first=(await state()).active; - const agent=await connect('context-agent');assert.equal(agent.hello.admission,'pending');await allow(agent); - const second=(await agent.call('open_tab',{reason:'Synthetic second terminal.'})).session; - await until(async()=>(await state()).order.includes(second),'new tab');assert.equal((await state()).active,first); - await capture('01-new-tab-notice');assert.equal((await state()).notice.target.session,second); - await page.locator('.pill').waitFor({state:'detached'});await grantBackground(agent,second);await capture('02-notice-target-and-explicit-grant'); - await select(first);await marker(agent,'BACKGROUND_TWO');await page.locator('.collaboration-activity button').waitFor(); - await typeHuman("printf '%s\\n' HUMAN_FIRST");assert.equal((await agent.call('status')).controller.type,'agent');await capture('03-visible-background-activity'); - await agent.call('snapshot',{session:first});await until(async()=>(await state()).activity.connections.some(a=>a.session===first),'latest read target'); - assert.equal(await page.locator('.collaboration-activity button').count(),1,'control elsewhere remains visible after reading this tab'); - await page.locator('.collaboration-activity button').first().click();await until(async()=>(await state()).active===second,'activity navigation');await typeHuman("printf '%s\\n' HUMAN_SECOND");assert.equal((await agent.call('status')).controller.type,'human'); - await select(first);const third=(await agent.call('open_tab')).session;await until(async()=>(await state()).order.includes(third),'third tab'); - await page.locator('.pill').waitFor({state:'detached'});await agent.call('switch_tab',{tab:second}); - await until(async()=>(await state()).notice?.target?.session===second,'background movement notice');assert.equal((await state()).active,first);await capture('04-background-to-background-move'); - // Explicitly addressed operations update activity without polling reverting it. - await agent.call('snapshot',{session:third});await agent.call('list_tabs'); - await until(async()=>(await state()).activity.connections.some(a=>a.session===third),'explicit session activity'); - // Clear an old request while its notice remains; clicking may navigate but never grants. - await agent.call('switch_tab',{tab:second});const cancelled=agent.call('request_control',{reason:'Cancel this request by disconnecting.'});cancelled.catch(()=>{}); - await until(async()=>!!(await state()).tabs[second].ctlReq,'request before disconnect');agent.close(); - await until(async()=>!(await state()).tabs[second].ctlReq,'disconnect clears request'); - if(await page.locator('.pill').count())await page.locator('.pill').click();assert.equal((await state()).tabs[second].controller.type,'human'); - // Same name reconnect is a fresh admission; select and inspect the existing shell. - const again=await connect('context-agent');assert.equal(again.hello.admission,'pending');await allow(again); - assert.notEqual(again.hello.conn,agent.hello.conn);await again.call('switch_tab',{tab:first});await select(first); - await typeHuman('printf "%s\\n" "$CONN_CONTEXT_MARKER"'); - await until(async()=>(await again.call('snapshot')).screen.includes('retained_shell_42'),'same PTY after reconnect');await capture('05-reconnect-retains-shell'); - // Long paths, URLs, Korean and line wrapping are compared with actual DOM rows. - const path='/synthetic/'+('deep-path/'.repeat(24))+'끝'; - const url='https://example.invalid/?synthetic='+('abcdef0123456789'.repeat(16)); - await typeHuman(`printf '\\033[2J\\033[H%s\\n%s\\n%s\\n' '${path}' '${url}' '한글과 English: 가나라마바사 아자차카타파하'`); - const before=await grid(again,'before');assert.ok(before.equal,'initial current grid matches rendered rows'); - await page.setViewportSize({width:860,height:720});const narrow=await grid(again,'narrow'); - await page.setViewportSize({width:1440,height:960});const restored=await grid(again,'restored'); - if(process.env.CONN_GRID_INVESTIGATE!=='1'){assert.ok(narrow.equal,'narrow current grid matches rendered rows');assert.ok(restored.equal,'restored current grid matches rendered rows')} - await capture('06-output-resize',{grid:{before:before.equal,narrow:narrow.equal,restored:restored.equal}}); - await page.locator('.pill').waitFor({state:'detached'});await page.locator('button.dot:not(.hidden)').click(); - await page.locator('.center .seg button').filter({hasText:'Observe'}).click(); - await until(async()=>(await again.call('status')).mode==='observe','Observe mode');await page.locator('.center').press('Escape'); - await again.call('snapshot');await assert.rejects(()=>again.call('request_control'),e=>e.code==='wrong_mode'); - await again.call('switch_tab',{tab:third});await again.call('switch_tab',{tab:first});await select(third);await again.call('request_attention',{reason:'Read-only inspection completed.'}); - await until(async()=>(await state()).notice?.target?.session===first,'Observe attention');await page.locator('.pill').click();await until(async()=>(await state()).active===first,'Observe request target');await capture('06b-observe-navigation'); - // Remove all sharing. Preparation stays connection-scoped and reveals no shell. - for(const id of [first,second,third]){await select(id);await stopSharing();} - assert.equal((await again.call('list_tabs')).tabs,0); - const request=await again.call('request_attention',{reason:'Choose a terminal for the synthetic fixture.'});assert.equal(request.scope,'connection'); - assert.equal((await again.call('request_attention',{reason:'duplicate'})).requestId,request.requestId); - await page.locator('.terminal-preparation').waitFor();await capture('07-sessionless-request'); - await page.setViewportSize({width:780,height:640});await page.emulateMedia({reducedMotion:'reduce'}); - await page.evaluate(async()=>{const {setLang}=await import('/src/lib/i18n.svelte.ts');setLang('en')});await capture('07b-preparation-english-narrow'); - assert.equal(await page.locator('.terminal-preparation .primary').innerText(),'Choose terminal'); - const card=await page.locator('.terminal-preparation').boundingBox();assert.ok(card.x>=0 && card.x+card.width<=780 && card.y+card.height<=640); - await page.evaluate(async()=>{const {setLang}=await import('/src/lib/i18n.svelte.ts');setLang('ko')});await page.setViewportSize({width:1440,height:960}); - await page.locator('.terminal-preparation .primary').click();await page.locator('.sharing').waitFor();assert.equal((await again.call('list_tabs')).tabs,0); - await page.locator('.sharing header button').click();await page.locator('.sharing').waitFor({state:'detached'}); - await page.locator('.terminal-preparation .btn:not(.ghost):not(.primary)').click();await page.locator('.sharing').waitFor(); - await until(async()=>![first,second,third].includes((await state()).active),'new private tab selected');const prepared=(await state()).active;assert.equal((await state()).tabs[prepared].shared,false);assert.equal((await again.call('list_tabs')).tabs,0);await capture('08-new-private-terminal'); - await shareSelected();await until(async()=>!(await page.locator('.terminal-preparation').count()),'resolved preparation'); - await again.call('switch_tab',{tab:prepared});assert.equal((await again.call('status')).controller.type,'human');await capture('09-explicit-sharing-without-control'); - await stopSharing();again.close();await until(async()=>!(await state()).activity.connections.length,'closed connection activity'); - const fresh=await connect('context-agent');await allow(fresh);assert.equal((await fresh.call('list_tabs')).tabs,0,'same name inherits no selected sharing'); - await fresh.call('request_attention');await page.locator('.terminal-preparation').waitFor();await page.locator('.terminal-preparation .ghost').click();await until(async()=>!(await page.locator('.terminal-preparation').count()),'later dismisses'); - assert.equal((await fresh.call('request_attention')).requested,false,'dismiss cooldown');await fresh.call('request_attention',{cancel:true}); - await capture('10-no-inherited-sharing');assert.deepEqual(errors,[]); - writeFileSync(join(output,'result.json'),JSON.stringify({status:'passed',stages:stages.length,errors},null,2));console.log(`Evidence: ${output}`); -}catch(error){if(page){await page.screenshot({path:join(output,'failure.png')}).catch(()=>{});console.error(await page.locator('body').innerText().catch(()=>''))}console.error(`Evidence: ${output}`);throw error; -}finally{for(const client of clients)client.close();await context?.close();if(page)await page.video()?.saveAs(join(output,'context.webm'));await browser?.close();vite?.kill();server.kill();} diff --git a/frontends/tauri/scripts/input-review-harness-test.mjs b/frontends/tauri/scripts/input-review-harness-test.mjs deleted file mode 100644 index 02b0d60..0000000 --- a/frontends/tauri/scripts/input-review-harness-test.mjs +++ /dev/null @@ -1,246 +0,0 @@ -// Production UI, Rust owner boundary, real PTYs and persistent agent sockets. -// Synthetic fixtures only. Evidence lives outside the checkout by default. -import {chromium} from 'playwright'; -import {spawn} from 'node:child_process'; -import {mkdtempSync,writeFileSync,existsSync,mkdirSync,openSync,readFileSync} from 'node:fs'; -import {tmpdir} from 'node:os'; -import {join,resolve} from 'node:path'; -import net from 'node:net'; -import {strict as assert} from 'node:assert'; -const dir=mkdtempSync(join(tmpdir(),'conn-input-review-')); -const output=process.env.CONN_INPUT_REVIEW_OUTPUT ?? join(dir,'evidence');mkdirSync(output,{recursive:true}); -const port=process.env.CONN_HARNESS_UI_PORT??'1471',backend=process.env.CONN_HARNESS_PORT??'1473'; -const env={...process.env,CONN_TEST_PORT:backend,CONN_TEST_ORIGIN:`http://127.0.0.1:${port}`,CONN_TEST_STATE:dir}; -writeFileSync(join(dir,'app.json'),JSON.stringify({mode:'autopilot',gate:true,pacing:{enterGraceMs:0,minWriteIntervalMs:0,leaseTtlSecs:120,approvalTtlSecs:120}})); -writeFileSync(join(dir,'profiles.json'),JSON.stringify({version:1,revision:0,defaultProfile:'fixture',profiles:[{id:'fixture',name:'Fixture',program:process.env.CONN_REPRO_SHELL??'/bin/bash',args:process.env.CONN_REPRO_SHELL?['-i']:['--noprofile','--norc'],env:{PS1:'fixture$ ',TERM:'xterm-256color'},cwd:dir}]})); -const log=openSync(join(dir,'harness.log'),'w'); -const server=spawn(resolve('../../target/debug/conn-browser-harness'),[dir],{env,stdio:['ignore',log,log]}); -const delay=ms=>new Promise(r=>setTimeout(r,ms)); -let vite,browser,context,page;const clients=[],errors=[],stages=[]; -async function connect(name){ - const socket=net.createConnection(join(dir,'conn.sock'));let seq=0,buffer='';const pending=new Map(); - await new Promise((r,j)=>{socket.once('connect',r);socket.once('error',j)}); - socket.on('data',chunk=>{buffer+=chunk;let at;while((at=buffer.indexOf('\n'))>=0){const m=JSON.parse(buffer.slice(0,at));buffer=buffer.slice(at+1);const p=pending.get(m.id);if(p){clearTimeout(p.timer);pending.delete(m.id);m.error?p.reject(Object.assign(Error(m.error.message),m.error)):p.resolve(m.result)}}}); - const client={call:(method,params={})=>new Promise((resolve,reject)=>{const id=++seq,timer=setTimeout(()=>{pending.delete(id);reject(Error(`RPC timeout: ${method}`))},18000);pending.set(id,{resolve,reject,timer});socket.write(JSON.stringify({id,method,params})+'\n')}),close(){for(const p of pending.values())clearTimeout(p.timer);socket.destroy();}}; - clients.push(client);client.hello=await client.call('hello',{kind:'agent',agentId:name});return client; -} -const state=()=>page.evaluate(async()=>{const {st}=await import('/src/lib/store.svelte.ts');return {active:st.active,order:st.order,tabs:st.tabs,activity:st.activity,notice:st.announcement};}); -async function capture(name,extra={}){await delay(500);stages.push({name,...await state(),...extra});writeFileSync(join(output,'states.json'),JSON.stringify(stages,null,2));await page.screenshot({path:join(output,`${name}.png`)});console.log(`PASS ${name}`);} -async function until(test,what){for(let i=0;i<100;i++){if(await test())return;await delay(100)}throw Error(`Timed out: ${what}`);} -async function allow(agent){await page.locator('.decision-card .primary').click();await until(async()=>(await state()).activity.connections.some(a=>a.connId===agent.hello.conn),'admission resolved');} -// fill() cannot deliver terminal input; keyboard insertion emits the real onData path. -async function typeHuman(text){const input=page.locator('.xterm-helper-textarea:visible');await input.click();await page.keyboard.insertText(text);await input.press('Enter');await delay(300);} -// Native IPC uses independent workers; the browser server serializes commands. -// A delayed transport request exposes an old size overtaking a newer one. -async function delayFirstResize(milliseconds){ - await page.evaluate(milliseconds=>{ - const send=WebSocket.prototype.send;let delayNextResize=true; - window.__requestedTerminalSizes=[]; - window.__restoreResizeTransport=()=>{WebSocket.prototype.send=send;}; - WebSocket.prototype.send=function(data){ - const message=JSON.parse(data); - if(message.name==='resize'){ - window.__requestedTerminalSizes.push({rows:message.args.rows,cols:message.args.cols}); - if(delayNextResize){delayNextResize=false;setTimeout(()=>send.call(this,data),milliseconds);return;} - } - return send.call(this,data); - }; - },milliseconds); -} -async function restoreResizeTransport(){ - await page.evaluate(()=>{window.__restoreResizeTransport();delete window.__restoreResizeTransport;delete window.__requestedTerminalSizes;}); -} -async function grid(agent,label){ - await delay(700); - const snapshot=await agent.call('snapshot'); - const visible=await page.locator('.xterm-rows:visible > div').allTextContents(); - const rows=visible.map(row=>row.replace(/\u00a0/g,' ').trimEnd()); - const cursor=await page.evaluate(cols=>{ - const cell=document.querySelector('.host:not([hidden]) .xterm-cursor'); - const screen=document.querySelector('.host:not([hidden]) .xterm-screen'); - const row=cell?.closest('.xterm-rows > div'); - if(!cell||!screen||!row)return null; - return {row:Array.from(row.parentElement.children).indexOf(row),col:Math.round((cell.getBoundingClientRect().left-screen.getBoundingClientRect().left)/(screen.clientWidth/cols))}; - },snapshot.size.cols); - const result={label,size:snapshot.size,core:snapshot.screen,visible:rows,cursor:snapshot.cursor,visibleCursor:cursor,equal:JSON.stringify(snapshot.screen)===JSON.stringify(rows)}; - writeFileSync(join(output,`grid-${label}.json`),JSON.stringify(result,null,2)); - assert.deepEqual(cursor,snapshot.cursor,`${label}: user and agent cursor positions agree`);return result; -} -try{ - for(let i=0;!existsSync(join(dir,'connection.json'));i++){if(i>100||server.exitCode!==null)throw Error('Rust startup failed');await delay(100)} - vite=spawn(process.execPath,['node_modules/vite/bin/vite.js','--mode','browser-test','--host','127.0.0.1','--port',port,'--strictPort'],{env,stdio:['ignore',log,log]}); - await until(async()=>{try{return(await fetch(`http://127.0.0.1:${port}/`)).ok}catch{return false}},'Vite'); - browser=await chromium.launch();context=await browser.newContext({viewport:{width:860,height:640}}); - await context.addInitScript(()=>localStorage.setItem('ss:lang','ko'));page=await context.newPage();page.setDefaultTimeout(12000); - page.on('pageerror',e=>errors.push(e.message));await page.goto(`http://127.0.0.1:${port}/`);await page.locator('.xterm-helper-textarea').waitFor();await delay(700); - if(process.env.CONN_AUTH_FIXTURE_RUNTIME){ - const runtime=process.env.CONN_AUTH_FIXTURE_RUNTIME; - const password=readFileSync(join(runtime,'password'),'utf8').trim();assert.ok(password.startsWith('SYNTHETIC_')); - await typeHuman(`ssh -F /dev/null -tt -p 22222 -o StrictHostKeyChecking=yes -o UserKnownHostsFile=${runtime}/known_hosts -o PreferredAuthentications=password -o PubkeyAuthentication=no -o IdentityAgent=none fixture@127.0.0.1`); - await until(async()=>(await page.locator('.xterm-rows').innerText()).includes('password:'),'SSH password prompt'); - await typeHuman(password); - await typeHuman("exec env LC_ALL=C.UTF-8 PS1='remote$ ' bash --noprofile --norc -i"); - await typeHuman('printf "REMOTE_READY_%s\\n" "$((6*7))"'); - await until(async()=>(await page.locator('.xterm-rows').innerText()).includes('REMOTE_READY_42'),'remote marker'); - } - const agent=await connect('input-repro');await allow(agent); - const control=agent.call('request_control',{reason:'Reproduce long command rendering.'});control.catch(()=>{}); - await page.locator('.decision-card .primary').click();await control;await delay(500); - await delayFirstResize(350); - try { - await page.setViewportSize({width:700,height:640});await delay(80); - await page.setViewportSize({width:860,height:640});await delay(700); - const requested=await page.evaluate(()=>window.__requestedTerminalSizes); - assert.ok(requested.length>=2 && requested[0].cols{ - const host=document.querySelector('.host:not([hidden])'); - const screen=host.querySelector('.xterm-screen'); - return {hostWidth:host.clientWidth,screenWidth:screen.clientWidth,dpr:devicePixelRatio}; - }); - assert.ok(geometry.hostWidth-geometry.screenWidth>=0 && geometry.hostWidth-geometry.screenWidth<=32,`terminal fills pane after density change: ${JSON.stringify(geometry)}`); - assert.ok((await grid(agent,`density-${deviceScaleFactor}`)).equal); - } - await metrics.detach(); - // A fixed window still resizes its PTY when the approval dock opens/closes. - // Fill the screen so the cursor moves and the terminal's actual motion runs. - await agent.call('type',{text:"printf 'synthetic row\\n%.0s' {1..70}"}); - assert.equal((await agent.call('send_key',{key:'ENTER',intent:'Fill the fixture screen to exercise dock motion.'})).status,'executed'); - const beforeDock=await grid(agent,'before-dock-motion');assert.ok(beforeDock.equal); - for(const latency of [0,500]){ - await delayFirstResize(latency); - await page.evaluate(()=>{ - window.__dockFrames=[]; - const sample=()=>{ - const host=document.querySelector('.host:not([hidden])'); - window.__dockFrames.push({width:innerWidth,height:innerHeight,hostHeight:host.clientHeight,screenHeight:host.querySelector('.xterm-screen').clientHeight,transform:getComputedStyle(host).transform}); - window.__dockFrame=requestAnimationFrame(sample); - };sample(); - }); - try { - await agent.call('type',{text:`rm -- '${join(dir,'missing-dock-'+('x'.repeat(120)))}'`}); - const review=await agent.call('send_key',{key:'ENTER',intent:'Exercise approval motion without executing the fixture command.'}); - assert.equal(review.status,'pending'); - const deny=page.locator('.decision-card .btn.danger');await deny.waitFor();await delay(latency?10:90); - await deny.click({force:true}); - await until(async()=>(await agent.call('check_approval',{approvalId:review.approvalId})).state==='denied','dock review denied'); - const afterDock=await grid(agent,`after-dock-motion-${latency}`); - const motion=await page.evaluate(()=>({frames:window.__dockFrames,sizes:window.__requestedTerminalSizes})); - writeFileSync(join(output,`dock-motion-${latency}.json`),JSON.stringify(motion,null,2)); - assert.ok(motion.frames.every(f=>f.width===860&&f.height===640),'window stays fixed throughout dock motion'); - if(!latency)assert.ok(motion.frames.some(f=>f.transform!=='none'&&f.transform!=='matrix(1, 0, 0, 1, 0, 0)'),'exercise actual terminal motion'); - assert.ok(motion.sizes.length>=2&&motion.sizes[0].rowss.cols===beforeDock.size.cols),'dock motion leaves terminal width unchanged'); - assert.deepEqual(afterDock.size,motion.sizes.at(-1),'late dock shrink must not replace the restored terminal size'); - const finalFrame=motion.frames.at(-1); - assert.ok(finalFrame.hostHeight-finalFrame.screenHeight>=0&&finalFrame.hostHeight-finalFrame.screenHeight<32,'restored terminal fills the available height'); - assert.ok(afterDock.equal);await capture(`fixed-window-dock-motion-${latency}`); - } finally { - await page.evaluate(()=>{cancelAnimationFrame(window.__dockFrame);delete window.__dockFrame;delete window.__dockFrames;}); - await restoreResizeTransport(); - } - } - for(const length of [240,700,1500,3500,7000]){ - const text='abcdefghijklmnopqrst'.repeat(Math.ceil(length/20)).slice(0,length); - await agent.call('type',{text:`printf '%s\\n' '${text}'`}); - - const execution=await agent.call('send_key',{key:'ENTER',intent:'Print synthetic fixture output.'}); - assert.equal(execution.status,'executed','ordinary SSH command executes in Autopilot'); - await delay(500);assert.ok((await grid(agent,`printed-${length}`)).equal);await capture(`output-${length}`); - } - // A response without a trailing newline legitimately shares its last line - // with a Bash prompt. Preserve that distinction; never invent a newline. - const prompt=process.env.CONN_AUTH_FIXTURE_RUNTIME?'remote$':'fixture$'; - const cols=(await agent.call('snapshot')).size.cols; - for(const padding of [0,cols*2]){ - const body=JSON.stringify({padding:'x'.repeat(padding),agentMode:{state:'unavailable'}}); - for(const [ending,format] of [['none','%s'],['lf','%s\\n'],['crlf','%s\\r\\n']]){ - await agent.call('type',{text:`printf '${format}' '${body}'`}); - assert.equal((await agent.call('send_key',{key:'ENTER',intent:'Compare synthetic JSON output with and without a trailing newline.'})).status,'executed'); - const label=`line-ending-${ending}-${padding?'wrapped':'short'}`; - const result=await grid(agent,label);assert.ok(result.equal); - const last=result.visible[result.cursor.row]; - if(ending==='none')assert.ok(last.endsWith(`}}${prompt}`),'no newline: prompt follows the final JSON bytes'); - else { - assert.equal(last,prompt,'newline: prompt starts on a separate line'); - assert.ok(result.visible[result.cursor.row-1].endsWith('}}'),'newline preserves the preceding JSON ending'); - } - await capture(label); - } - } - // The modal settings sheet must leave the underlying PTY dimensions alone. - for(const text of ['long-input/'.repeat(100), '한글/경로/🙂/'.repeat(65)]){ - await agent.call('type',{text:`printf '%s\\n' '${text}'`}); - const originalSize=(await agent.call('snapshot')).size; - await capture('before-settings-'+(text.startsWith('한')?'unicode':'ascii')); - for(let i=0;i<3;i++){ - await page.keyboard.press('Control+Shift+,');await delay(350); - assert.equal(await page.evaluate(async()=>(await import('/src/lib/store.svelte.ts')).st.settingsOpen),true); - assert.deepEqual((await agent.call('snapshot')).size,originalSize,'settings must not resize the PTY'); - await capture(`settings-${i}-${text.startsWith('한')?'unicode':'ascii'}`); - await page.keyboard.press('Escape');await delay(350); - } - assert.ok((await grid(agent,'edited-long-line')).equal); - await capture('after-settings-'+(text.startsWith('한')?'unicode':'ascii')); - const result=await agent.call('send_key',{key:'ENTER',intent:'Print the line after a panel resize.'}); - assert.equal(result.status,'executed');await delay(500); - } - const missing=join(dir,'missing-'+('deep/'.repeat(1000))+'file'); - await agent.call('type',{text:`rm -- '${missing}'`});const approval=await agent.call('send_key',{key:'ENTER',intent:'Remove an absent synthetic fixture path.'});assert.equal(approval.status,'pending'); - await page.locator('.decision-card .btn.ok').waitFor();await capture('long-approval');await page.setViewportSize({width:700,height:540});await delay(600);await capture('approval-narrow'); - const box=await page.getByRole('button',{name:'A 세션 허용',exact:true}).boundingBox(); - assert.ok(box && box.y>=0 && box.y+box.height<=540,'approval actions remain visible for a long command'); - await page.setViewportSize({width:860,height:640});await delay(600); - assert.equal((await state()).tabs[(await state()).active].reviewRequired,false); - const allowSession=page.getByRole('button',{name:'A 세션 허용',exact:true});assert.ok(await allowSession.isEnabled()); - await allowSession.click(); - await until(async()=>(await agent.call('check_approval',{approvalId:approval.approvalId})).state==='granted','approval granted'); - await delay(700);assert.ok((await grid(agent,'approved')).equal);await capture('after-allow'); - await until(async()=>(await state()).tabs[(await state()).active].allows.includes('delete files'),'session allowance shown'); - await agent.call('type',{text:`rm -- '${join(dir,'never-created')}'`}); - assert.equal((await agent.call('send_key',{key:'ENTER',intent:'Verify the same session rule on an absent fixture path.'})).status,'executed'); - await delay(500); - await agent.call('type',{text:'sudo id'}); - assert.equal((await agent.call('send_key',{key:'ENTER',intent:'Verify another risk still asks, without running it.'})).status,'pending'); - await page.locator('.decision-card .btn.danger').click();await delay(500); - const blocked=await page.evaluate(async()=>{ - const {cmd}=await import('/src/lib/bridge');return cmd('policy_test',{cmd:'rm -rf /'}); - }); - assert.equal(blocked.policy,'deny','session allowance never lifts deny rules'); - await delay(500); - await agent.call('type',{text:"printf '%s\\n' FINAL_MARKER"});const last=await agent.call('send_key',{key:'ENTER',intent:'Print final marker.'});assert.equal(last.status,'executed'); - await delay(500);assert.ok((await grid(agent,'final')).equal);await capture('final'); - // Human takeover, cursor editing and execution use the real terminal input path. - const long='cursor-edit/'.repeat(85); - await agent.call('type',{text:`printf '<%s>\\n' '${long}END'`}); - await delay(500); - const before=await grid(agent,'cursor-before-edit');assert.ok(before.equal); - await page.locator('.xterm-helper-textarea:visible').focus(); - for(let i=0;i<4;i++)await page.keyboard.press('ArrowLeft'); - await delay(300); - const moved=await grid(agent,'cursor-moved');assert.ok(moved.equal); - // Human takeover opens the handback dock and can reduce the row count. - const row=Math.min(before.cursor.row,moved.size.rows-1); - const start=row*before.size.cols+before.cursor.col-4; - assert.deepEqual(moved.cursor,{row:Math.floor(start/before.size.cols),col:start%before.size.cols}); - await page.keyboard.insertText('EDIT');await page.keyboard.press('End');await page.keyboard.press('Enter'); - await until(async()=>(await agent.call('snapshot')).screen.join('').includes('EDITEND>'),'edited command output'); - assert.equal((await state()).tabs[(await state()).active].controller.type,'human'); - assert.ok((await grid(agent,'human-edited')).equal);await capture('human-edited'); - if(process.env.CONN_AUTH_FIXTURE_RUNTIME){ - await typeHuman('exit'); - await until(async()=>page.evaluate(async()=>{const {cmd}=await import('/src/lib/bridge');return (await cmd('status')).completionPromptReady;}),'outer shell lifecycle restored'); - await typeHuman("printf 'LOCAL_BACK_%s\\n' 42"); - await until(async()=>(await agent.call('snapshot')).screen.some(row=>row==='LOCAL_BACK_42'),'outer shell restored'); - } - assert.deepEqual(errors,[]); - console.log('Evidence:',output); -}finally{for(const client of clients)client.close();await context?.close();await browser?.close();vite?.kill();server.kill();} diff --git a/frontends/tauri/src-tauri/src/lib.rs b/frontends/tauri/src-tauri/src/lib.rs index 2e057e8..cffcceb 100644 --- a/frontends/tauri/src-tauri/src/lib.rs +++ b/frontends/tauri/src-tauri/src/lib.rs @@ -1,5 +1,5 @@ //! Native window adapter; command behavior lives in conn-frontend. -use conn_frontend::Harness; +use conn_frontend::{AppRuntime, OwnerHello, OwnerMeta, OwnerRequest}; use serde_json::Value; use std::sync::Arc; use tauri::{Emitter, Manager, State}; @@ -16,24 +16,34 @@ mod linux; #[tauri::command] async fn dispatch( window: tauri::WebviewWindow, - state: State<'_, Arc>, + state: State<'_, Arc>, name: String, args: Value, + meta: OwnerMeta, ) -> Result { let harness = state.inner().clone(); let label = window.label().to_owned(); - tauri::async_runtime::spawn_blocking(move || harness.invoke_in_window(&label, &name, args)) + tauri::async_runtime::spawn_blocking(move || harness.invoke_owner(&label, OwnerRequest { name, args, meta })) .await .map_err(|e| e.to_string())? } +#[tauri::command] +async fn owner_attach(window: tauri::WebviewWindow, state: State<'_, Arc>, protocol: u32, takeover: bool) -> Result { + let runtime = state.inner().clone(); let label = window.label().to_owned(); + tauri::async_runtime::spawn_blocking(move || runtime.owner_attach(&label, protocol, takeover)).await.map_err(|e| e.to_string())? +} +#[tauri::command] +async fn owner_outcome(window: tauri::WebviewWindow, state: State<'_, Arc>, epoch: u64, operation_id: u64) -> Result { + state.owner_outcome(window.label(), epoch, operation_id) +} pub fn run() { tauri::Builder::default() .plugin(tauri_plugin_updater::Builder::new().build()) .manage(updates::Updates::new()) - .invoke_handler(tauri::generate_handler![dispatch, updates::app_update]) + .invoke_handler(tauri::generate_handler![dispatch, owner_attach, owner_outcome, updates::app_update]) .setup(|app| { let handle = app.handle().clone(); - let harness = Arc::new(Harness::new( + let harness = Arc::new(AppRuntime::new( std::env::var_os("CONN_CONFIG_DIR").map(std::path::PathBuf::from).unwrap_or_else(conn_core::paths::config_dir), conn_core::paths::socket_path(), Arc::new(move |name, value| { @@ -52,7 +62,7 @@ pub fn run() { Ok(()) }) .on_window_event(|window, event| { - let Some(harness) = window.try_state::>() else { + let Some(harness) = window.try_state::>() else { return; }; match event { @@ -65,7 +75,7 @@ pub fn run() { .expect("error while building Conn") .run(|app, event| { if let tauri::RunEvent::Exit = event { - app.state::>().shutdown(); + app.state::>().shutdown(); } }); } diff --git a/frontends/tauri/src-tauri/src/linux.rs b/frontends/tauri/src-tauri/src/linux.rs index 014e321..1795d3f 100644 --- a/frontends/tauri/src-tauri/src/linux.rs +++ b/frontends/tauri/src-tauri/src/linux.rs @@ -1,5 +1,5 @@ //! D-Bus adapter. Sender credentials come from the bus, never request JSON. -use conn_frontend::{automation::Caller, Harness}; +use conn_frontend::{automation::Caller, AppRuntime}; use serde_json::Value; use std::{ path::PathBuf, @@ -12,7 +12,7 @@ use zbus::{fdo, message::Header, Connection}; static SEQUENCE: AtomicU64 = AtomicU64::new(1); struct Adapter { app: tauri::AppHandle, - harness: Weak, + harness: Weak, inflight: Arc, } struct Permit(Arc); @@ -125,7 +125,7 @@ impl Adapter { .map_err(fdo::Error::Failed) } } -pub fn install(app: &tauri::AppHandle, harness: &Arc) { +pub fn install(app: &tauri::AppHandle, harness: &Arc) { let adapter = Adapter { app: app.clone(), harness: Arc::downgrade(harness), diff --git a/frontends/tauri/src-tauri/src/macos.rs b/frontends/tauri/src-tauri/src/macos.rs index 0a580b6..133975c 100644 --- a/frontends/tauri/src-tauri/src/macos.rs +++ b/frontends/tauri/src-tauri/src/macos.rs @@ -1,5 +1,5 @@ //! Cocoa commands enter the same platform-neutral automation service as future adapters. -use conn_frontend::{automation::Caller, Harness}; +use conn_frontend::{automation::Caller, AppRuntime}; use serde_json::{json, Value}; use std::{ ffi::{c_char, CStr, CString}, @@ -9,7 +9,7 @@ use std::{ }, }; struct Adapter { - harness: Weak, + harness: Weak, app: tauri::AppHandle, } static ADAPTER: OnceLock = OnceLock::new(); @@ -18,7 +18,7 @@ extern "C" { fn conn_script_link(); fn conn_script_sender_alive(identity: *const c_char) -> bool; } -pub fn install(app: &tauri::AppHandle, harness: &Arc) { +pub fn install(app: &tauri::AppHandle, harness: &Arc) { let _ = ADAPTER.set(Adapter { harness: Arc::downgrade(harness), app: app.clone(), diff --git a/frontends/tauri/src-tauri/src/main.rs b/frontends/tauri/src-tauri/src/main.rs index 6c5e485..8fc849b 100644 --- a/frontends/tauri/src-tauri/src/main.rs +++ b/frontends/tauri/src-tauri/src/main.rs @@ -1,5 +1,12 @@ #![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] fn main() { + // Before GTK/WebKit or any application threads start. DMA-BUF negotiation + // can abort WebKit on Linux GPU/driver combinations before a window exists. + // Honor explicit user overrides; this does not disable the WebKit sandbox. + #[cfg(target_os = "linux")] + if std::env::var_os("WEBKIT_DISABLE_DMABUF_RENDERER").is_none() { + std::env::set_var("WEBKIT_DISABLE_DMABUF_RENDERER", "1"); + } conn_desktop_lib::run() } diff --git a/frontends/tauri/src-tauri/src/updates.rs b/frontends/tauri/src-tauri/src/updates.rs index 287dc1e..1d1404f 100644 --- a/frontends/tauri/src-tauri/src/updates.rs +++ b/frontends/tauri/src-tauri/src/updates.rs @@ -178,7 +178,7 @@ pub async fn app_update( .map_err(|e| e.to_string())? .timeout(Duration::from_secs(180)) .on_before_exit(move || { - handle.state::>().shutdown(); + handle.state::>().shutdown(); handle.cleanup_before_exit(); }) .build() @@ -234,7 +234,7 @@ pub async fn app_update( .ok_or("Download and verify the update first")?; state.status.lock().phase = "installing"; update.install(bytes).map_err(|e| e.to_string())?; - app.state::>().shutdown(); + app.state::>().shutdown(); app.restart(); } _ => unreachable!(), diff --git a/frontends/tauri/src-tauri/src/windows.rs b/frontends/tauri/src-tauri/src/windows.rs index f1cb02a..2d0236b 100644 --- a/frontends/tauri/src-tauri/src/windows.rs +++ b/frontends/tauri/src-tauri/src/windows.rs @@ -1,4 +1,4 @@ -//! Native presentation; sessions and ownership stay in the shared Harness. +//! Native presentation; sessions and ownership stay in the shared AppRuntime. use std::sync::{ atomic::{AtomicBool, Ordering}, mpsc, Arc, diff --git a/frontends/tauri/src-tauri/tauri.conf.json b/frontends/tauri/src-tauri/tauri.conf.json index 8e59f72..f4fa798 100644 --- a/frontends/tauri/src-tauri/tauri.conf.json +++ b/frontends/tauri/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "https://schema.tauri.app/config/2", "productName": "Conn", - "version": "0.8.6", + "version": "0.8.7", "identifier": "dev.eggp.conn", "build": { "beforeDevCommand": "npm run dev", diff --git a/frontends/tauri/src/NativeRoot.svelte b/frontends/tauri/src/NativeRoot.svelte new file mode 100644 index 0000000..9489089 --- /dev/null +++ b/frontends/tauri/src/NativeRoot.svelte @@ -0,0 +1,34 @@ + + +{#if ports}{:else}{/if} diff --git a/frontends/tauri/src/components/ControlRequest.svelte b/frontends/tauri/src/components/ControlRequest.svelte deleted file mode 100644 index b653c60..0000000 --- a/frontends/tauri/src/components/ControlRequest.svelte +++ /dev/null @@ -1,27 +0,0 @@ - -{#if r} - {#key `${st.active}:${r.id}`} - - {#if r.reason}

{r.reason}

{/if} - - {#snippet actions()} - - - - {/snippet} -
- {/key} -{/if} diff --git a/frontends/tauri/src/lib/bridge.ts b/frontends/tauri/src/lib/bridge.ts deleted file mode 100644 index 946a619..0000000 --- a/frontends/tauri/src/lib/bridge.ts +++ /dev/null @@ -1,37 +0,0 @@ -import type { AdmissionChange } from "./collaboration/contracts"; -import type { SessionEvent } from "./collaboration/events"; -import { invoke } from "./transport"; -import { listen } from "./transport"; -import { st, toast } from "./store.svelte"; -import { t } from "./i18n.svelte"; - -export type Pacing = { minWriteIntervalMs: number; enterGraceMs: number; leaseTtlSecs: number; approvalTtlSecs: number }; -export type Mode = "observe" | "copilot" | "autopilot"; -export type Ev = SessionEvent; -export const TOOLS = ["snapshot", "request_control", "type", "send_key", "interrupt", "release_control", "check_approval", "request_attention", "open_tab", "switch_tab"]; -/** i18n key and affordance mask (`null` = every tool), shared by the palette and settings. */ -export const TOOL_PRESETS: [string, string[] | null][] = [ - ["s.preset.observe", ["snapshot", "request_attention", "check_approval", "switch_tab"]], - ["s.preset.notabs", TOOLS.filter((a) => a !== "open_tab")], - ["s.preset.all", null], -]; - -/** Invoke a command against the active tab unless `session` is given. */ -export const cmd = (name: string, args: Record = {}) => - invoke(name, { session: st.active, ...args }); -/** A rejected mode change must remain visible and must not permit a following grant. */ -export async function changeMode(mode: Mode, session = st.active): Promise { - try { await cmd("set_mode", { mode, session }); return true; } - catch (e) { - const message = String(e); - toast(message.includes("input_pending") || message.includes("shell input is pending") ? t("mode.input_pending") : message, "warn"); - return false; - } -} -export const log = (msg: string) => invoke("log", { msg }).catch(() => {}); -export const onEvent = (h: (ev: Ev) => void) => listen("ss:event", (e) => h(e.payload)); -export const onAdmission = (h: (p: AdmissionChange) => void) => listen("ss:admission", (e) => h(e.payload)); -export const onTabOpened = (h: (p: { session: string; agentId: string; reason?: string | null; focus?: boolean }) => void) => listen<{ session: string; agentId: string; reason?: string | null; focus?: boolean }>("ss:tab_opened", (e) => h(e.payload)); -type OutputFrame = { session: string; data: string; outputSeq: number; generation: number; size: { rows: number; cols: number } }; -export const onOutput = (h: (p: OutputFrame) => void) => listen("ss:output", (e) => h(e.payload)); -export const b64ToBytes = (s: string) => Uint8Array.from(atob(s), (c) => c.charCodeAt(0)); diff --git a/frontends/tauri/src/lib/collaboration/api.ts b/frontends/tauri/src/lib/collaboration/api.ts deleted file mode 100644 index 123d2d9..0000000 --- a/frontends/tauri/src/lib/collaboration/api.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { invoke } from '../transport'; -import type { AdmissionSnapshot, SharingSnapshot, SharingStatus, DecisionTarget } from './contracts'; -export const admissionSnapshot = () => invoke('admission_snapshot'); -export const decideAdmission = (connId: number, allow: boolean) => invoke('decide_admission', { connId, allow }); -export const sharingSnapshot = (session: string) => invoke('sharing_state', { session }); -export const setSharing = (session: string, shared: boolean, connectionIds: number[], expectedRevision: number) => invoke('set_sharing', { session, shared, connectionIds, expectedRevision }); -export const decideControl = (target: DecisionTarget, grant: boolean) => invoke('decide_control', { ...target, grant }); -export function failureKey(error: unknown): string { - const message = String(error); - if (message.includes('sharing_changed')) return 'sharing.changed'; - if (message.includes('history_unavailable')) return 'sharing.historyUnavailable'; - if (message.includes('input_pending') || message.includes('shell input is pending')) return 'sharing.pendingInput'; - if (message.includes('connection_gone') || message.includes('disconnected')) return 'sharing.connectionGone'; - return 'decision.failed'; -} diff --git a/frontends/tauri/src/lib/collaboration/attention.ts b/frontends/tauri/src/lib/collaboration/attention.ts deleted file mode 100644 index 75d68b9..0000000 --- a/frontends/tauri/src/lib/collaboration/attention.ts +++ /dev/null @@ -1,17 +0,0 @@ -/** App inactivity changes notification delivery only, never session access. */ -import {getCurrentWindow,UserAttentionType} from '@tauri-apps/api/window'; -let previous=new Set(); -let lastSignal=0; -let revision=0; -export async function signalPending(keys:string[]) { - const current=++revision; - const next=new Set(keys),fresh=keys.some(key=>!previous.has(key));previous=next; - document.title=keys.length ? `(${keys.length}) Conn` : 'Conn'; - if(import.meta.env.MODE==='browser-test')return; - const window=getCurrentWindow(); - if(!keys.length){await window.requestUserAttention(null);return;} - if(!fresh || Date.now()-lastSignal<10000 || await window.isFocused() || current!==revision)return; - lastSignal=Date.now(); - // Taskbar/Dock attention has no command, output or authentication payload. - await window.requestUserAttention(UserAttentionType.Informational); -} diff --git a/frontends/tauri/src/lib/collaboration/control.svelte.ts b/frontends/tauri/src/lib/collaboration/control.svelte.ts deleted file mode 100644 index f904ea3..0000000 --- a/frontends/tauri/src/lib/collaboration/control.svelte.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { invoke } from '../transport'; -import { decideControl } from './api'; -import type { DecisionTarget } from './contracts'; -import { requestAction } from './decision.svelte'; - -export const controlAction = (target: DecisionTarget) => requestAction(`control:${target.session}:${target.requestId}`); -export function resolveControl(target: DecisionTarget, decision: 'grant' | 'copilot' | 'deny') { - return controlAction(target).run(async () => { - if (decision === 'copilot') await invoke('set_mode', { session: target.session, mode: 'copilot' }); - await decideControl(target, decision !== 'deny'); - }); -} diff --git a/frontends/tauri/src/lib/collaboration/decision.svelte.ts b/frontends/tauri/src/lib/collaboration/decision.svelte.ts deleted file mode 100644 index 7d0cb7c..0000000 --- a/frontends/tauri/src/lib/collaboration/decision.svelte.ts +++ /dev/null @@ -1,26 +0,0 @@ -/** A decision stays retryable after failure. Never hide a request in finally. */ -export function decision() { - let busy = $state(false); - let error = $state(null); - return { - get busy() { return busy; }, get error() { return error; }, - async run(action: () => Promise) { - if (busy) return false; - busy = true; error = null; - try { await action(); return true; } - catch (cause) { error = cause; return false; } - finally { busy = false; } - }, - }; -} - -// Keyboard and card buttons share progress/error state for the same request. -const actions = new Map>(); -export function requestAction(key: string) { - let action = actions.get(key); - if (!action) { - for (const [id, old] of actions) if (actions.size >= 128 && !old.busy) actions.delete(id); - action = decision(); actions.set(key, action); - } - return action; -} diff --git a/frontends/tauri/src/lib/collaboration/review.svelte.ts b/frontends/tauri/src/lib/collaboration/review.svelte.ts deleted file mode 100644 index 721ad4e..0000000 --- a/frontends/tauri/src/lib/collaboration/review.svelte.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { invoke } from '../transport'; -import { requestAction } from './decision.svelte'; -export const reviewAction = (session: string, approvalId: string) => requestAction(`approval:${session}:${approvalId}`); -export function resolveReview(session: string, approvalId: string, decision: string) { - return reviewAction(session, approvalId).run(() => invoke('approve', { session, approvalId, decision })); -} diff --git a/frontends/tauri/src/lib/extensions.svelte.ts b/frontends/tauri/src/lib/extensions.svelte.ts deleted file mode 100644 index e7e9b4a..0000000 --- a/frontends/tauri/src/lib/extensions.svelte.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { cmd } from './bridge'; -import { st } from './store.svelte'; -import { ANSI, THEMES, type ThemeId } from './themes'; - -export type Extension = { id: string; name: string; kind: string; enabled: boolean; capabilities: string[] }; -export type ExtensionTheme = { id: string; name: string; background: string; foreground: string; cursor: string; selection: string; ansi: string[] }; -export type ExtensionCatalog = { - apiVersion: number; extensions: Extension[]; - settings: {theme: string}; themes: ExtensionTheme[]; -}; -export const extensions = $state<{catalog: ExtensionCatalog | null}>({catalog:null}); -export async function refreshExtensions() { - const catalog = await cmd('extensions_status'); - if (catalog.apiVersion !== 1) throw new Error('Unsupported extension API'); - for (const theme of catalog.themes) { - const id = theme.id.replace(/^conn\.theme\./, '') as ThemeId; - const rgb = parseInt(theme.background.replace('#',''),16); - const light = ((rgb >> 16) * .299 + ((rgb >> 8) & 255) * .587 + (rgb & 255) * .114) > 160; - const base = THEMES[id] ?? THEMES[light ? 'paper' : 'midnight']; - // Registry supplies only supported tokens; trusted status/approval colors stay in Conn. - THEMES[id] = {...base, id, name:theme.name, cursor:theme.cursor, tokens:{...base.tokens,bg:theme.background,fg:theme.foreground,selection:theme.selection}, xterm:{...base.xterm, background:theme.background,foreground:theme.foreground,...Object.fromEntries(ANSI.map((key,i) => [key,theme.ansi[i]]))}}; - } - const id = catalog.settings.theme.replace(/^conn\.theme\./, '') as ThemeId; - if (THEMES[id]) { st.theme = id; localStorage.setItem('ss:theme', id); } - st.themeRevision++; - extensions.catalog = catalog; - return catalog; -} -export async function selectTheme(id: string) { - await cmd('extension_configure', {id:extensions.catalog?.themes.find(theme => theme.id === id || theme.id === `conn.theme.${id}`)?.id ?? `conn.theme.${id}`,config:{enabled:true}}); - await refreshExtensions(); -} diff --git a/frontends/tauri/src/lib/liveAgents.svelte.ts b/frontends/tauri/src/lib/liveAgents.svelte.ts deleted file mode 100644 index 5a34b43..0000000 --- a/frontends/tauri/src/lib/liveAgents.svelte.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { cmd } from "./bridge"; - -export type LiveAgent = { conn: number; agentId: string; affordances: string[] }; -/** Agents connected to the active tab. One poll loop, alive only while a view watches. */ -export const liveAgents = $state<{ list: LiveAgent[] }>({ list: [] }); -let watchers = 0; -let timer: ReturnType | undefined; -async function poll() { try { liveAgents.list = await cmd("agents"); } catch { liveAgents.list = []; } } -/** Call from an `$effect` that tracks `st.active`; returns its cleanup. */ -export function watchLiveAgents() { - if (!watchers++) timer = setInterval(poll, 1500); - void poll(); - return () => { if (!--watchers) { clearInterval(timer); liveAgents.list = []; } }; -} diff --git a/frontends/tauri/src/lib/nativeUpdates.svelte.ts b/frontends/tauri/src/lib/nativeUpdates.svelte.ts deleted file mode 100644 index bebfe0c..0000000 --- a/frontends/tauri/src/lib/nativeUpdates.svelte.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { invoke as nativeInvoke } from '@tauri-apps/api/core'; - -export type UpdateStatus = { phase: string; current: string; version?: string; notes: string; preview: boolean; supported: boolean; downloaded: number; total?: number; error?: string }; -export const updater = $state({ status: { phase: 'idle', current: '', notes: '', preview: false, supported: false, downloaded: 0 } as UpdateStatus, busy: false, previews: false, automatic: true }); -const native = import.meta.env.MODE !== 'browser-test'; -let initialized = false; -export async function initUpdates() { - if (initialized) return; - initialized = true; - try { - if (native) updater.status = await nativeInvoke('app_update', { action: 'status' }); - updater.previews = localStorage.getItem('conn:update-previews') === 'true' || (localStorage.getItem('conn:update-previews') === null && updater.status.preview); - updater.automatic = localStorage.getItem('conn:auto-update') !== 'false'; - } catch { initialized = false; } -} -export function updatePreference(kind: 'previews' | 'automatic', value: boolean) { - updater[kind] = value; - localStorage.setItem(kind === 'previews' ? 'conn:update-previews' : 'conn:auto-update', String(value)); -} -export async function updateAction(action: 'check' | 'download' | 'install', confirmed = false) { - if (updater.busy) return; - updater.busy = true; - updater.status.error = undefined; - updater.status.phase = action === 'check' ? 'checking' : action === 'download' ? 'downloading' : 'installing'; - let finished = false; - let poll: ReturnType | undefined; - try { - if (native) { - poll = setInterval(async () => { try { const status = await nativeInvoke('app_update', { action: 'status' }); if (!finished) updater.status = status; } catch {} }, 500); - updater.status = await nativeInvoke('app_update', { action, previews: updater.previews, confirmed }); - } else updater.status.phase = 'current'; // The browser harness has no updater and makes no request. - } catch (error) { updater.status.phase = 'error'; updater.status.error = String(error); } - finally { finished = true; if (poll) clearInterval(poll); updater.busy = false; } -} -export function startAutoUpdates() { - // The browser harness and external automation windows never initiate updates. - if (!native) return () => {}; - let stopped = false; - const run = async () => { - await initUpdates(); - if (stopped || !initialized || !updater.automatic || updater.busy || ['ready','installing'].includes(updater.status.phase)) return; - await updateAction('check'); - if (!stopped && updater.automatic && updater.status.supported && updater.status.phase === 'available') await updateAction('download'); - }; - const first = setTimeout(run, 30000); - const repeat = setInterval(run, 6 * 60 * 60 * 1000); - return () => { stopped = true; clearTimeout(first); clearInterval(repeat); }; -} diff --git a/frontends/tauri/src/lib/terminalResize.ts b/frontends/tauri/src/lib/terminalResize.ts deleted file mode 100644 index 8075a67..0000000 --- a/frontends/tauri/src/lib/terminalResize.ts +++ /dev/null @@ -1,35 +0,0 @@ -type Size = { rows: number; cols: number }; - -/** One resize in flight per terminal, retaining the newest pending dimensions. - * Native IPC workers can finish in a different order from invocation. Sending - * the next size only after acknowledgement keeps an older size from winning. - * Intermediate window/dock sizes do not need their own PTY redraw. - */ -export function terminalResizeQueue(send: (size: Size) => Promise, onError: (error: unknown) => void) { - let pending: Size | undefined; - let applied: Size | undefined; - let running = false; - let disposed = false; - - async function drain() { - running = true; - try { - while (!disposed && pending) { - const size = pending; - pending = undefined; - if (applied?.rows === size.rows && applied.cols === size.cols) continue; - try { await send(size); applied = size; } - catch (error) { if (!disposed) onError(error); } - } - } finally { running = false; } - } - - return { - resize(size: Size) { - if (disposed) return; - pending = { ...size }; - if (!running) void drain(); - }, - dispose() { disposed = true; pending = undefined; }, - }; -} diff --git a/frontends/tauri/src/lib/transport.ts b/frontends/tauri/src/lib/transport.ts deleted file mode 100644 index a32a8fb..0000000 --- a/frontends/tauri/src/lib/transport.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { invoke as nativeInvoke } from "@tauri-apps/api/core"; -import { getCurrentWebviewWindow } from "@tauri-apps/api/webviewWindow"; -import { listen as nativeListen } from "@tauri-apps/api/event"; - -// Only the transport boundary knows about the browser test adapter. -const browser = import.meta.env.MODE === "browser-test"; -const adapter = () => import("../../tests/browser/transport"); -export async function invoke(name: string, args: Record = {}): Promise { - return browser ? (await adapter()).invoke(name,args) : nativeInvoke("dispatch",{name,args}); -} -export async function listen(name: string, handler: (event: {payload:T})=>void): Promise<()=>void> { - return browser ? (await adapter()).listen(name,handler) : nativeListen(name,handler, { target: { kind: "WebviewWindow", label: getCurrentWebviewWindow().label } }); -} diff --git a/frontends/tauri/src/main.ts b/frontends/tauri/src/main.ts index 363ec93..5e1fb86 100644 --- a/frontends/tauri/src/main.ts +++ b/frontends/tauri/src/main.ts @@ -1,5 +1,5 @@ -import { mount } from "svelte"; -import "./app.css"; -import App from "./App.svelte"; +import { mount } from 'svelte'; +import NativeRoot from './NativeRoot.svelte'; +import '@conn/ui/styles.css'; -export default mount(App, { target: document.getElementById("app")! }); +mount(NativeRoot, { target: document.getElementById('app')! }); diff --git a/frontends/tauri/src/nativePorts.ts b/frontends/tauri/src/nativePorts.ts new file mode 100644 index 0000000..2aee0a7 --- /dev/null +++ b/frontends/tauri/src/nativePorts.ts @@ -0,0 +1,44 @@ +import { invoke } from '@tauri-apps/api/core'; +import { getCurrentWebviewWindow } from '@tauri-apps/api/webviewWindow'; +import { listen } from '@tauri-apps/api/event'; +import { getCurrentWindow, UserAttentionType } from '@tauri-apps/api/window'; +import { OWNER_PROTOCOL, type ConnPorts, type UpdateStatus, type OwnerHello, type OwnerRequestMeta } from '@conn/ui/runtime'; + +/** Native APIs stay at this entry point; all state and scheduling lives in @conn/ui. */ +export async function createNativePorts(onDisconnect: (cause: unknown, uncertain?: boolean) => void): Promise { + let attachment = await invoke('owner_attach', { protocol: OWNER_PROTOCOL, takeover: true }); + let stopped = false; + const connectionListeners = new Set<(event: { payload: { connected: boolean; epoch: number; runtimeId: string } }) => void>(); + const signal = (connected: boolean) => { for (const listener of connectionListeners) listener({ payload: { connected, epoch: attachment.epoch, runtimeId: attachment.runtimeId } }); }; + const window = getCurrentWindow(); + const transport = { + async invoke(name: string, args: Record = {}, meta?: OwnerRequestMeta): Promise { + if (stopped) throw new Error('Native connection disposed'); + if (!meta) throw new Error('Owner operations must use the common Conn client'); + try { return await invoke('dispatch', { name, args, meta: { ...meta, epoch: attachment.epoch } }); } + catch (cause) { + // A retired view must ask the user to reconnect, never take ownership in a retry loop. + if (!stopped && String(cause) === 'attachment_fenced') { signal(false); onDisconnect(cause); } + throw cause; + } + }, + async listen(name: string, handler: (event: { payload: T }) => void): Promise<() => void> { + if (name === 'ss:connection') { + const listener = handler as (event: { payload: { connected: boolean; epoch: number; runtimeId: string } }) => void; + connectionListeners.add(listener); + queueMicrotask(() => { if (!stopped && connectionListeners.has(listener)) listener({ payload: { connected: true, epoch: attachment.epoch, runtimeId: attachment.runtimeId } }); }); + return () => { connectionListeners.delete(listener); }; + } + return listen(name, handler, { target: { kind: 'WebviewWindow', label: getCurrentWebviewWindow().label } }); + }, + reset(cause: unknown) { if (!stopped) { stopped = true; signal(false); onDisconnect(cause, true); } }, + dispose() { stopped = true; connectionListeners.clear(); }, + }; + return { + transport, + attention: { isFocused: () => window.isFocused(), request: active => window.requestUserAttention(active ? UserAttentionType.Informational : null) }, + updates: { supported: true, invoke: (action, options = {}) => invoke('app_update', { action, ...options }) }, + storage: localStorage, + platform: /Mac/.test(navigator.platform) ? 'macos' : /Win/.test(navigator.platform) ? 'windows' : 'linux', + }; +} diff --git a/frontends/tauri/tests/browser/transport.ts b/frontends/tauri/tests/browser/transport.ts deleted file mode 100644 index dfb2848..0000000 --- a/frontends/tauri/tests/browser/transport.ts +++ /dev/null @@ -1,53 +0,0 @@ -type Handler = (event: {payload:any})=>void; -const listeners = new Map>(); -type OutputPacket = {session:string;data:string;outputSeq:number;generation:number;size:{rows:number;cols:number}}; -const history = new Map(); -const historyBytes = new Map(); -const pending = new Mapvoid;reject:(e:Error)=>void;timer:ReturnType}>(); -let seq=0; -let connection:Promise|undefined; -async function connected():Promise { - return connection ??= (async()=>{ - const res=await fetch("/__conn/connection"); - if(!res.ok) throw new Error("Start the Conn browser harness with npm run test:browser."); - const config=await res.json(); - return new Promise((resolve,reject)=>{ - const ws=new WebSocket(`${config.url}?token=${encodeURIComponent(config.token)}`); - ws.onopen=()=>{for(const h of listeners.get("ss:connection")??[])h({payload:{connected:true}});resolve(ws);}; - ws.onerror=()=>reject(new Error("Cannot connect to the Conn test harness.")); - ws.onclose=()=>{ - for(const h of listeners.get("ss:connection")??[])h({payload:{connected:false}}); - const error=new Error("Conn test harness disconnected. Reload after restarting it."); - reject(error); - for(const p of pending.values()){clearTimeout(p.timer);p.reject(error);} pending.clear(); - }; - ws.onmessage=({data})=>{ - const v=JSON.parse(data); - if(v.id!==undefined){const p=pending.get(v.id);if(!p)return;clearTimeout(p.timer);pending.delete(v.id);v.error ? p.reject(new Error(v.error)) : p.resolve(v.result);return;} - if(v.event==="ss:output"){ - const id=v.payload.session;const chunks=history.get(id)??[];chunks.push(v.payload);history.set(id,chunks); - let count=(historyBytes.get(id)??0)+v.payload.data.length; - while(count>512*1024 && chunks.length>1)count-=chunks.shift()!.data.length; - historyBytes.set(id,count); - } - for(const h of listeners.get(v.event)??[])h({payload:v.payload}); - }; - }); - })().catch(e=>{connection=undefined;throw e;}); -} -export async function invoke(name:string,args:Record={}):Promise{ - const ws=await connected(); - if(ws.readyState!==WebSocket.OPEN) throw new Error("Conn test harness disconnected. Reload after restarting it."); - const id=++seq; - return new Promise((resolve,reject)=>{ - const timer=setTimeout(()=>{pending.delete(id);reject(new Error(`Conn command timed out: ${name}`));},15000); - pending.set(id,{resolve,reject,timer}); - try{ws.send(JSON.stringify({id,name,args}));}catch(e){clearTimeout(timer);pending.delete(id);reject(e);} - }); -} -export async function listen(name:string,handler:(event:{payload:T})=>void):Promise<()=>void>{ - let set=listeners.get(name);if(!set)listeners.set(name,set=new Set());set.add(handler); - // Transport replay only. All events, status and decisions originate from Rust. - if(name==="ss:output")for(const chunks of history.values())for(const packet of chunks)handler({payload:packet as T}); - return ()=>{set!.delete(handler);}; -} diff --git a/frontends/tauri/tests/collaboration/index.html b/frontends/tauri/tests/collaboration/index.html deleted file mode 100644 index 0ce577a..0000000 --- a/frontends/tauri/tests/collaboration/index.html +++ /dev/null @@ -1 +0,0 @@ -Collaboration regression
diff --git a/frontends/tauri/tests/collaboration/main.ts b/frontends/tauri/tests/collaboration/main.ts deleted file mode 100644 index 659f7bb..0000000 --- a/frontends/tauri/tests/collaboration/main.ts +++ /dev/null @@ -1,55 +0,0 @@ -// Contract fixture for the production App. Never imported by the application entrypoint. -import { mockIPC, mockWindows } from '@tauri-apps/api/mocks'; -import { emit } from '@tauri-apps/api/event'; -import { st } from '../../src/lib/store.svelte'; -import { mount } from 'svelte'; -import App from '../../src/App.svelte'; -import '../../src/app.css'; -import { setLang } from '../../src/lib/i18n.svelte'; - -const options = new URLSearchParams(location.search); -setLang(options.get('lang') === 'ko' ? 'ko' : 'en'); -if (options.has('settings')) { st.settingsOpen = true; st.settingsTab = 'agents'; } -let shared = false, admitted = false, admissionFailures = options.has('fail-admission') ? 1 : 0; -let revision = 1; -let staleFailures = options.has('fail-stale') ? 1 : 0; -let waiting = !options.has('delayed'); -window.addEventListener('fixture:request', () => { waiting = true; revision++; void emit('ss:admission', {connId: 7, agentId: 'copilot', state: 'pending', revision}); }); -const profile = { id: 'fixture', name: 'External shell', enabled: true, backend: 'local', shell: 'posix', program: '/bin/bash', args: [], cwd: null, env: {}, target: null, port: null }; -const status = () => ({ shared, externalOrigin: true, externalStarting: options.has('preparing'), externalInputAvailable: !shared, - surfaceAvailable: shared, inputPending: false, processAlive: true, attended: true, profileId: profile.id, profileName: profile.name, - mode: 'autopilot', effectiveMode: 'autopilot', controller: {type: 'human'}, controlGate: true, pending: [], controlRequests: [], - sessionAllows: [], affordanceMask: null, connectedAgents: admitted ? ['copilot'] : [], reviewRequired: true, - pacing: {minWriteIntervalMs: 0, enterGraceMs: 0, leaseTtlSecs: 60, approvalTtlSecs: 300}, revision }); -mockWindows('main'); -mockIPC((command, raw: any) => { - if (command !== 'dispatch') return null; - const { name, args } = raw; - switch (name) { - case 'profiles_catalog': return {config: {version: 1, revision: 0, defaultProfile: profile.id, profiles: [profile]}, availability: {[profile.id]: {available: true, message: 'Ready'}}}; - case 'extensions_status': return {extensions: []}; - case 'start': return {socket: 'fixture', session: options.has('empty') ? null : 'private-1', sessions: options.has('empty') ? [] : ['private-1'], externalPending: options.has('preparing')}; - case 'status': return status(); - case 'pending_admissions': return admitted || !waiting ? [] : [{connId: 7, agentId: 'copilot'}]; - case 'admission_snapshot': return {revision, pending: admitted || !waiting ? [] : [{connId: 7, agentId: 'copilot'}]}; - case 'admission_policy': return {ask: true}; - case 'decide_admission': - if (admissionFailures-- > 0) throw new Error('transport_unavailable'); - admitted = true; revision++; - void emit('ss:admission', {connId: 7, agentId: 'copilot', state: args.allow ? 'granted' : 'denied', revision}); - return {decided: true}; - case 'sharing_participants': return admitted ? [{connId: 7, agentId: 'copilot', selected: shared}] : []; - case 'sharing_state': return {revision, participants: admitted ? [{connId: 7, agentId: 'copilot', selected: shared}] : []}; - case 'set_sharing': - if (staleFailures-- > 0) { revision++; throw new Error('sharing_changed'); } - if (options.has('fail-sharing')) throw new Error('input_pending'); - shared = args.shared; revision++; - void emit('ss:event', {session: 'private-1', event: 'sharing_changed', shared, generation: revision}); - return status(); - case 'agent_clients': return []; - case 'audit_tail': return []; - case 'log': return null; - default: return null; - } -}, {shouldMockEvents: true}); -mount(App, {target: document.getElementById('app')!}); diff --git a/frontends/tauri/tests/review/Fixture.svelte b/frontends/tauri/tests/review/Fixture.svelte deleted file mode 100644 index 0713bc8..0000000 --- a/frontends/tauri/tests/review/Fixture.svelte +++ /dev/null @@ -1,26 +0,0 @@ - -
- - - - {#if st.settingsOpen} st.settingsOpen = false} />{/if} -
- diff --git a/frontends/tauri/tests/review/index.html b/frontends/tauri/tests/review/index.html deleted file mode 100644 index 76ae0e0..0000000 --- a/frontends/tauri/tests/review/index.html +++ /dev/null @@ -1 +0,0 @@ -Conn · Review UI fixture
diff --git a/frontends/tauri/tests/review/main.ts b/frontends/tauri/tests/review/main.ts deleted file mode 100644 index 19d7a7a..0000000 --- a/frontends/tauri/tests/review/main.ts +++ /dev/null @@ -1,60 +0,0 @@ -// Isolated visual regression fixture; never imported by the application build. -import { mockIPC } from '@tauri-apps/api/mocks'; -import { mount } from 'svelte'; -import Fixture from './Fixture.svelte'; -import '../../src/app.css'; -import { st, newTab } from '../../src/lib/store.svelte'; -import { recordTimeline } from '../../src/lib/timeline'; -import { setLang } from '../../src/lib/i18n.svelte'; - -const options = new URLSearchParams(location.search); -setLang(options.get('lang') === 'ko' ? 'ko' : 'en'); -st.active = 't1'; st.order = ['t1']; st.tabs.t1 = newTab('t1', 1); -st.settingsTab = 'diagnostics'; st.timelineOpen = true; -if (options.has('automation')) { st.settingsTab = 'automation'; st.settingsOpen = true; st.timelineOpen = false; } -let automationConfig = {enabled:false,profiles:['local-zsh']}; -let requiresReenable = options.has('reenable'); -let automationReads = 0; -const automationInfo = () => ({config:structuredClone(automationConfig),nativeSupported:!options.has('unsupported'),requiresReenable}); -const s = st.tabs.t1.timeline; -const events = [ - {event:'control_granted',agentId:'codex',lease:'l1'}, - {event:'agent_exec',agentId:'codex',cmd:'pwd',policy:'allow'}, - {event:'exec_scheduled',execId:'e1',agentId:'codex',cmd:'ls',graceMs:5000}, - {event:'exec_cosigned',execId:'e1',agentId:'codex'}, - {event:'agent_exec',agentId:'codex',cmd:'ls',policy:'allow'}, - {event:'proposal_changed',proposal:{proposalId:'p1',agentId:'codex',text:'mkdir sample',state:'ready'}}, - {event:'proposal_resolved',proposalId:'p1',state:'executed'}, - {event:'agent_exec',agentId:'codex',cmd:'mkdir sample',policy:'allow'}, - {event:'approval_requested',request:{id:'a1',agentId:'codex',cmd:'rm sample',label:'delete'}}, - {event:'approval_resolved',approvalId:'a1',state:'granted',by:'human'}, - {event:'agent_exec',agentId:'codex',cmd:'rm sample',policy:'confirm:granted'}, -]; -events.forEach((e,i) => recordTimeline(s,e,Date.now()+i)); -mockIPC((name,args:any) => { - if (name === 'dispatch') { name = args.name; args = args.args; } - if (name === 'automation_settings') { - const snapshot = automationInfo(); - automationReads++; - return options.has('slowPoll') && automationReads === 2 ? new Promise(resolve => setTimeout(() => resolve(snapshot),1000)) : snapshot; - } - if (name === 'automation_save') { - if(options.has('failSave')) throw new Error('Fixture: unable to save settings'); - // Native IPC serializes Svelte proxies before Rust receives them. - automationConfig = JSON.parse(JSON.stringify(args.config)); requiresReenable = false; return automationInfo(); - } - if (name === 'automation_revoke') { - if(options.has('failRevoke')) throw new Error('Fixture: unable to revoke access'); - return null; - } - if (name === 'profiles_catalog') return {config:{profiles:[{id:'local-zsh',name:'Local zsh'},{id:'ssh-development',name:'Development SSH connection with a long profile name'}]}}; - if (name === 'diagnostics') return { - version:'test',sessions:2,socket:'/test/conn.sock',configDir:'/test/config',policyPath:'/test/config/policy.yaml',auditPath:'/test/config/audit.jsonl', - cli:{onPath:'/test/conn',canInstall:false,canConfigure:false}, - clients:[{id:'copilot-cli',name:'Copilot CLI',state:'not_configured'},{id:'codex',name:'Codex CLI',state:'configured'}], - agentConnections:[{connId:1,agentId:'copilot',idleSecs:720,sessions:['t1']},{connId:2,agentId:'copilot',idleSecs:1,sessions:['t1','t2']}], - }; - if (name === 'set_mode') throw new Error('shell input is pending; clear or cancel it before changing mode'); - return null; -},{shouldMockEvents:true}); -mount(Fixture,{target:document.getElementById('app')!}); diff --git a/frontends/tauri/tests/terminal/resize.test.ts b/frontends/tauri/tests/terminal/resize.test.ts deleted file mode 100644 index 45bd9b4..0000000 --- a/frontends/tauri/tests/terminal/resize.test.ts +++ /dev/null @@ -1,65 +0,0 @@ -import assert from 'node:assert/strict'; -import test from 'node:test'; -import { terminalResizeQueue } from '../../src/lib/terminalResize.ts'; - -const turn = () => new Promise(resolve => setImmediate(resolve)); -const deferred = () => { - let resolve!: () => void; - let reject!: (error: Error) => void; - const promise = new Promise((yes, no) => { resolve = yes; reject = no; }); - return { promise, resolve, reject }; -}; - -test('a slow old resize cannot overtake the latest terminal size', async () => { - const first = deferred(); - const calls: {rows:number;cols:number}[] = []; - let pty = { rows:24, cols:80 }; - const queue = terminalResizeQueue(async size => { - calls.push(size); - if (calls.length === 1) await first.promise; - pty = size; - }, error => { throw error; }); - queue.resize({ rows:30, cols:83 }); - queue.resize({ rows:29, cols:100 }); - queue.resize({ rows:28, cols:137 }); - await turn(); - assert.deepEqual(calls, [{ rows:30, cols:83 }]); - first.resolve(); await turn(); - assert.deepEqual(calls, [{ rows:30, cols:83 }, { rows:28, cols:137 }]); - assert.deepEqual(pty, { rows:28, cols:137 }); - queue.dispose(); -}); - -test('returning to the acknowledged size does not signal a redundant resize', async () => { - const first = deferred();let calls=0; - const queue = terminalResizeQueue(async () => { calls++;await first.promise; }, error => { throw error; }); - queue.resize({ rows:24, cols:80 }); - queue.resize({ rows:24, cols:100 }); - queue.resize({ rows:24, cols:80 }); - first.resolve();await turn(); - assert.equal(calls,1);queue.dispose(); -}); - -test('a rejected resize does not strand the newest size or count as applied', async () => { - const first=deferred();const errors:unknown[]=[];let calls=0; - const queue=terminalResizeQueue(async () => {if(++calls===1)await first.promise;}, error=>errors.push(error)); - const size={rows:30,cols:104};queue.resize(size);queue.resize(size); - const error=new Error('synthetic transport failure');first.reject(error);await turn(); - assert.deepEqual(errors,[error]);assert.equal(calls,2);queue.dispose(); -}); - -test('closing a terminal discards pending sizes and late errors', async () => { - const first=deferred();let calls=0;const errors:unknown[]=[]; - const queue=terminalResizeQueue(async () => {calls++;await first.promise;}, error=>errors.push(error)); - queue.resize({rows:30,cols:100});queue.resize({rows:20,cols:90});queue.dispose(); - first.reject(new Error('closed'));await turn();queue.resize({rows:40,cols:120}); - assert.equal(calls,1);assert.deepEqual(errors,[]); -}); - -test('one terminal never blocks another terminal resize', async () => { - const first=deferred();let secondApplied=false; - const one=terminalResizeQueue(()=>first.promise,error=>{throw error;}); - const two=terminalResizeQueue(async()=>{secondApplied=true;},error=>{throw error;}); - one.resize({rows:24,cols:80});two.resize({rows:30,cols:100});await turn(); - assert.equal(secondApplied,true);one.dispose();two.dispose();first.resolve(); -}); diff --git a/frontends/tauri/tests/ui/index.html b/frontends/tauri/tests/ui/index.html deleted file mode 100644 index 3c7003e..0000000 --- a/frontends/tauri/tests/ui/index.html +++ /dev/null @@ -1 +0,0 @@ -Conn · Profile UI test fixture
diff --git a/frontends/tauri/tests/ui/main.ts b/frontends/tauri/tests/ui/main.ts deleted file mode 100644 index c6891bf..0000000 --- a/frontends/tauri/tests/ui/main.ts +++ /dev/null @@ -1,88 +0,0 @@ -// Browser-only test fixture. This entry is never imported by the application build. -import { mockIPC, mockWindows } from "@tauri-apps/api/mocks"; -import { emit } from "@tauri-apps/api/event"; -import { mount } from "svelte"; -import App from "../../src/App.svelte"; -import "../../src/app.css"; -import { st } from "../../src/lib/store.svelte"; -import { setLang } from "../../src/lib/i18n.svelte"; -import type { Profile, ProfileConfig } from "../../src/lib/profiles.svelte"; -const options = new URLSearchParams(location.search); -const externalPrivate = options.has("private"); -let externalInputAvailable = externalPrivate; -let externalStarting = externalPrivate && options.has("pending"); -let rendererAttached = false; -let launchCancelled = false; -setLang(options.get("lang") === "en" ? "en" : "ko"); -const base:Profile={id:"local-bash",name:"Bash",enabled:true,backend:"local",shell:"posix",program:"/bin/bash",args:["-l"],cwd:null,env:{},target:null,port:null}; -let config:ProfileConfig={version:1,revision:0,defaultProfile:base.id,profiles:[base,{...base,id:"ssh-dev",name:"Development server",backend:"ssh",program:"",shell:"custom",args:[],target:"dev@example.invalid"},{...base,id:"wsl-ubuntu",name:"WSL Ubuntu",backend:"wsl",target:"Ubuntu"}]}; -const sessions:Record={t1:structuredClone(base)}; -let active=options.has("existing") ? "t0" : "t1", sequence=1; -const catalog=()=>({config:structuredClone(config),availability:Object.fromEntries(config.profiles.map(p=>[p.id,{available:p.enabled && p.backend!=="wsl",message:p.backend==="wsl" ? "WSL profiles can be launched on Windows only" : p.enabled ? "Ready" : "Profile is disabled"}]))}); -mockWindows("main"); -mockIPC((command,args:any)=>{ - if (command === "dispatch") { command = args.name; args = args.args; } - if(command==="profiles_catalog") return catalog(); - if(command==="profiles_discover") return [{...base,id:"local-fish",name:"fish",program:"/usr/bin/fish",shell:"fish"}]; - if(command==="profiles_save") { - const next=args.config as ProfileConfig; - if(next.revision!==config.revision) throw new Error("Profiles changed in another window or CLI. Reload before saving."); - if(!next.profiles.find(p=>p.id===next.defaultProfile)?.enabled)throw new Error("The default profile must be enabled"); - config={...structuredClone(next),revision:next.revision+1};return catalog(); - } - if(command==="profiles_test") { - const p=args.profile as Profile; - if(p.target==="unreachable.invalid")throw new Error("Connection test timed out"); - return {available:p.backend!=="wsl",message:p.backend==="wsl" ? "WSL profiles can be launched on Windows only" : "Test fixture: target connection verified"}; - } - if(command==="start" && options.has("pending") && !options.has("existing")) return {socket:"/test/conn.sock", shell:"",session:null,sessions:[],externalPending:true}; - if(command==="start")return {socket:"/test/conn.sock",shell:"/bin/bash",session:active,sessions:[active]}; - if(command==="open_tab") { - const p=config.profiles.find(p=>p.id===(args.profileId ?? config.defaultProfile)); - if(!p || !catalog().availability[p.id].available)throw new Error("Profile unavailable"); - const id=`t${++sequence}`;sessions[id]=structuredClone(p);active=id;return id; - } - if(command==="attend"){active=args.session;return true;} - if(command==="close_tab"){delete sessions[args.session];return Object.keys(sessions)[0];} - if(command==="status") { - const p=sessions[args.session] ?? base; - if (externalPrivate && args.session === "t1") return {externalPrivate:true, externalStarting, externalInputAvailable:externalInputAvailable && !externalStarting,profileId:p.id,profileName:p.name,attended:true,processAlive:!externalStarting && !options.has("finished")}; - return {mode:"autopilot",effectiveMode:"autopilot",controlGate:false,sessionAllows:[],affordanceMask:null,connectedAgents:[],connectedFrontends:[],pacing:{minWriteIntervalMs:0,enterGraceMs:0,leaseTtlSecs:60,approvalTtlSecs:300},attended:args.session===active,processAlive:true,controller:{type:"human"},pending:[],controlRequests:[],profileId:p.id,profileName:p.name,reviewRequired:p.backend!=="local" || p.shell!=="posix"}; - } - if(command==="ui_ready" && options.has("pending")) { - setTimeout(() => { active = "t1"; void emit("ss:tab_opened", {session:"t1",externalPrivate:true,externalStarting:true,focus:true}); }, 100); - return null; - } - if(command==="attach_output") { - const session = args.session; - if (session === "t1") rendererAttached = true; - const publish = () => { - if (session !== "t1") return; - if (launchCancelled) return; - if (options.has("abort")) { void emit("ss:tab_aborted", {session}); return; } - if (externalStarting) { - if (!rendererAttached) throw new Error("Child started before renderer attachment"); - externalStarting = false; - void emit("ss:tab_opened", {session,externalPrivate:true,externalStarting:false,focus:true}); - } - void emit("ss:output", {session,data:btoa("\x1b[5n\x1b[6n\x1b[c\x1b[>c\x1b]52;c;dGVzdC1jbGlwYm9hcmQ=\x07External terminal fixture\r\nReady for local input.\r\n")}); - // A wrongly routed command event must not enter a private timeline. - void emit("ss:event", {session,event:"shell_command_started",commandId:"private-marker",actor:"human",cmd:"private-marker"}); - }; - setTimeout(publish, options.has("slowStart") ? Number(options.get("slowStart")) || 2000 : 0); - return null; - } - if(command==="take" || command==="input") { - externalInputAvailable = false; - if (externalStarting) { launchCancelled = true; void emit("ss:tab_aborted", {session:args.session}); } - return null; - } - if(command==="audit_tail" || command==="agents") { - if (externalPrivate && active === "t1") throw new Error("Private fixture queried collaboration data"); - return []; - } - if(command==="log" || command==="input" || command==="resize")return null; - return null; -},{shouldMockEvents:true}); -mount(App,{target:document.getElementById("app")!}); -st.settingsTab=externalPrivate ? "automation" : "profiles"; st.settingsOpen=!externalPrivate; diff --git a/frontends/tauri/vite.config.ts b/frontends/tauri/vite.config.ts index d9e52be..48a2f47 100644 --- a/frontends/tauri/vite.config.ts +++ b/frontends/tauri/vite.config.ts @@ -1,26 +1,11 @@ -import { readFile } from "node:fs/promises"; -import { resolve } from "node:path"; -import { defineConfig } from "vite"; -import { svelte } from "@sveltejs/vite-plugin-svelte"; +import { defineConfig } from 'vite'; +import { svelte } from '@sveltejs/vite-plugin-svelte'; -export default defineConfig(({mode}) => ({ - plugins: [svelte(), ...(mode === "browser-test" ? [{ - name: "conn-browser-test-transport", - configureServer(server: import("vite").ViteDevServer) { - server.middlewares.use(async(req,res,next)=>{ - const path=new URL(req.url??"/","http://localhost").pathname; - if(path==="/__conn/connection") { - try { res.setHeader("Content-Type","application/json");res.setHeader("Cache-Control","no-store");res.end(await readFile(resolve(process.env.CONN_TEST_STATE!,"connection.json"))); } - catch {res.statusCode=503;res.end("test harness unavailable");} return; - } - next(); - }); - } - }] : [])], +export default defineConfig({ + // Recreate native ports together with the common app during development. + plugins: [svelte({ compilerOptions: { hmr: false } })], clearScreen: false, - server: { - watch: { ignored: ["**/target/**"] }, - ...(mode === "browser-test" ? {hmr:false} : {}), port: 1420, strictPort: true, host: false }, - envPrefix: ["VITE_", "TAURI_ENV_"], - build: { target: "safari13", minify: !process.env.TAURI_ENV_DEBUG ? "esbuild" : false, sourcemap: !!process.env.TAURI_ENV_DEBUG }, -})); + server: { watch: { ignored: ['**/target/**'] }, port: 1420, strictPort: true, host: false }, + envPrefix: ['VITE_', 'TAURI_ENV_'], + build: { target: 'safari13', minify: !process.env.TAURI_ENV_DEBUG ? 'esbuild' : false, sourcemap: !!process.env.TAURI_ENV_DEBUG }, +}); diff --git a/frontends/web/index.html b/frontends/web/index.html new file mode 100644 index 0000000..e2b5f0e --- /dev/null +++ b/frontends/web/index.html @@ -0,0 +1,11 @@ + + + + + + + + Conn + +
+ diff --git a/frontends/web/package.json b/frontends/web/package.json new file mode 100644 index 0000000..3ad7f39 --- /dev/null +++ b/frontends/web/package.json @@ -0,0 +1,25 @@ +{ + "name": "@conn/web", + "version": "0.8.7", + "private": true, + "type": "module", + "scripts": { + "dev": "node scripts/dev.mjs", + "build": "svelte-check --threshold error && vite build", + "check": "svelte-check --threshold error" + }, + "dependencies": { + "@conn/ui": "*", + "svelte": "^5.57.0" + }, + "devDependencies": { + "@sveltejs/vite-plugin-svelte": "^5.1.1", + "@tsconfig/svelte": "^5.0.8", + "svelte-check": "^4.7.6", + "typescript": "^5.6.0", + "vite": "^6.0.0" + }, + "engines": { + "node": ">=24" + } +} diff --git a/frontends/web/public/conn-icon.svg b/frontends/web/public/conn-icon.svg new file mode 100644 index 0000000..957fb9a --- /dev/null +++ b/frontends/web/public/conn-icon.svg @@ -0,0 +1 @@ + diff --git a/frontends/web/scripts/dev.mjs b/frontends/web/scripts/dev.mjs new file mode 100644 index 0000000..3ea459a --- /dev/null +++ b/frontends/web/scripts/dev.mjs @@ -0,0 +1,43 @@ +import { spawn, spawnSync } from 'node:child_process'; +import { existsSync, readFileSync } from 'node:fs'; +import { homedir } from 'node:os'; +import { resolve, join } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const root = fileURLToPath(new URL('../../../', import.meta.url)); +const port = process.env.CONN_WEB_PORT ?? '1429'; +const backend = process.env.CONN_WEB_BACKEND_PORT ?? '1430'; +const origin = `http://127.0.0.1:${port}`; +const state = process.env.CONN_WEB_STATE ?? join(process.env.XDG_CONFIG_HOME ?? join(homedir(), '.config'), 'conn-web-dev'); +for (const p of [port, backend]) { + try { await fetch(`http://127.0.0.1:${p}/api/info`, { signal: AbortSignal.timeout(500) }); throw new Error(`Port ${p} is already serving. Reuse that host or select another port.`); } + catch (error) { if (!['TimeoutError', 'TypeError'].includes(error.name)) throw error; } +} +const build = spawnSync('cargo', ['build', '--locked', '-p', 'conn-web', '-p', 'conn'], { cwd: root, stdio: 'inherit' }); +if (build.status !== 0) process.exit(build.status ?? 1); +const executable = resolve(root, 'target/debug/conn-web' + (process.platform === 'win32' ? '.exe' : '')); +const args = ['serve', '--state-dir', state, '--port', backend, '--dev-origin', origin]; +if (process.env.CONN_WEB_SETUP_HOME) args.push('--setup-home', process.env.CONN_WEB_SETUP_HOME); +const hostEnv = { ...process.env }; +// npm's launcher setting is not a shell configuration; it breaks nvm startup. +delete hostEnv.npm_config_prefix; +const server = spawn(executable, args, { cwd: root, env: hostEnv, stdio: 'inherit' }); +let vite, stopping = false; +const stop = () => { if (stopping) return; stopping = true; vite?.kill(); server.kill(); }; +process.on('SIGINT', stop); process.on('SIGTERM', stop); +server.on('exit', code => { stop(); process.exitCode = code ?? 1; }); +try { + const connection = join(state, 'connection.json'); + for (let attempt = 0; ; attempt++) { + try { if (existsSync(connection) && (await fetch(`http://127.0.0.1:${backend}/api/info`)).ok) break; } catch {} + if (attempt >= 100 || server.exitCode !== null) throw new Error('Conn web host did not start.'); + await new Promise(resolve => setTimeout(resolve, 100)); + } + const metadata = JSON.parse(readFileSync(connection, 'utf8')); + if (metadata.protocol !== 1) throw new Error('Conn host protocol mismatch.'); + vite = spawn(process.execPath, [fileURLToPath(new URL('../node_modules/vite/bin/vite.js', import.meta.url)), '--host', '127.0.0.1', '--port', port], { + cwd: resolve(root, 'frontends/web'), env: { ...process.env, CONN_WEB_BACKEND: `http://127.0.0.1:${backend}` }, stdio: 'inherit', + }); + vite.on('exit', code => { stop(); process.exitCode = code ?? 1; }); + console.log(`Open ${origin}. Connection code: bootstrapToken in ${connection}`); +} catch (error) { console.error(error.message); stop(); process.exitCode = 1; } diff --git a/frontends/web/src/WebRoot.svelte b/frontends/web/src/WebRoot.svelte new file mode 100644 index 0000000..458fedb --- /dev/null +++ b/frontends/web/src/WebRoot.svelte @@ -0,0 +1,56 @@ + + +{#if ports}{:else}{/if} diff --git a/frontends/web/src/main.ts b/frontends/web/src/main.ts new file mode 100644 index 0000000..863942e --- /dev/null +++ b/frontends/web/src/main.ts @@ -0,0 +1,4 @@ +import { mount } from 'svelte'; +import WebRoot from './WebRoot.svelte'; +import '@conn/ui/styles.css'; +mount(WebRoot, { target: document.getElementById('app')! }); diff --git a/frontends/web/src/transport.ts b/frontends/web/src/transport.ts new file mode 100644 index 0000000..7e67ad7 --- /dev/null +++ b/frontends/web/src/transport.ts @@ -0,0 +1,140 @@ +import { OWNER_PROTOCOL, type ConnTransport, type OwnerRequestMeta, type OwnerHello } from '@conn/ui/runtime'; + +type Hello = OwnerHello; +type Problem = 'authentication' | 'occupied' | 'offline' | 'version' | 'reconnect'; +type Handler = (event: { payload: any }) => void; +type Pending = { resolve(value: any): void; reject(error: Error): void; timer: ReturnType }; +function failure(code: string, message = code) { return Object.assign(new Error(message), { code }); } + +/** Transport only. Ordering, terminal recovery and app lifetime live in @conn/ui. */ +export class WebTransport implements ConnTransport { + private socket?: WebSocket; + private hello?: Hello; + private listeners = new Map>(); + private pending = new Map(); + private nextId = 0; + private stopped = false; + private connected = false; + private connecting?: Promise; + private retry?: ReturnType; + private retryDelay = 500; + constructor(private problem: (kind: Problem) => void) {} + + connect(takeover = false): Promise { + if (this.stopped) return Promise.reject(failure('disposed')); + if (this.connected) return Promise.resolve(); + return this.connecting ??= this.open(takeover).finally(() => { this.connecting = undefined; }); + } + private async open(takeover: boolean) { + const response = await fetch('/api/info', { credentials: 'same-origin', cache: 'no-store' }); + if (!response.ok) throw failure('offline', `Conn host returned ${response.status}`); + const info = await response.json(); + if (!info.authenticated) { this.problem('authentication'); throw failure('authentication'); } + if (info.protocol !== OWNER_PROTOCOL) { this.problem('version'); throw failure('protocol_mismatch', 'This Conn host requires a different client version.'); } + if (this.stopped) throw failure('disposed'); + await new Promise((resolve, reject) => { + const url = new URL('/api/ws', location.href); + url.protocol = location.protocol === 'https:' ? 'wss:' : 'ws:'; + const socket = this.socket = new WebSocket(url); + let ready = false, fenced = false; + const timer = setTimeout(() => { reject(failure('timeout', 'Conn connection timed out.')); socket.close(); }, 10_000); + socket.onopen = () => socket.send(JSON.stringify({ type: 'hello', protocol: OWNER_PROTOCOL, takeover })); + socket.onmessage = event => { + if (this.socket !== socket || this.stopped) return; + let message: any; + try { message = JSON.parse(event.data); } catch { socket.close(); return; } + if (message.type === 'hello') { + clearTimeout(timer); + if (message.protocol !== OWNER_PROTOCOL) { this.problem('version'); reject(failure('protocol_mismatch')); socket.close(); return; } + this.hello = message; ready = true; this.connected = true; this.retryDelay = 500; + this.emit('ss:connection', { connected: true, ...message }); resolve(); return; + } + if (message.type === 'attachment_fenced' || (!ready && message.error === 'owner_attached')) { + fenced = true; this.problem('occupied'); reject(failure('owner_attached')); socket.close(); return; + } + if (!ready && message.type === 'error') { reject(failure(message.error ?? 'connection_failed')); socket.close(); return; } + if (message.type === 'resync_required') { socket.close(); return; } + if (typeof message.id === 'number') { + const pending = this.pending.get(message.id); + if (!pending) return; + this.pending.delete(message.id); clearTimeout(pending.timer); + if (message.error) pending.reject(failure(message.code ?? 'command_failed', message.error)); + else pending.resolve(message.result); + return; + } + if (typeof message.event === 'string' && message.epoch === this.hello?.epoch) this.emit(message.event, message.payload); + }; + socket.onerror = () => { /* close owns cleanup and retry */ }; + socket.onclose = () => { + clearTimeout(timer); + if (this.socket !== socket) return; + this.connected = false; + this.failPending(); + this.emit('ss:connection', { connected: false, ...this.hello }); + if (!ready) reject(failure(fenced ? 'owner_attached' : 'offline')); + if (ready && !fenced && !this.stopped) this.scheduleReconnect(); + }; + }); + } + private scheduleReconnect() { + if (this.stopped || this.retry) return; + this.problem('offline'); + this.retry = setTimeout(() => { + this.retry = undefined; + void this.connect().catch(error => { + if (!['authentication', 'owner_attached', 'protocol_mismatch', 'disposed'].includes(error.code)) { + this.retryDelay = Math.min(this.retryDelay * 2, 5000); this.scheduleReconnect(); + } + }); + }, this.retryDelay); + } + private request(message: Record): Promise { + if (!this.connected || this.socket?.readyState !== WebSocket.OPEN) return Promise.reject(failure('offline')); + const id = ++this.nextId; + return new Promise((resolve, reject) => { + const timer = setTimeout(() => { this.pending.delete(id); reject(failure('outcome_unknown', 'Command response was lost; its outcome is unknown.')); }, 30_000); + this.pending.set(id, { resolve, reject, timer }); + try { this.socket!.send(JSON.stringify({ id, ...message })); } + catch { clearTimeout(timer); this.pending.delete(id); reject(failure('outcome_unknown')); } + }); + } + async invoke(name: string, args: Record = {}, meta?: OwnerRequestMeta): Promise { + if (!meta) throw failure('missing_operation', 'Use the shared owner client for Conn commands.'); + const epoch = this.hello?.epoch; + try { return await this.request({ name, args, epoch, ...meta }); } + catch (error: any) { + // Query the original result once; never resubmit a mutation after a lost reply. + if (error.code !== 'outcome_unknown' || !this.connected || epoch !== this.hello?.epoch) throw error; + const outcome = await this.request({ type: 'outcome', epoch, operationId: meta.operationId }); + if (outcome.status === 'completed') { + if (outcome.error) throw failure('command_failed', outcome.error); + return outcome.result; + } + throw error; + } + } + async listen(name: string, handler: (event: { payload: T }) => void) { + let listeners = this.listeners.get(name); + if (!listeners) this.listeners.set(name, listeners = new Set()); + listeners.add(handler); + if (name === 'ss:connection') handler({ payload: { connected: this.connected, ...this.hello } as T }); + return () => { listeners.delete(handler); if (!listeners.size) this.listeners.delete(name); }; + } + private emit(name: string, payload: any) { for (const handler of this.listeners.get(name) ?? []) handler({ payload }); } + private failPending() { + for (const pending of this.pending.values()) { clearTimeout(pending.timer); pending.reject(failure('outcome_unknown', 'Connection lost; the command may have completed.')); } + this.pending.clear(); + } + reset(_cause: unknown) { + if (this.stopped) return; + this.stopped = true; this.connected = false; clearTimeout(this.retry); this.retry = undefined; + this.failPending(); + this.emit('ss:connection', { connected: false, ...this.hello }); + this.socket?.close(); + this.problem('reconnect'); + } + dispose() { + this.stopped = true; clearTimeout(this.retry); this.failPending(); this.listeners.clear(); + this.socket?.close(); this.connected = false; + } +} diff --git a/frontends/web/src/vite-env.d.ts b/frontends/web/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/frontends/web/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/frontends/web/svelte.config.js b/frontends/web/svelte.config.js new file mode 100644 index 0000000..0378127 --- /dev/null +++ b/frontends/web/svelte.config.js @@ -0,0 +1,2 @@ +import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; +export default { preprocess: vitePreprocess() }; diff --git a/frontends/web/tsconfig.json b/frontends/web/tsconfig.json new file mode 100644 index 0000000..bc2584c --- /dev/null +++ b/frontends/web/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "@tsconfig/svelte/tsconfig.json", + "compilerOptions": { + "target": "ES2021", "module": "ESNext", "lib": ["ES2021", "DOM", "DOM.Iterable"], + "moduleResolution": "bundler", "skipLibCheck": true, "resolveJsonModule": true, + "isolatedModules": true, "noEmit": true, "strict": true, "verbatimModuleSyntax": true + }, + "include": ["src/**/*.ts", "src/**/*.svelte", "../../packages/ui/src/**/*.ts", "../../packages/ui/src/**/*.svelte"] +} diff --git a/frontends/web/vite.config.ts b/frontends/web/vite.config.ts new file mode 100644 index 0000000..e86b1a2 --- /dev/null +++ b/frontends/web/vite.config.ts @@ -0,0 +1,15 @@ +import { defineConfig } from 'vite'; +import { svelte } from '@sveltejs/vite-plugin-svelte'; + +export default defineConfig({ + // Recreate the host attachment with the app. Component-only HMR would reuse + // ports disposed by the old ConnApp; a page reload retains the server's PTYs. + plugins: [svelte({ compilerOptions: { hmr: false } })], + resolve: { dedupe: ['svelte'] }, + server: { + host: '127.0.0.1', port: 1429, strictPort: true, + watch: { ignored: ['**/target/**'] }, + proxy: { '/api': { target: process.env.CONN_WEB_BACKEND ?? 'http://127.0.0.1:1430', ws: true, changeOrigin: true } }, + }, + build: { target: 'es2021' }, +}); diff --git a/media/demo/RECORDING-REMOTE.md b/media/demo/RECORDING-REMOTE.md index 306733e..f19640b 100644 --- a/media/demo/RECORDING-REMOTE.md +++ b/media/demo/RECORDING-REMOTE.md @@ -20,7 +20,7 @@ Visible prompts, the five cards with the agent's stated reasons, frame counts an ## Reproduce -Requires the repository built (`cargo build -p conn -p conn-browser-harness`), frontend dependencies, Google Chrome, Docker (the fixture builds a small image from `scripts/remote/Dockerfile.staging`), FFmpeg, Pillow, and an authenticated `claude` CLI. `setup-fixture.sh` creates the loopback-only server with its fake service, the `ssh staging` alias used by the film shell, a synthetic password and the Conn profile; it touches none of your own SSH or Conn settings. Raw frames, the agent transcript and the synthetic password stay outside the repository. Remove the server afterwards with `docker rm -f conn-film-staging`. +Requires the repository built (`cargo build -p conn -p conn-web`), the built web UI (`npm run build:web`), Google Chrome, Docker (the fixture builds a small image from `scripts/remote/Dockerfile.staging`), FFmpeg, Pillow, and an authenticated `claude` CLI. `setup-fixture.sh` creates the loopback-only server with its fake service, the `ssh staging` alias used by the film shell, a synthetic password and the Conn profile; it touches none of your own SSH or Conn settings. Raw frames, the agent transcript and the synthetic password stay outside the repository. Remove the server afterwards with `docker rm -f conn-film-staging`. ```sh scripts/remote/setup-fixture.sh /tmp/conn-film # SSH server, `ssh staging` alias, synthetic password, Conn profile diff --git a/media/demo/RECORDING.md b/media/demo/RECORDING.md index 745cc06..91c7c81 100644 --- a/media/demo/RECORDING.md +++ b/media/demo/RECORDING.md @@ -12,93 +12,11 @@ The [six source clips](public/footage/collaboration/) and their [provenance](pub ## Reproduce the isolated session -Requirements: Conn’s build dependencies, installed frontend dependencies, Python 3, Git, FFmpeg/FFprobe, and an installed, authenticated Codex CLI. These capture helpers use Unix PTYs and run on Linux/macOS. Use a fresh state directory, not an existing personal shell session. Run from the repository root: +The recorded film used the pre-refactor browser adapter. That adapter has been removed. Current recordings must use the [production web host](../../docs/browser-testing.md), its compiled shared UI and the matching persistent `conn mcp` process. The fixture and human-role script below remain useful; the old Vite proxy commands are historical and are no longer an executable setup guide. -```sh -cargo build -p conn -p conn-browser-harness --locked -export CONN_FILM_REPO="$PWD" -export CONN_FILM_STATE="$(mktemp -d /tmp/conn-film-XXXXXX)" -python3 - <<'PY' -import json, os, pathlib, shutil, subprocess -state = pathlib.Path(os.environ['CONN_FILM_STATE']) -repo = pathlib.Path(os.environ['CONN_FILM_REPO']) -workspace = state / 'workspace' -shutil.copytree(repo / 'media/demo/fixture', workspace) -(state / 'operator').mkdir() -profile = { - 'version': 1, 'revision': 0, 'defaultProfile': 'film', - 'profiles': [{ - 'id': 'film', 'name': 'checkout-demo', 'enabled': True, - 'backend': 'local', 'shell': 'posix', 'program': '/bin/bash', - 'args': ['--noprofile', '--norc', '-i'], 'cwd': str(workspace), - 'env': {'PS1': 'demo $ ', 'HISTFILE': '/dev/null', - 'PYTHONDONTWRITEBYTECODE': '1', 'GIT_PAGER': 'cat', 'PAGER': 'cat'} - }] -} -defaults = {'mode': 'autopilot', 'gate': True, - 'pacing': {'minWriteIntervalMs': 40, 'enterGraceMs': 2000, - 'leaseTtlSecs': 120, 'approvalTtlSecs': 300}} -(state / 'profiles.json').write_text(json.dumps(profile, indent=2)) -(state / 'app.json').write_text(json.dumps(defaults, indent=2)) -subprocess.run(['git', 'init', '--quiet', str(workspace)], check=True) -subprocess.run(['git', '-C', str(workspace), 'add', '.'], check=True) -subprocess.run(['git', '-C', str(workspace), '-c', 'user.name=Conn Demo', - '-c', 'user.email=demo@example.invalid', 'commit', '-qm', 'Add checkout fixture'], check=True) -print(f'CONN_FILM_STATE={state}') -PY -CONN_TEST_PORT=1433 CONN_TEST_ORIGIN=http://127.0.0.1:1435 \ - target/debug/conn-browser-harness "$CONN_FILM_STATE" -``` - -In a second terminal, set `CONN_FILM_REPO` and `CONN_FILM_STATE` to the same values. Start the unchanged frontend: - -```sh -cd "$CONN_FILM_REPO/frontends/tauri" -CONN_TEST_STATE="$CONN_FILM_STATE" \ - node node_modules/vite/bin/vite.js --mode browser-test --host 127.0.0.1 --port 1431 -``` - -In a third terminal, set those same variables. Write instructions that route the task through Conn without prescribing the fix: - -```sh -cat > "$CONN_FILM_STATE/agent-instructions.md" <<'PROMPT' -For this demonstration, perform task file inspection, edits and commands only through Conn MCP. Work in the shared terminal's current workspace, not this CLI's operator directory. Do not use built-in shell execution or direct file editing for the task. -Read the current terminal snapshot first. Request control with the exact planned command and a clear reason. Wait for approval; then type the command and submit Enter through Conn. Read the resulting snapshot: delivery of Enter does not prove command success. -Stop on denial or human takeover. When the user asks you to continue, read the terminal and changed files again before deciding what to do. After the initial two tests pass, pause and keep the lease so the user can take over by typing. Do not inspect cases/ before the user adds another test. On the follow-up, finish the task and release control. Keep responses concise and in English. -PROMPT -python3 - <<'PY' -import json, os, pathlib -state = pathlib.Path(os.environ['CONN_FILM_STATE']) -# Arguments are passed as a list; no shell interpolation of instructions or paths. -launcher = '''import json, os, pathlib, shutil -state = pathlib.Path(os.environ['CONN_FILM_STATE']) -repo = pathlib.Path(os.environ['CONN_FILM_REPO']) -cli = shutil.which('codex') -if not cli: raise SystemExit('Install and authenticate Codex CLI first') -args = [cli, '--no-alt-screen', '-C', str(state / 'operator'), - '-s', 'read-only', '-a', 'on-request', '-m', 'gpt-6-astra'] -config = { - 'model_reasoning_effort': 'medium', - 'mcp_servers.conn.command': str(repo / 'target/debug/conn'), - 'mcp_servers.conn.args': ['--socket', str(state / 'conn.sock'), 'mcp', '--tools', 'static'], - 'mcp_servers.conn.tool_timeout_sec': 600, - 'developer_instructions': (state / 'agent-instructions.md').read_text(), - 'check_for_update_on_startup': False, -} -for key, value in config.items(): args.extend(['-c', key + '=' + json.dumps(value)]) -os.execv(cli, args) -''' -(state / 'launch-codex.py').write_text(launcher) -PY -cd "$CONN_FILM_REPO" -python3 media/demo/scripts/cli-capture-server.py --proxy-conn \ - --cwd "$CONN_FILM_STATE/operator" --record "$CONN_FILM_STATE/codex-pty.jsonl" \ - -- python3 "$CONN_FILM_STATE/launch-codex.py" -``` - -Open `http://127.0.0.1:1435/`. The bridge proxies required Vite assets from port 1431 so both panes share an origin; Conn’s WebSocket connects to port 1433, whose permitted Origin must be port **1435**. All three listeners are loopback-only. The bridge starts one CLI process, forwards browser input and terminal size, and retains bounded output for reconnects. Its log is created with mode `0600` and refuses to overwrite an existing file. Stop/relaunch with a fresh log when starting another take. +Build `cargo build -p conn -p conn-web --locked` and `npm run build:web` at the repository root. Use a fresh state directory, copy `fixture/` into its workspace and select that workspace through a local shell profile. Start `conn-web serve --state-dir --ui-dir frontends/web/dist`, authenticate the owner using its private connection file, and configure Codex with `target/debug/conn --socket /conn.sock mcp --tools static`. -The `-c` settings apply to this Codex process; they do not rewrite global MCP configuration. Codex may record its normal workspace trust decision. Select an available model if `gpt-6-astra` is unavailable; generated commands and wording will vary. Instructions route this demonstration through Conn, but do not form a security sandbox or prevent another tool from being used. The isolated fixture protects real work by scope, not by filesystem confinement. +The split capture helper can embed the web host's own origin; do not use `--proxy-conn` to introduce a second owner transport. Enter the connection code in the embedded Conn UI. Record the source commit, executable versions and actual origin for a new take. Existing film provenance describes the original footage and must not be rewritten as evidence for the refactor. ## Perform the actual collaboration diff --git a/media/demo/scripts/remote/lib.mjs b/media/demo/scripts/remote/lib.mjs index 306cd25..8d6b2ee 100644 --- a/media/demo/scripts/remote/lib.mjs +++ b/media/demo/scripts/remote/lib.mjs @@ -10,13 +10,13 @@ export async function until(what, fn, ms = 20000, every = 120) { throw new Error("timeout: " + what); } -export async function launch({ repo, state, uiPort = 1491, backendPort = 1493, cdpPort = 9347, width = 1920, height = 1080, scale = 1 }) { +export async function launch({ repo, state, uiPort = 1491, cdpPort = 9347, width = 1920, height = 1080, scale = 1 }) { const kids = []; const run = (cmd, args, opt = {}) => { const c = spawn(cmd, args, { stdio: "ignore", ...opt }); kids.push(c); return c; }; await mkdir(state, { recursive: true, mode: 0o700 }); - run(`${repo}/target/debug/conn-browser-harness`, [state], { env: { ...process.env, CONN_TEST_PORT: String(backendPort), CONN_TEST_ORIGIN: `http://127.0.0.1:${uiPort}` } }); - run(process.execPath, ["node_modules/vite/bin/vite.js", "--mode", "browser-test", "--host", "127.0.0.1", "--port", String(uiPort), "--strictPort"], { cwd: `${repo}/frontends/tauri`, env: { ...process.env, CONN_TEST_STATE: state } }); + run(`${repo}/target/debug/conn-web`, ['serve', '--state-dir', state, '--port', String(uiPort), '--ui-dir', `${repo}/frontends/web/dist`, '--setup-home', `${state}/setup-home`]); await until("frontend", async () => (await fetch(`http://127.0.0.1:${uiPort}/`)).ok); + const connection = JSON.parse(await readFile(`${state}/connection.json`, 'utf8')); run("google-chrome", ["--headless=new", "--no-sandbox", "--hide-scrollbars", `--force-device-scale-factor=${scale}`, "--font-render-hinting=none", `--remote-debugging-port=${cdpPort}`, `--user-data-dir=${state}/chrome`, `--window-size=${width},${height}`, "about:blank"]); const target = await until("chrome", async () => (await (await fetch(`http://127.0.0.1:${cdpPort}/json`)).json()).find(t => t.type === "page")); const ws = new WebSocket(target.webSocketDebuggerUrl); @@ -34,7 +34,7 @@ export async function launch({ repo, state, uiPort = 1491, backendPort = 1493, c await cdp("Runtime.enable"); await cdp("Page.enable"); await cdp("Emulation.setDeviceMetricsOverride", { width, height, deviceScaleFactor: scale, mobile: false }); const stop = async () => { try { ws.close(); } catch {} for (const k of kids) k.kill("SIGTERM"); await sleep(600); }; - return { cdp, on, js, errors, stop, url: `http://127.0.0.1:${uiPort}/`, sock: `${state}/conn.sock` }; + return { cdp, on, js, errors, stop, url: `http://127.0.0.1:${uiPort}/#token=${encodeURIComponent(connection.bootstrapToken)}`, sock: `${state}/conn.sock` }; } // The human role: real key and mouse events delivered to the page, never a test-only API. diff --git a/package-lock.json b/package-lock.json index 030fa4a..7045636 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,9 +7,11 @@ "name": "conn-workspace", "workspaces": [ "frontends/tauri", + "frontends/web", "site", "media/demo", - "packages/*" + "packages/*", + "tests/collaboration" ], "engines": { "node": ">=24" @@ -17,20 +19,15 @@ }, "frontends/tauri": { "name": "conn-desktop", - "version": "0.8.6", + "version": "0.8.7", "dependencies": { - "@conn/brand": "*", - "@conn/themes": "*", - "@tauri-apps/api": "^2", - "@xterm/addon-fit": "^0.11.0", - "@xterm/addon-unicode11": "0.9.0", - "@xterm/xterm": "^6.0.0" + "@conn/ui": "*", + "@tauri-apps/api": "^2" }, "devDependencies": { "@sveltejs/vite-plugin-svelte": "^5.1.1", "@tauri-apps/cli": "^2", "@tsconfig/svelte": "^5.0.8", - "playwright": "1.63.0", "svelte": "^5.57.0", "svelte-check": "^4.7.6", "typescript": "^5.6.0", @@ -396,56 +393,6 @@ "dev": true, "license": "MIT" }, - "frontends/tauri/node_modules/@xterm/addon-fit": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@xterm/addon-fit/-/addon-fit-0.11.0.tgz", - "integrity": "sha512-jYcgT6xtVYhnhgxh3QgYDnnNMYTcf8ElbxxFzX0IZo+vabQqSPAjC3c1wJrKB5E19VwQei89QCiZZP86DCPF7g==", - "license": "MIT" - }, - "frontends/tauri/node_modules/@xterm/addon-unicode11": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@xterm/addon-unicode11/-/addon-unicode11-0.9.0.tgz", - "integrity": "sha512-FxDnYcyuXhNl+XSqGZL/t0U9eiNb/q3EWT5rYkQT/zuig8Gz/VagnQANKHdDWFM2lTMk9ly0EFQxxxtZUoRetw==", - "license": "MIT" - }, - "frontends/tauri/node_modules/@xterm/xterm": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@xterm/xterm/-/xterm-6.0.0.tgz", - "integrity": "sha512-TQwDdQGtwwDt+2cgKDLn0IRaSxYu1tSUjgKarSDkUM0ZNiSRXFpjxEsvc/Zgc5kq5omJ+V0a8/kIM2WD3sMOYg==", - "license": "MIT", - "workspaces": [ - "addons/*" - ] - }, - "frontends/tauri/node_modules/playwright": { - "version": "1.63.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.63.0.tgz", - "integrity": "sha512-+7ziBLidS4NaNCdt57SUDT+wYmmd5fmiQejUic/kb+YsYSCPyOOE9sebzMjNmQrsnNpDJqd4WHvV/8lfKfUDUg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "playwright-core": "1.63.0" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=20" - } - }, - "frontends/tauri/node_modules/playwright/node_modules/playwright-core": { - "version": "1.63.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.63.0.tgz", - "integrity": "sha512-rYCsBF/M5HjUch52bbtVONEFjv6Xu8sm8h72dNlR5bzIE1fvC/bxgspzkjSfU+MweEMmPM8KJebG6nnyxo5mCg==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "playwright-core": "cli.js" - }, - "engines": { - "node": ">=20" - } - }, "frontends/tauri/node_modules/svelte": { "version": "5.57.1", "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.57.1.tgz", @@ -1911,849 +1858,668 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, - "media/demo": { - "name": "conn-demo", - "version": "1.0.0", - "license": "MIT", + "frontends/web": { + "name": "@conn/web", + "version": "0.8.7", "dependencies": { - "@conn/brand": "*", - "@remotion/cli": "4.0.525", - "@remotion/fonts": "4.0.525", - "@remotion/media": "4.0.525", - "@remotion/transitions": "4.0.525", - "react": "19.3.0", - "react-dom": "19.3.0", - "remotion": "4.0.525" + "@conn/ui": "*", + "svelte": "^5.57.0" }, "devDependencies": { - "@remotion/eslint-config-flat": "4.0.525", - "@types/react": "19.3.0", - "@types/web": "0.0.356", - "eslint": "9.19.0", - "prettier": "3.9.7", - "typescript": "5.9.3" + "@sveltejs/vite-plugin-svelte": "^5.1.1", + "@tsconfig/svelte": "^5.0.8", + "svelte-check": "^4.7.6", + "typescript": "^5.6.0", + "vite": "^6.0.0" }, "engines": { - "node": ">=22.6.0" + "node": ">=24" } }, - "media/demo/node_modules/@remotion/cli": { - "version": "4.0.525", - "resolved": "https://registry.npmjs.org/@remotion/cli/-/cli-4.0.525.tgz", - "integrity": "sha512-pWZs6jSeNFMtjoCBMB4kIVWkMiiwDWQDUsMIM11mTv5/VAZ6NnzLNYMvOqIuLD4LWUAgyINna4tGdFXW/qMd+Q==", - "license": "SEE LICENSE IN LICENSE.md", + "frontends/web/node_modules/@sveltejs/vite-plugin-svelte": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-5.1.1.tgz", + "integrity": "sha512-Y1Cs7hhTc+a5E9Va/xwKlAJoariQyHY+5zBgCZg4PFWNYQ1nMN9sjK1zhw1gK69DuqVP++sht/1GZg1aRwmAXQ==", + "dev": true, + "license": "MIT", "dependencies": { - "@babel/parser": "7.24.1", - "@remotion/bundler": "4.0.525", - "@remotion/media-utils": "4.0.525", - "@remotion/player": "4.0.525", - "@remotion/renderer": "4.0.525", - "@remotion/studio": "4.0.525", - "@remotion/studio-server": "4.0.525", - "@remotion/studio-shared": "4.0.525", - "dotenv": "17.3.1", - "minimist": "1.2.6", - "prompts": "2.4.2", - "remotion": "4.0.525", - "semver": "7.5.3" + "@sveltejs/vite-plugin-svelte-inspector": "^4.0.1", + "debug": "^4.4.1", + "deepmerge": "^4.3.1", + "kleur": "^4.1.5", + "magic-string": "^0.30.17", + "vitefu": "^1.0.6" }, - "bin": { - "remotion": "remotion-cli.js", - "remotionb": "remotionb-cli.js", - "remotiond": "remotiond-cli.js" + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22" }, "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" + "svelte": "^5.0.0", + "vite": "^6.0.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@babel/parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.1.tgz", - "integrity": "sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==", + "frontends/web/node_modules/@sveltejs/vite-plugin-svelte/node_modules/@sveltejs/vite-plugin-svelte-inspector": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-4.0.1.tgz", + "integrity": "sha512-J/Nmb2Q2y7mck2hyCX4ckVHcR5tu2J+MtBEQqpDrrgELZ2uvraQcK/ioCV61AqkdXFgriksOKIceDcQmqnGhVw==", + "dev": true, "license": "MIT", - "bin": { - "parser": "bin/babel-parser.js" + "dependencies": { + "debug": "^4.3.7" }, "engines": { - "node": ">=6.0.0" + "node": "^18.0.0 || ^20.0.0 || >=22" + }, + "peerDependencies": { + "@sveltejs/vite-plugin-svelte": "^5.0.0", + "svelte": "^5.0.0", + "vite": "^6.0.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler": { - "version": "4.0.525", - "resolved": "https://registry.npmjs.org/@remotion/bundler/-/bundler-4.0.525.tgz", - "integrity": "sha512-xrmtaEqQjXkaxr+ISIHY1OjPq/NB/mHlwRzFkbGtfWiGR6csUlb5E28BHm8C9TXypX+0cpyoS9kjdsyCXM3TxQ==", - "license": "SEE LICENSE IN LICENSE.md", + "frontends/web/node_modules/@sveltejs/vite-plugin-svelte/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", "dependencies": { - "@remotion/media-parser": "4.0.525", - "@remotion/studio": "4.0.525", - "@remotion/studio-shared": "4.0.525", - "@remotion/timeline-utils": "4.0.525", - "@rspack/core": "1.7.11", - "@rspack/plugin-react-refresh": "1.6.1", - "css-loader": "7.1.4", - "esbuild": "0.28.1", - "react-refresh": "0.18.0", - "remotion": "4.0.525", - "style-loader": "4.0.0", - "webpack": "5.105.0" + "ms": "^2.1.3" }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@remotion/media-parser": { - "version": "4.0.525", - "resolved": "https://registry.npmjs.org/@remotion/media-parser/-/media-parser-4.0.525.tgz", - "integrity": "sha512-HwfMhGBTJR+msrEVhus7ZtYISPCW6ShEHDRiHBUOoOtKESPQO4VHGe3apna2pFd0GY1WZV00VjgHz7K6pO+2Ag==", - "license": "Remotion License https://remotion.dev/license" + "frontends/web/node_modules/@sveltejs/vite-plugin-svelte/node_modules/debug/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@remotion/timeline-utils": { - "version": "4.0.525", - "resolved": "https://registry.npmjs.org/@remotion/timeline-utils/-/timeline-utils-4.0.525.tgz", - "integrity": "sha512-KLYZrj0cHhpSkLeKcvH8dG3UM6xL6SbEAUmiYi/fNSdVcZh4HP/E2zJCuTSQqHoYByUy86aMRIxUCgfsUdChbQ==", + "frontends/web/node_modules/@sveltejs/vite-plugin-svelte/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==", + "dev": true, "license": "MIT", - "dependencies": { - "mediabunny": "1.56.1", - "remotion": "4.0.525" + "engines": { + "node": ">=0.10.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@remotion/timeline-utils/node_modules/mediabunny": { - "version": "1.56.1", - "resolved": "https://registry.npmjs.org/mediabunny/-/mediabunny-1.56.1.tgz", - "integrity": "sha512-DNOm0bRBmeOxJgCK/g3LxNWbxY5morTauNdlychujGmJ9L37ezVezkNoI1WtO2Xdb4WlWWJlYfIKnOEzd5phRw==", - "license": "MPL-2.0", - "workspaces": [ - ".", - "packages/*" - ], - "dependencies": { - "@types/dom-mediacapture-transform": "^0.1.11", - "@types/dom-webcodecs": "0.1.13" - }, - "funding": { - "type": "individual", - "url": "https://github.com/sponsors/Vanilagy" + "frontends/web/node_modules/@sveltejs/vite-plugin-svelte/node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@remotion/timeline-utils/node_modules/mediabunny/node_modules/@types/dom-mediacapture-transform": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/@types/dom-mediacapture-transform/-/dom-mediacapture-transform-0.1.12.tgz", - "integrity": "sha512-d7/QsLRwF864A5mgIM/YrfiglHoYn7zgCcAoJgW404r+2DwnNr7EBbLnCWpmOMgH8y0te73L1AV6H1bmauaWFw==", + "frontends/web/node_modules/@sveltejs/vite-plugin-svelte/node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, "license": "MIT", "dependencies": { - "@types/dom-webcodecs": "*" + "@jridgewell/sourcemap-codec": "^1.5.5" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@remotion/timeline-utils/node_modules/mediabunny/node_modules/@types/dom-webcodecs": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/@types/dom-webcodecs/-/dom-webcodecs-0.1.13.tgz", - "integrity": "sha512-O5hkiFIcjjszPIYyUSyvScyvrBoV3NOEEZx/pMlsu44TKzWNkLVBBxnxJz42in5n3QIolYOcBYFCPZZ0h8SkwQ==", + "frontends/web/node_modules/@sveltejs/vite-plugin-svelte/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", + "dev": true, "license": "MIT" }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/core": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@rspack/core/-/core-1.7.11.tgz", - "integrity": "sha512-rsD9b+Khmot5DwCMiB3cqTQo53ioPG3M/A7BySu8+0+RS7GCxKm+Z+mtsjtG/vsu4Tn2tcqCdZtA3pgLoJB+ew==", + "frontends/web/node_modules/@sveltejs/vite-plugin-svelte/node_modules/vitefu": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.3.tgz", + "integrity": "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==", + "dev": true, "license": "MIT", - "dependencies": { - "@module-federation/runtime-tools": "0.22.0", - "@rspack/binding": "1.7.11", - "@rspack/lite-tapable": "1.1.0" - }, - "engines": { - "node": ">=18.12.0" - }, + "workspaces": [ + "tests/deps/*", + "tests/projects/*", + "tests/projects/workspace/packages/*" + ], "peerDependencies": { - "@swc/helpers": ">=0.5.1" + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { - "@swc/helpers": { + "vite": { "optional": true } } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/core/node_modules/@module-federation/runtime-tools": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.22.0.tgz", - "integrity": "sha512-4ScUJ/aUfEernb+4PbLdhM/c60VHl698Gn1gY21m9vyC1Ucn69fPCA1y2EwcCB7IItseRMoNhdcWQnzt/OPCNA==", + "frontends/web/node_modules/@tsconfig/svelte": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@tsconfig/svelte/-/svelte-5.0.8.tgz", + "integrity": "sha512-UkNnw1/oFEfecR8ypyHIQuWYdkPvHiwcQ78sh+ymIiYoF+uc5H1UBetbjyqT+vgGJ3qQN6nhucJviX6HesWtKQ==", + "dev": true, + "license": "MIT" + }, + "frontends/web/node_modules/svelte": { + "version": "5.57.1", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.57.1.tgz", + "integrity": "sha512-Uqj49lWKB+iSSnneuwiYYJ7MZgkB+eXr0LXBhv4uDuAkXqnWmq65Sxflfvp0Lc6MdKjMUxGaeOKWJqz5SNiVIA==", "license": "MIT", "dependencies": { - "@module-federation/runtime": "0.22.0", - "@module-federation/webpack-bundler-runtime": "0.22.0" + "@jridgewell/remapping": "^2.3.5", + "@jridgewell/sourcemap-codec": "^1.6.0", + "@sveltejs/acorn-typescript": "^1.0.13", + "@types/estree": "^1.0.9", + "acorn": "^8.18.0", + "aria-query": "5.3.1", + "axobject-query": "^4.1.0", + "clsx": "^2.1.1", + "devalue": "^5.9.2", + "esm-env": "^1.2.1", + "esrap": "^2.3.6", + "is-reference": "^3.0.3", + "locate-character": "^3.0.0", + "magic-string": "^0.30.11", + "zimmerframe": "^1.1.2" + }, + "engines": { + "node": ">=18" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/core/node_modules/@module-federation/runtime-tools/node_modules/@module-federation/runtime": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.22.0.tgz", - "integrity": "sha512-38g5iPju2tPC3KHMPxRKmy4k4onNp6ypFPS1eKGsNLUkXgHsPMBFqAjDw96iEcjri91BrahG4XcdyKi97xZzlA==", + "frontends/web/node_modules/svelte-check": { + "version": "4.7.6", + "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-4.7.6.tgz", + "integrity": "sha512-t2scM//ZuVbSY/T2w6FSBw1v9s2NEmh/g+sy1lqtosW5ylBV5AF4wFb1Ts9Kf3MbfPDUDJDZ9L436YT0SPTdvw==", + "dev": true, "license": "MIT", "dependencies": { - "@module-federation/error-codes": "0.22.0", - "@module-federation/runtime-core": "0.22.0", - "@module-federation/sdk": "0.22.0" + "@jridgewell/trace-mapping": "^0.3.25", + "@sveltejs/load-config": "^0.2.3", + "chokidar": "^4.0.1", + "fdir": "^6.2.0", + "picocolors": "^1.0.0", + "sade": "^1.7.4" + }, + "bin": { + "svelte-check": "bin/svelte-check" + }, + "engines": { + "node": ">= 18.0.0" + }, + "peerDependencies": { + "svelte": "^4.0.0 || ^5.0.0-next.0", + "typescript": "^5.0.0 || ^6.0.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/core/node_modules/@module-federation/runtime-tools/node_modules/@module-federation/runtime/node_modules/@module-federation/error-codes": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.22.0.tgz", - "integrity": "sha512-xF9SjnEy7vTdx+xekjPCV5cIHOGCkdn3pIxo9vU7gEZMIw0SvAEdsy6Uh17xaCpm8V0FWvR0SZoK9Ik6jGOaug==", - "license": "MIT" - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/core/node_modules/@module-federation/runtime-tools/node_modules/@module-federation/runtime/node_modules/@module-federation/runtime-core": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-0.22.0.tgz", - "integrity": "sha512-GR1TcD6/s7zqItfhC87zAp30PqzvceoeDGYTgF3Vx2TXvsfDrhP6Qw9T4vudDQL3uJRne6t7CzdT29YyVxlgIA==", + "frontends/web/node_modules/svelte-check/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, "license": "MIT", "dependencies": { - "@module-federation/error-codes": "0.22.0", - "@module-federation/sdk": "0.22.0" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/core/node_modules/@module-federation/runtime-tools/node_modules/@module-federation/runtime/node_modules/@module-federation/sdk": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.22.0.tgz", - "integrity": "sha512-x4aFNBKn2KVQRuNVC5A7SnrSCSqyfIWmm1DvubjbO9iKFe7ith5niw8dqSFBekYBg2Fwy+eMg4sEFNVvCAdo6g==", - "license": "MIT" - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/core/node_modules/@module-federation/runtime-tools/node_modules/@module-federation/webpack-bundler-runtime": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.22.0.tgz", - "integrity": "sha512-aM8gCqXu+/4wBmJtVeMeeMN5guw3chf+2i6HajKtQv7SJfxV/f4IyNQJUeUQu9HfiAZHjqtMV5Lvq/Lvh8LdyA==", + "frontends/web/node_modules/svelte-check/node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, "license": "MIT", - "dependencies": { - "@module-federation/runtime": "0.22.0", - "@module-federation/sdk": "0.22.0" + "engines": { + "node": ">=6.0.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/core/node_modules/@module-federation/runtime-tools/node_modules/@module-federation/webpack-bundler-runtime/node_modules/@module-federation/sdk": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.22.0.tgz", - "integrity": "sha512-x4aFNBKn2KVQRuNVC5A7SnrSCSqyfIWmm1DvubjbO9iKFe7ith5niw8dqSFBekYBg2Fwy+eMg4sEFNVvCAdo6g==", + "frontends/web/node_modules/svelte-check/node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", + "dev": true, "license": "MIT" }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/core/node_modules/@rspack/binding": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-1.7.11.tgz", - "integrity": "sha512-2MGdy2s2HimsDT444Bp5XnALzNRxuBNc7y0JzyuqKbHBywd4x2NeXyhWXXoxufaCFu5PBc9Qq9jyfjW2Aeh06Q==", + "frontends/web/node_modules/svelte-check/node_modules/@sveltejs/load-config": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@sveltejs/load-config/-/load-config-0.2.3.tgz", + "integrity": "sha512-VT3qmUb8pRV2QrZjd8iAmtg8lf4W0TIjZbvXtz5MKei/q96teWZgGJyyidJzOjzZzvdq616eSRVeMYIQChUTAQ==", + "dev": true, "license": "MIT", - "optionalDependencies": { - "@rspack/binding-darwin-arm64": "1.7.11", - "@rspack/binding-darwin-x64": "1.7.11", - "@rspack/binding-linux-arm64-gnu": "1.7.11", - "@rspack/binding-linux-arm64-musl": "1.7.11", - "@rspack/binding-linux-x64-gnu": "1.7.11", - "@rspack/binding-linux-x64-musl": "1.7.11", - "@rspack/binding-wasm32-wasi": "1.7.11", - "@rspack/binding-win32-arm64-msvc": "1.7.11", - "@rspack/binding-win32-ia32-msvc": "1.7.11", - "@rspack/binding-win32-x64-msvc": "1.7.11" + "engines": { + "node": ">= 18.0.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/core/node_modules/@rspack/binding/node_modules/@rspack/binding-darwin-arm64": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.7.11.tgz", - "integrity": "sha512-oduECiZVqbO5zlVw+q7Vy65sJFth99fWPTyucwvLJJtJkPL5n17Uiql2cYP6Ijn0pkqtf1SXgK8WjiKLG5bIig==", - "cpu": [ - "arm64" - ], + "frontends/web/node_modules/svelte-check/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/core/node_modules/@rspack/binding/node_modules/@rspack/binding-darwin-x64": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.7.11.tgz", - "integrity": "sha512-a1+TtTE9ap6RalgFi7FGIgkJP6O4Vy6ctv+9WGJy53E4kuqHR0RygzaiVxCI/GMc/vBT9vY23hyrpWb3d1vtXA==", - "cpu": [ - "x64" - ], + "frontends/web/node_modules/svelte-check/node_modules/chokidar/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/core/node_modules/@rspack/binding/node_modules/@rspack/binding-linux-arm64-gnu": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.7.11.tgz", - "integrity": "sha512-P0QrGRPbTWu6RKWfN0bDtbnEps3rXH0MWIMreZABoUrVmNQKtXR6e73J3ub6a+di5s2+K0M2LJ9Bh2/H4UsDUA==", - "cpu": [ - "arm64" - ], + "frontends/web/node_modules/svelte-check/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", - "optional": true, - "os": [ - "linux" - ] + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/core/node_modules/@rspack/binding/node_modules/@rspack/binding-linux-arm64-musl": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.7.11.tgz", - "integrity": "sha512-6ky7R43VMjWwmx3Yx7Jl7faLBBMAgMDt+/bN35RgwjiPgsIByz65EwytUVuW9rikB43BGHvA/eqlnjLrUzNBqw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "frontends/web/node_modules/svelte-check/node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/core/node_modules/@rspack/binding/node_modules/@rspack/binding-linux-x64-gnu": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.7.11.tgz", - "integrity": "sha512-cuOJMfCOvb2Wgsry5enXJ3iT1FGUjdPqtGUBVupQlEG4ntSYsQ2PtF4wIDVasR3wdxC5nQbipOrDiN/u6fYsdQ==", - "cpu": [ - "x64" - ], + "frontends/web/node_modules/svelte-check/node_modules/sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" + } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/core/node_modules/@rspack/binding/node_modules/@rspack/binding-linux-x64-musl": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.7.11.tgz", - "integrity": "sha512-CoK37hva4AmHGh3VCsQXmGr40L36m1/AdnN5LEjUX6kx5rEH7/1nEBN6Ii72pejqDVvk9anEROmPDiPw10tpFg==", - "cpu": [ - "x64" - ], + "frontends/web/node_modules/svelte-check/node_modules/sade/node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "engines": { + "node": ">=4" + } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/core/node_modules/@rspack/binding/node_modules/@rspack/binding-wasm32-wasi": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@rspack/binding-wasm32-wasi/-/binding-wasm32-wasi-1.7.11.tgz", - "integrity": "sha512-OtrmnPUVJMxjNa3eDMfHyPdtlLRmmp/aIm0fQHlAOATbZvlGm12q7rhPW5BXTu1yh+1rQ1/uqvz+SzKEZXuJaQ==", - "cpu": [ - "wasm32" - ], + "frontends/web/node_modules/svelte/node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", "license": "MIT", - "optional": true, "dependencies": { - "@napi-rs/wasm-runtime": "1.0.7" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/core/node_modules/@rspack/binding/node_modules/@rspack/binding-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.0.7.tgz", - "integrity": "sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==", + "frontends/web/node_modules/svelte/node_modules/@jridgewell/remapping/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "license": "MIT", - "optional": true, "dependencies": { - "@emnapi/core": "^1.5.0", - "@emnapi/runtime": "^1.5.0", - "@tybys/wasm-util": "^0.10.1" + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/core/node_modules/@rspack/binding/node_modules/@rspack/binding-wasm32-wasi/node_modules/@napi-rs/wasm-runtime/node_modules/@emnapi/core": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.3.tgz", - "integrity": "sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg==", + "frontends/web/node_modules/svelte/node_modules/@jridgewell/remapping/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "license": "MIT", - "optional": true, "dependencies": { - "@emnapi/wasi-threads": "1.2.3", - "tslib": "^2.4.0" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/core/node_modules/@rspack/binding/node_modules/@rspack/binding-wasm32-wasi/node_modules/@napi-rs/wasm-runtime/node_modules/@emnapi/core/node_modules/@emnapi/wasi-threads": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.3.tgz", - "integrity": "sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g==", + "frontends/web/node_modules/svelte/node_modules/@jridgewell/remapping/node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" + "engines": { + "node": ">=6.0.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/core/node_modules/@rspack/binding/node_modules/@rspack/binding-wasm32-wasi/node_modules/@napi-rs/wasm-runtime/node_modules/@emnapi/core/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD", - "optional": true + "frontends/web/node_modules/svelte/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", + "license": "MIT" }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/core/node_modules/@rspack/binding/node_modules/@rspack/binding-wasm32-wasi/node_modules/@napi-rs/wasm-runtime/node_modules/@emnapi/runtime": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.3.tgz", - "integrity": "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==", + "frontends/web/node_modules/svelte/node_modules/@sveltejs/acorn-typescript": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.13.tgz", + "integrity": "sha512-wgKggnhZVL9Bfx1OaKKTrYY9BFRk6C8UAkQNUcIv1+llzYrIqy+RZm5HPKzn0NpEBvTVhTqB4kQyllZywsRBRQ==", "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" + "peerDependencies": { + "acorn": "^8.9.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/core/node_modules/@rspack/binding/node_modules/@rspack/binding-wasm32-wasi/node_modules/@napi-rs/wasm-runtime/node_modules/@emnapi/runtime/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD", - "optional": true + "frontends/web/node_modules/svelte/node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "license": "MIT" }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/core/node_modules/@rspack/binding/node_modules/@rspack/binding-wasm32-wasi/node_modules/@napi-rs/wasm-runtime/node_modules/@tybys/wasm-util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.4.tgz", - "integrity": "sha512-W3c4gRigFS0T/Ma4qIYF3GDAc5AQdHb1yL5znJT1Zv1YaD9Kitx656wBjvr19qbiosmZT8lWDM5BEMynUqX65A==", + "frontends/web/node_modules/svelte/node_modules/acorn": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/core/node_modules/@rspack/binding/node_modules/@rspack/binding-wasm32-wasi/node_modules/@napi-rs/wasm-runtime/node_modules/@tybys/wasm-util/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD", - "optional": true + "frontends/web/node_modules/svelte/node_modules/aria-query": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.1.tgz", + "integrity": "sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/core/node_modules/@rspack/binding/node_modules/@rspack/binding-win32-arm64-msvc": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.7.11.tgz", - "integrity": "sha512-lObFW6e5lCWNgTBNwT//yiEDbsxm9QG4BYUojqeXxothuzJ/L6ibXz6+gLMvbOvLGV3nKgkXmx8GvT9WDKR0mA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "frontends/web/node_modules/svelte/node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/core/node_modules/@rspack/binding/node_modules/@rspack/binding-win32-ia32-msvc": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.7.11.tgz", - "integrity": "sha512-0pYGnZd8PPqNR68zQ8skamqNAXEA1sUfXuAdYcknIIRq2wsbiwFzIc0Pov1cIfHYab37G7sSIPBiOUdOWF5Ivw==", - "cpu": [ - "ia32" - ], + "frontends/web/node_modules/svelte/node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "engines": { + "node": ">=6" + } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/core/node_modules/@rspack/binding/node_modules/@rspack/binding-win32-x64-msvc": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.7.11.tgz", - "integrity": "sha512-EeQXayoQk/uBkI3pdoXfQBXNIUrADq56L3s/DFyM2pJeUDrWmhfIw2UFIGkYPTMSCo8F2JcdcGM32FGJrSnU0Q==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "frontends/web/node_modules/svelte/node_modules/devalue": { + "version": "5.9.4", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.9.4.tgz", + "integrity": "sha512-sPAT4pztbu6586/hrhOnMKS17IJrvg12mXiSPSS3W5qDeN2RGgvZ0diZCm31dBbnevfVmujNO3IM2wrS4Y2Rhg==", + "license": "MIT" }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/core/node_modules/@rspack/lite-tapable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rspack/lite-tapable/-/lite-tapable-1.1.0.tgz", - "integrity": "sha512-E2B0JhYFmVAwdDiG14+DW0Di4Ze4Jg10Pc4/lILUrd5DRCaklduz2OvJ5HYQ6G+hd+WTzqQb3QnDNfK4yvAFYw==", + "frontends/web/node_modules/svelte/node_modules/esm-env": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz", + "integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==", "license": "MIT" }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/plugin-react-refresh": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@rspack/plugin-react-refresh/-/plugin-react-refresh-1.6.1.tgz", - "integrity": "sha512-eqqW5645VG3CzGzFgNg5HqNdHVXY+567PGjtDhhrM8t67caxmsSzRmT5qfoEIfBcGgFkH9vEg7kzXwmCYQdQDw==", + "frontends/web/node_modules/svelte/node_modules/esrap": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/esrap/-/esrap-2.3.8.tgz", + "integrity": "sha512-0yrRvyjiH1EWLIEPb0i26mEnOYsXgIjG77muq3LMJH/dpmp+ctFEEHF8jjGBQAdhwgrKfN74CohbJTMFIaJcMw==", "license": "MIT", "dependencies": { - "error-stack-parser": "^2.1.4", - "html-entities": "^2.6.0" + "@jridgewell/sourcemap-codec": "^1.4.15" }, "peerDependencies": { - "react-refresh": ">=0.10.0 <1.0.0", - "webpack-hot-middleware": "2.x" + "@typescript-eslint/types": "^8.2.0" }, "peerDependenciesMeta": { - "webpack-hot-middleware": { + "@typescript-eslint/types": { "optional": true } } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/plugin-react-refresh/node_modules/error-stack-parser": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", - "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "frontends/web/node_modules/svelte/node_modules/is-reference": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz", + "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==", "license": "MIT", "dependencies": { - "stackframe": "^1.3.4" + "@types/estree": "^1.0.6" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/plugin-react-refresh/node_modules/error-stack-parser/node_modules/stackframe": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", - "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", - "license": "MIT" - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/plugin-react-refresh/node_modules/html-entities": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", - "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ], + "frontends/web/node_modules/svelte/node_modules/locate-character": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", + "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", "license": "MIT" }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/css-loader": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.4.tgz", - "integrity": "sha512-vv3J9tlOl04WjiMvHQI/9tmIrCxVrj6PFbHemBB1iihpeRbi/I4h033eoFIhwxBBqLhI0KYFS7yvynBFhIZfTw==", + "frontends/web/node_modules/svelte/node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", "license": "MIT", "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.40", - "postcss-modules-extract-imports": "^3.1.0", - "postcss-modules-local-by-default": "^4.0.5", - "postcss-modules-scope": "^3.2.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.6.3" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "@rspack/core": "0.x || ^1.0.0 || ^2.0.0-0", - "webpack": "^5.27.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } + "@jridgewell/sourcemap-codec": "^1.5.5" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/css-loader/node_modules/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "license": "ISC", - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } + "frontends/web/node_modules/svelte/node_modules/zimmerframe": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.5.tgz", + "integrity": "sha512-msJxIvYDYcoNL+PJsu+7qmpDWsYmAxTY+2TNYXXF0hzBzBk0BMecOqDOG/EckUoKCuKwObfbugIl8QpqHDXeFA==", + "license": "MIT" }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/css-loader/node_modules/postcss": { - "version": "8.5.28", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.28.tgz", - "integrity": "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.18", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" + "frontends/web/node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/css-loader/node_modules/postcss-modules-extract-imports": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", - "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", - "license": "ISC", - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "node": ">=14.17" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/css-loader/node_modules/postcss-modules-local-by-default": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", - "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", + "frontends/web/node_modules/vite": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.3.tgz", + "integrity": "sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A==", + "dev": true, "license": "MIT", "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^7.0.0", - "postcss-value-parser": "^4.1.0" + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" }, "engines": { - "node": "^10 || ^12 || >= 14" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" }, "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/css-loader/node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.6.tgz", - "integrity": "sha512-7qASPzhKF2l2KLboRZux8CCTRMdGiV08vWmyKzPz22qZ7ZjQBOeY7rNzNoCLSUiftJ7HUq0GERHmxw/t0dCdMw==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" }, - "engines": { - "node": ">=4" + "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 + } } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/css-loader/node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser/node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "frontends/web/node_modules/vite/node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, "license": "MIT", "bin": { - "cssesc": "bin/cssesc" + "esbuild": "bin/esbuild" }, "engines": { - "node": ">=4" + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/css-loader/node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser/node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/css-loader/node_modules/postcss-modules-scope": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", - "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", - "license": "ISC", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, + "frontends/web/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "node": ">=18" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/css-loader/node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.6.tgz", - "integrity": "sha512-7qASPzhKF2l2KLboRZux8CCTRMdGiV08vWmyKzPz22qZ7ZjQBOeY7rNzNoCLSUiftJ7HUq0GERHmxw/t0dCdMw==", + "frontends/web/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=4" + "node": ">=18" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/css-loader/node_modules/postcss-modules-scope/node_modules/postcss-selector-parser/node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "frontends/web/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=4" + "node": ">=18" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/css-loader/node_modules/postcss-modules-scope/node_modules/postcss-selector-parser/node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/css-loader/node_modules/postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "license": "ISC", - "dependencies": { - "icss-utils": "^5.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/css-loader/node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "license": "MIT" - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/css-loader/node_modules/postcss/node_modules/nanoid": { - "version": "3.3.19", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.19.tgz", - "integrity": "sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/css-loader/node_modules/postcss/node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/css-loader/node_modules/postcss/node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/css-loader/node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/esbuild": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", - "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.28.1", - "@esbuild/android-arm": "0.28.1", - "@esbuild/android-arm64": "0.28.1", - "@esbuild/android-x64": "0.28.1", - "@esbuild/darwin-arm64": "0.28.1", - "@esbuild/darwin-x64": "0.28.1", - "@esbuild/freebsd-arm64": "0.28.1", - "@esbuild/freebsd-x64": "0.28.1", - "@esbuild/linux-arm": "0.28.1", - "@esbuild/linux-arm64": "0.28.1", - "@esbuild/linux-ia32": "0.28.1", - "@esbuild/linux-loong64": "0.28.1", - "@esbuild/linux-mips64el": "0.28.1", - "@esbuild/linux-ppc64": "0.28.1", - "@esbuild/linux-riscv64": "0.28.1", - "@esbuild/linux-s390x": "0.28.1", - "@esbuild/linux-x64": "0.28.1", - "@esbuild/netbsd-arm64": "0.28.1", - "@esbuild/netbsd-x64": "0.28.1", - "@esbuild/openbsd-arm64": "0.28.1", - "@esbuild/openbsd-x64": "0.28.1", - "@esbuild/openharmony-arm64": "0.28.1", - "@esbuild/sunos-x64": "0.28.1", - "@esbuild/win32-arm64": "0.28.1", - "@esbuild/win32-ia32": "0.28.1", - "@esbuild/win32-x64": "0.28.1" - } - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/esbuild/node_modules/@esbuild/aix-ppc64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", - "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/esbuild/node_modules/@esbuild/android-arm": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz", - "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/esbuild/node_modules/@esbuild/android-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", - "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/esbuild/node_modules/@esbuild/android-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz", - "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==", + "frontends/web/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2763,13 +2529,14 @@ "node": ">=18" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/esbuild/node_modules/@esbuild/darwin-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz", - "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==", + "frontends/web/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2779,13 +2546,14 @@ "node": ">=18" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/esbuild/node_modules/@esbuild/darwin-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", - "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==", + "frontends/web/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2795,13 +2563,14 @@ "node": ">=18" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/esbuild/node_modules/@esbuild/freebsd-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz", - "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==", + "frontends/web/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2811,13 +2580,14 @@ "node": ">=18" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/esbuild/node_modules/@esbuild/freebsd-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz", - "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==", + "frontends/web/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2827,13 +2597,14 @@ "node": ">=18" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/esbuild/node_modules/@esbuild/linux-arm": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz", - "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==", + "frontends/web/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", "cpu": [ "arm" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2843,13 +2614,14 @@ "node": ">=18" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/esbuild/node_modules/@esbuild/linux-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz", - "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==", + "frontends/web/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2859,13 +2631,14 @@ "node": ">=18" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/esbuild/node_modules/@esbuild/linux-ia32": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz", - "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==", + "frontends/web/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", "cpu": [ "ia32" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2875,13 +2648,14 @@ "node": ">=18" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/esbuild/node_modules/@esbuild/linux-loong64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz", - "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==", + "frontends/web/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", "cpu": [ "loong64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2891,13 +2665,14 @@ "node": ">=18" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/esbuild/node_modules/@esbuild/linux-mips64el": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", - "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==", + "frontends/web/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", "cpu": [ "mips64el" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2907,13 +2682,14 @@ "node": ">=18" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/esbuild/node_modules/@esbuild/linux-ppc64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz", - "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==", + "frontends/web/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", "cpu": [ "ppc64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2923,13 +2699,14 @@ "node": ">=18" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/esbuild/node_modules/@esbuild/linux-riscv64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", - "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==", + "frontends/web/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", "cpu": [ "riscv64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2939,13 +2716,14 @@ "node": ">=18" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/esbuild/node_modules/@esbuild/linux-s390x": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz", - "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==", + "frontends/web/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", "cpu": [ "s390x" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2955,13 +2733,14 @@ "node": ">=18" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/esbuild/node_modules/@esbuild/linux-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz", - "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==", + "frontends/web/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2971,13 +2750,14 @@ "node": ">=18" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/esbuild/node_modules/@esbuild/netbsd-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz", - "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==", + "frontends/web/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2987,13 +2767,14 @@ "node": ">=18" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/esbuild/node_modules/@esbuild/netbsd-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", - "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==", + "frontends/web/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3003,13 +2784,14 @@ "node": ">=18" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/esbuild/node_modules/@esbuild/openbsd-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz", - "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==", + "frontends/web/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3019,13 +2801,14 @@ "node": ">=18" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/esbuild/node_modules/@esbuild/openbsd-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz", - "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==", + "frontends/web/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3035,13 +2818,14 @@ "node": ">=18" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/esbuild/node_modules/@esbuild/openharmony-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", - "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==", + "frontends/web/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3051,13 +2835,14 @@ "node": ">=18" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/esbuild/node_modules/@esbuild/sunos-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz", - "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==", + "frontends/web/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3067,13 +2852,14 @@ "node": ">=18" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/esbuild/node_modules/@esbuild/win32-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz", - "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==", + "frontends/web/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3083,13 +2869,14 @@ "node": ">=18" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/esbuild/node_modules/@esbuild/win32-ia32": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz", - "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==", + "frontends/web/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", "cpu": [ "ia32" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3099,13 +2886,14 @@ "node": ">=18" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/esbuild/node_modules/@esbuild/win32-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz", - "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==", + "frontends/web/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3115,360 +2903,4494 @@ "node": ">=18" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/react-refresh": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.18.0.tgz", - "integrity": "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==", + "frontends/web/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==", + "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/style-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-4.0.0.tgz", - "integrity": "sha512-1V4WqhhZZgjVAVJyt7TdDPZoPBPNHbekX4fWnCJL1yQukhCeZhJySUL+gL9y6sNdN95uEOS83Y55SqHcP7MzLA==", + "frontends/web/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": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.27.0" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack": { - "version": "5.105.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.0.tgz", - "integrity": "sha512-gX/dMkRQc7QOMzgTe6KsYFM7DxeIONQSui1s0n/0xht36HvrgbxtM1xBlgx596NbpHuQU8P7QpKwrZYwUX48nw==", + "frontends/web/node_modules/vite/node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "dev": true, "license": "MIT", - "dependencies": { - "@types/eslint-scope": "^3.7.7", - "@types/estree": "^1.0.8", - "@types/json-schema": "^7.0.15", - "@webassemblyjs/ast": "^1.14.1", - "@webassemblyjs/wasm-edit": "^1.14.1", - "@webassemblyjs/wasm-parser": "^1.14.1", - "acorn": "^8.15.0", - "acorn-import-phases": "^1.0.3", - "browserslist": "^4.28.1", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.19.0", - "es-module-lexer": "^2.0.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.11", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.3.1", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^4.3.3", - "tapable": "^2.3.0", - "terser-webpack-plugin": "^5.3.16", - "watchpack": "^2.5.1", - "webpack-sources": "^3.3.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, "engines": { - "node": ">=10.13.0" + "node": ">=12" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } + "url": "https://github.com/sponsors/jonschlinkert" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "frontends/web/node_modules/vite/node_modules/postcss": { + "version": "8.5.28", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.28.tgz", + "integrity": "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" + "nanoid": "^3.3.18", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/@types/eslint-scope/node_modules/@types/eslint": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", - "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "frontends/web/node_modules/vite/node_modules/postcss/node_modules/nanoid": { + "version": "3.3.19", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.19.tgz", + "integrity": "sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/@types/estree": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", - "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", - "license": "MIT" + "frontends/web/node_modules/vite/node_modules/postcss/node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "license": "MIT" + "frontends/web/node_modules/vite/node_modules/postcss/node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/@webassemblyjs/ast": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", - "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "frontends/web/node_modules/vite/node_modules/rollup": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.63.4.tgz", + "integrity": "sha512-4U0liVayNIoLp3GFl1FcI8561WepLnZ1rqfraGh7S9B3Ur5F9S283y8Futii7RUU2C/97tOBmBy7nYvhoiOpbQ==", + "dev": true, "license": "MIT", "dependencies": { - "@webassemblyjs/helper-numbers": "1.13.2", + "@types/estree": "1.0.9" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@napi-rs/lzma-linux-x64-gnu": "1.5.1", + "@rollup/rollup-android-arm-eabi": "4.63.4", + "@rollup/rollup-android-arm64": "4.63.4", + "@rollup/rollup-darwin-arm64": "4.63.4", + "@rollup/rollup-darwin-x64": "4.63.4", + "@rollup/rollup-freebsd-arm64": "4.63.4", + "@rollup/rollup-freebsd-x64": "4.63.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.63.4", + "@rollup/rollup-linux-arm-musleabihf": "4.63.4", + "@rollup/rollup-linux-arm64-gnu": "4.63.4", + "@rollup/rollup-linux-arm64-musl": "4.63.4", + "@rollup/rollup-linux-loong64-gnu": "4.63.4", + "@rollup/rollup-linux-loong64-musl": "4.63.4", + "@rollup/rollup-linux-ppc64-gnu": "4.63.4", + "@rollup/rollup-linux-ppc64-musl": "4.63.4", + "@rollup/rollup-linux-riscv64-gnu": "4.63.4", + "@rollup/rollup-linux-riscv64-musl": "4.63.4", + "@rollup/rollup-linux-s390x-gnu": "4.63.4", + "@rollup/rollup-linux-x64-gnu": "4.63.4", + "@rollup/rollup-linux-x64-musl": "4.63.4", + "@rollup/rollup-openbsd-x64": "4.63.4", + "@rollup/rollup-openharmony-arm64": "4.63.4", + "@rollup/rollup-win32-arm64-msvc": "4.63.4", + "@rollup/rollup-win32-ia32-msvc": "4.63.4", + "@rollup/rollup-win32-x64-gnu": "4.63.4", + "@rollup/rollup-win32-x64-msvc": "4.63.4", + "fsevents": "~2.3.2" + } + }, + "frontends/web/node_modules/vite/node_modules/rollup/node_modules/@napi-rs/lzma-linux-x64-gnu": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz", + "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^22.20 || ^24.12 || >=25" + } + }, + "frontends/web/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.63.4.tgz", + "integrity": "sha512-I+BSHzTAhKN2n7ZwGZsegGcZjDpLqFOMAtJz/u6uFGe0pUFbq56dEHjqJV/ZUdRJtNXNxA+hREUatZBvMR3Oiw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "frontends/web/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-android-arm64": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.63.4.tgz", + "integrity": "sha512-pu3BdjS2LtEzRu2elmGzS3fIeWSZy4BMDIaLNwjorO76+k2d0LMluijhsDx3KQyQBQ/lLUZCQA9/s6csvUfuhw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "frontends/web/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.63.4.tgz", + "integrity": "sha512-xfSrj9MHnWK9GaSqT9U0ImHtH/N8WZlHLx4cZHiuLcqs640hvZ3hLPd5UR2AZS57FaE8HrRUSpltbZdWRxHiDA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "frontends/web/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-darwin-x64": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.63.4.tgz", + "integrity": "sha512-bqU99PLJb/dqb3S0GIMdeuyAEETSUgZBoqXYd3Sd+WCsV+MmPhnN6JrotWyir31+QgH7EvvE5/mwGJlEoci8Fw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "frontends/web/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.63.4.tgz", + "integrity": "sha512-JinsFZ5G40oXQb+sUuiA5x689vhr6dDYK0H0NL+rwKdL6CqnmYN8PE4ZwfRSoIjrCxqTQG/SLfTtSvHeGxoVlw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "frontends/web/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.63.4.tgz", + "integrity": "sha512-GAdA4UxpiNm27cLHr2GqXBpAD0x9FqwYBY7/YSP0Ss0/PNi4k8gbviqpIpYbVSRBaS2ZcegXEzgTQMbRNCwxCw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "frontends/web/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.63.4.tgz", + "integrity": "sha512-qDd6NoA1znaLjp4jR5U/KWCdLAKDJNB8W9ChbbDaKbo0xA+Atln5HK6LFCZ4oJQpemtRZA288DCirFRjrspptw==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "frontends/web/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.63.4.tgz", + "integrity": "sha512-WtB5Tz5KTNINb8ZA+8sQ7bmjuS1JrRT7YverYIhUGdWWDlpzVWmIwuZE+jidkEXUn1l0zrEkaIMa8dHF3NGcsA==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "frontends/web/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.63.4.tgz", + "integrity": "sha512-VcQ3L1tjnkKzWjryAVaFhHEWcqOfICX9uxVVoDzm2t0DpgKRHd2zOpVrJc0xsWeBZcBFyYROCIBdyR/fS174pg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "frontends/web/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.63.4.tgz", + "integrity": "sha512-6+ZQX6P5s0cMDN2Ypb8Lbm2+/sZYmZjdaYny992ujUU9UKi/4CWoJWsl1pNvjWJHNHGK51m+jKGLlh1ylb2ifQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "frontends/web/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.63.4.tgz", + "integrity": "sha512-D72ZnvkFkBXOfzMMQLcwfPLyGkKb7HZ9/mf97B7v6/P5Lbv4oFOtSY/uHbS8lH6uKUOxoKiuokdb50XZSzzbJw==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "frontends/web/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.63.4.tgz", + "integrity": "sha512-piU6BxeqA3O9KSu3kRCIQQtNqFFaTu21SEV4FwaRZowpnj3bLaWPZHw+xFqCs0XlJ+aOH3PTRWGoglH+mKA/OA==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "frontends/web/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.63.4.tgz", + "integrity": "sha512-/5PGpHwqt2EEEOUs1XwzubE/ucr0dWDQ+to3zqi4Ds7EWpwtQ79wXc4JBoxqj/OwpawTsKWzJxHfSuBOq3DrWA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "frontends/web/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.63.4.tgz", + "integrity": "sha512-cX3beZDLWt7G2oJF+nhChiT+qtaihs+S2xi7ziGmVB+2pwPng6D0Ed0HmElQOgv2UsUmSJJLGwpBao/3TDx3VA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "frontends/web/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.63.4.tgz", + "integrity": "sha512-1uz2mGWHyptR7DgHHrlbdRAjXK7v7elGZ9lMja910/RP+ZYbX6xAmCiU9UZSX4hqmgtHMv6lr5l3kq1HIOpcag==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "frontends/web/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.63.4.tgz", + "integrity": "sha512-nLS8topojxyz7SRpKR2IODRpQ0XPZ+xaOXvT3+hqK/Uy8Lo5HFgkkIBiIrCu5tL5YqzTvgovGw55PwpahTAGig==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "frontends/web/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.63.4.tgz", + "integrity": "sha512-gs7DRKotr3l3q+jGPQBjH0ng1FjlEDm5ueQrkw5JtQvtLyEIcLASqAEaor56BhkKRzk+IcQzrcanBdb/bBQn8g==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "frontends/web/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.63.4.tgz", + "integrity": "sha512-791ET7W17NnScOZM7h4dX5hYspxE28htPFsb1awY/NRR8+PRNkS53e475rDdxXXDrP+kwnCcNWg9CX5ztn/Aqw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "frontends/web/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.63.4.tgz", + "integrity": "sha512-iwZQRcmj7g88g3tzefIrQY7qvmuA/cfYwhrDtTBhsmukO4U2huVO5W+86XacUMRvdSFVAc6kZUZy21JaRwiB9w==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "frontends/web/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.63.4.tgz", + "integrity": "sha512-dVHFp9gRWrdTpnqQuGfCwd7hOQDatK1VCP2iWhLY/cGrOQs/ucFzJ6A5SRqbXX12ZDI8EUuejSM5kwg+ja7Png==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "frontends/web/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.63.4.tgz", + "integrity": "sha512-t3NlauOW6gxZVVFcBEnO62Cb4wbyDFL416gTg1uFI/2tgqYQlf69FbSE115Ajre9I+c26Lk4mcmdFUsS/DGifQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "frontends/web/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.63.4.tgz", + "integrity": "sha512-xWuIaSye5FWZF8+UYtVEcHtRJDN5kN9Kfgxx3Kq8XIov9KSKbc1fiqQCm90SKrgQbUXZelbnUhnlUJmfSE7P9A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "frontends/web/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.63.4.tgz", + "integrity": "sha512-9ALJJUOg/ZflMJepVo2PlgsGxSaxN7SQ4Z8GoZfVlarWr6r3rkHUNsd/zAio7p4YMtChSMXPionxej4Hkf6CXQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "frontends/web/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.63.4.tgz", + "integrity": "sha512-blj9z5qx/Pv4WU0W1NMFDB97e0JH5ed+aZGywW8WCvp/NhWX/4PFAq5uu6Q0AebNn+Vo6KzUYDT++JzTT5ojlQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "frontends/web/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.63.4.tgz", + "integrity": "sha512-Erx822VRBwLa124shbj+wNXe//BOgMEctDV0m1aqTQdNO1S69DgNUCFKC1RCeZfixs1J31l6igk1ziyXErbigQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "frontends/web/node_modules/vite/node_modules/rollup/node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "frontends/web/node_modules/vite/node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "media/demo": { + "name": "conn-demo", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@conn/brand": "*", + "@remotion/cli": "4.0.525", + "@remotion/fonts": "4.0.525", + "@remotion/media": "4.0.525", + "@remotion/transitions": "4.0.525", + "react": "19.3.0", + "react-dom": "19.3.0", + "remotion": "4.0.525" + }, + "devDependencies": { + "@remotion/eslint-config-flat": "4.0.525", + "@types/react": "19.3.0", + "@types/web": "0.0.356", + "eslint": "9.19.0", + "prettier": "3.9.7", + "typescript": "5.9.3" + }, + "engines": { + "node": ">=22.6.0" + } + }, + "media/demo/node_modules/@remotion/cli": { + "version": "4.0.525", + "resolved": "https://registry.npmjs.org/@remotion/cli/-/cli-4.0.525.tgz", + "integrity": "sha512-pWZs6jSeNFMtjoCBMB4kIVWkMiiwDWQDUsMIM11mTv5/VAZ6NnzLNYMvOqIuLD4LWUAgyINna4tGdFXW/qMd+Q==", + "license": "SEE LICENSE IN LICENSE.md", + "dependencies": { + "@babel/parser": "7.24.1", + "@remotion/bundler": "4.0.525", + "@remotion/media-utils": "4.0.525", + "@remotion/player": "4.0.525", + "@remotion/renderer": "4.0.525", + "@remotion/studio": "4.0.525", + "@remotion/studio-server": "4.0.525", + "@remotion/studio-shared": "4.0.525", + "dotenv": "17.3.1", + "minimist": "1.2.6", + "prompts": "2.4.2", + "remotion": "4.0.525", + "semver": "7.5.3" + }, + "bin": { + "remotion": "remotion-cli.js", + "remotionb": "remotionb-cli.js", + "remotiond": "remotiond-cli.js" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@babel/parser": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.1.tgz", + "integrity": "sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==", + "license": "MIT", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler": { + "version": "4.0.525", + "resolved": "https://registry.npmjs.org/@remotion/bundler/-/bundler-4.0.525.tgz", + "integrity": "sha512-xrmtaEqQjXkaxr+ISIHY1OjPq/NB/mHlwRzFkbGtfWiGR6csUlb5E28BHm8C9TXypX+0cpyoS9kjdsyCXM3TxQ==", + "license": "SEE LICENSE IN LICENSE.md", + "dependencies": { + "@remotion/media-parser": "4.0.525", + "@remotion/studio": "4.0.525", + "@remotion/studio-shared": "4.0.525", + "@remotion/timeline-utils": "4.0.525", + "@rspack/core": "1.7.11", + "@rspack/plugin-react-refresh": "1.6.1", + "css-loader": "7.1.4", + "esbuild": "0.28.1", + "react-refresh": "0.18.0", + "remotion": "4.0.525", + "style-loader": "4.0.0", + "webpack": "5.105.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@remotion/media-parser": { + "version": "4.0.525", + "resolved": "https://registry.npmjs.org/@remotion/media-parser/-/media-parser-4.0.525.tgz", + "integrity": "sha512-HwfMhGBTJR+msrEVhus7ZtYISPCW6ShEHDRiHBUOoOtKESPQO4VHGe3apna2pFd0GY1WZV00VjgHz7K6pO+2Ag==", + "license": "Remotion License https://remotion.dev/license" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@remotion/timeline-utils": { + "version": "4.0.525", + "resolved": "https://registry.npmjs.org/@remotion/timeline-utils/-/timeline-utils-4.0.525.tgz", + "integrity": "sha512-KLYZrj0cHhpSkLeKcvH8dG3UM6xL6SbEAUmiYi/fNSdVcZh4HP/E2zJCuTSQqHoYByUy86aMRIxUCgfsUdChbQ==", + "license": "MIT", + "dependencies": { + "mediabunny": "1.56.1", + "remotion": "4.0.525" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@remotion/timeline-utils/node_modules/mediabunny": { + "version": "1.56.1", + "resolved": "https://registry.npmjs.org/mediabunny/-/mediabunny-1.56.1.tgz", + "integrity": "sha512-DNOm0bRBmeOxJgCK/g3LxNWbxY5morTauNdlychujGmJ9L37ezVezkNoI1WtO2Xdb4WlWWJlYfIKnOEzd5phRw==", + "license": "MPL-2.0", + "workspaces": [ + ".", + "packages/*" + ], + "dependencies": { + "@types/dom-mediacapture-transform": "^0.1.11", + "@types/dom-webcodecs": "0.1.13" + }, + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/Vanilagy" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@remotion/timeline-utils/node_modules/mediabunny/node_modules/@types/dom-mediacapture-transform": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/@types/dom-mediacapture-transform/-/dom-mediacapture-transform-0.1.12.tgz", + "integrity": "sha512-d7/QsLRwF864A5mgIM/YrfiglHoYn7zgCcAoJgW404r+2DwnNr7EBbLnCWpmOMgH8y0te73L1AV6H1bmauaWFw==", + "license": "MIT", + "dependencies": { + "@types/dom-webcodecs": "*" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@remotion/timeline-utils/node_modules/mediabunny/node_modules/@types/dom-webcodecs": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/@types/dom-webcodecs/-/dom-webcodecs-0.1.13.tgz", + "integrity": "sha512-O5hkiFIcjjszPIYyUSyvScyvrBoV3NOEEZx/pMlsu44TKzWNkLVBBxnxJz42in5n3QIolYOcBYFCPZZ0h8SkwQ==", + "license": "MIT" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/core": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@rspack/core/-/core-1.7.11.tgz", + "integrity": "sha512-rsD9b+Khmot5DwCMiB3cqTQo53ioPG3M/A7BySu8+0+RS7GCxKm+Z+mtsjtG/vsu4Tn2tcqCdZtA3pgLoJB+ew==", + "license": "MIT", + "dependencies": { + "@module-federation/runtime-tools": "0.22.0", + "@rspack/binding": "1.7.11", + "@rspack/lite-tapable": "1.1.0" + }, + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "@swc/helpers": ">=0.5.1" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/core/node_modules/@module-federation/runtime-tools": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.22.0.tgz", + "integrity": "sha512-4ScUJ/aUfEernb+4PbLdhM/c60VHl698Gn1gY21m9vyC1Ucn69fPCA1y2EwcCB7IItseRMoNhdcWQnzt/OPCNA==", + "license": "MIT", + "dependencies": { + "@module-federation/runtime": "0.22.0", + "@module-federation/webpack-bundler-runtime": "0.22.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/core/node_modules/@module-federation/runtime-tools/node_modules/@module-federation/runtime": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.22.0.tgz", + "integrity": "sha512-38g5iPju2tPC3KHMPxRKmy4k4onNp6ypFPS1eKGsNLUkXgHsPMBFqAjDw96iEcjri91BrahG4XcdyKi97xZzlA==", + "license": "MIT", + "dependencies": { + "@module-federation/error-codes": "0.22.0", + "@module-federation/runtime-core": "0.22.0", + "@module-federation/sdk": "0.22.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/core/node_modules/@module-federation/runtime-tools/node_modules/@module-federation/runtime/node_modules/@module-federation/error-codes": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.22.0.tgz", + "integrity": "sha512-xF9SjnEy7vTdx+xekjPCV5cIHOGCkdn3pIxo9vU7gEZMIw0SvAEdsy6Uh17xaCpm8V0FWvR0SZoK9Ik6jGOaug==", + "license": "MIT" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/core/node_modules/@module-federation/runtime-tools/node_modules/@module-federation/runtime/node_modules/@module-federation/runtime-core": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-0.22.0.tgz", + "integrity": "sha512-GR1TcD6/s7zqItfhC87zAp30PqzvceoeDGYTgF3Vx2TXvsfDrhP6Qw9T4vudDQL3uJRne6t7CzdT29YyVxlgIA==", + "license": "MIT", + "dependencies": { + "@module-federation/error-codes": "0.22.0", + "@module-federation/sdk": "0.22.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/core/node_modules/@module-federation/runtime-tools/node_modules/@module-federation/runtime/node_modules/@module-federation/sdk": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.22.0.tgz", + "integrity": "sha512-x4aFNBKn2KVQRuNVC5A7SnrSCSqyfIWmm1DvubjbO9iKFe7ith5niw8dqSFBekYBg2Fwy+eMg4sEFNVvCAdo6g==", + "license": "MIT" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/core/node_modules/@module-federation/runtime-tools/node_modules/@module-federation/webpack-bundler-runtime": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.22.0.tgz", + "integrity": "sha512-aM8gCqXu+/4wBmJtVeMeeMN5guw3chf+2i6HajKtQv7SJfxV/f4IyNQJUeUQu9HfiAZHjqtMV5Lvq/Lvh8LdyA==", + "license": "MIT", + "dependencies": { + "@module-federation/runtime": "0.22.0", + "@module-federation/sdk": "0.22.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/core/node_modules/@module-federation/runtime-tools/node_modules/@module-federation/webpack-bundler-runtime/node_modules/@module-federation/sdk": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.22.0.tgz", + "integrity": "sha512-x4aFNBKn2KVQRuNVC5A7SnrSCSqyfIWmm1DvubjbO9iKFe7ith5niw8dqSFBekYBg2Fwy+eMg4sEFNVvCAdo6g==", + "license": "MIT" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/core/node_modules/@rspack/binding": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-1.7.11.tgz", + "integrity": "sha512-2MGdy2s2HimsDT444Bp5XnALzNRxuBNc7y0JzyuqKbHBywd4x2NeXyhWXXoxufaCFu5PBc9Qq9jyfjW2Aeh06Q==", + "license": "MIT", + "optionalDependencies": { + "@rspack/binding-darwin-arm64": "1.7.11", + "@rspack/binding-darwin-x64": "1.7.11", + "@rspack/binding-linux-arm64-gnu": "1.7.11", + "@rspack/binding-linux-arm64-musl": "1.7.11", + "@rspack/binding-linux-x64-gnu": "1.7.11", + "@rspack/binding-linux-x64-musl": "1.7.11", + "@rspack/binding-wasm32-wasi": "1.7.11", + "@rspack/binding-win32-arm64-msvc": "1.7.11", + "@rspack/binding-win32-ia32-msvc": "1.7.11", + "@rspack/binding-win32-x64-msvc": "1.7.11" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/core/node_modules/@rspack/binding/node_modules/@rspack/binding-darwin-arm64": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.7.11.tgz", + "integrity": "sha512-oduECiZVqbO5zlVw+q7Vy65sJFth99fWPTyucwvLJJtJkPL5n17Uiql2cYP6Ijn0pkqtf1SXgK8WjiKLG5bIig==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/core/node_modules/@rspack/binding/node_modules/@rspack/binding-darwin-x64": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.7.11.tgz", + "integrity": "sha512-a1+TtTE9ap6RalgFi7FGIgkJP6O4Vy6ctv+9WGJy53E4kuqHR0RygzaiVxCI/GMc/vBT9vY23hyrpWb3d1vtXA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/core/node_modules/@rspack/binding/node_modules/@rspack/binding-linux-arm64-gnu": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.7.11.tgz", + "integrity": "sha512-P0QrGRPbTWu6RKWfN0bDtbnEps3rXH0MWIMreZABoUrVmNQKtXR6e73J3ub6a+di5s2+K0M2LJ9Bh2/H4UsDUA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/core/node_modules/@rspack/binding/node_modules/@rspack/binding-linux-arm64-musl": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.7.11.tgz", + "integrity": "sha512-6ky7R43VMjWwmx3Yx7Jl7faLBBMAgMDt+/bN35RgwjiPgsIByz65EwytUVuW9rikB43BGHvA/eqlnjLrUzNBqw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/core/node_modules/@rspack/binding/node_modules/@rspack/binding-linux-x64-gnu": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.7.11.tgz", + "integrity": "sha512-cuOJMfCOvb2Wgsry5enXJ3iT1FGUjdPqtGUBVupQlEG4ntSYsQ2PtF4wIDVasR3wdxC5nQbipOrDiN/u6fYsdQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/core/node_modules/@rspack/binding/node_modules/@rspack/binding-linux-x64-musl": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.7.11.tgz", + "integrity": "sha512-CoK37hva4AmHGh3VCsQXmGr40L36m1/AdnN5LEjUX6kx5rEH7/1nEBN6Ii72pejqDVvk9anEROmPDiPw10tpFg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/core/node_modules/@rspack/binding/node_modules/@rspack/binding-wasm32-wasi": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@rspack/binding-wasm32-wasi/-/binding-wasm32-wasi-1.7.11.tgz", + "integrity": "sha512-OtrmnPUVJMxjNa3eDMfHyPdtlLRmmp/aIm0fQHlAOATbZvlGm12q7rhPW5BXTu1yh+1rQ1/uqvz+SzKEZXuJaQ==", + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "1.0.7" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/core/node_modules/@rspack/binding/node_modules/@rspack/binding-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.0.7.tgz", + "integrity": "sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==", + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.5.0", + "@emnapi/runtime": "^1.5.0", + "@tybys/wasm-util": "^0.10.1" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/core/node_modules/@rspack/binding/node_modules/@rspack/binding-wasm32-wasi/node_modules/@napi-rs/wasm-runtime/node_modules/@emnapi/core": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.3.tgz", + "integrity": "sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg==", + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.3", + "tslib": "^2.4.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/core/node_modules/@rspack/binding/node_modules/@rspack/binding-wasm32-wasi/node_modules/@napi-rs/wasm-runtime/node_modules/@emnapi/core/node_modules/@emnapi/wasi-threads": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.3.tgz", + "integrity": "sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/core/node_modules/@rspack/binding/node_modules/@rspack/binding-wasm32-wasi/node_modules/@napi-rs/wasm-runtime/node_modules/@emnapi/core/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD", + "optional": true + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/core/node_modules/@rspack/binding/node_modules/@rspack/binding-wasm32-wasi/node_modules/@napi-rs/wasm-runtime/node_modules/@emnapi/runtime": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.3.tgz", + "integrity": "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/core/node_modules/@rspack/binding/node_modules/@rspack/binding-wasm32-wasi/node_modules/@napi-rs/wasm-runtime/node_modules/@emnapi/runtime/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD", + "optional": true + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/core/node_modules/@rspack/binding/node_modules/@rspack/binding-wasm32-wasi/node_modules/@napi-rs/wasm-runtime/node_modules/@tybys/wasm-util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.4.tgz", + "integrity": "sha512-W3c4gRigFS0T/Ma4qIYF3GDAc5AQdHb1yL5znJT1Zv1YaD9Kitx656wBjvr19qbiosmZT8lWDM5BEMynUqX65A==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/core/node_modules/@rspack/binding/node_modules/@rspack/binding-wasm32-wasi/node_modules/@napi-rs/wasm-runtime/node_modules/@tybys/wasm-util/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD", + "optional": true + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/core/node_modules/@rspack/binding/node_modules/@rspack/binding-win32-arm64-msvc": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.7.11.tgz", + "integrity": "sha512-lObFW6e5lCWNgTBNwT//yiEDbsxm9QG4BYUojqeXxothuzJ/L6ibXz6+gLMvbOvLGV3nKgkXmx8GvT9WDKR0mA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/core/node_modules/@rspack/binding/node_modules/@rspack/binding-win32-ia32-msvc": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.7.11.tgz", + "integrity": "sha512-0pYGnZd8PPqNR68zQ8skamqNAXEA1sUfXuAdYcknIIRq2wsbiwFzIc0Pov1cIfHYab37G7sSIPBiOUdOWF5Ivw==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/core/node_modules/@rspack/binding/node_modules/@rspack/binding-win32-x64-msvc": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.7.11.tgz", + "integrity": "sha512-EeQXayoQk/uBkI3pdoXfQBXNIUrADq56L3s/DFyM2pJeUDrWmhfIw2UFIGkYPTMSCo8F2JcdcGM32FGJrSnU0Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/core/node_modules/@rspack/lite-tapable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rspack/lite-tapable/-/lite-tapable-1.1.0.tgz", + "integrity": "sha512-E2B0JhYFmVAwdDiG14+DW0Di4Ze4Jg10Pc4/lILUrd5DRCaklduz2OvJ5HYQ6G+hd+WTzqQb3QnDNfK4yvAFYw==", + "license": "MIT" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/plugin-react-refresh": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@rspack/plugin-react-refresh/-/plugin-react-refresh-1.6.1.tgz", + "integrity": "sha512-eqqW5645VG3CzGzFgNg5HqNdHVXY+567PGjtDhhrM8t67caxmsSzRmT5qfoEIfBcGgFkH9vEg7kzXwmCYQdQDw==", + "license": "MIT", + "dependencies": { + "error-stack-parser": "^2.1.4", + "html-entities": "^2.6.0" + }, + "peerDependencies": { + "react-refresh": ">=0.10.0 <1.0.0", + "webpack-hot-middleware": "2.x" + }, + "peerDependenciesMeta": { + "webpack-hot-middleware": { + "optional": true + } + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/plugin-react-refresh/node_modules/error-stack-parser": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", + "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "license": "MIT", + "dependencies": { + "stackframe": "^1.3.4" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/plugin-react-refresh/node_modules/error-stack-parser/node_modules/stackframe": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", + "license": "MIT" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/@rspack/plugin-react-refresh/node_modules/html-entities": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", + "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/css-loader": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.4.tgz", + "integrity": "sha512-vv3J9tlOl04WjiMvHQI/9tmIrCxVrj6PFbHemBB1iihpeRbi/I4h033eoFIhwxBBqLhI0KYFS7yvynBFhIZfTw==", + "license": "MIT", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.40", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.6.3" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || ^1.0.0 || ^2.0.0-0", + "webpack": "^5.27.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/css-loader/node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/css-loader/node_modules/postcss": { + "version": "8.5.28", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.28.tgz", + "integrity": "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.18", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/css-loader/node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/css-loader/node_modules/postcss-modules-local-by-default": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", + "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", + "license": "MIT", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/css-loader/node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.6.tgz", + "integrity": "sha512-7qASPzhKF2l2KLboRZux8CCTRMdGiV08vWmyKzPz22qZ7ZjQBOeY7rNzNoCLSUiftJ7HUq0GERHmxw/t0dCdMw==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/css-loader/node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser/node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/css-loader/node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser/node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/css-loader/node_modules/postcss-modules-scope": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", + "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/css-loader/node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.6.tgz", + "integrity": "sha512-7qASPzhKF2l2KLboRZux8CCTRMdGiV08vWmyKzPz22qZ7ZjQBOeY7rNzNoCLSUiftJ7HUq0GERHmxw/t0dCdMw==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/css-loader/node_modules/postcss-modules-scope/node_modules/postcss-selector-parser/node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/css-loader/node_modules/postcss-modules-scope/node_modules/postcss-selector-parser/node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/css-loader/node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "license": "ISC", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/css-loader/node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/css-loader/node_modules/postcss/node_modules/nanoid": { + "version": "3.3.19", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.19.tgz", + "integrity": "sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/css-loader/node_modules/postcss/node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/css-loader/node_modules/postcss/node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/css-loader/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/esbuild": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", + "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.28.1", + "@esbuild/android-arm": "0.28.1", + "@esbuild/android-arm64": "0.28.1", + "@esbuild/android-x64": "0.28.1", + "@esbuild/darwin-arm64": "0.28.1", + "@esbuild/darwin-x64": "0.28.1", + "@esbuild/freebsd-arm64": "0.28.1", + "@esbuild/freebsd-x64": "0.28.1", + "@esbuild/linux-arm": "0.28.1", + "@esbuild/linux-arm64": "0.28.1", + "@esbuild/linux-ia32": "0.28.1", + "@esbuild/linux-loong64": "0.28.1", + "@esbuild/linux-mips64el": "0.28.1", + "@esbuild/linux-ppc64": "0.28.1", + "@esbuild/linux-riscv64": "0.28.1", + "@esbuild/linux-s390x": "0.28.1", + "@esbuild/linux-x64": "0.28.1", + "@esbuild/netbsd-arm64": "0.28.1", + "@esbuild/netbsd-x64": "0.28.1", + "@esbuild/openbsd-arm64": "0.28.1", + "@esbuild/openbsd-x64": "0.28.1", + "@esbuild/openharmony-arm64": "0.28.1", + "@esbuild/sunos-x64": "0.28.1", + "@esbuild/win32-arm64": "0.28.1", + "@esbuild/win32-ia32": "0.28.1", + "@esbuild/win32-x64": "0.28.1" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/esbuild/node_modules/@esbuild/aix-ppc64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", + "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/esbuild/node_modules/@esbuild/android-arm": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz", + "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/esbuild/node_modules/@esbuild/android-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", + "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/esbuild/node_modules/@esbuild/android-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz", + "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/esbuild/node_modules/@esbuild/darwin-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz", + "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/esbuild/node_modules/@esbuild/darwin-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", + "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/esbuild/node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz", + "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/esbuild/node_modules/@esbuild/freebsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz", + "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/esbuild/node_modules/@esbuild/linux-arm": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz", + "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/esbuild/node_modules/@esbuild/linux-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz", + "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/esbuild/node_modules/@esbuild/linux-ia32": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz", + "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/esbuild/node_modules/@esbuild/linux-loong64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz", + "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/esbuild/node_modules/@esbuild/linux-mips64el": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", + "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/esbuild/node_modules/@esbuild/linux-ppc64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz", + "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/esbuild/node_modules/@esbuild/linux-riscv64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", + "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/esbuild/node_modules/@esbuild/linux-s390x": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz", + "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/esbuild/node_modules/@esbuild/linux-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz", + "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/esbuild/node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz", + "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/esbuild/node_modules/@esbuild/netbsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", + "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/esbuild/node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz", + "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/esbuild/node_modules/@esbuild/openbsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz", + "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/esbuild/node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", + "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/esbuild/node_modules/@esbuild/sunos-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz", + "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/esbuild/node_modules/@esbuild/win32-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz", + "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/esbuild/node_modules/@esbuild/win32-ia32": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz", + "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/esbuild/node_modules/@esbuild/win32-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz", + "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/react-refresh": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.18.0.tgz", + "integrity": "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/style-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-4.0.0.tgz", + "integrity": "sha512-1V4WqhhZZgjVAVJyt7TdDPZoPBPNHbekX4fWnCJL1yQukhCeZhJySUL+gL9y6sNdN95uEOS83Y55SqHcP7MzLA==", + "license": "MIT", + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.27.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack": { + "version": "5.105.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.0.tgz", + "integrity": "sha512-gX/dMkRQc7QOMzgTe6KsYFM7DxeIONQSui1s0n/0xht36HvrgbxtM1xBlgx596NbpHuQU8P7QpKwrZYwUX48nw==", + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.15.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.28.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.19.0", + "es-module-lexer": "^2.0.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.3.1", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "terser-webpack-plugin": "^5.3.16", + "watchpack": "^2.5.1", + "webpack-sources": "^3.3.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "license": "MIT", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/@types/eslint-scope/node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "license": "MIT" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "license": "MIT" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/@webassemblyjs/ast/node_modules/@webassemblyjs/helper-numbers": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", - "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/@webassemblyjs/ast/node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/@webassemblyjs/ast/node_modules/@webassemblyjs/helper-numbers/node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "license": "MIT" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/@webassemblyjs/ast/node_modules/@webassemblyjs/helper-numbers/node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "license": "MIT" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/@webassemblyjs/ast/node_modules/@webassemblyjs/helper-numbers/node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "license": "Apache-2.0" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/@webassemblyjs/ast/node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "license": "MIT" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/@webassemblyjs/wasm-edit/node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "license": "MIT" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/@webassemblyjs/wasm-edit/node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "license": "MIT" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/@webassemblyjs/wasm-edit/node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/@webassemblyjs/wasm-edit/node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/@webassemblyjs/wasm-edit/node_modules/@webassemblyjs/wasm-gen/node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/@webassemblyjs/wasm-edit/node_modules/@webassemblyjs/wasm-gen/node_modules/@webassemblyjs/ieee754/node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "license": "BSD-3-Clause" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/@webassemblyjs/wasm-edit/node_modules/@webassemblyjs/wasm-gen/node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/@webassemblyjs/wasm-edit/node_modules/@webassemblyjs/wasm-gen/node_modules/@webassemblyjs/leb128/node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "license": "Apache-2.0" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/@webassemblyjs/wasm-edit/node_modules/@webassemblyjs/wasm-gen/node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "license": "MIT" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/@webassemblyjs/wasm-edit/node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/@webassemblyjs/wasm-edit/node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/@webassemblyjs/wasm-edit/node_modules/@webassemblyjs/wast-printer/node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "license": "Apache-2.0" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/@webassemblyjs/wasm-parser/node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "license": "MIT" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/@webassemblyjs/wasm-parser/node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "license": "MIT" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/@webassemblyjs/wasm-parser/node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/@webassemblyjs/wasm-parser/node_modules/@webassemblyjs/ieee754/node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "license": "BSD-3-Clause" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/@webassemblyjs/wasm-parser/node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/@webassemblyjs/wasm-parser/node_modules/@webassemblyjs/leb128/node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "license": "Apache-2.0" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/@webassemblyjs/wasm-parser/node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "license": "MIT" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/acorn": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "acorn": "^8.14.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/browserslist": { + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.29.0.tgz", + "integrity": "sha512-3GSvyjvDI4Dur1Meg2BekJquu5uF+9R9a1+5M1Mde192eZoXbeXjzgOsgqPS2V8D5wrrip0gR5Hf/GhWQ9ZzaA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.11.23", + "caniuse-lite": "^1.0.30001810", + "electron-to-chromium": "^1.5.427", + "node-releases": "^2.0.55", + "update-browserslist-db": "^1.3.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/browserslist/node_modules/baseline-browser-mapping": { + "version": "2.11.25", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.25.tgz", + "integrity": "sha512-gMmEShwwq7FJqMwvfRwvCl00v4kN+KOfJqXn+f4nrufak5gNHJOksd/60Dvjuz7sI8Y5WiSFBa8FEYr+zoyqCw==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/browserslist/node_modules/caniuse-lite": { + "version": "1.0.30001810", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001810.tgz", + "integrity": "sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/browserslist/node_modules/electron-to-chromium": { + "version": "1.5.433", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.433.tgz", + "integrity": "sha512-5lCAbyZBjtmUt/RAGHRqrL2q0oEFRThDAsZHHDn9XHa89Qw7gMYOeSicBTy+AHfvo0r6vwsZvqNJTQIQy1BLzA==", + "license": "ISC" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/browserslist/node_modules/node-releases": { + "version": "2.0.56", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.56.tgz", + "integrity": "sha512-x0InOIyzgdk+eyaWaRJFH5snEtiImgBgblZ2CyPrLmqqcuMQkEvcDPHbzqbD8eDsSeJbVOjn+crzyzHaM4D+/A==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/browserslist/node_modules/update-browserslist-db": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.3.tgz", + "integrity": "sha512-pJ2sYawQS0R/WI928Gj5GlPhTGzbMelq0+4INtSYNDV9ErKJcX6xjGWkoG/VnB3dpUm00zALaqkrUD77pO5TDQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/browserslist/node_modules/update-browserslist-db/node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/browserslist/node_modules/update-browserslist-db/node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/enhanced-resolve": { + "version": "5.25.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.25.1.tgz", + "integrity": "sha512-nGXts5znJzmWPu+mIE9izCOzdg63oJca2mDzGWWTth7sr4aCToKcoyFVBQwN75Ij5Pf6p510EwkTqViTRzDV+w==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/es-module-lexer": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.2.tgz", + "integrity": "sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==", + "license": "MIT" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/eslint-scope/node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/eslint-scope/node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/eslint-scope/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "license": "BSD-2-Clause" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/loader-runner": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.2.tgz", + "integrity": "sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==", + "license": "MIT", + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/mime-types/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "license": "MIT" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/schema-utils": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.5.0.tgz", + "integrity": "sha512-zJlMCZ0cAR5p/Y4oVpRoqioDMJcGxaXRrQ/4rP4WyR84vc5z/DolXdbvXeDpTwbtocDFr2rhPqHPErDCUtz2kA==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.15", + "ajv": "^8.20.0", + "ajv-formats": "^3.0.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/schema-utils/node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/schema-utils/node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/schema-utils/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/schema-utils/node_modules/ajv-keywords/node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/schema-utils/node_modules/ajv/node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/schema-utils/node_modules/ajv/node_modules/fast-uri": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.8.tgz", + "integrity": "sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/schema-utils/node_modules/ajv/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/schema-utils/node_modules/ajv/node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/tapable": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/terser-webpack-plugin": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.6.1.tgz", + "integrity": "sha512-201R5j+sJpK8nFWwKVyNfZot8FaJbLZDq5evriVzbV1wDtSXDjRUDRfJzHpAaxFDMEhsZL1QkeqM61wgsS3KaQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "terser": "^5.31.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@minify-html/node": { + "optional": true + }, + "@swc/core": { + "optional": true + }, + "@swc/css": { + "optional": true + }, + "@swc/html": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "cssnano": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "html-minifier-terser": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "postcss": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/terser-webpack-plugin/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/terser-webpack-plugin/node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/terser-webpack-plugin/node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", + "license": "MIT" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/terser-webpack-plugin/node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/terser-webpack-plugin/node_modules/jest-worker/node_modules/@types/node": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-26.6.2.tgz", + "integrity": "sha512-X1P21scMv4zGKLYqjdGjaKa7COa0RKVYYZZN/NfvLQ1JegxFhdhpZG/Lyn8AXx6CDUavKAd11v6BvfpkDByK8g==", + "license": "MIT", + "dependencies": { + "undici-types": "~8.9.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/terser-webpack-plugin/node_modules/jest-worker/node_modules/@types/node/node_modules/undici-types": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.9.0.tgz", + "integrity": "sha512-KTDyRTYX8sWmKXAikPHHSyc63CRPETMctyjKFupcC6OBLXT3xsN0e9aF7m+mIXutFWpUXuedtowG7iLOzp0kQg==", + "license": "MIT" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/terser-webpack-plugin/node_modules/jest-worker/node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "license": "MIT" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/terser-webpack-plugin/node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/terser-webpack-plugin/node_modules/jest-worker/node_modules/supports-color/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/terser-webpack-plugin/node_modules/terser": { + "version": "5.51.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.51.2.tgz", + "integrity": "sha512-bWnjSNscmuI+GJze6ZupnHP8G/cTcsJF+bXCeQknk2SHQsgbNJnLrqiH9jZ2W4STPVXH2mDKKRX3iwPhc9Cn/Q==", + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/terser-webpack-plugin/node_modules/terser/node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/terser-webpack-plugin/node_modules/terser/node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/terser-webpack-plugin/node_modules/terser/node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", + "license": "MIT" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/terser-webpack-plugin/node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "license": "MIT" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/terser-webpack-plugin/node_modules/terser/node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/terser-webpack-plugin/node_modules/terser/node_modules/source-map-support/node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/terser-webpack-plugin/node_modules/terser/node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/watchpack": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.2.tgz", + "integrity": "sha512-6i/00NBjP4yGPs+caKSyRfpTF/8Torsu0MOW3mMzIbhgISFder8i7xbqgHlLMwJrdiN8ndBV3UA1/AfzPSr+jg==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/webpack-sources": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.5.1.tgz", + "integrity": "sha512-jyuiGJdtvY434z5bUZrjz67v76/ePNvFZTp9Mdz29IlH4+GPsgyGjiv0fKI+M7BdkU6ADjulUcKAd3tUK3WlEw==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/media-utils": { + "version": "4.0.525", + "resolved": "https://registry.npmjs.org/@remotion/media-utils/-/media-utils-4.0.525.tgz", + "integrity": "sha512-t2I4rNolwua/LQUNWP2LR533cZySKl/Qg+qwcHJUP/gMLp45gXErkubg6VPMB5r08CcAIUeYl1wtnVC/i6Yatw==", + "license": "MIT", + "dependencies": { + "mediabunny": "1.56.1", + "remotion": "4.0.525" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/media-utils/node_modules/mediabunny": { + "version": "1.56.1", + "resolved": "https://registry.npmjs.org/mediabunny/-/mediabunny-1.56.1.tgz", + "integrity": "sha512-DNOm0bRBmeOxJgCK/g3LxNWbxY5morTauNdlychujGmJ9L37ezVezkNoI1WtO2Xdb4WlWWJlYfIKnOEzd5phRw==", + "license": "MPL-2.0", + "workspaces": [ + ".", + "packages/*" + ], + "dependencies": { + "@types/dom-mediacapture-transform": "^0.1.11", + "@types/dom-webcodecs": "0.1.13" + }, + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/Vanilagy" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/media-utils/node_modules/mediabunny/node_modules/@types/dom-mediacapture-transform": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/@types/dom-mediacapture-transform/-/dom-mediacapture-transform-0.1.12.tgz", + "integrity": "sha512-d7/QsLRwF864A5mgIM/YrfiglHoYn7zgCcAoJgW404r+2DwnNr7EBbLnCWpmOMgH8y0te73L1AV6H1bmauaWFw==", + "license": "MIT", + "dependencies": { + "@types/dom-webcodecs": "*" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/media-utils/node_modules/mediabunny/node_modules/@types/dom-webcodecs": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/@types/dom-webcodecs/-/dom-webcodecs-0.1.13.tgz", + "integrity": "sha512-O5hkiFIcjjszPIYyUSyvScyvrBoV3NOEEZx/pMlsu44TKzWNkLVBBxnxJz42in5n3QIolYOcBYFCPZZ0h8SkwQ==", + "license": "MIT" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/player": { + "version": "4.0.525", + "resolved": "https://registry.npmjs.org/@remotion/player/-/player-4.0.525.tgz", + "integrity": "sha512-ybnuN6v2V3+00dMHvvjW6l2ffYXo1Ex2+liVROoVgDMkLX4pObMThxaFazmdnbYA4KX5JMnMk+ADApgzxCrpNQ==", + "license": "SEE LICENSE IN LICENSE.md", + "dependencies": { + "remotion": "4.0.525" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/renderer": { + "version": "4.0.525", + "resolved": "https://registry.npmjs.org/@remotion/renderer/-/renderer-4.0.525.tgz", + "integrity": "sha512-Jxtu6oB1BTfzuC9yRoIhpIMJ344zKiWkJuuIkIBszd4Ju5FimtpNb0ExUzFKN960p70LfhIQh3cukvmJOLVVrQ==", + "license": "SEE LICENSE IN LICENSE.md", + "dependencies": { + "@remotion/licensing": "4.0.525", + "@remotion/streaming": "4.0.525", + "execa": "5.1.1", + "remotion": "4.0.525", + "source-map": "0.8.0", + "ws": "8.21.0" + }, + "optionalDependencies": { + "@remotion/compositor-darwin-arm64": "4.0.525", + "@remotion/compositor-darwin-x64": "4.0.525", + "@remotion/compositor-linux-arm64-gnu": "4.0.525", + "@remotion/compositor-linux-arm64-musl": "4.0.525", + "@remotion/compositor-linux-x64-gnu": "4.0.525", + "@remotion/compositor-linux-x64-musl": "4.0.525", + "@remotion/compositor-win32-x64-msvc": "4.0.525" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/renderer/node_modules/@remotion/compositor-darwin-arm64": { + "version": "4.0.525", + "resolved": "https://registry.npmjs.org/@remotion/compositor-darwin-arm64/-/compositor-darwin-arm64-4.0.525.tgz", + "integrity": "sha512-Log+eDBupDVcyxzUWW+qHf+auknP7FpDl0aziQaEWg58StyHvxlAI/P/Lw7t78SRbR/lCxK8FO+GPtuW9fA7jw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ] + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/renderer/node_modules/@remotion/compositor-darwin-x64": { + "version": "4.0.525", + "resolved": "https://registry.npmjs.org/@remotion/compositor-darwin-x64/-/compositor-darwin-x64-4.0.525.tgz", + "integrity": "sha512-whq00ccXQurcn+CHyATisZVPj0Z9asS2bNOYJOyN75RDCFXiSmSQuSe9PBEPxhqUw0ucNkJW3oaqP7uCvXdU9A==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ] + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/renderer/node_modules/@remotion/compositor-linux-arm64-gnu": { + "version": "4.0.525", + "resolved": "https://registry.npmjs.org/@remotion/compositor-linux-arm64-gnu/-/compositor-linux-arm64-gnu-4.0.525.tgz", + "integrity": "sha512-cvbg70XQTKNkibrLMiqKRY3TpN5NFfopVabd7i56yy2n029wm/CfxzbbGS81M5QzbqDOL/zvw//E7tyxKWKPWA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/renderer/node_modules/@remotion/compositor-linux-arm64-musl": { + "version": "4.0.525", + "resolved": "https://registry.npmjs.org/@remotion/compositor-linux-arm64-musl/-/compositor-linux-arm64-musl-4.0.525.tgz", + "integrity": "sha512-Bd8vWbirviC0RH0gcqY9gOXku8W+GixdDvjvTYWpEAZBPBwiWnI6lloMpBu38NcG1nKdwCT0Rlb9KRvYsyVo3w==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/renderer/node_modules/@remotion/compositor-linux-x64-gnu": { + "version": "4.0.525", + "resolved": "https://registry.npmjs.org/@remotion/compositor-linux-x64-gnu/-/compositor-linux-x64-gnu-4.0.525.tgz", + "integrity": "sha512-TLku1Xcw+Je5aNQov1tUPMlsF2p5u1Sj10YmA0Lsf28JQqIGeozRYIBUDynjskghPxYSEvSDUEmRqpJsnP8IwQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/renderer/node_modules/@remotion/compositor-linux-x64-musl": { + "version": "4.0.525", + "resolved": "https://registry.npmjs.org/@remotion/compositor-linux-x64-musl/-/compositor-linux-x64-musl-4.0.525.tgz", + "integrity": "sha512-s8TDKPSfBbT7ERuxGpcr7Z5TmAyxBqTuB1+5XT9edcxXk8ziu0rfH0ecttbNc/9wdrz+cPr+JIPaf1OvlZ3eDg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/renderer/node_modules/@remotion/compositor-win32-x64-msvc": { + "version": "4.0.525", + "resolved": "https://registry.npmjs.org/@remotion/compositor-win32-x64-msvc/-/compositor-win32-x64-msvc-4.0.525.tgz", + "integrity": "sha512-+0/duQEdyul7IovzeCa8FA1iUF3/4OM9HPOUvBIU4xagzXWI1dcSf7SGf0wW3+as4WGLN9QdnNfsDoZ8k7Iu+g==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/renderer/node_modules/@remotion/licensing": { + "version": "4.0.525", + "resolved": "https://registry.npmjs.org/@remotion/licensing/-/licensing-4.0.525.tgz", + "integrity": "sha512-4uNq/sgGjDIdNeJO5NWowbKkidSeZ6OTRe/L2nUh9BfS4dqnva6GCcZ8slfyiqB+YGCPpilq4LtHCTw8yhdNpw==", + "license": "MIT" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/renderer/node_modules/@remotion/streaming": { + "version": "4.0.525", + "resolved": "https://registry.npmjs.org/@remotion/streaming/-/streaming-4.0.525.tgz", + "integrity": "sha512-wIRLtYes0TkgghlgtDbp9wXZKa57h5cFy2wxHaF5WXLsIx6wHmjY6OeAhhXaIYmsSUF+EhI+3ybctMYzOKOZzQ==", + "license": "MIT" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/renderer/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/renderer/node_modules/execa/node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/renderer/node_modules/execa/node_modules/cross-spawn/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/renderer/node_modules/execa/node_modules/cross-spawn/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/renderer/node_modules/execa/node_modules/cross-spawn/node_modules/shebang-command/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/renderer/node_modules/execa/node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/renderer/node_modules/execa/node_modules/cross-spawn/node_modules/which/node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/renderer/node_modules/execa/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/renderer/node_modules/execa/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/renderer/node_modules/execa/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/renderer/node_modules/execa/node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "license": "MIT" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/renderer/node_modules/execa/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/renderer/node_modules/execa/node_modules/npm-run-path/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/renderer/node_modules/execa/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/renderer/node_modules/execa/node_modules/onetime/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/renderer/node_modules/execa/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/renderer/node_modules/execa/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/renderer/node_modules/source-map": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0.tgz", + "integrity": "sha512-d8EqvL+k/SOXCreS/SUzg2ciyHqBBLcN/yuRjFsbvVhHTE2pgei7oAhmPM7kWFbkX6OSMQfUq4KbkF3au9lhYQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/renderer/node_modules/ws": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", + "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", + "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 + } + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio": { + "version": "4.0.525", + "resolved": "https://registry.npmjs.org/@remotion/studio/-/studio-4.0.525.tgz", + "integrity": "sha512-10wpL4XdYEIW9+FoBprU69dVzFoC0XdHnZwC4OsTZTVbxAGPM8g9/frUd+gz/GY+iz6niUhFgbrGJV0G4f/G2A==", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.31", + "@remotion/canvas": "4.0.525", + "@remotion/captions": "4.0.525", + "@remotion/media": "4.0.525", + "@remotion/media-utils": "4.0.525", + "@remotion/player": "4.0.525", + "@remotion/renderer": "4.0.525", + "@remotion/studio-codemods": "4.0.525", + "@remotion/studio-protocol": "4.0.525", + "@remotion/studio-shared": "4.0.525", + "@remotion/timeline-utils": "4.0.525", + "@remotion/web-renderer": "4.0.525", + "@remotion/zod-types": "4.0.525", + "@tanstack/react-virtual": "3.14.9", + "mediabunny": "1.56.1", + "memfs": "3.4.3", + "open": "8.4.2", + "prismjs": "1.30.0", + "remotion": "4.0.525", + "semver": "7.5.3", + "zod": "4.5.4" + }, + "peerDependencies": { + "@remotion/video-matting": "4.0.525", + "@remotion/whisper-webgpu": "4.0.525", + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@remotion/video-matting": { + "optional": true + }, + "@remotion/whisper-webgpu": { + "optional": true + } + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server": { + "version": "4.0.525", + "resolved": "https://registry.npmjs.org/@remotion/studio-server/-/studio-server-4.0.525.tgz", + "integrity": "sha512-lkMRlAek4V4lyVNZmuRgL5DPVgpZCR6FkWPsotUOY4DpCAZPKmOcA7AnKeoEn003CiEkzkREad7PgkOs4ck0Zg==", + "license": "MIT", + "dependencies": { + "@babel/parser": "7.24.1", + "@babel/types": "7.24.0", + "@remotion/bundler": "4.0.525", + "@remotion/renderer": "4.0.525", + "@remotion/studio-codemods": "4.0.525", + "@remotion/studio-protocol": "4.0.525", + "@remotion/studio-shared": "4.0.525", + "@svgr/core": "8.1.0", + "@svgr/plugin-jsx": "8.1.0", + "kiwi-schema": "0.5.0", + "memfs": "3.4.3", + "open": "8.4.2", + "prettier": "3.8.1", + "recast": "0.23.21", + "remotion": "4.0.525", + "semver": "7.5.3", + "zod": "4.5.4" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@babel/types": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@babel/types/node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@babel/types/node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@babel/types/node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@remotion/studio-codemods": { + "version": "4.0.525", + "resolved": "https://registry.npmjs.org/@remotion/studio-codemods/-/studio-codemods-4.0.525.tgz", + "integrity": "sha512-EmPyjLEh/22dgawZGsgot/no9H9f1gDPFh0sCMEkOYSMzQkABvDyQrZL2iBAhC/KPcHWGzVUace+Q66ehoiEJw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "7.24.1", + "@babel/types": "7.24.0", + "@remotion/studio-shared": "4.0.525", + "ast-types": "0.16.1", + "recast": "0.23.21", + "remotion": "4.0.525" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@remotion/studio-codemods/node_modules/ast-types": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz", + "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@remotion/studio-codemods/node_modules/ast-types/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@remotion/studio-protocol": { + "version": "4.0.525", + "resolved": "https://registry.npmjs.org/@remotion/studio-protocol/-/studio-protocol-4.0.525.tgz", + "integrity": "sha512-a6IvVYa1Ok0+wpUbcs9HXi2LK/eV1O1pz428WP5CLp9rXJAbggtN1FNzjrbLLH2oKccxPBYUI6BoIPFUuxmiPA==", + "license": "Remotion License", + "dependencies": { + "zod": "4.5.4" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", + "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^8.1.3", + "snake-case": "^3.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/code-frame/node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/code-frame/node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/code-frame/node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/generator": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", + "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.8", + "@babel/types": "^7.29.8", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", + "license": "MIT" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/generator/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/generator/node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/generator/node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", + "license": "MIT" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/generator/node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/helper-compilation-targets/node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/helper-compilation-targets/node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/helper-compilation-targets/node_modules/browserslist": { + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.29.0.tgz", + "integrity": "sha512-3GSvyjvDI4Dur1Meg2BekJquu5uF+9R9a1+5M1Mde192eZoXbeXjzgOsgqPS2V8D5wrrip0gR5Hf/GhWQ9ZzaA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.11.23", + "caniuse-lite": "^1.0.30001810", + "electron-to-chromium": "^1.5.427", + "node-releases": "^2.0.55", + "update-browserslist-db": "^1.3.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/helper-compilation-targets/node_modules/browserslist/node_modules/baseline-browser-mapping": { + "version": "2.11.25", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.25.tgz", + "integrity": "sha512-gMmEShwwq7FJqMwvfRwvCl00v4kN+KOfJqXn+f4nrufak5gNHJOksd/60Dvjuz7sI8Y5WiSFBa8FEYr+zoyqCw==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/helper-compilation-targets/node_modules/browserslist/node_modules/caniuse-lite": { + "version": "1.0.30001810", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001810.tgz", + "integrity": "sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/helper-compilation-targets/node_modules/browserslist/node_modules/electron-to-chromium": { + "version": "1.5.433", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.433.tgz", + "integrity": "sha512-5lCAbyZBjtmUt/RAGHRqrL2q0oEFRThDAsZHHDn9XHa89Qw7gMYOeSicBTy+AHfvo0r6vwsZvqNJTQIQy1BLzA==", + "license": "ISC" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/helper-compilation-targets/node_modules/browserslist/node_modules/node-releases": { + "version": "2.0.56", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.56.tgz", + "integrity": "sha512-x0InOIyzgdk+eyaWaRJFH5snEtiImgBgblZ2CyPrLmqqcuMQkEvcDPHbzqbD8eDsSeJbVOjn+crzyzHaM4D+/A==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/helper-compilation-targets/node_modules/browserslist/node_modules/update-browserslist-db": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.3.tgz", + "integrity": "sha512-pJ2sYawQS0R/WI928Gj5GlPhTGzbMelq0+4INtSYNDV9ErKJcX6xjGWkoG/VnB3dpUm00zALaqkrUD77pO5TDQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/helper-compilation-targets/node_modules/browserslist/node_modules/update-browserslist-db/node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/helper-compilation-targets/node_modules/browserslist/node_modules/update-browserslist-db/node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/helper-compilation-targets/node_modules/lru-cache/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "license": "ISC" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/helper-module-transforms/node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/helper-module-transforms/node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/helpers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/parser": { + "version": "7.29.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.9.tgz", + "integrity": "sha512-CjXrNHTnvqBVqHgdBysY3vk2T8tpJHb5/RMeHJBTyVa9xgugCB0CJTx/3oO8RV2QRQP391RWpB7D6hLjm8V9uA==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.8" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/traverse": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz", + "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.8", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.8", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.8", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/traverse/node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/types": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/types/node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/types/node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@jridgewell/remapping/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@jridgewell/remapping/node_modules/@jridgewell/gen-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", + "license": "MIT" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@jridgewell/remapping/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@jridgewell/remapping/node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@jridgewell/remapping/node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", + "license": "MIT" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "license": "MIT" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/debug/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@svgr/babel-preset": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", + "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", + "license": "MIT", + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", + "@svgr/babel-plugin-transform-svg-component": "8.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@svgr/babel-preset/node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@svgr/babel-preset/node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@svgr/babel-preset/node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", + "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@svgr/babel-preset/node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", + "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@svgr/babel-preset/node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", + "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@svgr/babel-preset/node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", + "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@svgr/babel-preset/node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", + "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@svgr/babel-preset/node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", + "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", "license": "MIT", "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.13.2", - "@webassemblyjs/helper-api-error": "1.13.2", - "@xtuc/long": "4.2.2" + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/@webassemblyjs/ast/node_modules/@webassemblyjs/helper-numbers/node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", - "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", - "license": "MIT" + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/cosmiconfig/node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/@webassemblyjs/ast/node_modules/@webassemblyjs/helper-numbers/node_modules/@webassemblyjs/helper-api-error": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", - "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", - "license": "MIT" + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/cosmiconfig/node_modules/import-fresh/node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/@webassemblyjs/ast/node_modules/@webassemblyjs/helper-numbers/node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "license": "Apache-2.0" + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/cosmiconfig/node_modules/import-fresh/node_modules/parent-module/node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/@webassemblyjs/ast/node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", - "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/cosmiconfig/node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/cosmiconfig/node_modules/js-yaml": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz", + "integrity": "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/cosmiconfig/node_modules/js-yaml/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/cosmiconfig/node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/cosmiconfig/node_modules/parse-json/node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/cosmiconfig/node_modules/parse-json/node_modules/@babel/code-frame/node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/cosmiconfig/node_modules/parse-json/node_modules/@babel/code-frame/node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "license": "MIT" }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/@webassemblyjs/wasm-edit": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", - "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/cosmiconfig/node_modules/parse-json/node_modules/@babel/code-frame/node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/cosmiconfig/node_modules/parse-json/node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/helper-wasm-section": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-opt": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1", - "@webassemblyjs/wast-printer": "1.14.1" + "is-arrayish": "^0.2.1" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/@webassemblyjs/wasm-edit/node_modules/@webassemblyjs/helper-buffer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", - "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/cosmiconfig/node_modules/parse-json/node_modules/error-ex/node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "license": "MIT" }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/@webassemblyjs/wasm-edit/node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", - "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/cosmiconfig/node_modules/parse-json/node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/cosmiconfig/node_modules/parse-json/node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "license": "MIT" }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/@webassemblyjs/wasm-edit/node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", - "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/cosmiconfig/node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/wasm-gen": "1.14.1" + "dot-case": "^3.0.4", + "tslib": "^2.0.3" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/@webassemblyjs/wasm-edit/node_modules/@webassemblyjs/wasm-gen": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", - "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/snake-case/node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" + "no-case": "^3.0.4", + "tslib": "^2.0.3" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/@webassemblyjs/wasm-edit/node_modules/@webassemblyjs/wasm-gen/node_modules/@webassemblyjs/ieee754": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", - "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/snake-case/node_modules/dot-case/node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", "license": "MIT", "dependencies": { - "@xtuc/ieee754": "^1.2.0" + "lower-case": "^2.0.2", + "tslib": "^2.0.3" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/@webassemblyjs/wasm-edit/node_modules/@webassemblyjs/wasm-gen/node_modules/@webassemblyjs/ieee754/node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "license": "BSD-3-Clause" - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/@webassemblyjs/wasm-edit/node_modules/@webassemblyjs/wasm-gen/node_modules/@webassemblyjs/leb128": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", - "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", - "license": "Apache-2.0", + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/snake-case/node_modules/dot-case/node_modules/no-case/node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "license": "MIT", "dependencies": { - "@xtuc/long": "4.2.2" + "tslib": "^2.0.3" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/@webassemblyjs/wasm-edit/node_modules/@webassemblyjs/wasm-gen/node_modules/@webassemblyjs/leb128/node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "license": "Apache-2.0" - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/@webassemblyjs/wasm-edit/node_modules/@webassemblyjs/wasm-gen/node_modules/@webassemblyjs/utf8": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", - "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", - "license": "MIT" + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/snake-case/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/@webassemblyjs/wasm-edit/node_modules/@webassemblyjs/wasm-opt": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", - "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", + "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1" + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "@svgr/hast-util-to-babel-ast": "8.0.0", + "svg-parser": "^2.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/@webassemblyjs/wasm-edit/node_modules/@webassemblyjs/wast-printer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", - "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@xtuc/long": "4.2.2" + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/@webassemblyjs/wasm-edit/node_modules/@webassemblyjs/wast-printer/node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "license": "Apache-2.0" - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/@webassemblyjs/wasm-parser": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", - "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-api-error": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/@webassemblyjs/wasm-parser/node_modules/@webassemblyjs/helper-api-error": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", - "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", - "license": "MIT" + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/code-frame/node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/@webassemblyjs/wasm-parser/node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", - "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/code-frame/node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "license": "MIT" }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/@webassemblyjs/wasm-parser/node_modules/@webassemblyjs/ieee754": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", - "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/code-frame/node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/generator": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", + "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", "license": "MIT", "dependencies": { - "@xtuc/ieee754": "^1.2.0" + "@babel/parser": "^7.29.8", + "@babel/types": "^7.29.8", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/@webassemblyjs/wasm-parser/node_modules/@webassemblyjs/ieee754/node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "license": "BSD-3-Clause" + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/@webassemblyjs/wasm-parser/node_modules/@webassemblyjs/leb128": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", - "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", - "license": "Apache-2.0", + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", + "license": "MIT" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/generator/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", "dependencies": { - "@xtuc/long": "4.2.2" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/@webassemblyjs/wasm-parser/node_modules/@webassemblyjs/leb128/node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "license": "Apache-2.0" + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/generator/node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/@webassemblyjs/wasm-parser/node_modules/@webassemblyjs/utf8": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", - "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/generator/node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", "license": "MIT" }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/acorn": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", - "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/generator/node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "license": "MIT", "bin": { - "acorn": "bin/acorn" + "jsesc": "bin/jsesc" }, "engines": { - "node": ">=0.4.0" + "node": ">=6" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/acorn-import-phases": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", - "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", "license": "MIT", - "engines": { - "node": ">=10.13.0" + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, - "peerDependencies": { - "acorn": "^8.14.0" + "engines": { + "node": ">=6.9.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/browserslist": { + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/helper-compilation-targets/node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/helper-compilation-targets/node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/helper-compilation-targets/node_modules/browserslist": { "version": "4.29.0", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.29.0.tgz", "integrity": "sha512-3GSvyjvDI4Dur1Meg2BekJquu5uF+9R9a1+5M1Mde192eZoXbeXjzgOsgqPS2V8D5wrrip0gR5Hf/GhWQ9ZzaA==", @@ -3501,7 +7423,7 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/browserslist/node_modules/baseline-browser-mapping": { + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/helper-compilation-targets/node_modules/browserslist/node_modules/baseline-browser-mapping": { "version": "2.11.25", "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.25.tgz", "integrity": "sha512-gMmEShwwq7FJqMwvfRwvCl00v4kN+KOfJqXn+f4nrufak5gNHJOksd/60Dvjuz7sI8Y5WiSFBa8FEYr+zoyqCw==", @@ -3513,7 +7435,7 @@ "node": ">=6.0.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/browserslist/node_modules/caniuse-lite": { + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/helper-compilation-targets/node_modules/browserslist/node_modules/caniuse-lite": { "version": "1.0.30001810", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001810.tgz", "integrity": "sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==", @@ -3533,13 +7455,13 @@ ], "license": "CC-BY-4.0" }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/browserslist/node_modules/electron-to-chromium": { + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/helper-compilation-targets/node_modules/browserslist/node_modules/electron-to-chromium": { "version": "1.5.433", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.433.tgz", "integrity": "sha512-5lCAbyZBjtmUt/RAGHRqrL2q0oEFRThDAsZHHDn9XHa89Qw7gMYOeSicBTy+AHfvo0r6vwsZvqNJTQIQy1BLzA==", "license": "ISC" }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/browserslist/node_modules/node-releases": { + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/helper-compilation-targets/node_modules/browserslist/node_modules/node-releases": { "version": "2.0.56", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.56.tgz", "integrity": "sha512-x0InOIyzgdk+eyaWaRJFH5snEtiImgBgblZ2CyPrLmqqcuMQkEvcDPHbzqbD8eDsSeJbVOjn+crzyzHaM4D+/A==", @@ -3548,7 +7470,7 @@ "node": ">=18" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/browserslist/node_modules/update-browserslist-db": { + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/helper-compilation-targets/node_modules/browserslist/node_modules/update-browserslist-db": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.3.tgz", "integrity": "sha512-pJ2sYawQS0R/WI928Gj5GlPhTGzbMelq0+4INtSYNDV9ErKJcX6xjGWkoG/VnB3dpUm00zALaqkrUD77pO5TDQ==", @@ -3578,7 +7500,7 @@ "browserslist": ">= 4.21.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/browserslist/node_modules/update-browserslist-db/node_modules/escalade": { + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/helper-compilation-targets/node_modules/browserslist/node_modules/update-browserslist-db/node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", @@ -3587,481 +7509,605 @@ "node": ">=6" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/browserslist/node_modules/update-browserslist-db/node_modules/picocolors": { + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/helper-compilation-targets/node_modules/browserslist/node_modules/update-browserslist-db/node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "license": "ISC" }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/chrome-trace-event": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", - "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/helper-compilation-targets/node_modules/lru-cache/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "license": "ISC" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, "engines": { - "node": ">=6.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/helper-module-transforms/node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/helper-module-transforms/node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/helpers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/parser": { + "version": "7.29.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.9.tgz", + "integrity": "sha512-CjXrNHTnvqBVqHgdBysY3vk2T8tpJHb5/RMeHJBTyVa9xgugCB0CJTx/3oO8RV2QRQP391RWpB7D6hLjm8V9uA==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.8" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/traverse": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz", + "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.8", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.8", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.8", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/traverse/node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/types": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/types/node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/types/node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@jridgewell/remapping/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@jridgewell/remapping/node_modules/@jridgewell/gen-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", + "license": "MIT" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@jridgewell/remapping/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/enhanced-resolve": { - "version": "5.25.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.25.1.tgz", - "integrity": "sha512-nGXts5znJzmWPu+mIE9izCOzdg63oJca2mDzGWWTth7sr4aCToKcoyFVBQwN75Ij5Pf6p510EwkTqViTRzDV+w==", + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@jridgewell/remapping/node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.3.3" - }, "engines": { - "node": ">=10.13.0" + "node": ">=6.0.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/es-module-lexer": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.2.tgz", - "integrity": "sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==", + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@jridgewell/remapping/node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", "license": "MIT" }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "license": "MIT" }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/eslint-scope/node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "license": "BSD-2-Clause", + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", "dependencies": { - "estraverse": "^5.2.0" + "ms": "^2.1.3" }, "engines": { - "node": ">=4.0" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/eslint-scope/node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/debug/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/eslint-scope/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "license": "BSD-2-Clause", + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "license": "MIT", "engines": { - "node": ">=4.0" + "node": ">=6.9.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, "engines": { - "node": ">=0.8.x" + "node": ">=6" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "license": "BSD-2-Clause" - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC" - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "license": "MIT" - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/loader-runner": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.2.tgz", - "integrity": "sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==", - "license": "MIT", - "engines": { - "node": ">=6.11.5" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@svgr/babel-preset": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", + "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", "license": "MIT", "dependencies": { - "mime-db": "1.52.0" + "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", + "@svgr/babel-plugin-transform-svg-component": "8.0.0" }, "engines": { - "node": ">= 0.6" + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/mime-types/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@svgr/babel-preset/node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "license": "MIT" - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/schema-utils": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.5.0.tgz", - "integrity": "sha512-zJlMCZ0cAR5p/Y4oVpRoqioDMJcGxaXRrQ/4rP4WyR84vc5z/DolXdbvXeDpTwbtocDFr2rhPqHPErDCUtz2kA==", + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@svgr/babel-preset/node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.15", - "ajv": "^8.20.0", - "ajv-formats": "^3.0.1", - "ajv-keywords": "^5.1.0" - }, "engines": { - "node": ">= 10.13.0" + "node": ">=14" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/schema-utils/node_modules/ajv": { - "version": "8.20.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", - "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@svgr/babel-preset/node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", + "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" + "engines": { + "node": ">=14" }, "funding": { "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/schema-utils/node_modules/ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@svgr/babel-preset/node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", + "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" + "engines": { + "node": ">=14" }, - "peerDependencies": { - "ajv": "^8.0.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/schema-utils/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@svgr/babel-preset/node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", + "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" }, "peerDependencies": { - "ajv": "^8.8.2" + "@babel/core": "^7.0.0-0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/schema-utils/node_modules/ajv-keywords/node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "license": "MIT" - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/schema-utils/node_modules/ajv/node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "license": "MIT" - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/schema-utils/node_modules/ajv/node_modules/fast-uri": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.8.tgz", - "integrity": "sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause" - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/schema-utils/node_modules/ajv/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/schema-utils/node_modules/ajv/node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@svgr/babel-preset/node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", + "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/tapable": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", - "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@svgr/babel-preset/node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", + "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", "license": "MIT", "engines": { - "node": ">=6" + "node": ">=14" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/terser-webpack-plugin": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.6.1.tgz", - "integrity": "sha512-201R5j+sJpK8nFWwKVyNfZot8FaJbLZDq5evriVzbV1wDtSXDjRUDRfJzHpAaxFDMEhsZL1QkeqM61wgsS3KaQ==", + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@svgr/babel-preset/node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", + "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", - "jest-worker": "^27.4.5", - "schema-utils": "^4.3.0", - "terser": "^5.31.1" - }, "engines": { - "node": ">= 10.13.0" + "node": ">=12" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "type": "github", + "url": "https://github.com/sponsors/gregberge" }, "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@minify-html/node": { - "optional": true - }, - "@swc/core": { - "optional": true - }, - "@swc/css": { - "optional": true - }, - "@swc/html": { - "optional": true - }, - "clean-css": { - "optional": true - }, - "cssnano": { - "optional": true - }, - "csso": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "html-minifier-terser": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "postcss": { - "optional": true - }, - "uglify-js": { - "optional": true - } + "@babel/core": "^7.0.0-0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/terser-webpack-plugin/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@svgr/hast-util-to-babel-ast": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", + "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "@babel/types": "^7.21.3", + "entities": "^4.4.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/terser-webpack-plugin/node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "license": "MIT", + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@svgr/hast-util-to-babel-ast/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", "engines": { - "node": ">=6.0.0" + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/terser-webpack-plugin/node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", - "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", - "license": "MIT" + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/svg-parser": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.1.0.tgz", + "integrity": "sha512-bwLf38YmY+TDYHJw1Ex0Co8c4yeXuJAo8YnXGZrscxrvYoVVIvLeniEkV1Ks/54VteMnL4FtyN1+P+TZJdUPmQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/terser-webpack-plugin/node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/kiwi-schema": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/kiwi-schema/-/kiwi-schema-0.5.0.tgz", + "integrity": "sha512-X+FpfU0yTEtc6aTHS7VwbOpvQwRt70+pXXWRI5fd6CvWhe7pSVC854TVo4Zo0x5/wwcWj+/9KUlXpdcP0dY9AA==", "license": "MIT", + "bin": { + "kiwic": "cli.js" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/memfs": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.3.tgz", + "integrity": "sha512-eivjfi7Ahr6eQTn44nvTnR60e4a1Fs1Via2kCR5lHo/kyNoiMWaXCNJ/GpSd0ilXas2JSOl9B5FTIhflXu0hlg==", + "license": "Unlicense", "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" + "fs-monkey": "1.0.3" }, "engines": { - "node": ">= 10.13.0" + "node": ">= 4.0.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/terser-webpack-plugin/node_modules/jest-worker/node_modules/@types/node": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-26.6.2.tgz", - "integrity": "sha512-X1P21scMv4zGKLYqjdGjaKa7COa0RKVYYZZN/NfvLQ1JegxFhdhpZG/Lyn8AXx6CDUavKAd11v6BvfpkDByK8g==", + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/memfs/node_modules/fs-monkey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", + "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", + "license": "Unlicense" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", "license": "MIT", "dependencies": { - "undici-types": "~8.9.0" + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/terser-webpack-plugin/node_modules/jest-worker/node_modules/@types/node/node_modules/undici-types": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.9.0.tgz", - "integrity": "sha512-KTDyRTYX8sWmKXAikPHHSyc63CRPETMctyjKFupcC6OBLXT3xsN0e9aF7m+mIXutFWpUXuedtowG7iLOzp0kQg==", - "license": "MIT" - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/terser-webpack-plugin/node_modules/jest-worker/node_modules/merge-stream": { + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/open/node_modules/define-lazy-prop": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "license": "MIT" + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/terser-webpack-plugin/node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/open/node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" + "bin": { + "is-docker": "cli.js" }, "engines": { - "node": ">=10" + "node": ">=8" }, "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/terser-webpack-plugin/node_modules/jest-worker/node_modules/supports-color/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/open/node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, "engines": { "node": ">=8" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/terser-webpack-plugin/node_modules/terser": { - "version": "5.51.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.51.2.tgz", - "integrity": "sha512-bWnjSNscmuI+GJze6ZupnHP8G/cTcsJF+bXCeQknk2SHQsgbNJnLrqiH9jZ2W4STPVXH2mDKKRX3iwPhc9Cn/Q==", - "license": "BSD-2-Clause", - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.15.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/prettier": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", + "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", + "license": "MIT", "bin": { - "terser": "bin/terser" + "prettier": "bin/prettier.cjs" }, "engines": { - "node": ">=10" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/terser-webpack-plugin/node_modules/terser/node_modules/@jridgewell/source-map": { - "version": "0.3.11", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", - "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/recast": { + "version": "0.23.21", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.21.tgz", + "integrity": "sha512-mFAyJq9vUbSTARLZUvAEf1z3YxlvAwswbmxMx2mPA/MSm4KmpwvwvhsH/NIrZhyOuwD60Lzyw2qh83uCbgTPYw==", "license": "MIT", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" + "ast-types": "^0.16.1", + "esprima": "~4.0.0", + "source-map": "~0.6.1", + "tiny-invariant": "^1.3.3", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">= 4" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/terser-webpack-plugin/node_modules/terser/node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/recast/node_modules/ast-types": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.3.tgz", + "integrity": "sha512-FvWoWYfSCM6kRxCSH+MGLHIKKGRL6A6AW7Zek2O32REPQRdg131428uRTKMBYAeRd3XXAaHDS60Wpri7CdKDrA==", "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/terser-webpack-plugin/node_modules/terser/node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", - "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", - "license": "MIT" - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/terser-webpack-plugin/node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "license": "MIT" - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/terser-webpack-plugin/node_modules/terser/node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/recast/node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/terser-webpack-plugin/node_modules/terser/node_modules/source-map-support/node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "license": "MIT" - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/terser-webpack-plugin/node_modules/terser/node_modules/source-map-support/node_modules/source-map": { + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/recast/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", @@ -4070,1105 +8116,1005 @@ "node": ">=0.10.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/watchpack": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.2.tgz", - "integrity": "sha512-6i/00NBjP4yGPs+caKSyRfpTF/8Torsu0MOW3mMzIbhgISFder8i7xbqgHlLMwJrdiN8ndBV3UA1/AfzPSr+jg==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/recast/node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "license": "MIT" }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/bundler/node_modules/webpack/node_modules/webpack-sources": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.5.1.tgz", - "integrity": "sha512-jyuiGJdtvY434z5bUZrjz67v76/ePNvFZTp9Mdz29IlH4+GPsgyGjiv0fKI+M7BdkU6ADjulUcKAd3tUK3WlEw==", - "license": "MIT", - "engines": { - "node": ">=10.13.0" - } + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/recast/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/media-utils": { - "version": "4.0.525", - "resolved": "https://registry.npmjs.org/@remotion/media-utils/-/media-utils-4.0.525.tgz", - "integrity": "sha512-t2I4rNolwua/LQUNWP2LR533cZySKl/Qg+qwcHJUP/gMLp45gXErkubg6VPMB5r08CcAIUeYl1wtnVC/i6Yatw==", + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/zod": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.5.4.tgz", + "integrity": "sha512-sC95tT5iHHH9gtpj6A81kh+NEaRAUFN+qlUPDUbRfOMvNf5QCBqsb3WgvnpVtK5Y+4UfA6KqufotuTvMGiTlsA==", "license": "MIT", - "dependencies": { - "mediabunny": "1.56.1", - "remotion": "4.0.525" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/media-utils/node_modules/mediabunny": { - "version": "1.56.1", - "resolved": "https://registry.npmjs.org/mediabunny/-/mediabunny-1.56.1.tgz", - "integrity": "sha512-DNOm0bRBmeOxJgCK/g3LxNWbxY5morTauNdlychujGmJ9L37ezVezkNoI1WtO2Xdb4WlWWJlYfIKnOEzd5phRw==", - "license": "MPL-2.0", - "workspaces": [ - ".", - "packages/*" - ], - "dependencies": { - "@types/dom-mediacapture-transform": "^0.1.11", - "@types/dom-webcodecs": "0.1.13" - }, "funding": { - "type": "individual", - "url": "https://github.com/sponsors/Vanilagy" - } - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/media-utils/node_modules/mediabunny/node_modules/@types/dom-mediacapture-transform": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/@types/dom-mediacapture-transform/-/dom-mediacapture-transform-0.1.12.tgz", - "integrity": "sha512-d7/QsLRwF864A5mgIM/YrfiglHoYn7zgCcAoJgW404r+2DwnNr7EBbLnCWpmOMgH8y0te73L1AV6H1bmauaWFw==", - "license": "MIT", - "dependencies": { - "@types/dom-webcodecs": "*" - } - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/media-utils/node_modules/mediabunny/node_modules/@types/dom-webcodecs": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/@types/dom-webcodecs/-/dom-webcodecs-0.1.13.tgz", - "integrity": "sha512-O5hkiFIcjjszPIYyUSyvScyvrBoV3NOEEZx/pMlsu44TKzWNkLVBBxnxJz42in5n3QIolYOcBYFCPZZ0h8SkwQ==", - "license": "MIT" - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/player": { - "version": "4.0.525", - "resolved": "https://registry.npmjs.org/@remotion/player/-/player-4.0.525.tgz", - "integrity": "sha512-ybnuN6v2V3+00dMHvvjW6l2ffYXo1Ex2+liVROoVgDMkLX4pObMThxaFazmdnbYA4KX5JMnMk+ADApgzxCrpNQ==", - "license": "SEE LICENSE IN LICENSE.md", - "dependencies": { - "remotion": "4.0.525" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/renderer": { - "version": "4.0.525", - "resolved": "https://registry.npmjs.org/@remotion/renderer/-/renderer-4.0.525.tgz", - "integrity": "sha512-Jxtu6oB1BTfzuC9yRoIhpIMJ344zKiWkJuuIkIBszd4Ju5FimtpNb0ExUzFKN960p70LfhIQh3cukvmJOLVVrQ==", - "license": "SEE LICENSE IN LICENSE.md", - "dependencies": { - "@remotion/licensing": "4.0.525", - "@remotion/streaming": "4.0.525", - "execa": "5.1.1", - "remotion": "4.0.525", - "source-map": "0.8.0", - "ws": "8.21.0" - }, - "optionalDependencies": { - "@remotion/compositor-darwin-arm64": "4.0.525", - "@remotion/compositor-darwin-x64": "4.0.525", - "@remotion/compositor-linux-arm64-gnu": "4.0.525", - "@remotion/compositor-linux-arm64-musl": "4.0.525", - "@remotion/compositor-linux-x64-gnu": "4.0.525", - "@remotion/compositor-linux-x64-musl": "4.0.525", - "@remotion/compositor-win32-x64-msvc": "4.0.525" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" + "url": "https://github.com/sponsors/colinhacks" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/renderer/node_modules/@remotion/compositor-darwin-arm64": { - "version": "4.0.525", - "resolved": "https://registry.npmjs.org/@remotion/compositor-darwin-arm64/-/compositor-darwin-arm64-4.0.525.tgz", - "integrity": "sha512-Log+eDBupDVcyxzUWW+qHf+auknP7FpDl0aziQaEWg58StyHvxlAI/P/Lw7t78SRbR/lCxK8FO+GPtuW9fA7jw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ] - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/renderer/node_modules/@remotion/compositor-darwin-x64": { - "version": "4.0.525", - "resolved": "https://registry.npmjs.org/@remotion/compositor-darwin-x64/-/compositor-darwin-x64-4.0.525.tgz", - "integrity": "sha512-whq00ccXQurcn+CHyATisZVPj0Z9asS2bNOYJOyN75RDCFXiSmSQuSe9PBEPxhqUw0ucNkJW3oaqP7uCvXdU9A==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ] - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/renderer/node_modules/@remotion/compositor-linux-arm64-gnu": { + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-shared": { "version": "4.0.525", - "resolved": "https://registry.npmjs.org/@remotion/compositor-linux-arm64-gnu/-/compositor-linux-arm64-gnu-4.0.525.tgz", - "integrity": "sha512-cvbg70XQTKNkibrLMiqKRY3TpN5NFfopVabd7i56yy2n029wm/CfxzbbGS81M5QzbqDOL/zvw//E7tyxKWKPWA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ] + "resolved": "https://registry.npmjs.org/@remotion/studio-shared/-/studio-shared-4.0.525.tgz", + "integrity": "sha512-XNQdLxItSw3D7ex4yVGZAsv4lDcMfBP5S+YOotFhFQiDaP+PAheofHN/0/mqxhoAlgIh1XFvHsR6b3SXtbRfEg==", + "license": "MIT", + "dependencies": { + "remotion": "4.0.525" + } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/renderer/node_modules/@remotion/compositor-linux-arm64-musl": { - "version": "4.0.525", - "resolved": "https://registry.npmjs.org/@remotion/compositor-linux-arm64-musl/-/compositor-linux-arm64-musl-4.0.525.tgz", - "integrity": "sha512-Bd8vWbirviC0RH0gcqY9gOXku8W+GixdDvjvTYWpEAZBPBwiWnI6lloMpBu38NcG1nKdwCT0Rlb9KRvYsyVo3w==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ] + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/renderer/node_modules/@remotion/compositor-linux-x64-gnu": { - "version": "4.0.525", - "resolved": "https://registry.npmjs.org/@remotion/compositor-linux-x64-gnu/-/compositor-linux-x64-gnu-4.0.525.tgz", - "integrity": "sha512-TLku1Xcw+Je5aNQov1tUPMlsF2p5u1Sj10YmA0Lsf28JQqIGeozRYIBUDynjskghPxYSEvSDUEmRqpJsnP8IwQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ] + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/renderer/node_modules/@remotion/compositor-linux-x64-musl": { - "version": "4.0.525", - "resolved": "https://registry.npmjs.org/@remotion/compositor-linux-x64-musl/-/compositor-linux-x64-musl-4.0.525.tgz", - "integrity": "sha512-s8TDKPSfBbT7ERuxGpcr7Z5TmAyxBqTuB1+5XT9edcxXk8ziu0rfH0ecttbNc/9wdrz+cPr+JIPaf1OvlZ3eDg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ] + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", + "license": "MIT" }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/renderer/node_modules/@remotion/compositor-win32-x64-msvc": { + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/@remotion/canvas": { "version": "4.0.525", - "resolved": "https://registry.npmjs.org/@remotion/compositor-win32-x64-msvc/-/compositor-win32-x64-msvc-4.0.525.tgz", - "integrity": "sha512-+0/duQEdyul7IovzeCa8FA1iUF3/4OM9HPOUvBIU4xagzXWI1dcSf7SGf0wW3+as4WGLN9QdnNfsDoZ8k7Iu+g==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ] + "resolved": "https://registry.npmjs.org/@remotion/canvas/-/canvas-4.0.525.tgz", + "integrity": "sha512-9cw3JMNb4IurI+1kl9SfoWBt30o4Mdh7KRKwNjNXfDAg3Jdod+xYgLl8pE2oDboDsaf1d0wM0GJLalbvkb4DFQ==", + "license": "Remotion License", + "dependencies": { + "@remotion/player": "4.0.525", + "remotion": "4.0.525" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/renderer/node_modules/@remotion/licensing": { + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/@remotion/captions": { "version": "4.0.525", - "resolved": "https://registry.npmjs.org/@remotion/licensing/-/licensing-4.0.525.tgz", - "integrity": "sha512-4uNq/sgGjDIdNeJO5NWowbKkidSeZ6OTRe/L2nUh9BfS4dqnva6GCcZ8slfyiqB+YGCPpilq4LtHCTw8yhdNpw==", + "resolved": "https://registry.npmjs.org/@remotion/captions/-/captions-4.0.525.tgz", + "integrity": "sha512-h1kyap1MgDKRH4fJRGZLKbsgH6yhusidNyv6lBegcDZkPr8/nNtpWNBzsYSNGLDO0xfaD+1WdMsvMkpdhylc+g==", "license": "MIT" }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/renderer/node_modules/@remotion/streaming": { + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/@remotion/studio-codemods": { "version": "4.0.525", - "resolved": "https://registry.npmjs.org/@remotion/streaming/-/streaming-4.0.525.tgz", - "integrity": "sha512-wIRLtYes0TkgghlgtDbp9wXZKa57h5cFy2wxHaF5WXLsIx6wHmjY6OeAhhXaIYmsSUF+EhI+3ybctMYzOKOZzQ==", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@remotion/studio-codemods/-/studio-codemods-4.0.525.tgz", + "integrity": "sha512-EmPyjLEh/22dgawZGsgot/no9H9f1gDPFh0sCMEkOYSMzQkABvDyQrZL2iBAhC/KPcHWGzVUace+Q66ehoiEJw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "7.24.1", + "@babel/types": "7.24.0", + "@remotion/studio-shared": "4.0.525", + "ast-types": "0.16.1", + "recast": "0.23.21", + "remotion": "4.0.525" + } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/renderer/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/@remotion/studio-codemods/node_modules/@babel/types": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", "license": "MIT", "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "node": ">=6.9.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/renderer/node_modules/execa/node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/@remotion/studio-codemods/node_modules/@babel/types/node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, "engines": { - "node": ">= 8" + "node": ">=6.9.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/renderer/node_modules/execa/node_modules/cross-spawn/node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/@remotion/studio-codemods/node_modules/@babel/types/node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", "license": "MIT", "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/renderer/node_modules/execa/node_modules/cross-spawn/node_modules/shebang-command": { + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/@remotion/studio-codemods/node_modules/@babel/types/node_modules/to-fast-properties": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/renderer/node_modules/execa/node_modules/cross-spawn/node_modules/shebang-command/node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/@remotion/studio-codemods/node_modules/ast-types": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz", + "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", "license": "MIT", + "dependencies": { + "tslib": "^2.0.1" + }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/renderer/node_modules/execa/node_modules/cross-spawn/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "license": "ISC", + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/@remotion/studio-codemods/node_modules/ast-types/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/@remotion/studio-codemods/node_modules/recast": { + "version": "0.23.21", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.21.tgz", + "integrity": "sha512-mFAyJq9vUbSTARLZUvAEf1z3YxlvAwswbmxMx2mPA/MSm4KmpwvwvhsH/NIrZhyOuwD60Lzyw2qh83uCbgTPYw==", + "license": "MIT", "dependencies": { - "isexe": "^2.0.0" + "ast-types": "^0.16.1", + "esprima": "~4.0.0", + "source-map": "~0.6.1", + "tiny-invariant": "^1.3.3", + "tslib": "^2.0.1" }, + "engines": { + "node": ">= 4" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/@remotion/studio-codemods/node_modules/recast/node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", "bin": { - "node-which": "bin/node-which" + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" }, "engines": { - "node": ">= 8" + "node": ">=4" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/@remotion/studio-codemods/node_modules/recast/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/@remotion/studio-codemods/node_modules/recast/node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "license": "MIT" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/@remotion/studio-codemods/node_modules/recast/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/@remotion/studio-protocol": { + "version": "4.0.525", + "resolved": "https://registry.npmjs.org/@remotion/studio-protocol/-/studio-protocol-4.0.525.tgz", + "integrity": "sha512-a6IvVYa1Ok0+wpUbcs9HXi2LK/eV1O1pz428WP5CLp9rXJAbggtN1FNzjrbLLH2oKccxPBYUI6BoIPFUuxmiPA==", + "license": "Remotion License", + "dependencies": { + "zod": "4.5.4" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/renderer/node_modules/execa/node_modules/cross-spawn/node_modules/which/node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC" - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/renderer/node_modules/execa/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/@remotion/timeline-utils": { + "version": "4.0.525", + "resolved": "https://registry.npmjs.org/@remotion/timeline-utils/-/timeline-utils-4.0.525.tgz", + "integrity": "sha512-KLYZrj0cHhpSkLeKcvH8dG3UM6xL6SbEAUmiYi/fNSdVcZh4HP/E2zJCuTSQqHoYByUy86aMRIxUCgfsUdChbQ==", "license": "MIT", - "engines": { - "node": ">=10" + "dependencies": { + "mediabunny": "1.56.1", + "remotion": "4.0.525" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/@remotion/web-renderer": { + "version": "4.0.525", + "resolved": "https://registry.npmjs.org/@remotion/web-renderer/-/web-renderer-4.0.525.tgz", + "integrity": "sha512-VJDC6M/bY4HeCIDoWY0kXyu0c7amNFq5YsB2cJsik88OEd3PRXiLJOONmnV2y3bXAiqfyu1cBR8SJGjoVDnAQw==", + "license": "SEE LICENSE IN LICENSE.md", + "dependencies": { + "@mediabunny/aac-encoder": "1.56.1", + "@mediabunny/flac-encoder": "1.56.1", + "@mediabunny/mp3-encoder": "1.56.1", + "@remotion/licensing": "4.0.525", + "mediabunny": "1.56.1", + "remotion": "4.0.525" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "react": ">=18.0.0", + "react-dom": ">=18.0.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/renderer/node_modules/execa/node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/@remotion/web-renderer/node_modules/@mediabunny/aac-encoder": { + "version": "1.56.1", + "resolved": "https://registry.npmjs.org/@mediabunny/aac-encoder/-/aac-encoder-1.56.1.tgz", + "integrity": "sha512-a+OY/BctP7zC4G/prHikooOVaoWXMD4+bUyEwHg2dtQiQdIwC6TDJdVYJu5dfrdSNOiAFkv1HKcYEeROdwMezg==", + "license": "MPL-2.0", + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/Vanilagy" + }, + "peerDependencies": { + "mediabunny": "^1.0.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/renderer/node_modules/execa/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", - "engines": { - "node": ">=8" + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/@remotion/web-renderer/node_modules/@mediabunny/flac-encoder": { + "version": "1.56.1", + "resolved": "https://registry.npmjs.org/@mediabunny/flac-encoder/-/flac-encoder-1.56.1.tgz", + "integrity": "sha512-zbmorMVlF1izwtlz5mWnu7A1rJLM+V26I0pEFr9Td1EDTwE5uAGRSW+/UZlnjwj1t00Woe3Zonfh9kb7lRRBqg==", + "license": "MPL-2.0", + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/Vanilagy" }, + "peerDependencies": { + "mediabunny": "^1.0.0" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/@remotion/web-renderer/node_modules/@mediabunny/mp3-encoder": { + "version": "1.56.1", + "resolved": "https://registry.npmjs.org/@mediabunny/mp3-encoder/-/mp3-encoder-1.56.1.tgz", + "integrity": "sha512-p66ovEq6mZt3ejje45NOju84hIJI4v8rHfsmc1D2J34ziV0USE8AdJBzmiwqxl6nZkIAQLNB19HzbVRcQfc51g==", + "license": "MPL-2.0", "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "individual", + "url": "https://github.com/sponsors/Vanilagy" + }, + "peerDependencies": { + "mediabunny": "^1.0.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/renderer/node_modules/execa/node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/@remotion/web-renderer/node_modules/@remotion/licensing": { + "version": "4.0.525", + "resolved": "https://registry.npmjs.org/@remotion/licensing/-/licensing-4.0.525.tgz", + "integrity": "sha512-4uNq/sgGjDIdNeJO5NWowbKkidSeZ6OTRe/L2nUh9BfS4dqnva6GCcZ8slfyiqB+YGCPpilq4LtHCTw8yhdNpw==", "license": "MIT" }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/renderer/node_modules/execa/node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/@remotion/zod-types": { + "version": "4.0.525", + "resolved": "https://registry.npmjs.org/@remotion/zod-types/-/zod-types-4.0.525.tgz", + "integrity": "sha512-l1pKgOQp+F1BGg3dC1Zxca5fP0UqPPHzLg6XwqTvsAy0slJQZ5AavSwWWjhGNyPSH6eb+e6X7m+7dWg34eXpLQ==", "license": "MIT", "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/renderer/node_modules/execa/node_modules/npm-run-path/node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "license": "MIT", - "engines": { - "node": ">=8" + "remotion": "4.0.525" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/renderer/node_modules/execa/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/@tanstack/react-virtual": { + "version": "3.14.9", + "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.14.9.tgz", + "integrity": "sha512-qZyr0FZDP8rDC4WBhsryIZmAd9bveJvFGUJJtskWaew6/0dTRS6wZxnR6VQ5bY2KwL3LjerrHqQLk3a0GKcPXQ==", "license": "MIT", "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" + "@tanstack/virtual-core": "3.17.7" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/renderer/node_modules/execa/node_modules/onetime/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/@tanstack/react-virtual/node_modules/@tanstack/virtual-core": { + "version": "3.17.7", + "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.17.7.tgz", + "integrity": "sha512-bp+v10y65sp2H7WpWfIMyxTNfl8ZVfxFTLRjPIFRryi6FV/J33z4IS53WO4pTk36KlvJ4iLiQz+oaydDC1xbcA==", "license": "MIT", - "engines": { - "node": ">=6" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/renderer/node_modules/execa/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/mediabunny": { + "version": "1.56.1", + "resolved": "https://registry.npmjs.org/mediabunny/-/mediabunny-1.56.1.tgz", + "integrity": "sha512-DNOm0bRBmeOxJgCK/g3LxNWbxY5morTauNdlychujGmJ9L37ezVezkNoI1WtO2Xdb4WlWWJlYfIKnOEzd5phRw==", + "license": "MPL-2.0", + "workspaces": [ + ".", + "packages/*" + ], + "dependencies": { + "@types/dom-mediacapture-transform": "^0.1.11", + "@types/dom-webcodecs": "0.1.13" + }, + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/Vanilagy" + } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/renderer/node_modules/execa/node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/mediabunny/node_modules/@types/dom-mediacapture-transform": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/@types/dom-mediacapture-transform/-/dom-mediacapture-transform-0.1.12.tgz", + "integrity": "sha512-d7/QsLRwF864A5mgIM/YrfiglHoYn7zgCcAoJgW404r+2DwnNr7EBbLnCWpmOMgH8y0te73L1AV6H1bmauaWFw==", "license": "MIT", - "engines": { - "node": ">=6" + "dependencies": { + "@types/dom-webcodecs": "*" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/renderer/node_modules/source-map": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0.tgz", - "integrity": "sha512-d8EqvL+k/SOXCreS/SUzg2ciyHqBBLcN/yuRjFsbvVhHTE2pgei7oAhmPM7kWFbkX6OSMQfUq4KbkF3au9lhYQ==", - "license": "BSD-3-Clause", - "engines": { - "node": ">= 12" - } + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/mediabunny/node_modules/@types/dom-webcodecs": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/@types/dom-webcodecs/-/dom-webcodecs-0.1.13.tgz", + "integrity": "sha512-O5hkiFIcjjszPIYyUSyvScyvrBoV3NOEEZx/pMlsu44TKzWNkLVBBxnxJz42in5n3QIolYOcBYFCPZZ0h8SkwQ==", + "license": "MIT" }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/renderer/node_modules/ws": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", - "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/memfs": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.3.tgz", + "integrity": "sha512-eivjfi7Ahr6eQTn44nvTnR60e4a1Fs1Via2kCR5lHo/kyNoiMWaXCNJ/GpSd0ilXas2JSOl9B5FTIhflXu0hlg==", + "license": "Unlicense", + "dependencies": { + "fs-monkey": "1.0.3" }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "engines": { + "node": ">= 4.0.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio": { - "version": "4.0.525", - "resolved": "https://registry.npmjs.org/@remotion/studio/-/studio-4.0.525.tgz", - "integrity": "sha512-10wpL4XdYEIW9+FoBprU69dVzFoC0XdHnZwC4OsTZTVbxAGPM8g9/frUd+gz/GY+iz6niUhFgbrGJV0G4f/G2A==", - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "0.3.31", - "@remotion/canvas": "4.0.525", - "@remotion/captions": "4.0.525", - "@remotion/media": "4.0.525", - "@remotion/media-utils": "4.0.525", - "@remotion/player": "4.0.525", - "@remotion/renderer": "4.0.525", - "@remotion/studio-codemods": "4.0.525", - "@remotion/studio-protocol": "4.0.525", - "@remotion/studio-shared": "4.0.525", - "@remotion/timeline-utils": "4.0.525", - "@remotion/web-renderer": "4.0.525", - "@remotion/zod-types": "4.0.525", - "@tanstack/react-virtual": "3.14.9", - "mediabunny": "1.56.1", - "memfs": "3.4.3", - "open": "8.4.2", - "prismjs": "1.30.0", - "remotion": "4.0.525", - "semver": "7.5.3", - "zod": "4.5.4" + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/memfs/node_modules/fs-monkey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", + "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", + "license": "Unlicense" + }, + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" }, - "peerDependencies": { - "@remotion/video-matting": "4.0.525", - "@remotion/whisper-webgpu": "4.0.525", - "react": ">=16.8.0", - "react-dom": ">=16.8.0" + "engines": { + "node": ">=12" }, - "peerDependenciesMeta": { - "@remotion/video-matting": { - "optional": true - }, - "@remotion/whisper-webgpu": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server": { - "version": "4.0.525", - "resolved": "https://registry.npmjs.org/@remotion/studio-server/-/studio-server-4.0.525.tgz", - "integrity": "sha512-lkMRlAek4V4lyVNZmuRgL5DPVgpZCR6FkWPsotUOY4DpCAZPKmOcA7AnKeoEn003CiEkzkREad7PgkOs4ck0Zg==", + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/open/node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", "license": "MIT", - "dependencies": { - "@babel/parser": "7.24.1", - "@babel/types": "7.24.0", - "@remotion/bundler": "4.0.525", - "@remotion/renderer": "4.0.525", - "@remotion/studio-codemods": "4.0.525", - "@remotion/studio-protocol": "4.0.525", - "@remotion/studio-shared": "4.0.525", - "@svgr/core": "8.1.0", - "@svgr/plugin-jsx": "8.1.0", - "kiwi-schema": "0.5.0", - "memfs": "3.4.3", - "open": "8.4.2", - "prettier": "3.8.1", - "recast": "0.23.21", - "remotion": "4.0.525", - "semver": "7.5.3", - "zod": "4.5.4" + "engines": { + "node": ">=8" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@babel/types": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", - "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/open/node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" + "bin": { + "is-docker": "cli.js" }, "engines": { - "node": ">=6.9.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@babel/types/node_modules/@babel/helper-string-parser": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", - "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/open/node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, "engines": { - "node": ">=6.9.0" + "node": ">=8" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@babel/types/node_modules/@babel/helper-validator-identifier": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", - "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/prismjs": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": ">=6" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@babel/types/node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/zod": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.5.4.tgz", + "integrity": "sha512-sC95tT5iHHH9gtpj6A81kh+NEaRAUFN+qlUPDUbRfOMvNf5QCBqsb3WgvnpVtK5Y+4UfA6KqufotuTvMGiTlsA==", "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/dotenv": { + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.3.1.tgz", + "integrity": "sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA==", + "license": "BSD-2-Clause", "engines": { - "node": ">=4" + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@remotion/studio-codemods": { - "version": "4.0.525", - "resolved": "https://registry.npmjs.org/@remotion/studio-codemods/-/studio-codemods-4.0.525.tgz", - "integrity": "sha512-EmPyjLEh/22dgawZGsgot/no9H9f1gDPFh0sCMEkOYSMzQkABvDyQrZL2iBAhC/KPcHWGzVUace+Q66ehoiEJw==", + "media/demo/node_modules/@remotion/cli/node_modules/minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "license": "MIT" + }, + "media/demo/node_modules/@remotion/cli/node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "license": "MIT", "dependencies": { - "@babel/parser": "7.24.1", - "@babel/types": "7.24.0", - "@remotion/studio-shared": "4.0.525", - "ast-types": "0.16.1", - "recast": "0.23.21", - "remotion": "4.0.525" + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@remotion/studio-codemods/node_modules/ast-types": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz", - "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", + "media/demo/node_modules/@remotion/cli/node_modules/prompts/node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "media/demo/node_modules/@remotion/cli/node_modules/prompts/node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "license": "MIT" + }, + "media/demo/node_modules/@remotion/cli/node_modules/semver": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "license": "ISC", "dependencies": { - "tslib": "^2.0.1" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">=4" + "node": ">=10" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@remotion/studio-codemods/node_modules/ast-types/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" + "media/demo/node_modules/@remotion/cli/node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@remotion/studio-protocol": { + "media/demo/node_modules/@remotion/cli/node_modules/semver/node_modules/lru-cache/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, + "media/demo/node_modules/@remotion/eslint-config-flat": { "version": "4.0.525", - "resolved": "https://registry.npmjs.org/@remotion/studio-protocol/-/studio-protocol-4.0.525.tgz", - "integrity": "sha512-a6IvVYa1Ok0+wpUbcs9HXi2LK/eV1O1pz428WP5CLp9rXJAbggtN1FNzjrbLLH2oKccxPBYUI6BoIPFUuxmiPA==", - "license": "Remotion License", + "resolved": "https://registry.npmjs.org/@remotion/eslint-config-flat/-/eslint-config-flat-4.0.525.tgz", + "integrity": "sha512-seTVOdlpszP+8RLk7E6SWWOO7IV3ia5CiHwvtkUNFL94HpmZHEkFiOd8TO+9uRTSd0F97xVNoeYmQ3vw5cqyYg==", + "dev": true, + "license": "ISC", "dependencies": { - "zod": "4.5.4" + "typescript-eslint": "8.21.0" + }, + "peerDependencies": { + "eslint": ">=9" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", - "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.21.3", - "@svgr/babel-preset": "8.1.0", - "camelcase": "^6.2.0", - "cosmiconfig": "^8.1.3", - "snake-case": "^3.0.4" + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "node": ">=14.17" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", - "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/generator": "^7.29.7", - "@babel/helper-compilation-targets": "^7.29.7", - "@babel/helper-module-transforms": "^7.29.7", - "@babel/helpers": "^7.29.7", - "@babel/parser": "^7.29.7", - "@babel/template": "^7.29.7", - "@babel/traverse": "^7.29.7", - "@babel/types": "^7.29.7", - "@jridgewell/remapping": "^2.3.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.21.0.tgz", + "integrity": "sha512-txEKYY4XMKwPXxNkN8+AxAdX6iIJAPiJbHE/FpQccs/sxw8Lf26kqwC3cn0xkHlW8kEbLhkhCsjWuMveaY9Rxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.21.0", + "@typescript-eslint/parser": "8.21.0", + "@typescript-eslint/utils": "8.21.0" }, "engines": { - "node": ">=6.9.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/babel" + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/code-frame": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", - "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.21.0.tgz", + "integrity": "sha512-eTH+UOR4I7WbdQnG4Z48ebIA6Bgi7WO8HvFEneeYBxG8qCOYgTOFPSg6ek9ITIDvGjDQzWHcoWHCDO2biByNzA==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.29.7", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.21.0", + "@typescript-eslint/type-utils": "8.21.0", + "@typescript-eslint/utils": "8.21.0", + "@typescript-eslint/visitor-keys": "8.21.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.0.0" }, "engines": { - "node": ">=6.9.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/code-frame/node_modules/@babel/helper-validator-identifier": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", - "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/code-frame/node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/code-frame/node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/generator": { - "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", - "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.21.0.tgz", + "integrity": "sha512-G3IBKz0/0IPfdeGRMbp+4rbjfSSdnGkXsM/pFZA8zM9t9klXDnB/YnKOBQ0GoPmoROa4bCq2NeHgJa5ydsQ4mA==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.8", - "@babel/types": "^7.29.8", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" + "@typescript-eslint/types": "8.21.0", + "@typescript-eslint/visitor-keys": "8.21.0" }, "engines": { - "node": ">=6.9.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager/node_modules/@typescript-eslint/types": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.21.0.tgz", + "integrity": "sha512-PAL6LUuQwotLW2a8VsySDBwYMm129vFm4tMVlylzdoTybTHaAi0oBp7Ac6LhSrHHOdLM3efH+nAR6hAWoMF89A==", + "dev": true, "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", - "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", - "license": "MIT" - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/generator/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.21.0.tgz", + "integrity": "sha512-95OsL6J2BtzoBxHicoXHxgk3z+9P3BEcQTpBKriqiYzLKnM2DeSqs+sndMKdamU8FosiadQFT3D+BSL9EKnAJQ==", + "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/generator/node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "license": "MIT", + "@typescript-eslint/typescript-estree": "8.21.0", + "@typescript-eslint/utils": "8.21.0", + "debug": "^4.3.4", + "ts-api-utils": "^2.0.0" + }, "engines": { - "node": ">=6.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/generator/node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", - "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", - "license": "MIT" - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/generator/node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.21.0.tgz", + "integrity": "sha512-x+aeKh/AjAArSauz0GiQZsjT8ciadNMHdkUSwBB9Z6PrKc/4knM4g3UfHml6oDJmKC88a6//cdxnO/+P2LkMcg==", + "dev": true, "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" + "dependencies": { + "@typescript-eslint/types": "8.21.0", + "@typescript-eslint/visitor-keys": "8.21.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.0.0" }, "engines": { - "node": ">=6" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.8.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/helper-compilation-targets": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", - "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/types": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.21.0.tgz", + "integrity": "sha512-PAL6LUuQwotLW2a8VsySDBwYMm129vFm4tMVlylzdoTybTHaAi0oBp7Ac6LhSrHHOdLM3efH+nAR6hAWoMF89A==", + "dev": true, "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.29.7", - "@babel/helper-validator-option": "^7.29.7", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, "engines": { - "node": ">=6.9.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/helper-compilation-targets/node_modules/@babel/compat-data": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", - "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, "engines": { - "node": ">=6.9.0" + "node": ">=8.6.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/helper-compilation-targets/node_modules/@babel/helper-validator-option": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", - "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": ">= 8" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/helper-compilation-targets/node_modules/browserslist": { - "version": "4.29.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.29.0.tgz", - "integrity": "sha512-3GSvyjvDI4Dur1Meg2BekJquu5uF+9R9a1+5M1Mde192eZoXbeXjzgOsgqPS2V8D5wrrip0gR5Hf/GhWQ9ZzaA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, "license": "MIT", "dependencies": { - "baseline-browser-mapping": "^2.11.23", - "caniuse-lite": "^1.0.30001810", - "electron-to-chromium": "^1.5.427", - "node-releases": "^2.0.55", - "update-browserslist-db": "^1.3.3" - }, - "bin": { - "browserslist": "cli.js" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" }, "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "node": ">= 8" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/helper-compilation-targets/node_modules/browserslist/node_modules/baseline-browser-mapping": { - "version": "2.11.25", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.25.tgz", - "integrity": "sha512-gMmEShwwq7FJqMwvfRwvCl00v4kN+KOfJqXn+f4nrufak5gNHJOksd/60Dvjuz7sI8Y5WiSFBa8FEYr+zoyqCw==", - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.cjs" + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/@nodelib/fs.walk/node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" }, "engines": { - "node": ">=6.0.0" + "node": ">= 8" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/helper-compilation-targets/node_modules/browserslist/node_modules/caniuse-lite": { - "version": "1.0.30001810", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001810.tgz", - "integrity": "sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/@nodelib/fs.walk/node_modules/@nodelib/fs.scandir/node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, "funding": [ { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" + "type": "github", + "url": "https://github.com/sponsors/feross" }, { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + "type": "patreon", + "url": "https://www.patreon.com/feross" }, { - "type": "github", - "url": "https://github.com/sponsors/ai" + "type": "consulting", + "url": "https://feross.org/support" } ], - "license": "CC-BY-4.0" - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/helper-compilation-targets/node_modules/browserslist/node_modules/electron-to-chromium": { - "version": "1.5.433", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.433.tgz", - "integrity": "sha512-5lCAbyZBjtmUt/RAGHRqrL2q0oEFRThDAsZHHDn9XHa89Qw7gMYOeSicBTy+AHfvo0r6vwsZvqNJTQIQy1BLzA==", - "license": "ISC" - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/helper-compilation-targets/node_modules/browserslist/node_modules/node-releases": { - "version": "2.0.56", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.56.tgz", - "integrity": "sha512-x0InOIyzgdk+eyaWaRJFH5snEtiImgBgblZ2CyPrLmqqcuMQkEvcDPHbzqbD8eDsSeJbVOjn+crzyzHaM4D+/A==", "license": "MIT", - "engines": { - "node": ">=18" + "dependencies": { + "queue-microtask": "^1.2.2" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/helper-compilation-targets/node_modules/browserslist/node_modules/update-browserslist-db": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.3.tgz", - "integrity": "sha512-pJ2sYawQS0R/WI928Gj5GlPhTGzbMelq0+4INtSYNDV9ErKJcX6xjGWkoG/VnB3dpUm00zALaqkrUD77pO5TDQ==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/@nodelib/fs.walk/node_modules/@nodelib/fs.scandir/node_modules/run-parallel/node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, "funding": [ { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" + "type": "github", + "url": "https://github.com/sponsors/feross" }, { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" + "type": "patreon", + "url": "https://www.patreon.com/feross" }, { - "type": "github", - "url": "https://github.com/sponsors/ai" + "type": "consulting", + "url": "https://feross.org/support" } ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/helper-compilation-targets/node_modules/browserslist/node_modules/update-browserslist-db/node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/helper-compilation-targets/node_modules/browserslist/node_modules/update-browserslist-db/node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" + "license": "MIT" }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/@nodelib/fs.walk/node_modules/fastq": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.3.tgz", + "integrity": "sha512-XKv5nnLs6nLF71NgiKJLIZFLkPyIEuOselLG7ujZnGrRfQK8HpvY+WqKhAJUAdLomwVHErVS4LfxFlPq0/FTAw==", + "dev": true, "license": "ISC", "dependencies": { - "yallist": "^3.0.2" + "reusify": "^1.0.4" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/helper-compilation-targets/node_modules/lru-cache/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "license": "ISC" - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/helper-module-transforms": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", - "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/@nodelib/fs.walk/node_modules/fastq/node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.29.7", - "@babel/helper-validator-identifier": "^7.29.7", - "@babel/traverse": "^7.29.7" - }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "iojs": ">=1.0.0", + "node": ">=0.10.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/helper-module-transforms/node_modules/@babel/helper-module-imports": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", - "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", - "license": "MIT", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", "dependencies": { - "@babel/traverse": "^7.29.7", - "@babel/types": "^7.29.7" + "is-glob": "^4.0.1" }, "engines": { - "node": ">=6.9.0" - } - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/helper-module-transforms/node_modules/@babel/helper-validator-identifier": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", - "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" + "node": ">= 6" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/helpers": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", - "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, "license": "MIT", - "dependencies": { - "@babel/template": "^7.29.7", - "@babel/types": "^7.29.7" - }, "engines": { - "node": ">=6.9.0" + "node": ">= 8" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/parser": { - "version": "7.29.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.9.tgz", - "integrity": "sha512-CjXrNHTnvqBVqHgdBysY3vk2T8tpJHb5/RMeHJBTyVa9xgugCB0CJTx/3oO8RV2QRQP391RWpB7D6hLjm8V9uA==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.29.8" - }, - "bin": { - "parser": "bin/babel-parser.js" + "braces": "^3.0.3", + "picomatch": "^2.3.1" }, "engines": { - "node": ">=6.0.0" + "node": ">=8.6" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/template": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", - "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/micromatch/node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/parser": "^7.29.7", - "@babel/types": "^7.29.7" + "fill-range": "^7.1.1" }, "engines": { - "node": ">=6.9.0" + "node": ">=8" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/traverse": { - "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz", - "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/micromatch/node_modules/braces/node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/generator": "^7.29.8", - "@babel/helper-globals": "^7.29.7", - "@babel/parser": "^7.29.8", - "@babel/template": "^7.29.7", - "@babel/types": "^7.29.8", - "debug": "^4.3.1" + "to-regex-range": "^5.0.1" }, "engines": { - "node": ">=6.9.0" - } - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/traverse/node_modules/@babel/helper-globals": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", - "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" + "node": ">=8" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/types": { - "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", - "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/micromatch/node_modules/braces/node_modules/fill-range/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.29.7", - "@babel/helper-validator-identifier": "^7.29.7" + "is-number": "^7.0.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=8.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/types/node_modules/@babel/helper-string-parser": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", - "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/micromatch/node_modules/braces/node_modules/fill-range/node_modules/to-regex-range/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": ">=0.12.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@babel/types/node_modules/@babel/helper-validator-identifier": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", - "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/micromatch/node_modules/picomatch": { + "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": { - "node": ">=6.9.0" + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree/node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@jridgewell/remapping/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree/node_modules/is-glob/node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" + "engines": { + "node": ">=0.10.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@jridgewell/remapping/node_modules/@jridgewell/gen-mapping/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", - "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", - "license": "MIT" - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@jridgewell/remapping/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "license": "MIT", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@jridgewell/remapping/node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch/node_modules/brace-expansion": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.7.tgz", + "integrity": "sha512-uZbew1NqdmPDTMJ8ah1y+b+9QEJrfkXFk3RcTQw3X0jW/xRUvFKsg1CfQdSYGdTbXZWExtU3J3ccxtnfw1Fi0g==", + "dev": true, "license": "MIT", - "engines": { - "node": ">=6.0.0" + "dependencies": { + "balanced-match": "^1.0.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/@jridgewell/remapping/node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", - "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, "license": "MIT" }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "license": "MIT" + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/debug": { + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -5182,4661 +9128,5074 @@ } } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/debug/node_modules/ms": { + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/debug/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, "license": "MIT" }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.21.0.tgz", + "integrity": "sha512-BkLMNpdV6prozk8LlyK/SOoWLmUFi+ZD+pcqti9ILCbVvHGk1ui1g4jJOc2WDLaeExz2qWwojxlPce5PljcT3w==", + "dev": true, "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.21.0", + "eslint-visitor-keys": "^4.2.0" + }, "engines": { - "node": ">=6.9.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys/node_modules/@typescript-eslint/types": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.21.0.tgz", + "integrity": "sha512-PAL6LUuQwotLW2a8VsySDBwYMm129vFm4tMVlylzdoTybTHaAi0oBp7Ac6LhSrHHOdLM3efH+nAR6hAWoMF89A==", + "dev": true, "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, "engines": { - "node": ">=6" - } - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@svgr/babel-preset": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", - "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", - "license": "MIT", - "dependencies": { - "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", - "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", - "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", - "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", - "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", - "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", - "@svgr/babel-plugin-transform-svg-component": "8.0.0" - }, + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=14" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "url": "https://opencollective.com/eslint" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@svgr/babel-preset/node_modules/@svgr/babel-plugin-add-jsx-attribute": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", - "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, "license": "MIT", "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 4" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@svgr/babel-preset/node_modules/@svgr/babel-plugin-remove-jsx-attribute": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", - "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "dev": true, "license": "MIT", "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "node": ">=18.12" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "typescript": ">=4.8.4" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@svgr/babel-preset/node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", - "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.21.0.tgz", + "integrity": "sha512-Wy+/sdEH9kI3w9civgACwabHbKl+qIOu0uFZ9IMKzX3Jpv9og0ZBJrZExGrPpFAY7rWsXuxs5e7CPPP17A4eYA==", + "dev": true, "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.21.0", + "@typescript-eslint/types": "8.21.0", + "@typescript-eslint/typescript-estree": "8.21.0", + "@typescript-eslint/visitor-keys": "8.21.0", + "debug": "^4.3.4" + }, "engines": { - "node": ">=14" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@svgr/babel-preset/node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", - "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.21.0.tgz", + "integrity": "sha512-G3IBKz0/0IPfdeGRMbp+4rbjfSSdnGkXsM/pFZA8zM9t9klXDnB/YnKOBQ0GoPmoROa4bCq2NeHgJa5ydsQ4mA==", + "dev": true, "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.21.0", + "@typescript-eslint/visitor-keys": "8.21.0" + }, "engines": { - "node": ">=14" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@svgr/babel-preset/node_modules/@svgr/babel-plugin-svg-dynamic-title": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", - "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.21.0.tgz", + "integrity": "sha512-PAL6LUuQwotLW2a8VsySDBwYMm129vFm4tMVlylzdoTybTHaAi0oBp7Ac6LhSrHHOdLM3efH+nAR6hAWoMF89A==", + "dev": true, "license": "MIT", "engines": { - "node": ">=14" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@svgr/babel-preset/node_modules/@svgr/babel-plugin-svg-em-dimensions": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", - "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.21.0.tgz", + "integrity": "sha512-x+aeKh/AjAArSauz0GiQZsjT8ciadNMHdkUSwBB9Z6PrKc/4knM4g3UfHml6oDJmKC88a6//cdxnO/+P2LkMcg==", + "dev": true, "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.21.0", + "@typescript-eslint/visitor-keys": "8.21.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.0.0" + }, "engines": { - "node": ">=14" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "typescript": ">=4.8.4 <5.8.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@svgr/babel-preset/node_modules/@svgr/babel-plugin-transform-react-native-svg": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", - "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=8.6.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/@svgr/babel-preset/node_modules/@svgr/babel-plugin-transform-svg-component": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", - "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 8" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, "license": "MIT", - "engines": { - "node": ">=10" + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">= 8" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/@nodelib/fs.walk/node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, "license": "MIT", "dependencies": { - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" }, "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" + "node": ">= 8" + } + }, + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/@nodelib/fs.walk/node_modules/@nodelib/fs.scandir/node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "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", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/@nodelib/fs.walk/node_modules/@nodelib/fs.scandir/node_modules/run-parallel/node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "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" + }, + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/@nodelib/fs.walk/node_modules/fastq": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.3.tgz", + "integrity": "sha512-XKv5nnLs6nLF71NgiKJLIZFLkPyIEuOselLG7ujZnGrRfQK8HpvY+WqKhAJUAdLomwVHErVS4LfxFlPq0/FTAw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/@nodelib/fs.walk/node_modules/fastq/node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "engines": { + "node": ">= 6" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/cosmiconfig/node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 8" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/cosmiconfig/node_modules/import-fresh/node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, "license": "MIT", "dependencies": { - "callsites": "^3.0.0" + "braces": "^3.0.3", + "picomatch": "^2.3.1" }, "engines": { - "node": ">=6" + "node": ">=8.6" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/cosmiconfig/node_modules/import-fresh/node_modules/parent-module/node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/micromatch/node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/cosmiconfig/node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/micromatch/node_modules/braces/node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/cosmiconfig/node_modules/js-yaml": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz", - "integrity": "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/puzrin" - }, - { - "type": "github", - "url": "https://github.com/sponsors/nodeca" - } - ], + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/micromatch/node_modules/braces/node_modules/fill-range/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, "license": "MIT", "dependencies": { - "argparse": "^2.0.1" + "is-number": "^7.0.0" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">=8.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/cosmiconfig/node_modules/js-yaml/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/micromatch/node_modules/braces/node_modules/fill-range/node_modules/to-regex-range/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/cosmiconfig/node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/micromatch/node_modules/picomatch": { + "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", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, "engines": { - "node": ">=8" + "node": ">=8.6" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/cosmiconfig/node_modules/parse-json/node_modules/@babel/code-frame": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", - "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree/node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.29.7", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" + "is-extglob": "^2.1.1" }, "engines": { - "node": ">=6.9.0" + "node": ">=0.10.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/cosmiconfig/node_modules/parse-json/node_modules/@babel/code-frame/node_modules/@babel/helper-validator-identifier": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", - "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree/node_modules/is-glob/node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": ">=0.10.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/cosmiconfig/node_modules/parse-json/node_modules/@babel/code-frame/node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/cosmiconfig/node_modules/parse-json/node_modules/@babel/code-frame/node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/cosmiconfig/node_modules/parse-json/node_modules/error-ex": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", - "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch/node_modules/brace-expansion": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.7.tgz", + "integrity": "sha512-uZbew1NqdmPDTMJ8ah1y+b+9QEJrfkXFk3RcTQw3X0jW/xRUvFKsg1CfQdSYGdTbXZWExtU3J3ccxtnfw1Fi0g==", + "dev": true, "license": "MIT", "dependencies": { - "is-arrayish": "^0.2.1" + "balanced-match": "^1.0.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/cosmiconfig/node_modules/parse-json/node_modules/error-ex/node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "license": "MIT" - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/cosmiconfig/node_modules/parse-json/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, "license": "MIT" }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/cosmiconfig/node_modules/parse-json/node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "license": "MIT" + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/cosmiconfig/node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree/node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/snake-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", - "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.21.0.tgz", + "integrity": "sha512-BkLMNpdV6prozk8LlyK/SOoWLmUFi+ZD+pcqti9ILCbVvHGk1ui1g4jJOc2WDLaeExz2qWwojxlPce5PljcT3w==", + "dev": true, "license": "MIT", "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" + "@typescript-eslint/types": "8.21.0", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/snake-case/node_modules/dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/snake-case/node_modules/dot-case/node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, "license": "MIT", "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/snake-case/node_modules/dot-case/node_modules/no-case/node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/debug/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.21.0.tgz", + "integrity": "sha512-xcXBfcq0Kaxgj7dwejMbFyq7IOHgpNMtVuDveK7w3ZGwG9owKzhALVwKpTF2yrZmEwl9SWdetf3fxNzJQaVuxw==", + "dev": true, "license": "MIT", "dependencies": { - "tslib": "^2.0.3" + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.21.0", + "@typescript-eslint/types": "8.21.0", + "@typescript-eslint/typescript-estree": "8.21.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/core/node_modules/snake-case/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", - "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@eslint-community/eslint-utils": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", + "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.21.3", - "@svgr/babel-preset": "8.1.0", - "@svgr/hast-util-to-babel-ast": "8.0.0", - "svg-parser": "^2.0.4" + "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": ">=14" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "url": "https://opencollective.com/eslint" }, "peerDependencies": { - "@svgr/core": "*" + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", - "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.21.0.tgz", + "integrity": "sha512-G3IBKz0/0IPfdeGRMbp+4rbjfSSdnGkXsM/pFZA8zM9t9klXDnB/YnKOBQ0GoPmoROa4bCq2NeHgJa5ydsQ4mA==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/generator": "^7.29.7", - "@babel/helper-compilation-targets": "^7.29.7", - "@babel/helper-module-transforms": "^7.29.7", - "@babel/helpers": "^7.29.7", - "@babel/parser": "^7.29.7", - "@babel/template": "^7.29.7", - "@babel/traverse": "^7.29.7", - "@babel/types": "^7.29.7", - "@jridgewell/remapping": "^2.3.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" + "@typescript-eslint/types": "8.21.0", + "@typescript-eslint/visitor-keys": "8.21.0" }, "engines": { - "node": ">=6.9.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/babel" + "url": "https://opencollective.com/typescript-eslint" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/code-frame": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", - "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.21.0.tgz", + "integrity": "sha512-BkLMNpdV6prozk8LlyK/SOoWLmUFi+ZD+pcqti9ILCbVvHGk1ui1g4jJOc2WDLaeExz2qWwojxlPce5PljcT3w==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.29.7", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" + "@typescript-eslint/types": "8.21.0", + "eslint-visitor-keys": "^4.2.0" }, "engines": { - "node": ">=6.9.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/code-frame/node_modules/@babel/helper-validator-identifier": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", - "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", - "license": "MIT", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager/node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=6.9.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/code-frame/node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/code-frame/node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/generator": { - "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", - "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.21.0.tgz", + "integrity": "sha512-PAL6LUuQwotLW2a8VsySDBwYMm129vFm4tMVlylzdoTybTHaAi0oBp7Ac6LhSrHHOdLM3efH+nAR6hAWoMF89A==", + "dev": true, "license": "MIT", - "dependencies": { - "@babel/parser": "^7.29.8", - "@babel/types": "^7.29.8", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, "engines": { - "node": ">=6.9.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.21.0.tgz", + "integrity": "sha512-x+aeKh/AjAArSauz0GiQZsjT8ciadNMHdkUSwBB9Z6PrKc/4knM4g3UfHml6oDJmKC88a6//cdxnO/+P2LkMcg==", + "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" + "@typescript-eslint/types": "8.21.0", + "@typescript-eslint/visitor-keys": "8.21.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.8.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", - "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", - "license": "MIT" - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/generator/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.21.0.tgz", + "integrity": "sha512-BkLMNpdV6prozk8LlyK/SOoWLmUFi+ZD+pcqti9ILCbVvHGk1ui1g4jJOc2WDLaeExz2qWwojxlPce5PljcT3w==", + "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/generator/node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "license": "MIT", + "@typescript-eslint/types": "8.21.0", + "eslint-visitor-keys": "^4.2.0" + }, "engines": { - "node": ">=6.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/generator/node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", - "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", - "license": "MIT" - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/generator/node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=6" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/helper-compilation-targets": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", - "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.29.7", - "@babel/helper-validator-option": "^7.29.7", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" + "ms": "^2.1.3" }, "engines": { - "node": ">=6.9.0" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/helper-compilation-targets/node_modules/@babel/compat-data": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", - "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/debug/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, "engines": { - "node": ">=6.9.0" + "node": ">=8.6.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/helper-compilation-targets/node_modules/@babel/helper-validator-option": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", - "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": ">= 8" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/helper-compilation-targets/node_modules/browserslist": { - "version": "4.29.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.29.0.tgz", - "integrity": "sha512-3GSvyjvDI4Dur1Meg2BekJquu5uF+9R9a1+5M1Mde192eZoXbeXjzgOsgqPS2V8D5wrrip0gR5Hf/GhWQ9ZzaA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, "license": "MIT", "dependencies": { - "baseline-browser-mapping": "^2.11.23", - "caniuse-lite": "^1.0.30001810", - "electron-to-chromium": "^1.5.427", - "node-releases": "^2.0.55", - "update-browserslist-db": "^1.3.3" - }, - "bin": { - "browserslist": "cli.js" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" }, "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "node": ">= 8" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/helper-compilation-targets/node_modules/browserslist/node_modules/baseline-browser-mapping": { - "version": "2.11.25", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.25.tgz", - "integrity": "sha512-gMmEShwwq7FJqMwvfRwvCl00v4kN+KOfJqXn+f4nrufak5gNHJOksd/60Dvjuz7sI8Y5WiSFBa8FEYr+zoyqCw==", - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.cjs" + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/@nodelib/fs.walk/node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" }, "engines": { - "node": ">=6.0.0" + "node": ">= 8" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/helper-compilation-targets/node_modules/browserslist/node_modules/caniuse-lite": { - "version": "1.0.30001810", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001810.tgz", - "integrity": "sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/@nodelib/fs.walk/node_modules/@nodelib/fs.scandir/node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, { "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/helper-compilation-targets/node_modules/browserslist/node_modules/electron-to-chromium": { - "version": "1.5.433", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.433.tgz", - "integrity": "sha512-5lCAbyZBjtmUt/RAGHRqrL2q0oEFRThDAsZHHDn9XHa89Qw7gMYOeSicBTy+AHfvo0r6vwsZvqNJTQIQy1BLzA==", - "license": "ISC" - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/helper-compilation-targets/node_modules/browserslist/node_modules/node-releases": { - "version": "2.0.56", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.56.tgz", - "integrity": "sha512-x0InOIyzgdk+eyaWaRJFH5snEtiImgBgblZ2CyPrLmqqcuMQkEvcDPHbzqbD8eDsSeJbVOjn+crzyzHaM4D+/A==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/helper-compilation-targets/node_modules/browserslist/node_modules/update-browserslist-db": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.3.tgz", - "integrity": "sha512-pJ2sYawQS0R/WI928Gj5GlPhTGzbMelq0+4INtSYNDV9ErKJcX6xjGWkoG/VnB3dpUm00zALaqkrUD77pO5TDQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" + "url": "https://github.com/sponsors/feross" }, { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/helper-compilation-targets/node_modules/browserslist/node_modules/update-browserslist-db/node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/helper-compilation-targets/node_modules/browserslist/node_modules/update-browserslist-db/node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/helper-compilation-targets/node_modules/lru-cache/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "license": "ISC" - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/helper-module-transforms": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", - "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.29.7", - "@babel/helper-validator-identifier": "^7.29.7", - "@babel/traverse": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "queue-microtask": "^1.2.2" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/helper-module-transforms/node_modules/@babel/helper-module-imports": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", - "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", - "license": "MIT", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/@nodelib/fs.walk/node_modules/@nodelib/fs.scandir/node_modules/run-parallel/node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "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" + }, + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/@nodelib/fs.walk/node_modules/fastq": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.3.tgz", + "integrity": "sha512-XKv5nnLs6nLF71NgiKJLIZFLkPyIEuOselLG7ujZnGrRfQK8HpvY+WqKhAJUAdLomwVHErVS4LfxFlPq0/FTAw==", + "dev": true, + "license": "ISC", "dependencies": { - "@babel/traverse": "^7.29.7", - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" + "reusify": "^1.0.4" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/helper-module-transforms/node_modules/@babel/helper-validator-identifier": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", - "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/@nodelib/fs.walk/node_modules/fastq/node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, "license": "MIT", "engines": { - "node": ">=6.9.0" + "iojs": ">=1.0.0", + "node": ">=0.10.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/helpers": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", - "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", - "license": "MIT", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", "dependencies": { - "@babel/template": "^7.29.7", - "@babel/types": "^7.29.7" + "is-glob": "^4.0.1" }, "engines": { - "node": ">=6.9.0" + "node": ">= 6" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/parser": { - "version": "7.29.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.9.tgz", - "integrity": "sha512-CjXrNHTnvqBVqHgdBysY3vk2T8tpJHb5/RMeHJBTyVa9xgugCB0CJTx/3oO8RV2QRQP391RWpB7D6hLjm8V9uA==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, "license": "MIT", - "dependencies": { - "@babel/types": "^7.29.8" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, "engines": { - "node": ">=6.0.0" + "node": ">= 8" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/template": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", - "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/parser": "^7.29.7", - "@babel/types": "^7.29.7" + "braces": "^3.0.3", + "picomatch": "^2.3.1" }, "engines": { - "node": ">=6.9.0" + "node": ">=8.6" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/traverse": { - "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz", - "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/micromatch/node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/generator": "^7.29.8", - "@babel/helper-globals": "^7.29.7", - "@babel/parser": "^7.29.8", - "@babel/template": "^7.29.7", - "@babel/types": "^7.29.8", - "debug": "^4.3.1" + "fill-range": "^7.1.1" }, "engines": { - "node": ">=6.9.0" + "node": ">=8" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/traverse/node_modules/@babel/helper-globals": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", - "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/micromatch/node_modules/braces/node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, "engines": { - "node": ">=6.9.0" + "node": ">=8" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/types": { - "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", - "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/micromatch/node_modules/braces/node_modules/fill-range/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.29.7", - "@babel/helper-validator-identifier": "^7.29.7" + "is-number": "^7.0.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=8.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/types/node_modules/@babel/helper-string-parser": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", - "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/micromatch/node_modules/braces/node_modules/fill-range/node_modules/to-regex-range/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": ">=0.12.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@babel/types/node_modules/@babel/helper-validator-identifier": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", - "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/micromatch/node_modules/picomatch": { + "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": { - "node": ">=6.9.0" - } - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@jridgewell/remapping/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@jridgewell/remapping/node_modules/@jridgewell/gen-mapping/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", - "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", - "license": "MIT" - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@jridgewell/remapping/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@jridgewell/remapping/node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/is-glob/node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, "license": "MIT", "engines": { - "node": ">=6.0.0" + "node": ">=0.10.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/@jridgewell/remapping/node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", - "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", - "license": "MIT" - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "license": "MIT" - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", "dependencies": { - "ms": "^2.1.3" + "brace-expansion": "^2.0.2" }, "engines": { - "node": ">=6.0" + "node": ">=16 || 14 >=14.17" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/debug/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch/node_modules/brace-expansion": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.7.tgz", + "integrity": "sha512-uZbew1NqdmPDTMJ8ah1y+b+9QEJrfkXFk3RcTQw3X0jW/xRUvFKsg1CfQdSYGdTbXZWExtU3J3ccxtnfw1Fi0g==", + "dev": true, "license": "MIT", - "engines": { - "node": ">=6.9.0" + "dependencies": { + "balanced-match": "^1.0.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "license": "MIT", + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "dev": true, + "license": "ISC", "bin": { - "json5": "lib/cli.js" + "semver": "bin/semver.js" }, "engines": { - "node": ">=6" + "node": ">=10" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@svgr/babel-preset": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", - "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", + "media/demo/node_modules/@remotion/fonts": { + "version": "4.0.525", + "resolved": "https://registry.npmjs.org/@remotion/fonts/-/fonts-4.0.525.tgz", + "integrity": "sha512-/YD3zv/Q4dJh6NbSKK54uoYB8wRZBabcfIJuJnScs2OwzTh8KtK3AppAP+7BxrwPTPSInMbAA3kH+KHyO7Rmtw==", "license": "MIT", "dependencies": { - "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", - "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", - "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", - "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", - "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", - "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", - "@svgr/babel-plugin-transform-svg-component": "8.0.0" + "remotion": "4.0.525" + } + }, + "media/demo/node_modules/@remotion/media": { + "version": "4.0.525", + "resolved": "https://registry.npmjs.org/@remotion/media/-/media-4.0.525.tgz", + "integrity": "sha512-O1/l6O0MYJ+39QjUQzFeLAZEqqcQDNpVFWUDL4nb/TYrAYz5QTqurIiyxua7xG4Y1w0MR0ta4H0b655Jtmvn8w==", + "dependencies": { + "mediabunny": "1.56.1", + "remotion": "4.0.525", + "zod": "4.5.4" }, - "engines": { - "node": ">=14" + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "media/demo/node_modules/@remotion/media/node_modules/mediabunny": { + "version": "1.56.1", + "resolved": "https://registry.npmjs.org/mediabunny/-/mediabunny-1.56.1.tgz", + "integrity": "sha512-DNOm0bRBmeOxJgCK/g3LxNWbxY5morTauNdlychujGmJ9L37ezVezkNoI1WtO2Xdb4WlWWJlYfIKnOEzd5phRw==", + "license": "MPL-2.0", + "workspaces": [ + ".", + "packages/*" + ], + "dependencies": { + "@types/dom-mediacapture-transform": "^0.1.11", + "@types/dom-webcodecs": "0.1.13" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "type": "individual", + "url": "https://github.com/sponsors/Vanilagy" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@svgr/babel-preset/node_modules/@svgr/babel-plugin-add-jsx-attribute": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", - "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", + "media/demo/node_modules/@remotion/media/node_modules/mediabunny/node_modules/@types/dom-mediacapture-transform": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/@types/dom-mediacapture-transform/-/dom-mediacapture-transform-0.1.12.tgz", + "integrity": "sha512-d7/QsLRwF864A5mgIM/YrfiglHoYn7zgCcAoJgW404r+2DwnNr7EBbLnCWpmOMgH8y0te73L1AV6H1bmauaWFw==", + "license": "MIT", + "dependencies": { + "@types/dom-webcodecs": "*" + } + }, + "media/demo/node_modules/@remotion/media/node_modules/mediabunny/node_modules/@types/dom-webcodecs": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/@types/dom-webcodecs/-/dom-webcodecs-0.1.13.tgz", + "integrity": "sha512-O5hkiFIcjjszPIYyUSyvScyvrBoV3NOEEZx/pMlsu44TKzWNkLVBBxnxJz42in5n3QIolYOcBYFCPZZ0h8SkwQ==", + "license": "MIT" + }, + "media/demo/node_modules/@remotion/media/node_modules/zod": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.5.4.tgz", + "integrity": "sha512-sC95tT5iHHH9gtpj6A81kh+NEaRAUFN+qlUPDUbRfOMvNf5QCBqsb3WgvnpVtK5Y+4UfA6KqufotuTvMGiTlsA==", "license": "MIT", - "engines": { - "node": ">=14" - }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "url": "https://github.com/sponsors/colinhacks" + } + }, + "media/demo/node_modules/@remotion/transitions": { + "version": "4.0.525", + "resolved": "https://registry.npmjs.org/@remotion/transitions/-/transitions-4.0.525.tgz", + "integrity": "sha512-y6kfKvxZcfMY2J5qCWTmA/9MBE7SB8KIe4WWFvkrASps8Rz0kicFmDm2dIanKgWD/l7mZMwVKnmIlY4VBnFs5w==", + "license": "UNLICENSED", + "dependencies": { + "@remotion/paths": "4.0.525", + "@remotion/shapes": "4.0.525", + "remotion": "4.0.525" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "react": ">=16.8.0", + "react-dom": ">=16.8.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@svgr/babel-preset/node_modules/@svgr/babel-plugin-remove-jsx-attribute": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", - "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", + "media/demo/node_modules/@remotion/transitions/node_modules/@remotion/paths": { + "version": "4.0.525", + "resolved": "https://registry.npmjs.org/@remotion/paths/-/paths-4.0.525.tgz", + "integrity": "sha512-q7vFGefHukENgNf0wuAHyFXCEkp8a0OaONo5zyvrSnXYgDQUQA+yAzOfVdSvpNYHCQXUKLkRzsfgf/NUOlrA8Q==", + "license": "MIT" + }, + "media/demo/node_modules/@remotion/transitions/node_modules/@remotion/shapes": { + "version": "4.0.525", + "resolved": "https://registry.npmjs.org/@remotion/shapes/-/shapes-4.0.525.tgz", + "integrity": "sha512-hZnZuuLU/ROWcGDHJCuxKrQuFPSDBNFhd4WA1u7rqJov2Sgsn0j988p2MVzUpLyxsyJ49cbntPs8CMRuMcJGMA==", "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "dependencies": { + "@remotion/paths": "4.0.525", + "remotion": "4.0.525" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "react": ">=16.8.0", + "react-dom": ">=16.8.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@svgr/babel-preset/node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", - "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", + "media/demo/node_modules/@types/react": { + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.3.0.tgz", + "integrity": "sha512-N0rFCuH9YoxG9/m61l9MfpJKfmLOVU0em7ipIz6TRgSSkvReLB9vL85GB+yr8Bs5leqpvg96JSwF4ZS1s4viQg==", + "dev": true, "license": "MIT", - "engines": { - "node": ">=14" + "dependencies": { + "csstype": "^3.2.2" + } + }, + "media/demo/node_modules/@types/react/node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "media/demo/node_modules/@types/web": { + "version": "0.0.356", + "resolved": "https://registry.npmjs.org/@types/web/-/web-0.0.356.tgz", + "integrity": "sha512-FjE7SeW2G2It3cSeEuzxRLDZbBhiy6cmHI4506Q7hGVivabw+xz5aQBW2zoHoCWGoIrNMJAhfB7lV1SU3JZrDA==", + "dev": true, + "license": "Apache-2.0" + }, + "media/demo/node_modules/eslint": { + "version": "9.19.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.19.0.tgz", + "integrity": "sha512-ug92j0LepKlbbEv6hD911THhoRHmbdXt2gX+VDABAW/Ir7D3nqKdv5Pf5vtlyY6HQMTEP2skXY43ueqTCWssEA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.19.0", + "@eslint/core": "^0.10.0", + "@eslint/eslintrc": "^3.2.0", + "@eslint/js": "9.19.0", + "@eslint/plugin-kit": "^0.2.5", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.1", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.2.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "bin": { + "eslint": "bin/eslint.js" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@svgr/babel-preset/node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", - "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", - "license": "MIT", "engines": { - "node": ">=14" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "url": "https://eslint.org/donate" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@svgr/babel-preset/node_modules/@svgr/babel-plugin-svg-dynamic-title": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", - "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "jiti": "*" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "peerDependenciesMeta": { + "jiti": { + "optional": true + } } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@svgr/babel-preset/node_modules/@svgr/babel-plugin-svg-em-dimensions": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", - "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", + "media/demo/node_modules/eslint/node_modules/@eslint-community/eslint-utils": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", + "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==", + "dev": true, "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, "engines": { - "node": ">=14" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "url": "https://opencollective.com/eslint" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@svgr/babel-preset/node_modules/@svgr/babel-plugin-transform-react-native-svg": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", - "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", - "license": "MIT", + "media/demo/node_modules/eslint/node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=14" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "url": "https://opencollective.com/eslint" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@svgr/babel-preset/node_modules/@svgr/babel-plugin-transform-svg-component": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", - "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", + "media/demo/node_modules/eslint/node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@svgr/hast-util-to-babel-ast": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", - "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", - "license": "MIT", + "media/demo/node_modules/eslint/node_modules/@eslint/config-array": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.2.tgz", + "integrity": "sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "@babel/types": "^7.21.3", - "entities": "^4.4.0" - }, - "engines": { - "node": ">=14" + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/@svgr/hast-util-to-babel-ast/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "license": "BSD-2-Clause", "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/@svgr/plugin-jsx/node_modules/svg-parser": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.1.0.tgz", - "integrity": "sha512-bwLf38YmY+TDYHJw1Ex0Co8c4yeXuJAo8YnXGZrscxrvYoVVIvLeniEkV1Ks/54VteMnL4FtyN1+P+TZJdUPmQ==", - "license": "MIT", + "media/demo/node_modules/eslint/node_modules/@eslint/config-array/node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=8" - } - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/kiwi-schema": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/kiwi-schema/-/kiwi-schema-0.5.0.tgz", - "integrity": "sha512-X+FpfU0yTEtc6aTHS7VwbOpvQwRt70+pXXWRI5fd6CvWhe7pSVC854TVo4Zo0x5/wwcWj+/9KUlXpdcP0dY9AA==", - "license": "MIT", - "bin": { - "kiwic": "cli.js" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/memfs": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.3.tgz", - "integrity": "sha512-eivjfi7Ahr6eQTn44nvTnR60e4a1Fs1Via2kCR5lHo/kyNoiMWaXCNJ/GpSd0ilXas2JSOl9B5FTIhflXu0hlg==", - "license": "Unlicense", + "media/demo/node_modules/eslint/node_modules/@eslint/core": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.10.0.tgz", + "integrity": "sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "fs-monkey": "1.0.3" + "@types/json-schema": "^7.0.15" }, "engines": { - "node": ">= 4.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/memfs/node_modules/fs-monkey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", - "license": "Unlicense" - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "media/demo/node_modules/eslint/node_modules/@eslint/eslintrc": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.7.tgz", + "integrity": "sha512-F42g89Qd5oAWtp0k0nnSrjziAKza7w8SVT4mStc18LZMaRb4J1HQAHLCalEtDCxrTuksx7NU9qsmeLwpOfPqWw==", + "dev": true, "license": "MIT", "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" + "ajv": "^6.14.0", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.3.2", + "minimatch": "^3.1.5", + "strip-json-comments": "^3.1.1" }, "engines": { - "node": ">=12" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/open/node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "license": "MIT", - "engines": { - "node": ">=8" + "url": "https://opencollective.com/eslint" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/open/node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "media/demo/node_modules/eslint/node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/open/node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/prettier": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", - "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", + "media/demo/node_modules/eslint/node_modules/@eslint/eslintrc/node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" }, "engines": { - "node": ">=14" + "node": ">=6" }, "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/recast": { - "version": "0.23.21", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.21.tgz", - "integrity": "sha512-mFAyJq9vUbSTARLZUvAEf1z3YxlvAwswbmxMx2mPA/MSm4KmpwvwvhsH/NIrZhyOuwD60Lzyw2qh83uCbgTPYw==", + "media/demo/node_modules/eslint/node_modules/@eslint/eslintrc/node_modules/import-fresh/node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, "license": "MIT", "dependencies": { - "ast-types": "^0.16.1", - "esprima": "~4.0.0", - "source-map": "~0.6.1", - "tiny-invariant": "^1.3.3", - "tslib": "^2.0.1" + "callsites": "^3.0.0" }, "engines": { - "node": ">= 4" + "node": ">=6" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/recast/node_modules/ast-types": { - "version": "0.16.3", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.3.tgz", - "integrity": "sha512-FvWoWYfSCM6kRxCSH+MGLHIKKGRL6A6AW7Zek2O32REPQRdg131428uRTKMBYAeRd3XXAaHDS60Wpri7CdKDrA==", + "media/demo/node_modules/eslint/node_modules/@eslint/eslintrc/node_modules/import-fresh/node_modules/parent-module/node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, "license": "MIT", - "dependencies": { - "tslib": "^2.0.1" - }, "engines": { - "node": ">=4" + "node": ">=6" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/recast/node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, + "media/demo/node_modules/eslint/node_modules/@eslint/eslintrc/node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/recast/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/recast/node_modules/tiny-invariant": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", - "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", - "license": "MIT" - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/recast/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-server/node_modules/zod": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.5.4.tgz", - "integrity": "sha512-sC95tT5iHHH9gtpj6A81kh+NEaRAUFN+qlUPDUbRfOMvNf5QCBqsb3WgvnpVtK5Y+4UfA6KqufotuTvMGiTlsA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio-shared": { - "version": "4.0.525", - "resolved": "https://registry.npmjs.org/@remotion/studio-shared/-/studio-shared-4.0.525.tgz", - "integrity": "sha512-XNQdLxItSw3D7ex4yVGZAsv4lDcMfBP5S+YOotFhFQiDaP+PAheofHN/0/mqxhoAlgIh1XFvHsR6b3SXtbRfEg==", + "media/demo/node_modules/eslint/node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz", + "integrity": "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], "license": "MIT", "dependencies": { - "remotion": "4.0.525" + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "media/demo/node_modules/eslint/node_modules/@eslint/eslintrc/node_modules/js-yaml/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "media/demo/node_modules/eslint/node_modules/@eslint/eslintrc/node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "media/demo/node_modules/eslint/node_modules/@eslint/js": { + "version": "9.19.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.19.0.tgz", + "integrity": "sha512-rbq9/g38qjfqFLOVPvwjIvFFdNziEC5S65jmjPw5r6A//QH+W91akh9irMwjDN8zKUTak6W9EsAv4m/7Wnw0UQ==", + "dev": true, "license": "MIT", "engines": { - "node": ">=6.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", - "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", - "license": "MIT" - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/@remotion/canvas": { - "version": "4.0.525", - "resolved": "https://registry.npmjs.org/@remotion/canvas/-/canvas-4.0.525.tgz", - "integrity": "sha512-9cw3JMNb4IurI+1kl9SfoWBt30o4Mdh7KRKwNjNXfDAg3Jdod+xYgLl8pE2oDboDsaf1d0wM0GJLalbvkb4DFQ==", - "license": "Remotion License", + "media/demo/node_modules/eslint/node_modules/@eslint/plugin-kit": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz", + "integrity": "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "@remotion/player": "4.0.525", - "remotion": "4.0.525" + "@eslint/core": "^0.13.0", + "levn": "^0.4.1" }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/@remotion/captions": { - "version": "4.0.525", - "resolved": "https://registry.npmjs.org/@remotion/captions/-/captions-4.0.525.tgz", - "integrity": "sha512-h1kyap1MgDKRH4fJRGZLKbsgH6yhusidNyv6lBegcDZkPr8/nNtpWNBzsYSNGLDO0xfaD+1WdMsvMkpdhylc+g==", - "license": "MIT" - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/@remotion/studio-codemods": { - "version": "4.0.525", - "resolved": "https://registry.npmjs.org/@remotion/studio-codemods/-/studio-codemods-4.0.525.tgz", - "integrity": "sha512-EmPyjLEh/22dgawZGsgot/no9H9f1gDPFh0sCMEkOYSMzQkABvDyQrZL2iBAhC/KPcHWGzVUace+Q66ehoiEJw==", - "license": "MIT", - "dependencies": { - "@babel/parser": "7.24.1", - "@babel/types": "7.24.0", - "@remotion/studio-shared": "4.0.525", - "ast-types": "0.16.1", - "recast": "0.23.21", - "remotion": "4.0.525" + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/@remotion/studio-codemods/node_modules/@babel/types": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", - "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", - "license": "MIT", + "media/demo/node_modules/eslint/node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.13.0.tgz", + "integrity": "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" + "@types/json-schema": "^7.0.15" }, "engines": { - "node": ">=6.9.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/@remotion/studio-codemods/node_modules/@babel/types/node_modules/@babel/helper-string-parser": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", - "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "media/demo/node_modules/eslint/node_modules/@eslint/plugin-kit/node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, "engines": { - "node": ">=6.9.0" + "node": ">= 0.8.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/@remotion/studio-codemods/node_modules/@babel/types/node_modules/@babel/helper-validator-identifier": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", - "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "media/demo/node_modules/eslint/node_modules/@eslint/plugin-kit/node_modules/levn/node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": ">= 0.8.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/@remotion/studio-codemods/node_modules/@babel/types/node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "media/demo/node_modules/eslint/node_modules/@eslint/plugin-kit/node_modules/levn/node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, "engines": { - "node": ">=4" + "node": ">= 0.8.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/@remotion/studio-codemods/node_modules/ast-types": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz", - "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", - "license": "MIT", + "media/demo/node_modules/eslint/node_modules/@humanfs/node": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "tslib": "^2.0.1" + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" }, "engines": { - "node": ">=4" + "node": ">=18.18.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/@remotion/studio-codemods/node_modules/ast-types/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/@remotion/studio-codemods/node_modules/recast": { - "version": "0.23.21", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.21.tgz", - "integrity": "sha512-mFAyJq9vUbSTARLZUvAEf1z3YxlvAwswbmxMx2mPA/MSm4KmpwvwvhsH/NIrZhyOuwD60Lzyw2qh83uCbgTPYw==", - "license": "MIT", + "media/demo/node_modules/eslint/node_modules/@humanfs/node/node_modules/@humanfs/core": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "ast-types": "^0.16.1", - "esprima": "~4.0.0", - "source-map": "~0.6.1", - "tiny-invariant": "^1.3.3", - "tslib": "^2.0.1" + "@humanfs/types": "^0.15.0" }, "engines": { - "node": ">= 4" + "node": ">=18.18.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/@remotion/studio-codemods/node_modules/recast/node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, + "media/demo/node_modules/eslint/node_modules/@humanfs/node/node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=4" + "node": ">=18.18.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/@remotion/studio-codemods/node_modules/recast/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", + "media/demo/node_modules/eslint/node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=0.10.0" + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/@remotion/studio-codemods/node_modules/recast/node_modules/tiny-invariant": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", - "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "media/demo/node_modules/eslint/node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "media/demo/node_modules/eslint/node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, "license": "MIT" }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/@remotion/studio-codemods/node_modules/recast/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" + "media/demo/node_modules/eslint/node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/@remotion/studio-protocol": { - "version": "4.0.525", - "resolved": "https://registry.npmjs.org/@remotion/studio-protocol/-/studio-protocol-4.0.525.tgz", - "integrity": "sha512-a6IvVYa1Ok0+wpUbcs9HXi2LK/eV1O1pz428WP5CLp9rXJAbggtN1FNzjrbLLH2oKccxPBYUI6BoIPFUuxmiPA==", - "license": "Remotion License", + "media/demo/node_modules/eslint/node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", "dependencies": { - "zod": "4.5.4" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/@remotion/timeline-utils": { - "version": "4.0.525", - "resolved": "https://registry.npmjs.org/@remotion/timeline-utils/-/timeline-utils-4.0.525.tgz", - "integrity": "sha512-KLYZrj0cHhpSkLeKcvH8dG3UM6xL6SbEAUmiYi/fNSdVcZh4HP/E2zJCuTSQqHoYByUy86aMRIxUCgfsUdChbQ==", - "license": "MIT", + "media/demo/node_modules/eslint/node_modules/ajv/node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "media/demo/node_modules/eslint/node_modules/ajv/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "media/demo/node_modules/eslint/node_modules/ajv/node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "mediabunny": "1.56.1", - "remotion": "4.0.525" + "punycode": "^2.1.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/@remotion/web-renderer": { - "version": "4.0.525", - "resolved": "https://registry.npmjs.org/@remotion/web-renderer/-/web-renderer-4.0.525.tgz", - "integrity": "sha512-VJDC6M/bY4HeCIDoWY0kXyu0c7amNFq5YsB2cJsik88OEd3PRXiLJOONmnV2y3bXAiqfyu1cBR8SJGjoVDnAQw==", - "license": "SEE LICENSE IN LICENSE.md", - "dependencies": { - "@mediabunny/aac-encoder": "1.56.1", - "@mediabunny/flac-encoder": "1.56.1", - "@mediabunny/mp3-encoder": "1.56.1", - "@remotion/licensing": "4.0.525", - "mediabunny": "1.56.1", - "remotion": "4.0.525" - }, - "peerDependencies": { - "react": ">=18.0.0", - "react-dom": ">=18.0.0" + "media/demo/node_modules/eslint/node_modules/ajv/node_modules/uri-js/node_modules/punycode": { + "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" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/@remotion/web-renderer/node_modules/@mediabunny/aac-encoder": { - "version": "1.56.1", - "resolved": "https://registry.npmjs.org/@mediabunny/aac-encoder/-/aac-encoder-1.56.1.tgz", - "integrity": "sha512-a+OY/BctP7zC4G/prHikooOVaoWXMD4+bUyEwHg2dtQiQdIwC6TDJdVYJu5dfrdSNOiAFkv1HKcYEeROdwMezg==", - "license": "MPL-2.0", - "funding": { - "type": "individual", - "url": "https://github.com/sponsors/Vanilagy" + "media/demo/node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, - "peerDependencies": { - "mediabunny": "^1.0.0" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/@remotion/web-renderer/node_modules/@mediabunny/flac-encoder": { - "version": "1.56.1", - "resolved": "https://registry.npmjs.org/@mediabunny/flac-encoder/-/flac-encoder-1.56.1.tgz", - "integrity": "sha512-zbmorMVlF1izwtlz5mWnu7A1rJLM+V26I0pEFr9Td1EDTwE5uAGRSW+/UZlnjwj1t00Woe3Zonfh9kb7lRRBqg==", - "license": "MPL-2.0", - "funding": { - "type": "individual", - "url": "https://github.com/sponsors/Vanilagy" + "media/demo/node_modules/eslint/node_modules/chalk/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" }, - "peerDependencies": { - "mediabunny": "^1.0.0" + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/@remotion/web-renderer/node_modules/@mediabunny/mp3-encoder": { - "version": "1.56.1", - "resolved": "https://registry.npmjs.org/@mediabunny/mp3-encoder/-/mp3-encoder-1.56.1.tgz", - "integrity": "sha512-p66ovEq6mZt3ejje45NOju84hIJI4v8rHfsmc1D2J34ziV0USE8AdJBzmiwqxl6nZkIAQLNB19HzbVRcQfc51g==", - "license": "MPL-2.0", - "funding": { - "type": "individual", - "url": "https://github.com/sponsors/Vanilagy" + "media/demo/node_modules/eslint/node_modules/chalk/node_modules/ansi-styles/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" }, - "peerDependencies": { - "mediabunny": "^1.0.0" + "engines": { + "node": ">=7.0.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/@remotion/web-renderer/node_modules/@remotion/licensing": { - "version": "4.0.525", - "resolved": "https://registry.npmjs.org/@remotion/licensing/-/licensing-4.0.525.tgz", - "integrity": "sha512-4uNq/sgGjDIdNeJO5NWowbKkidSeZ6OTRe/L2nUh9BfS4dqnva6GCcZ8slfyiqB+YGCPpilq4LtHCTw8yhdNpw==", + "media/demo/node_modules/eslint/node_modules/chalk/node_modules/ansi-styles/node_modules/color-convert/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, "license": "MIT" }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/@remotion/zod-types": { - "version": "4.0.525", - "resolved": "https://registry.npmjs.org/@remotion/zod-types/-/zod-types-4.0.525.tgz", - "integrity": "sha512-l1pKgOQp+F1BGg3dC1Zxca5fP0UqPPHzLg6XwqTvsAy0slJQZ5AavSwWWjhGNyPSH6eb+e6X7m+7dWg34eXpLQ==", + "media/demo/node_modules/eslint/node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "license": "MIT", "dependencies": { - "remotion": "4.0.525" + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/@tanstack/react-virtual": { - "version": "3.14.9", - "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.14.9.tgz", - "integrity": "sha512-qZyr0FZDP8rDC4WBhsryIZmAd9bveJvFGUJJtskWaew6/0dTRS6wZxnR6VQ5bY2KwL3LjerrHqQLk3a0GKcPXQ==", + "media/demo/node_modules/eslint/node_modules/chalk/node_modules/supports-color/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "media/demo/node_modules/eslint/node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, "license": "MIT", "dependencies": { - "@tanstack/virtual-core": "3.17.7" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + "engines": { + "node": ">= 8" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/@tanstack/react-virtual/node_modules/@tanstack/virtual-core": { - "version": "3.17.7", - "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.17.7.tgz", - "integrity": "sha512-bp+v10y65sp2H7WpWfIMyxTNfl8ZVfxFTLRjPIFRryi6FV/J33z4IS53WO4pTk36KlvJ4iLiQz+oaydDC1xbcA==", + "media/demo/node_modules/eslint/node_modules/cross-spawn/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" + "engines": { + "node": ">=8" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/mediabunny": { - "version": "1.56.1", - "resolved": "https://registry.npmjs.org/mediabunny/-/mediabunny-1.56.1.tgz", - "integrity": "sha512-DNOm0bRBmeOxJgCK/g3LxNWbxY5morTauNdlychujGmJ9L37ezVezkNoI1WtO2Xdb4WlWWJlYfIKnOEzd5phRw==", - "license": "MPL-2.0", - "workspaces": [ - ".", - "packages/*" - ], + "media/demo/node_modules/eslint/node_modules/cross-spawn/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", "dependencies": { - "@types/dom-mediacapture-transform": "^0.1.11", - "@types/dom-webcodecs": "0.1.13" + "shebang-regex": "^3.0.0" }, - "funding": { - "type": "individual", - "url": "https://github.com/sponsors/Vanilagy" + "engines": { + "node": ">=8" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/mediabunny/node_modules/@types/dom-mediacapture-transform": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/@types/dom-mediacapture-transform/-/dom-mediacapture-transform-0.1.12.tgz", - "integrity": "sha512-d7/QsLRwF864A5mgIM/YrfiglHoYn7zgCcAoJgW404r+2DwnNr7EBbLnCWpmOMgH8y0te73L1AV6H1bmauaWFw==", + "media/demo/node_modules/eslint/node_modules/cross-spawn/node_modules/shebang-command/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, "license": "MIT", - "dependencies": { - "@types/dom-webcodecs": "*" + "engines": { + "node": ">=8" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/mediabunny/node_modules/@types/dom-webcodecs": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/@types/dom-webcodecs/-/dom-webcodecs-0.1.13.tgz", - "integrity": "sha512-O5hkiFIcjjszPIYyUSyvScyvrBoV3NOEEZx/pMlsu44TKzWNkLVBBxnxJz42in5n3QIolYOcBYFCPZZ0h8SkwQ==", - "license": "MIT" - }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/memfs": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.3.tgz", - "integrity": "sha512-eivjfi7Ahr6eQTn44nvTnR60e4a1Fs1Via2kCR5lHo/kyNoiMWaXCNJ/GpSd0ilXas2JSOl9B5FTIhflXu0hlg==", - "license": "Unlicense", + "media/demo/node_modules/eslint/node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", "dependencies": { - "fs-monkey": "1.0.3" + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" }, "engines": { - "node": ">= 4.0.0" + "node": ">= 8" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/memfs/node_modules/fs-monkey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", - "license": "Unlicense" + "media/demo/node_modules/eslint/node_modules/cross-spawn/node_modules/which/node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "media/demo/node_modules/eslint/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, "license": "MIT", "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" + "ms": "^2.1.3" }, "engines": { - "node": ">=12" + "node": ">=6.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/open/node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "media/demo/node_modules/eslint/node_modules/debug/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "media/demo/node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/open/node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "license": "MIT", - "bin": { - "is-docker": "cli.js" + "media/demo/node_modules/eslint/node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, "engines": { - "node": ">=8" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/eslint" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/open/node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "license": "MIT", + "media/demo/node_modules/eslint/node_modules/eslint-scope/node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "is-docker": "^2.0.0" + "estraverse": "^5.2.0" }, "engines": { - "node": ">=8" + "node": ">=4.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/prismjs": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", - "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", - "license": "MIT", + "media/demo/node_modules/eslint/node_modules/eslint-scope/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", "engines": { - "node": ">=6" + "node": ">=4.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/@remotion/studio/node_modules/zod": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.5.4.tgz", - "integrity": "sha512-sC95tT5iHHH9gtpj6A81kh+NEaRAUFN+qlUPDUbRfOMvNf5QCBqsb3WgvnpVtK5Y+4UfA6KqufotuTvMGiTlsA==", - "license": "MIT", + "media/demo/node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, "funding": { - "url": "https://github.com/sponsors/colinhacks" + "url": "https://opencollective.com/eslint" } }, - "media/demo/node_modules/@remotion/cli/node_modules/dotenv": { - "version": "17.3.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.3.1.tgz", - "integrity": "sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA==", + "media/demo/node_modules/eslint/node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, "engines": { - "node": ">=12" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "media/demo/node_modules/eslint/node_modules/espree/node_modules/acorn": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" }, - "funding": { - "url": "https://dotenvx.com" + "engines": { + "node": ">=0.4.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "license": "MIT" - }, - "media/demo/node_modules/@remotion/cli/node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "media/demo/node_modules/eslint/node_modules/espree/node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "media/demo/node_modules/eslint/node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" + "estraverse": "^5.1.0" }, "engines": { - "node": ">= 6" + "node": ">=0.10" } }, - "media/demo/node_modules/@remotion/cli/node_modules/prompts/node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "license": "MIT", + "media/demo/node_modules/eslint/node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", "engines": { - "node": ">=6" + "node": ">=4.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/prompts/node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "media/demo/node_modules/eslint/node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "media/demo/node_modules/eslint/node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, "license": "MIT" }, - "media/demo/node_modules/@remotion/cli/node_modules/semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", - "license": "ISC", + "media/demo/node_modules/eslint/node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "flat-cache": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">=16.0.0" } }, - "media/demo/node_modules/@remotion/cli/node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "license": "ISC", + "media/demo/node_modules/eslint/node_modules/file-entry-cache/node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", "dependencies": { - "yallist": "^4.0.0" + "flatted": "^3.2.9", + "keyv": "^4.5.4" }, "engines": { - "node": ">=10" + "node": ">=16" } }, - "media/demo/node_modules/@remotion/cli/node_modules/semver/node_modules/lru-cache/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "media/demo/node_modules/eslint/node_modules/file-entry-cache/node_modules/flat-cache/node_modules/flatted": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz", + "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==", + "dev": true, "license": "ISC" }, - "media/demo/node_modules/@remotion/eslint-config-flat": { - "version": "4.0.525", - "resolved": "https://registry.npmjs.org/@remotion/eslint-config-flat/-/eslint-config-flat-4.0.525.tgz", - "integrity": "sha512-seTVOdlpszP+8RLk7E6SWWOO7IV3ia5CiHwvtkUNFL94HpmZHEkFiOd8TO+9uRTSd0F97xVNoeYmQ3vw5cqyYg==", + "media/demo/node_modules/eslint/node_modules/file-entry-cache/node_modules/flat-cache/node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "typescript-eslint": "8.21.0" - }, - "peerDependencies": { - "eslint": ">=9" + "json-buffer": "3.0.1" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", - "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", + "media/demo/node_modules/eslint/node_modules/file-entry-cache/node_modules/flat-cache/node_modules/keyv/node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true, - "license": "Apache-2.0", - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } + "license": "MIT" }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.21.0.tgz", - "integrity": "sha512-txEKYY4XMKwPXxNkN8+AxAdX6iIJAPiJbHE/FpQccs/sxw8Lf26kqwC3cn0xkHlW8kEbLhkhCsjWuMveaY9Rxw==", + "media/demo/node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.21.0", - "@typescript-eslint/parser": "8.21.0", - "@typescript-eslint/utils": "8.21.0" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" + "url": "https://github.com/sponsors/sindresorhus" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.21.0.tgz", - "integrity": "sha512-eTH+UOR4I7WbdQnG4Z48ebIA6Bgi7WO8HvFEneeYBxG8qCOYgTOFPSg6ek9ITIDvGjDQzWHcoWHCDO2biByNzA==", + "media/demo/node_modules/eslint/node_modules/find-up/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.21.0", - "@typescript-eslint/type-utils": "8.21.0", - "@typescript-eslint/utils": "8.21.0", - "@typescript-eslint/visitor-keys": "8.21.0", - "graphemer": "^1.4.0", - "ignore": "^5.3.1", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.0.0" + "p-locate": "^5.0.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" + "url": "https://github.com/sponsors/sindresorhus" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@eslint-community/regexpp": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", - "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "media/demo/node_modules/eslint/node_modules/find-up/node_modules/locate-path/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.21.0.tgz", - "integrity": "sha512-G3IBKz0/0IPfdeGRMbp+4rbjfSSdnGkXsM/pFZA8zM9t9klXDnB/YnKOBQ0GoPmoROa4bCq2NeHgJa5ydsQ4mA==", + "media/demo/node_modules/eslint/node_modules/find-up/node_modules/locate-path/node_modules/p-locate/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.21.0", - "@typescript-eslint/visitor-keys": "8.21.0" + "yocto-queue": "^0.1.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://github.com/sponsors/sindresorhus" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager/node_modules/@typescript-eslint/types": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.21.0.tgz", - "integrity": "sha512-PAL6LUuQwotLW2a8VsySDBwYMm129vFm4tMVlylzdoTybTHaAi0oBp7Ac6LhSrHHOdLM3efH+nAR6hAWoMF89A==", + "media/demo/node_modules/eslint/node_modules/find-up/node_modules/locate-path/node_modules/p-locate/node_modules/p-limit/node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, "license": "MIT", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://github.com/sponsors/sindresorhus" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.21.0.tgz", - "integrity": "sha512-95OsL6J2BtzoBxHicoXHxgk3z+9P3BEcQTpBKriqiYzLKnM2DeSqs+sndMKdamU8FosiadQFT3D+BSL9EKnAJQ==", + "media/demo/node_modules/eslint/node_modules/find-up/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "media/demo/node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", "dependencies": { - "@typescript-eslint/typescript-estree": "8.21.0", - "@typescript-eslint/utils": "8.21.0", - "debug": "^4.3.4", - "ts-api-utils": "^2.0.0" + "is-glob": "^4.0.3" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" + "node": ">=10.13.0" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.21.0.tgz", - "integrity": "sha512-x+aeKh/AjAArSauz0GiQZsjT8ciadNMHdkUSwBB9Z6PrKc/4knM4g3UfHml6oDJmKC88a6//cdxnO/+P2LkMcg==", + "media/demo/node_modules/eslint/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.21.0", - "@typescript-eslint/visitor-keys": "8.21.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.0.0" - }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <5.8.0" + "node": ">= 4" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/types": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.21.0.tgz", - "integrity": "sha512-PAL6LUuQwotLW2a8VsySDBwYMm129vFm4tMVlylzdoTybTHaAi0oBp7Ac6LhSrHHOdLM3efH+nAR6hAWoMF89A==", + "media/demo/node_modules/eslint/node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, "license": "MIT", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=0.8.19" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "media/demo/node_modules/eslint/node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "license": "MIT", "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" + "is-extglob": "^2.1.1" }, "engines": { - "node": ">=8.6.0" + "node": ">=0.10.0" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "media/demo/node_modules/eslint/node_modules/is-glob/node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, "license": "MIT", "engines": { - "node": ">= 8" + "node": ">=0.10.0" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "media/demo/node_modules/eslint/node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true, - "license": "MIT", + "license": "MIT" + }, + "media/demo/node_modules/eslint/node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "media/demo/node_modules/eslint/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">= 8" + "node": "*" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/@nodelib/fs.walk/node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "media/demo/node_modules/eslint/node_modules/minimatch/node_modules/brace-expansion": { + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.21.tgz", + "integrity": "sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==", "dev": true, "license": "MIT", "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/@nodelib/fs.walk/node_modules/@nodelib/fs.scandir/node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "media/demo/node_modules/eslint/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "media/demo/node_modules/eslint/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "media/demo/node_modules/eslint/node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "media/demo/node_modules/eslint/node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, - "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", "dependencies": { - "queue-microtask": "^1.2.2" + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/@nodelib/fs.walk/node_modules/@nodelib/fs.scandir/node_modules/run-parallel/node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "media/demo/node_modules/eslint/node_modules/optionator/node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true, - "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" }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/@nodelib/fs.walk/node_modules/fastq": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.3.tgz", - "integrity": "sha512-XKv5nnLs6nLF71NgiKJLIZFLkPyIEuOselLG7ujZnGrRfQK8HpvY+WqKhAJUAdLomwVHErVS4LfxFlPq0/FTAw==", + "media/demo/node_modules/eslint/node_modules/optionator/node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true, - "license": "ISC", + "license": "MIT" + }, + "media/demo/node_modules/eslint/node_modules/optionator/node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", "dependencies": { - "reusify": "^1.0.4" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/@nodelib/fs.walk/node_modules/fastq/node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "media/demo/node_modules/eslint/node_modules/optionator/node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, "license": "MIT", "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "node": ">= 0.8.0" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "media/demo/node_modules/eslint/node_modules/optionator/node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "is-glob": "^4.0.1" + "prelude-ls": "^1.2.1" }, "engines": { - "node": ">= 6" + "node": ">= 0.8.0" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "media/demo/node_modules/eslint/node_modules/optionator/node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, "license": "MIT", "engines": { - "node": ">= 8" + "node": ">=0.10.0" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "media/demo/node_modules/prettier": { + "version": "3.9.7", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.7.tgz", + "integrity": "sha512-T3mF5P7HFzZVLDQuCUNtJj6WK1pcpLMweMNUVwGb01bLNkH9AkKxtZvmInw8K6bnn2O3d6/5RHl6zSHiBAD0Og==", "dev": true, "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" + "bin": { + "prettier": "bin/prettier.cjs" }, "engines": { - "node": ">=8.6" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/micromatch/node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, + "media/demo/node_modules/react": { + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.3.0.tgz", + "integrity": "sha512-E8LUcbtBWt20bbl2YoHfx4ZDBdxVTfOKtCZn9cDSJ4l6/nuoApcpIBcj47t2wZoVX8g2ZHuMHbiShgCR1T5Sog==", "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/micromatch/node_modules/braces/node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, + "media/demo/node_modules/react-dom": { + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.3.0.tgz", + "integrity": "sha512-JDk8dgif51OjFoDE70+OT9ICyYr+69HlmihNwp1+Nsfbna3t5sIiCa9ZJktDmQ4/1b/rn26hIAR2uYXDMr5r0Q==", "license": "MIT", "dependencies": { - "to-regex-range": "^5.0.1" + "scheduler": "^0.28.0" + }, + "peerDependencies": { + "react": "^19.3.0" + } + }, + "media/demo/node_modules/react-dom/node_modules/scheduler": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.28.0.tgz", + "integrity": "sha512-juorfCmIkIw8tT+p5BXSm6PJjQF/ycEYmKyzURCIt/RaZIhL+PulbQ9Yu2z1HdOJDdqDTlxA1+xKBmHXJsczAw==", + "license": "MIT" + }, + "media/demo/node_modules/remotion": { + "version": "4.0.525", + "resolved": "https://registry.npmjs.org/remotion/-/remotion-4.0.525.tgz", + "integrity": "sha512-A/Hrt0MytCza0gOSVZrIZ+tSTx296VEW0ISGt+xNWN8+ik1i1xSAwlRcA+8Zb+NoFgddyozfldto5Azq4uWfeA==", + "license": "SEE LICENSE IN LICENSE.md", + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "media/demo/node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, "engines": { - "node": ">=8" + "node": ">=14.17" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/micromatch/node_modules/braces/node_modules/fill-range/node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", + "node_modules/@conn/brand": { + "resolved": "packages/brand", + "link": true + }, + "node_modules/@conn/collaboration-tests": { + "resolved": "tests/collaboration", + "link": true + }, + "node_modules/@conn/themes": { + "resolved": "packages/themes", + "link": true + }, + "node_modules/@conn/ui": { + "resolved": "packages/ui", + "link": true + }, + "node_modules/@conn/web": { + "resolved": "frontends/web", + "link": true + }, + "node_modules/conn-demo": { + "resolved": "media/demo", + "link": true + }, + "node_modules/conn-desktop": { + "resolved": "frontends/tauri", + "link": true + }, + "node_modules/conn-site": { + "resolved": "site", + "link": true + }, + "packages/brand": { + "name": "@conn/brand", + "version": "0.0.0" + }, + "packages/themes": { + "name": "@conn/themes", + "version": "0.0.0" + }, + "packages/ui": { + "name": "@conn/ui", + "version": "0.8.7", "dependencies": { - "is-number": "^7.0.0" + "@conn/brand": "*", + "@conn/themes": "*", + "@xterm/addon-fit": "^0.11.0", + "@xterm/addon-unicode11": "0.9.0", + "@xterm/xterm": "^6.0.0" }, - "engines": { - "node": ">=8.0" + "devDependencies": { + "@sveltejs/vite-plugin-svelte": "^5.1.1", + "@tsconfig/svelte": "^5.0.8", + "playwright": "1.63.0", + "svelte": "^5.57.0", + "svelte-check": "^4.7.6", + "typescript": "^5.6.0", + "vite": "^6.0.0" + }, + "peerDependencies": { + "svelte": "^5.57.0" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/micromatch/node_modules/braces/node_modules/fill-range/node_modules/to-regex-range/node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "packages/ui/node_modules/@sveltejs/vite-plugin-svelte": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-5.1.1.tgz", + "integrity": "sha512-Y1Cs7hhTc+a5E9Va/xwKlAJoariQyHY+5zBgCZg4PFWNYQ1nMN9sjK1zhw1gK69DuqVP++sht/1GZg1aRwmAXQ==", "dev": true, "license": "MIT", + "dependencies": { + "@sveltejs/vite-plugin-svelte-inspector": "^4.0.1", + "debug": "^4.4.1", + "deepmerge": "^4.3.1", + "kleur": "^4.1.5", + "magic-string": "^0.30.17", + "vitefu": "^1.0.6" + }, "engines": { - "node": ">=0.12.0" + "node": "^18.0.0 || ^20.0.0 || >=22" + }, + "peerDependencies": { + "svelte": "^5.0.0", + "vite": "^6.0.0" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "packages/ui/node_modules/@sveltejs/vite-plugin-svelte/node_modules/@sveltejs/vite-plugin-svelte-inspector": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-4.0.1.tgz", + "integrity": "sha512-J/Nmb2Q2y7mck2hyCX4ckVHcR5tu2J+MtBEQqpDrrgELZ2uvraQcK/ioCV61AqkdXFgriksOKIceDcQmqnGhVw==", "dev": true, "license": "MIT", + "dependencies": { + "debug": "^4.3.7" + }, "engines": { - "node": ">=8.6" + "node": "^18.0.0 || ^20.0.0 || >=22" }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "peerDependencies": { + "@sveltejs/vite-plugin-svelte": "^5.0.0", + "svelte": "^5.0.0", + "vite": "^6.0.0" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree/node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "packages/ui/node_modules/@sveltejs/vite-plugin-svelte/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", "dependencies": { - "is-extglob": "^2.1.1" + "ms": "^2.1.3" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree/node_modules/is-glob/node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "packages/ui/node_modules/@sveltejs/vite-plugin-svelte/node_modules/debug/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "packages/ui/node_modules/@sveltejs/vite-plugin-svelte/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==", "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", - "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "packages/ui/node_modules/@sveltejs/vite-plugin-svelte/node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.2" - }, + "license": "MIT", "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=6" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch/node_modules/brace-expansion": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.7.tgz", - "integrity": "sha512-uZbew1NqdmPDTMJ8ah1y+b+9QEJrfkXFk3RcTQw3X0jW/xRUvFKsg1CfQdSYGdTbXZWExtU3J3ccxtnfw1Fi0g==", + "packages/ui/node_modules/@sveltejs/vite-plugin-svelte/node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "@jridgewell/sourcemap-codec": "^1.5.5" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "packages/ui/node_modules/@sveltejs/vite-plugin-svelte/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT" + }, + "packages/ui/node_modules/@sveltejs/vite-plugin-svelte/node_modules/vitefu": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.3.tgz", + "integrity": "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==", "dev": true, "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" + "workspaces": [ + "tests/deps/*", + "tests/projects/*", + "tests/projects/workspace/packages/*" + ], + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { - "supports-color": { + "vite": { "optional": true } } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/debug/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "packages/ui/node_modules/@tsconfig/svelte": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@tsconfig/svelte/-/svelte-5.0.8.tgz", + "integrity": "sha512-UkNnw1/oFEfecR8ypyHIQuWYdkPvHiwcQ78sh+ymIiYoF+uc5H1UBetbjyqT+vgGJ3qQN6nhucJviX6HesWtKQ==", "dev": true, "license": "MIT" }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.21.0.tgz", - "integrity": "sha512-BkLMNpdV6prozk8LlyK/SOoWLmUFi+ZD+pcqti9ILCbVvHGk1ui1g4jJOc2WDLaeExz2qWwojxlPce5PljcT3w==", - "dev": true, + "packages/ui/node_modules/@xterm/addon-fit": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@xterm/addon-fit/-/addon-fit-0.11.0.tgz", + "integrity": "sha512-jYcgT6xtVYhnhgxh3QgYDnnNMYTcf8ElbxxFzX0IZo+vabQqSPAjC3c1wJrKB5E19VwQei89QCiZZP86DCPF7g==", + "license": "MIT" + }, + "packages/ui/node_modules/@xterm/addon-unicode11": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@xterm/addon-unicode11/-/addon-unicode11-0.9.0.tgz", + "integrity": "sha512-FxDnYcyuXhNl+XSqGZL/t0U9eiNb/q3EWT5rYkQT/zuig8Gz/VagnQANKHdDWFM2lTMk9ly0EFQxxxtZUoRetw==", + "license": "MIT" + }, + "packages/ui/node_modules/@xterm/xterm": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@xterm/xterm/-/xterm-6.0.0.tgz", + "integrity": "sha512-TQwDdQGtwwDt+2cgKDLn0IRaSxYu1tSUjgKarSDkUM0ZNiSRXFpjxEsvc/Zgc5kq5omJ+V0a8/kIM2WD3sMOYg==", "license": "MIT", + "workspaces": [ + "addons/*" + ] + }, + "packages/ui/node_modules/playwright": { + "version": "1.63.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.63.0.tgz", + "integrity": "sha512-+7ziBLidS4NaNCdt57SUDT+wYmmd5fmiQejUic/kb+YsYSCPyOOE9sebzMjNmQrsnNpDJqd4WHvV/8lfKfUDUg==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "@typescript-eslint/types": "8.21.0", - "eslint-visitor-keys": "^4.2.0" + "playwright-core": "1.63.0" }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "bin": { + "playwright": "cli.js" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys/node_modules/@typescript-eslint/types": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.21.0.tgz", - "integrity": "sha512-PAL6LUuQwotLW2a8VsySDBwYMm129vFm4tMVlylzdoTybTHaAi0oBp7Ac6LhSrHHOdLM3efH+nAR6hAWoMF89A==", - "dev": true, - "license": "MIT", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=20" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "packages/ui/node_modules/playwright/node_modules/playwright-core": { + "version": "1.63.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.63.0.tgz", + "integrity": "sha512-rYCsBF/M5HjUch52bbtVONEFjv6Xu8sm8h72dNlR5bzIE1fvC/bxgspzkjSfU+MweEMmPM8KJebG6nnyxo5mCg==", "dev": true, "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "bin": { + "playwright-core": "cli.js" }, - "funding": { - "url": "https://opencollective.com/eslint" + "engines": { + "node": ">=20" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true, - "license": "MIT" - }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "packages/ui/node_modules/svelte": { + "version": "5.57.1", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.57.1.tgz", + "integrity": "sha512-Uqj49lWKB+iSSnneuwiYYJ7MZgkB+eXr0LXBhv4uDuAkXqnWmq65Sxflfvp0Lc6MdKjMUxGaeOKWJqz5SNiVIA==", "dev": true, "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "@jridgewell/sourcemap-codec": "^1.6.0", + "@sveltejs/acorn-typescript": "^1.0.13", + "@types/estree": "^1.0.9", + "acorn": "^8.18.0", + "aria-query": "5.3.1", + "axobject-query": "^4.1.0", + "clsx": "^2.1.1", + "devalue": "^5.9.2", + "esm-env": "^1.2.1", + "esrap": "^2.3.6", + "is-reference": "^3.0.3", + "locate-character": "^3.0.0", + "magic-string": "^0.30.11", + "zimmerframe": "^1.1.2" + }, "engines": { - "node": ">= 4" + "node": ">=18" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" - }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin/node_modules/ts-api-utils": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", - "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "packages/ui/node_modules/svelte-check": { + "version": "4.7.6", + "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-4.7.6.tgz", + "integrity": "sha512-t2scM//ZuVbSY/T2w6FSBw1v9s2NEmh/g+sy1lqtosW5ylBV5AF4wFb1Ts9Kf3MbfPDUDJDZ9L436YT0SPTdvw==", "dev": true, "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "@sveltejs/load-config": "^0.2.3", + "chokidar": "^4.0.1", + "fdir": "^6.2.0", + "picocolors": "^1.0.0", + "sade": "^1.7.4" + }, + "bin": { + "svelte-check": "bin/svelte-check" + }, "engines": { - "node": ">=18.12" + "node": ">= 18.0.0" }, "peerDependencies": { - "typescript": ">=4.8.4" + "svelte": "^4.0.0 || ^5.0.0-next.0", + "typescript": "^5.0.0 || ^6.0.0" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.21.0.tgz", - "integrity": "sha512-Wy+/sdEH9kI3w9civgACwabHbKl+qIOu0uFZ9IMKzX3Jpv9og0ZBJrZExGrPpFAY7rWsXuxs5e7CPPP17A4eYA==", + "packages/ui/node_modules/svelte-check/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.21.0", - "@typescript-eslint/types": "8.21.0", - "@typescript-eslint/typescript-estree": "8.21.0", - "@typescript-eslint/visitor-keys": "8.21.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.21.0.tgz", - "integrity": "sha512-G3IBKz0/0IPfdeGRMbp+4rbjfSSdnGkXsM/pFZA8zM9t9klXDnB/YnKOBQ0GoPmoROa4bCq2NeHgJa5ydsQ4mA==", + "packages/ui/node_modules/svelte-check/node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.21.0", - "@typescript-eslint/visitor-keys": "8.21.0" - }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=6.0.0" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.21.0.tgz", - "integrity": "sha512-PAL6LUuQwotLW2a8VsySDBwYMm129vFm4tMVlylzdoTybTHaAi0oBp7Ac6LhSrHHOdLM3efH+nAR6hAWoMF89A==", + "packages/ui/node_modules/svelte-check/node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", + "dev": true, + "license": "MIT" + }, + "packages/ui/node_modules/svelte-check/node_modules/@sveltejs/load-config": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@sveltejs/load-config/-/load-config-0.2.3.tgz", + "integrity": "sha512-VT3qmUb8pRV2QrZjd8iAmtg8lf4W0TIjZbvXtz5MKei/q96teWZgGJyyidJzOjzZzvdq616eSRVeMYIQChUTAQ==", "dev": true, "license": "MIT", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">= 18.0.0" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.21.0.tgz", - "integrity": "sha512-x+aeKh/AjAArSauz0GiQZsjT8ciadNMHdkUSwBB9Z6PrKc/4knM4g3UfHml6oDJmKC88a6//cdxnO/+P2LkMcg==", + "packages/ui/node_modules/svelte-check/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.21.0", - "@typescript-eslint/visitor-keys": "8.21.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.0.0" + "readdirp": "^4.0.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">= 14.16.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <5.8.0" + "url": "https://paulmillr.com/funding/" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, + "packages/ui/node_modules/svelte-check/node_modules/chokidar/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=8.6.0" + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "packages/ui/node_modules/svelte-check/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": ">= 8" + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "packages/ui/node_modules/svelte-check/node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "packages/ui/node_modules/svelte-check/node_modules/sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", "dev": true, "license": "MIT", "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "mri": "^1.1.0" }, "engines": { - "node": ">= 8" + "node": ">=6" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/@nodelib/fs.walk/node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "packages/ui/node_modules/svelte-check/node_modules/sade/node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", "dev": true, "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, "engines": { - "node": ">= 8" + "node": ">=4" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/@nodelib/fs.walk/node_modules/@nodelib/fs.scandir/node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "packages/ui/node_modules/svelte/node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", "dev": true, - "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", "dependencies": { - "queue-microtask": "^1.2.2" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/@nodelib/fs.walk/node_modules/@nodelib/fs.scandir/node_modules/run-parallel/node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "packages/ui/node_modules/svelte/node_modules/@jridgewell/remapping/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "dev": true, - "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" + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/@nodelib/fs.walk/node_modules/fastq": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.3.tgz", - "integrity": "sha512-XKv5nnLs6nLF71NgiKJLIZFLkPyIEuOselLG7ujZnGrRfQK8HpvY+WqKhAJUAdLomwVHErVS4LfxFlPq0/FTAw==", + "packages/ui/node_modules/svelte/node_modules/@jridgewell/remapping/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "reusify": "^1.0.4" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/@nodelib/fs.walk/node_modules/fastq/node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "packages/ui/node_modules/svelte/node_modules/@jridgewell/remapping/node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, "license": "MIT", "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "node": ">=6.0.0" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "packages/ui/node_modules/svelte/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } + "license": "MIT" }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "packages/ui/node_modules/svelte/node_modules/@sveltejs/acorn-typescript": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.13.tgz", + "integrity": "sha512-wgKggnhZVL9Bfx1OaKKTrYY9BFRk6C8UAkQNUcIv1+llzYrIqy+RZm5HPKzn0NpEBvTVhTqB4kQyllZywsRBRQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 8" + "peerDependencies": { + "acorn": "^8.9.0" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "packages/ui/node_modules/svelte/node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } + "license": "MIT" }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/micromatch/node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "packages/ui/node_modules/svelte/node_modules/acorn": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", "dev": true, "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" + "bin": { + "acorn": "bin/acorn" }, "engines": { - "node": ">=8" + "node": ">=0.4.0" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/micromatch/node_modules/braces/node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "packages/ui/node_modules/svelte/node_modules/aria-query": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.1.tgz", + "integrity": "sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g==", "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, + "license": "Apache-2.0", "engines": { - "node": ">=8" + "node": ">= 0.4" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/micromatch/node_modules/braces/node_modules/fill-range/node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "packages/ui/node_modules/svelte/node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, + "license": "Apache-2.0", "engines": { - "node": ">=8.0" + "node": ">= 0.4" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/micromatch/node_modules/braces/node_modules/fill-range/node_modules/to-regex-range/node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "packages/ui/node_modules/svelte/node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.12.0" + "node": ">=6" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "packages/ui/node_modules/svelte/node_modules/devalue": { + "version": "5.9.4", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.9.4.tgz", + "integrity": "sha512-sPAT4pztbu6586/hrhOnMKS17IJrvg12mXiSPSS3W5qDeN2RGgvZ0diZCm31dBbnevfVmujNO3IM2wrS4Y2Rhg==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } + "license": "MIT" }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree/node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "packages/ui/node_modules/svelte/node_modules/esm-env": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz", + "integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==", + "dev": true, + "license": "MIT" + }, + "packages/ui/node_modules/svelte/node_modules/esrap": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/esrap/-/esrap-2.3.8.tgz", + "integrity": "sha512-0yrRvyjiH1EWLIEPb0i26mEnOYsXgIjG77muq3LMJH/dpmp+ctFEEHF8jjGBQAdhwgrKfN74CohbJTMFIaJcMw==", "dev": true, "license": "MIT", "dependencies": { - "is-extglob": "^2.1.1" + "@jridgewell/sourcemap-codec": "^1.4.15" }, - "engines": { - "node": ">=0.10.0" + "peerDependencies": { + "@typescript-eslint/types": "^8.2.0" + }, + "peerDependenciesMeta": { + "@typescript-eslint/types": { + "optional": true + } } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree/node_modules/is-glob/node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "packages/ui/node_modules/svelte/node_modules/is-reference": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz", + "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "@types/estree": "^1.0.6" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", - "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "packages/ui/node_modules/svelte/node_modules/locate-character": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", + "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.2" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } + "license": "MIT" }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch/node_modules/brace-expansion": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.7.tgz", - "integrity": "sha512-uZbew1NqdmPDTMJ8ah1y+b+9QEJrfkXFk3RcTQw3X0jW/xRUvFKsg1CfQdSYGdTbXZWExtU3J3ccxtnfw1Fi0g==", + "packages/ui/node_modules/svelte/node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "@jridgewell/sourcemap-codec": "^1.5.5" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "packages/ui/node_modules/svelte/node_modules/zimmerframe": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.5.tgz", + "integrity": "sha512-msJxIvYDYcoNL+PJsu+7qmpDWsYmAxTY+2TNYXXF0hzBzBk0BMecOqDOG/EckUoKCuKwObfbugIl8QpqHDXeFA==", "dev": true, "license": "MIT" }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "packages/ui/node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, - "license": "ISC", + "license": "Apache-2.0", "bin": { - "semver": "bin/semver.js" + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, "engines": { - "node": ">=10" - } - }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree/node_modules/ts-api-utils": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", - "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.12" - }, - "peerDependencies": { - "typescript": ">=4.8.4" + "node": ">=14.17" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.21.0.tgz", - "integrity": "sha512-BkLMNpdV6prozk8LlyK/SOoWLmUFi+ZD+pcqti9ILCbVvHGk1ui1g4jJOc2WDLaeExz2qWwojxlPce5PljcT3w==", + "packages/ui/node_modules/vite": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.3.tgz", + "integrity": "sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.21.0", - "eslint-visitor-keys": "^4.2.0" + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "bin": { + "vite": "bin/vite.js" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, - "license": "Apache-2.0", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" + "url": "https://github.com/vitejs/vite?sponsor=1" }, - "engines": { - "node": ">=6.0" + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" }, "peerDependenciesMeta": { - "supports-color": { + "@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 } } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/parser/node_modules/debug/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.21.0.tgz", - "integrity": "sha512-xcXBfcq0Kaxgj7dwejMbFyq7IOHgpNMtVuDveK7w3ZGwG9owKzhALVwKpTF2yrZmEwl9SWdetf3fxNzJQaVuxw==", + "packages/ui/node_modules/vite/node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", "dev": true, + "hasInstallScript": true, "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.21.0", - "@typescript-eslint/types": "8.21.0", - "@typescript-eslint/typescript-estree": "8.21.0" + "bin": { + "esbuild": "bin/esbuild" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=18" }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@eslint-community/eslint-utils": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", - "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==", + "packages/ui/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], "dev": true, "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, + "optional": true, + "os": [ + "aix" + ], "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + "node": ">=18" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "packages/ui/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], "dev": true, - "license": "Apache-2.0", + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=18" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.21.0.tgz", - "integrity": "sha512-G3IBKz0/0IPfdeGRMbp+4rbjfSSdnGkXsM/pFZA8zM9t9klXDnB/YnKOBQ0GoPmoROa4bCq2NeHgJa5ydsQ4mA==", + "packages/ui/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.21.0", - "@typescript-eslint/visitor-keys": "8.21.0" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=18" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.21.0.tgz", - "integrity": "sha512-BkLMNpdV6prozk8LlyK/SOoWLmUFi+ZD+pcqti9ILCbVvHGk1ui1g4jJOc2WDLaeExz2qWwojxlPce5PljcT3w==", + "packages/ui/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.21.0", - "eslint-visitor-keys": "^4.2.0" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=18" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager/node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "packages/ui/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "Apache-2.0", + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=18" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.21.0.tgz", - "integrity": "sha512-PAL6LUuQwotLW2a8VsySDBwYMm129vFm4tMVlylzdoTybTHaAi0oBp7Ac6LhSrHHOdLM3efH+nAR6hAWoMF89A==", + "packages/ui/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=18" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.21.0.tgz", - "integrity": "sha512-x+aeKh/AjAArSauz0GiQZsjT8ciadNMHdkUSwBB9Z6PrKc/4knM4g3UfHml6oDJmKC88a6//cdxnO/+P2LkMcg==", + "packages/ui/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.21.0", - "@typescript-eslint/visitor-keys": "8.21.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.0.0" - }, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <5.8.0" + "node": ">=18" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.21.0.tgz", - "integrity": "sha512-BkLMNpdV6prozk8LlyK/SOoWLmUFi+ZD+pcqti9ILCbVvHGk1ui1g4jJOc2WDLaeExz2qWwojxlPce5PljcT3w==", + "packages/ui/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.21.0", - "eslint-visitor-keys": "^4.2.0" - }, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=18" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "packages/ui/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], "dev": true, - "license": "Apache-2.0", + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=18" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "packages/ui/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=18" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/debug/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "packages/ui/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "packages/ui/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8.6.0" + "node": ">=18" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "packages/ui/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 8" + "node": ">=18" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "packages/ui/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 8" + "node": ">=18" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/@nodelib/fs.walk/node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "packages/ui/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 8" + "node": ">=18" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/@nodelib/fs.walk/node_modules/@nodelib/fs.scandir/node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } + "packages/ui/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" ], + "dev": true, "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/@nodelib/fs.walk/node_modules/@nodelib/fs.scandir/node_modules/run-parallel/node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } + "packages/ui/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" ], - "license": "MIT" - }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/@nodelib/fs.walk/node_modules/fastq": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.3.tgz", - "integrity": "sha512-XKv5nnLs6nLF71NgiKJLIZFLkPyIEuOselLG7ujZnGrRfQK8HpvY+WqKhAJUAdLomwVHErVS4LfxFlPq0/FTAw==", "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/@nodelib/fs.walk/node_modules/fastq/node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "packages/ui/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "node": ">=18" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "packages/ui/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": ">= 6" + "node": ">=18" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "packages/ui/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">= 8" + "node": ">=18" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "packages/ui/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">=8.6" + "node": ">=18" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/micromatch/node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "packages/ui/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, + "optional": true, + "os": [ + "openharmony" + ], "engines": { - "node": ">=8" + "node": ">=18" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/micromatch/node_modules/braces/node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "packages/ui/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, + "optional": true, + "os": [ + "sunos" + ], "engines": { - "node": ">=8" + "node": ">=18" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/micromatch/node_modules/braces/node_modules/fill-range/node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "packages/ui/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=8.0" + "node": ">=18" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/micromatch/node_modules/braces/node_modules/fill-range/node_modules/to-regex-range/node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "packages/ui/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=0.12.0" + "node": ">=18" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob/node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "packages/ui/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "node": ">=18" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "packages/ui/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==", "dev": true, "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, "engines": { - "node": ">=0.10.0" + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/is-glob/node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "packages/ui/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": ">=0.10.0" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", - "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "packages/ui/node_modules/vite/node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.2" - }, + "license": "MIT", "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch/node_modules/brace-expansion": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.7.tgz", - "integrity": "sha512-uZbew1NqdmPDTMJ8ah1y+b+9QEJrfkXFk3RcTQw3X0jW/xRUvFKsg1CfQdSYGdTbXZWExtU3J3ccxtnfw1Fi0g==", + "packages/ui/node_modules/vite/node_modules/postcss": { + "version": "8.5.28", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.28.tgz", + "integrity": "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "nanoid": "^3.3.18", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "packages/ui/node_modules/vite/node_modules/postcss/node_modules/nanoid": { + "version": "3.3.19", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.19.tgz", + "integrity": "sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug==", "dev": true, - "license": "ISC", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", "bin": { - "semver": "bin/semver.js" + "nanoid": "bin/nanoid.cjs" }, "engines": { - "node": ">=10" + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "media/demo/node_modules/@remotion/eslint-config-flat/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/ts-api-utils": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", - "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "packages/ui/node_modules/vite/node_modules/postcss/node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true, - "license": "MIT", + "license": "ISC" + }, + "packages/ui/node_modules/vite/node_modules/postcss/node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", "engines": { - "node": ">=18.12" - }, - "peerDependencies": { - "typescript": ">=4.8.4" + "node": ">=0.10.0" } }, - "media/demo/node_modules/@remotion/fonts": { - "version": "4.0.525", - "resolved": "https://registry.npmjs.org/@remotion/fonts/-/fonts-4.0.525.tgz", - "integrity": "sha512-/YD3zv/Q4dJh6NbSKK54uoYB8wRZBabcfIJuJnScs2OwzTh8KtK3AppAP+7BxrwPTPSInMbAA3kH+KHyO7Rmtw==", + "packages/ui/node_modules/vite/node_modules/rollup": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.63.4.tgz", + "integrity": "sha512-4U0liVayNIoLp3GFl1FcI8561WepLnZ1rqfraGh7S9B3Ur5F9S283y8Futii7RUU2C/97tOBmBy7nYvhoiOpbQ==", + "dev": true, "license": "MIT", "dependencies": { - "remotion": "4.0.525" - } - }, - "media/demo/node_modules/@remotion/media": { - "version": "4.0.525", - "resolved": "https://registry.npmjs.org/@remotion/media/-/media-4.0.525.tgz", - "integrity": "sha512-O1/l6O0MYJ+39QjUQzFeLAZEqqcQDNpVFWUDL4nb/TYrAYz5QTqurIiyxua7xG4Y1w0MR0ta4H0b655Jtmvn8w==", - "dependencies": { - "mediabunny": "1.56.1", - "remotion": "4.0.525", - "zod": "4.5.4" + "@types/estree": "1.0.9" }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "media/demo/node_modules/@remotion/media/node_modules/mediabunny": { - "version": "1.56.1", - "resolved": "https://registry.npmjs.org/mediabunny/-/mediabunny-1.56.1.tgz", - "integrity": "sha512-DNOm0bRBmeOxJgCK/g3LxNWbxY5morTauNdlychujGmJ9L37ezVezkNoI1WtO2Xdb4WlWWJlYfIKnOEzd5phRw==", - "license": "MPL-2.0", - "workspaces": [ - ".", - "packages/*" - ], - "dependencies": { - "@types/dom-mediacapture-transform": "^0.1.11", - "@types/dom-webcodecs": "0.1.13" + "bin": { + "rollup": "dist/bin/rollup" }, - "funding": { - "type": "individual", - "url": "https://github.com/sponsors/Vanilagy" - } - }, - "media/demo/node_modules/@remotion/media/node_modules/mediabunny/node_modules/@types/dom-mediacapture-transform": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/@types/dom-mediacapture-transform/-/dom-mediacapture-transform-0.1.12.tgz", - "integrity": "sha512-d7/QsLRwF864A5mgIM/YrfiglHoYn7zgCcAoJgW404r+2DwnNr7EBbLnCWpmOMgH8y0te73L1AV6H1bmauaWFw==", - "license": "MIT", - "dependencies": { - "@types/dom-webcodecs": "*" - } - }, - "media/demo/node_modules/@remotion/media/node_modules/mediabunny/node_modules/@types/dom-webcodecs": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/@types/dom-webcodecs/-/dom-webcodecs-0.1.13.tgz", - "integrity": "sha512-O5hkiFIcjjszPIYyUSyvScyvrBoV3NOEEZx/pMlsu44TKzWNkLVBBxnxJz42in5n3QIolYOcBYFCPZZ0h8SkwQ==", - "license": "MIT" - }, - "media/demo/node_modules/@remotion/media/node_modules/zod": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.5.4.tgz", - "integrity": "sha512-sC95tT5iHHH9gtpj6A81kh+NEaRAUFN+qlUPDUbRfOMvNf5QCBqsb3WgvnpVtK5Y+4UfA6KqufotuTvMGiTlsA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "media/demo/node_modules/@remotion/transitions": { - "version": "4.0.525", - "resolved": "https://registry.npmjs.org/@remotion/transitions/-/transitions-4.0.525.tgz", - "integrity": "sha512-y6kfKvxZcfMY2J5qCWTmA/9MBE7SB8KIe4WWFvkrASps8Rz0kicFmDm2dIanKgWD/l7mZMwVKnmIlY4VBnFs5w==", - "license": "UNLICENSED", - "dependencies": { - "@remotion/paths": "4.0.525", - "@remotion/shapes": "4.0.525", - "remotion": "4.0.525" + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" + "optionalDependencies": { + "@napi-rs/lzma-linux-x64-gnu": "1.5.1", + "@rollup/rollup-android-arm-eabi": "4.63.4", + "@rollup/rollup-android-arm64": "4.63.4", + "@rollup/rollup-darwin-arm64": "4.63.4", + "@rollup/rollup-darwin-x64": "4.63.4", + "@rollup/rollup-freebsd-arm64": "4.63.4", + "@rollup/rollup-freebsd-x64": "4.63.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.63.4", + "@rollup/rollup-linux-arm-musleabihf": "4.63.4", + "@rollup/rollup-linux-arm64-gnu": "4.63.4", + "@rollup/rollup-linux-arm64-musl": "4.63.4", + "@rollup/rollup-linux-loong64-gnu": "4.63.4", + "@rollup/rollup-linux-loong64-musl": "4.63.4", + "@rollup/rollup-linux-ppc64-gnu": "4.63.4", + "@rollup/rollup-linux-ppc64-musl": "4.63.4", + "@rollup/rollup-linux-riscv64-gnu": "4.63.4", + "@rollup/rollup-linux-riscv64-musl": "4.63.4", + "@rollup/rollup-linux-s390x-gnu": "4.63.4", + "@rollup/rollup-linux-x64-gnu": "4.63.4", + "@rollup/rollup-linux-x64-musl": "4.63.4", + "@rollup/rollup-openbsd-x64": "4.63.4", + "@rollup/rollup-openharmony-arm64": "4.63.4", + "@rollup/rollup-win32-arm64-msvc": "4.63.4", + "@rollup/rollup-win32-ia32-msvc": "4.63.4", + "@rollup/rollup-win32-x64-gnu": "4.63.4", + "@rollup/rollup-win32-x64-msvc": "4.63.4", + "fsevents": "~2.3.2" } }, - "media/demo/node_modules/@remotion/transitions/node_modules/@remotion/paths": { - "version": "4.0.525", - "resolved": "https://registry.npmjs.org/@remotion/paths/-/paths-4.0.525.tgz", - "integrity": "sha512-q7vFGefHukENgNf0wuAHyFXCEkp8a0OaONo5zyvrSnXYgDQUQA+yAzOfVdSvpNYHCQXUKLkRzsfgf/NUOlrA8Q==", - "license": "MIT" - }, - "media/demo/node_modules/@remotion/transitions/node_modules/@remotion/shapes": { - "version": "4.0.525", - "resolved": "https://registry.npmjs.org/@remotion/shapes/-/shapes-4.0.525.tgz", - "integrity": "sha512-hZnZuuLU/ROWcGDHJCuxKrQuFPSDBNFhd4WA1u7rqJov2Sgsn0j988p2MVzUpLyxsyJ49cbntPs8CMRuMcJGMA==", + "packages/ui/node_modules/vite/node_modules/rollup/node_modules/@napi-rs/lzma-linux-x64-gnu": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz", + "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", - "dependencies": { - "@remotion/paths": "4.0.525", - "remotion": "4.0.525" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^22.20 || ^24.12 || >=25" } }, - "media/demo/node_modules/@types/react": { - "version": "19.3.0", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.3.0.tgz", - "integrity": "sha512-N0rFCuH9YoxG9/m61l9MfpJKfmLOVU0em7ipIz6TRgSSkvReLB9vL85GB+yr8Bs5leqpvg96JSwF4ZS1s4viQg==", + "packages/ui/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.63.4.tgz", + "integrity": "sha512-I+BSHzTAhKN2n7ZwGZsegGcZjDpLqFOMAtJz/u6uFGe0pUFbq56dEHjqJV/ZUdRJtNXNxA+hREUatZBvMR3Oiw==", + "cpu": [ + "arm" + ], "dev": true, "license": "MIT", - "dependencies": { - "csstype": "^3.2.2" - } + "optional": true, + "os": [ + "android" + ] }, - "media/demo/node_modules/@types/react/node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "packages/ui/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-android-arm64": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.63.4.tgz", + "integrity": "sha512-pu3BdjS2LtEzRu2elmGzS3fIeWSZy4BMDIaLNwjorO76+k2d0LMluijhsDx3KQyQBQ/lLUZCQA9/s6csvUfuhw==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "os": [ + "android" + ] }, - "media/demo/node_modules/@types/web": { - "version": "0.0.356", - "resolved": "https://registry.npmjs.org/@types/web/-/web-0.0.356.tgz", - "integrity": "sha512-FjE7SeW2G2It3cSeEuzxRLDZbBhiy6cmHI4506Q7hGVivabw+xz5aQBW2zoHoCWGoIrNMJAhfB7lV1SU3JZrDA==", + "packages/ui/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.63.4.tgz", + "integrity": "sha512-xfSrj9MHnWK9GaSqT9U0ImHtH/N8WZlHLx4cZHiuLcqs640hvZ3hLPd5UR2AZS57FaE8HrRUSpltbZdWRxHiDA==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "Apache-2.0" + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] }, - "media/demo/node_modules/eslint": { - "version": "9.19.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.19.0.tgz", - "integrity": "sha512-ug92j0LepKlbbEv6hD911THhoRHmbdXt2gX+VDABAW/Ir7D3nqKdv5Pf5vtlyY6HQMTEP2skXY43ueqTCWssEA==", - "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "packages/ui/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-darwin-x64": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.63.4.tgz", + "integrity": "sha512-bqU99PLJb/dqb3S0GIMdeuyAEETSUgZBoqXYd3Sd+WCsV+MmPhnN6JrotWyir31+QgH7EvvE5/mwGJlEoci8Fw==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.19.0", - "@eslint/core": "^0.10.0", - "@eslint/eslintrc": "^3.2.0", - "@eslint/js": "9.19.0", - "@eslint/plugin-kit": "^0.2.5", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.1", - "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.6", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.2.0", - "eslint-visitor-keys": "^4.2.0", - "espree": "^10.3.0", - "esquery": "^1.5.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } - } + "optional": true, + "os": [ + "darwin" + ] }, - "media/demo/node_modules/eslint/node_modules/@eslint-community/eslint-utils": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", - "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==", + "packages/ui/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.63.4.tgz", + "integrity": "sha512-JinsFZ5G40oXQb+sUuiA5x689vhr6dDYK0H0NL+rwKdL6CqnmYN8PE4ZwfRSoIjrCxqTQG/SLfTtSvHeGxoVlw==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } + "optional": true, + "os": [ + "freebsd" + ] }, - "media/demo/node_modules/eslint/node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "packages/ui/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.63.4.tgz", + "integrity": "sha512-GAdA4UxpiNm27cLHr2GqXBpAD0x9FqwYBY7/YSP0Ss0/PNi4k8gbviqpIpYbVSRBaS2ZcegXEzgTQMbRNCwxCw==", + "cpu": [ + "x64" + ], "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] }, - "media/demo/node_modules/eslint/node_modules/@eslint-community/regexpp": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", - "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "packages/ui/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.63.4.tgz", + "integrity": "sha512-qDd6NoA1znaLjp4jR5U/KWCdLAKDJNB8W9ChbbDaKbo0xA+Atln5HK6LFCZ4oJQpemtRZA288DCirFRjrspptw==", + "cpu": [ + "arm" + ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } + "optional": true, + "os": [ + "linux" + ] }, - "media/demo/node_modules/eslint/node_modules/@eslint/config-array": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.2.tgz", - "integrity": "sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==", + "packages/ui/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.63.4.tgz", + "integrity": "sha512-WtB5Tz5KTNINb8ZA+8sQ7bmjuS1JrRT7YverYIhUGdWWDlpzVWmIwuZE+jidkEXUn1l0zrEkaIMa8dHF3NGcsA==", + "cpu": [ + "arm" + ], "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/object-schema": "^2.1.6", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "packages/ui/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.63.4.tgz", + "integrity": "sha512-VcQ3L1tjnkKzWjryAVaFhHEWcqOfICX9uxVVoDzm2t0DpgKRHd2zOpVrJc0xsWeBZcBFyYROCIBdyR/fS174pg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "media/demo/node_modules/eslint/node_modules/@eslint/config-array/node_modules/@eslint/object-schema": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", - "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "packages/ui/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.63.4.tgz", + "integrity": "sha512-6+ZQX6P5s0cMDN2Ypb8Lbm2+/sZYmZjdaYny992ujUU9UKi/4CWoJWsl1pNvjWJHNHGK51m+jKGLlh1ylb2ifQ==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "media/demo/node_modules/eslint/node_modules/@eslint/core": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.10.0.tgz", - "integrity": "sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==", + "packages/ui/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.63.4.tgz", + "integrity": "sha512-D72ZnvkFkBXOfzMMQLcwfPLyGkKb7HZ9/mf97B7v6/P5Lbv4oFOtSY/uHbS8lH6uKUOxoKiuokdb50XZSzzbJw==", + "cpu": [ + "loong64" + ], "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "media/demo/node_modules/eslint/node_modules/@eslint/eslintrc": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.7.tgz", - "integrity": "sha512-F42g89Qd5oAWtp0k0nnSrjziAKza7w8SVT4mStc18LZMaRb4J1HQAHLCalEtDCxrTuksx7NU9qsmeLwpOfPqWw==", + "packages/ui/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.63.4.tgz", + "integrity": "sha512-piU6BxeqA3O9KSu3kRCIQQtNqFFaTu21SEV4FwaRZowpnj3bLaWPZHw+xFqCs0XlJ+aOH3PTRWGoglH+mKA/OA==", + "cpu": [ + "loong64" + ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", - "dependencies": { - "ajv": "^6.14.0", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.3.2", - "minimatch": "^3.1.5", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } + "optional": true, + "os": [ + "linux" + ] }, - "media/demo/node_modules/eslint/node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "packages/ui/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.63.4.tgz", + "integrity": "sha512-/5PGpHwqt2EEEOUs1XwzubE/ucr0dWDQ+to3zqi4Ds7EWpwtQ79wXc4JBoxqj/OwpawTsKWzJxHfSuBOq3DrWA==", + "cpu": [ + "ppc64" + ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "optional": true, + "os": [ + "linux" + ] }, - "media/demo/node_modules/eslint/node_modules/@eslint/eslintrc/node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "packages/ui/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.63.4.tgz", + "integrity": "sha512-cX3beZDLWt7G2oJF+nhChiT+qtaihs+S2xi7ziGmVB+2pwPng6D0Ed0HmElQOgv2UsUmSJJLGwpBao/3TDx3VA==", + "cpu": [ + "ppc64" + ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "optional": true, + "os": [ + "linux" + ] }, - "media/demo/node_modules/eslint/node_modules/@eslint/eslintrc/node_modules/import-fresh/node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "packages/ui/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.63.4.tgz", + "integrity": "sha512-1uz2mGWHyptR7DgHHrlbdRAjXK7v7elGZ9lMja910/RP+ZYbX6xAmCiU9UZSX4hqmgtHMv6lr5l3kq1HIOpcag==", + "cpu": [ + "riscv64" + ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } + "optional": true, + "os": [ + "linux" + ] }, - "media/demo/node_modules/eslint/node_modules/@eslint/eslintrc/node_modules/import-fresh/node_modules/parent-module/node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "packages/ui/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.63.4.tgz", + "integrity": "sha512-nLS8topojxyz7SRpKR2IODRpQ0XPZ+xaOXvT3+hqK/Uy8Lo5HFgkkIBiIrCu5tL5YqzTvgovGw55PwpahTAGig==", + "cpu": [ + "riscv64" + ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", - "engines": { - "node": ">=6" - } + "optional": true, + "os": [ + "linux" + ] }, - "media/demo/node_modules/eslint/node_modules/@eslint/eslintrc/node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "packages/ui/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.63.4.tgz", + "integrity": "sha512-gs7DRKotr3l3q+jGPQBjH0ng1FjlEDm5ueQrkw5JtQvtLyEIcLASqAEaor56BhkKRzk+IcQzrcanBdb/bBQn8g==", + "cpu": [ + "s390x" + ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", - "engines": { - "node": ">=4" - } + "optional": true, + "os": [ + "linux" + ] }, - "media/demo/node_modules/eslint/node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz", - "integrity": "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==", + "packages/ui/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.63.4.tgz", + "integrity": "sha512-791ET7W17NnScOZM7h4dX5hYspxE28htPFsb1awY/NRR8+PRNkS53e475rDdxXXDrP+kwnCcNWg9CX5ztn/Aqw==", + "cpu": [ + "x64" + ], "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/puzrin" - }, - { - "type": "github", - "url": "https://github.com/sponsors/nodeca" - } + "libc": [ + "glibc" ], "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } + "optional": true, + "os": [ + "linux" + ] }, - "media/demo/node_modules/eslint/node_modules/@eslint/eslintrc/node_modules/js-yaml/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "packages/ui/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.63.4.tgz", + "integrity": "sha512-iwZQRcmj7g88g3tzefIrQY7qvmuA/cfYwhrDtTBhsmukO4U2huVO5W+86XacUMRvdSFVAc6kZUZy21JaRwiB9w==", + "cpu": [ + "x64" + ], "dev": true, - "license": "Python-2.0" + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "media/demo/node_modules/eslint/node_modules/@eslint/eslintrc/node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "packages/ui/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.63.4.tgz", + "integrity": "sha512-dVHFp9gRWrdTpnqQuGfCwd7hOQDatK1VCP2iWhLY/cGrOQs/ucFzJ6A5SRqbXX12ZDI8EUuejSM5kwg+ja7Png==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "optional": true, + "os": [ + "openbsd" + ] }, - "media/demo/node_modules/eslint/node_modules/@eslint/js": { - "version": "9.19.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.19.0.tgz", - "integrity": "sha512-rbq9/g38qjfqFLOVPvwjIvFFdNziEC5S65jmjPw5r6A//QH+W91akh9irMwjDN8zKUTak6W9EsAv4m/7Wnw0UQ==", + "packages/ui/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.63.4.tgz", + "integrity": "sha512-t3NlauOW6gxZVVFcBEnO62Cb4wbyDFL416gTg1uFI/2tgqYQlf69FbSE115Ajre9I+c26Lk4mcmdFUsS/DGifQ==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } + "optional": true, + "os": [ + "openharmony" + ] }, - "media/demo/node_modules/eslint/node_modules/@eslint/plugin-kit": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz", - "integrity": "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==", + "packages/ui/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.63.4.tgz", + "integrity": "sha512-xWuIaSye5FWZF8+UYtVEcHtRJDN5kN9Kfgxx3Kq8XIov9KSKbc1fiqQCm90SKrgQbUXZelbnUhnlUJmfSE7P9A==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.13.0", - "levn": "^0.4.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, - "media/demo/node_modules/eslint/node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.13.0.tgz", - "integrity": "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==", + "packages/ui/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.63.4.tgz", + "integrity": "sha512-9ALJJUOg/ZflMJepVo2PlgsGxSaxN7SQ4Z8GoZfVlarWr6r3rkHUNsd/zAio7p4YMtChSMXPionxej4Hkf6CXQ==", + "cpu": [ + "ia32" + ], "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, - "media/demo/node_modules/eslint/node_modules/@eslint/plugin-kit/node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "packages/ui/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.63.4.tgz", + "integrity": "sha512-blj9z5qx/Pv4WU0W1NMFDB97e0JH5ed+aZGywW8WCvp/NhWX/4PFAq5uu6Q0AebNn+Vo6KzUYDT++JzTT5ojlQ==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } + "optional": true, + "os": [ + "win32" + ] }, - "media/demo/node_modules/eslint/node_modules/@eslint/plugin-kit/node_modules/levn/node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "packages/ui/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.63.4.tgz", + "integrity": "sha512-Erx822VRBwLa124shbj+wNXe//BOgMEctDV0m1aqTQdNO1S69DgNUCFKC1RCeZfixs1J31l6igk1ziyXErbigQ==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } + "optional": true, + "os": [ + "win32" + ] }, - "media/demo/node_modules/eslint/node_modules/@eslint/plugin-kit/node_modules/levn/node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "packages/ui/node_modules/vite/node_modules/rollup/node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "packages/ui/node_modules/vite/node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", "dev": true, "license": "MIT", "dependencies": { - "prelude-ls": "^1.2.1" + "fdir": "^6.5.0", + "picomatch": "^4.0.4" }, "engines": { - "node": ">= 0.8.0" + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" } }, - "media/demo/node_modules/eslint/node_modules/@humanfs/node": { - "version": "0.16.8", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", - "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", - "dev": true, - "license": "Apache-2.0", + "site": { + "name": "conn-site", + "version": "0.0.0", "dependencies": { - "@humanfs/core": "^0.19.2", - "@humanfs/types": "^0.15.0", - "@humanwhocodes/retry": "^0.4.0" + "@astrojs/starlight": "^0.42.2", + "@conn/brand": "*", + "@fontsource-variable/noto-sans-kr": "^5.3.0", + "@vercel/analytics": "^2.0.1", + "astro": "^7.3.3", + "sharp": "^0.35.4" }, - "engines": { - "node": ">=18.18.0" + "devDependencies": { + "@astrojs/check": "^0.9.4", + "typescript": "^5.6.0" } }, - "media/demo/node_modules/eslint/node_modules/@humanfs/node/node_modules/@humanfs/core": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", - "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", + "site/node_modules/@astrojs/check": { + "version": "0.9.10", + "resolved": "https://registry.npmjs.org/@astrojs/check/-/check-0.9.10.tgz", + "integrity": "sha512-zgx/UQMozdjOa3bOxjgeCFdtpE3c9rRX6xHwa+2QXvy8z8Akifu2AtubHyv/zzC2znO8dl8fFWL4K+Ba9kS8HQ==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "@humanfs/types": "^0.15.0" + "@astrojs/language-server": "^2.16.7", + "chokidar": "^4.0.3", + "kleur": "^4.1.5", + "yargs": "^18.0.0" }, - "engines": { - "node": ">=18.18.0" - } - }, - "media/demo/node_modules/eslint/node_modules/@humanfs/node/node_modules/@humanfs/types": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", - "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18.0" + "bin": { + "astro-check": "bin/astro-check.js" + }, + "peerDependencies": { + "typescript": "^5.0.0 || ^6.0.0" } }, - "media/demo/node_modules/eslint/node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/@astrojs/language-server/-/language-server-2.17.0.tgz", + "integrity": "sha512-ZvT7UEo7/jBdfjXD3nNYssziEezNKM8G6FUYRnGUidAs7FmowqsQhQ0Xwl5Q4tjqlOjhnpxQuoEb4jwESL+nKQ==", "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" + "license": "MIT", + "dependencies": { + "@astrojs/astro2tsx": "^0.1.0", + "@astrojs/yaml2ts": "^0.2.4", + "@volar/kit": "~2.4.28", + "@volar/language-core": "~2.4.28", + "@volar/language-server": "~2.4.28", + "@volar/language-service": "~2.4.28", + "muggle-string": "^0.4.1", + "tinyglobby": "^0.2.16", + "volar-service-css": "0.0.71", + "volar-service-emmet": "0.0.71", + "volar-service-html": "0.0.71", + "volar-service-prettier": "0.0.71", + "volar-service-typescript": "0.0.71", + "volar-service-typescript-twoslash-queries": "0.0.71", + "volar-service-yaml": "0.0.71", + "vscode-html-languageservice": "^5.6.2", + "vscode-uri": "^3.1.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "bin": { + "astro-ls": "bin/nodeServer.js" + }, + "peerDependencies": { + "prettier": "^3.0.0", + "prettier-plugin-astro": ">=0.11.0" + }, + "peerDependenciesMeta": { + "prettier": { + "optional": true + }, + "prettier-plugin-astro": { + "optional": true + } } }, - "media/demo/node_modules/eslint/node_modules/@humanwhocodes/retry": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", - "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@astrojs/astro2tsx": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@astrojs/astro2tsx/-/astro2tsx-0.1.0.tgz", + "integrity": "sha512-tgprkax8mcF+BiHJQBdoQ+REqtvvnLlYzV0yCeLMdcv3pJIutdlinWNHUzN1jMOT5VRlYTtMmDdaoPrtd3cBAQ==", "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" + "license": "MIT", + "dependencies": { + "@emnapi/core": "1.11.3", + "@napi-rs/wasm-runtime": "1.2.4" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "media/demo/node_modules/eslint/node_modules/@types/estree": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", - "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", - "dev": true, - "license": "MIT" - }, - "media/demo/node_modules/eslint/node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "license": "MIT" - }, - "media/demo/node_modules/eslint/node_modules/ajv": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", - "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@astrojs/astro2tsx/node_modules/@emnapi/core": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.3.tgz", + "integrity": "sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg==", "dev": true, "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "@emnapi/wasi-threads": "1.2.3", + "tslib": "^2.4.0" } }, - "media/demo/node_modules/eslint/node_modules/ajv/node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@astrojs/astro2tsx/node_modules/@emnapi/core/node_modules/@emnapi/wasi-threads": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.3.tgz", + "integrity": "sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + } }, - "media/demo/node_modules/eslint/node_modules/ajv/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@astrojs/astro2tsx/node_modules/@emnapi/core/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, - "license": "MIT" + "license": "0BSD" }, - "media/demo/node_modules/eslint/node_modules/ajv/node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@astrojs/astro2tsx/node_modules/@emnapi/runtime": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.3.tgz", + "integrity": "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", + "peer": true, "dependencies": { - "punycode": "^2.1.0" + "tslib": "^2.4.0" } }, - "media/demo/node_modules/eslint/node_modules/ajv/node_modules/uri-js/node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@astrojs/astro2tsx/node_modules/@emnapi/runtime/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } + "license": "0BSD", + "peer": true }, - "media/demo/node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@astrojs/astro2tsx/node_modules/@napi-rs/wasm-runtime": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.2.4.tgz", + "integrity": "sha512-AJxoUD2/15ESHbvpcyjU274nsAPLuOtPHCk0vKJM5pj//Fg/B1FXNWjPnXTT9PymCYYiHo4zPj0ZomXBKhoy7g==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@tybys/wasm-util": "^0.10.3" }, "engines": { - "node": ">=10" + "node": "^20.19.0 || ^22.13.0 || >=23.5.0" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1 || ^2.0.0-alpha.4", + "@emnapi/runtime": "^1.7.1 || ^2.0.0-alpha.4" } }, - "media/demo/node_modules/eslint/node_modules/chalk/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@astrojs/astro2tsx/node_modules/@napi-rs/wasm-runtime/node_modules/@tybys/wasm-util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.4.tgz", + "integrity": "sha512-W3c4gRigFS0T/Ma4qIYF3GDAc5AQdHb1yL5znJT1Zv1YaD9Kitx656wBjvr19qbiosmZT8lWDM5BEMynUqX65A==", "dev": true, "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "tslib": "^2.4.0" + } + }, + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@astrojs/astro2tsx/node_modules/@napi-rs/wasm-runtime/node_modules/@tybys/wasm-util/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@astrojs/yaml2ts": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@astrojs/yaml2ts/-/yaml2ts-0.2.4.tgz", + "integrity": "sha512-8oddpOae35pJsXPQXhTkM0ypfKPskVsh2bCxRtbf7e+/Epw2nReakFYpLKjZMEr75CsoF203PMnCocpfz0s69A==", + "dev": true, + "license": "MIT", + "dependencies": { + "yaml": "^2.8.3" + } + }, + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@astrojs/yaml2ts/node_modules/yaml": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.1.tgz", + "integrity": "sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" }, "engines": { - "node": ">=8" + "node": ">= 14.6" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/eemeli" } }, - "media/demo/node_modules/eslint/node_modules/chalk/node_modules/ansi-styles/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@volar/kit": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/kit/-/kit-2.4.28.tgz", + "integrity": "sha512-cKX4vK9dtZvDRaAzeoUdaAJEew6IdxHNCRrdp5Kvcl6zZOqb6jTOfk3kXkIkG3T7oTFXguEMt5+9ptyqYR84Pg==", "dev": true, "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "@volar/language-service": "2.4.28", + "@volar/typescript": "2.4.28", + "typesafe-path": "^0.2.2", + "vscode-languageserver-textdocument": "^1.0.11", + "vscode-uri": "^3.0.8" }, - "engines": { - "node": ">=7.0.0" + "peerDependencies": { + "typescript": "*" } }, - "media/demo/node_modules/eslint/node_modules/chalk/node_modules/ansi-styles/node_modules/color-convert/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@volar/kit/node_modules/@volar/typescript": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.28.tgz", + "integrity": "sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.28", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" + } + }, + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@volar/kit/node_modules/@volar/typescript/node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", "dev": true, "license": "MIT" }, - "media/demo/node_modules/eslint/node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@volar/kit/node_modules/typesafe-path": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/typesafe-path/-/typesafe-path-0.2.2.tgz", + "integrity": "sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA==", + "dev": true, + "license": "MIT" + }, + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@volar/kit/node_modules/vscode-languageserver-textdocument": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.14.tgz", + "integrity": "sha512-EQyqJMi552E4ZTf46izQ4Fj6XquqxCySR3J5ZSD1SisMf6RfpeOWHxGBE8Gr6V0/3GHIGdAzDn8F8+1nTGCnoQ==", + "dev": true, + "license": "MIT" + }, + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@volar/language-core": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.28.tgz", + "integrity": "sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==", "dev": true, "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" + "@volar/source-map": "2.4.28" } }, - "media/demo/node_modules/eslint/node_modules/chalk/node_modules/supports-color/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@volar/language-core/node_modules/@volar/source-map": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.28.tgz", + "integrity": "sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "media/demo/node_modules/eslint/node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@volar/language-server": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/language-server/-/language-server-2.4.28.tgz", + "integrity": "sha512-NqcLnE5gERKuS4PUFwlhMxf6vqYo7hXtbMFbViXcbVkbZ905AIVWhnSo0ZNBC2V127H1/2zP7RvVOVnyITFfBw==", "dev": true, "license": "MIT", "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" + "@volar/language-core": "2.4.28", + "@volar/language-service": "2.4.28", + "@volar/typescript": "2.4.28", + "path-browserify": "^1.0.1", + "request-light": "^0.7.0", + "vscode-languageserver": "^9.0.1", + "vscode-languageserver-protocol": "^3.17.5", + "vscode-languageserver-textdocument": "^1.0.11", + "vscode-uri": "^3.0.8" } }, - "media/demo/node_modules/eslint/node_modules/cross-spawn/node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@volar/language-server/node_modules/@volar/typescript": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.28.tgz", + "integrity": "sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "@volar/language-core": "2.4.28", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" } }, - "media/demo/node_modules/eslint/node_modules/cross-spawn/node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@volar/language-server/node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true, + "license": "MIT" + }, + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@volar/language-server/node_modules/request-light": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/request-light/-/request-light-0.7.0.tgz", + "integrity": "sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q==", + "dev": true, + "license": "MIT" + }, + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@volar/language-server/node_modules/vscode-languageserver": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz", + "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", "dev": true, "license": "MIT", "dependencies": { - "shebang-regex": "^3.0.0" + "vscode-languageserver-protocol": "3.17.5" }, - "engines": { - "node": ">=8" + "bin": { + "installServerIntoExtension": "bin/installServerIntoExtension" } }, - "media/demo/node_modules/eslint/node_modules/cross-spawn/node_modules/shebang-command/node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@volar/language-server/node_modules/vscode-languageserver-protocol": { + "version": "3.18.3", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.18.3.tgz", + "integrity": "sha512-DF49+WeV5py4zO5hhobp60jjsDSK0lAqA0OuKBLBvp423HPWQcCbhZz3JgyfIewsEz2f8U+X75xNIFHdiXZm2w==", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "vscode-jsonrpc": "9.0.2", + "vscode-languageserver-types": "3.18.3" } }, - "media/demo/node_modules/eslint/node_modules/cross-spawn/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@volar/language-server/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-9.0.2.tgz", + "integrity": "sha512-SbQSV9yRemARxeXw6LU5sS6Zq0e9/DgCCX5yelH263ZQWukbTk8EF8fjTrr1dziasf4GwlJbvTwFnTrnQFWZXQ==", "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, + "license": "MIT", "engines": { - "node": ">= 8" + "node": ">=14.0.0" } }, - "media/demo/node_modules/eslint/node_modules/cross-spawn/node_modules/which/node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@volar/language-server/node_modules/vscode-languageserver-protocol/node_modules/vscode-languageserver-types": { + "version": "3.18.3", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.18.3.tgz", + "integrity": "sha512-XIlzJ7Qp/jzSI1ds7/FwPAWrPeTZA7pAtlW4hdJ1J6xXWJL6dR9QYnDhJOdLzdKhUQ5Mm6mvUMw+3DcOQQasPw==", "dev": true, - "license": "ISC" + "license": "MIT" }, - "media/demo/node_modules/eslint/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@volar/language-server/node_modules/vscode-languageserver-textdocument": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.14.tgz", + "integrity": "sha512-EQyqJMi552E4ZTf46izQ4Fj6XquqxCySR3J5ZSD1SisMf6RfpeOWHxGBE8Gr6V0/3GHIGdAzDn8F8+1nTGCnoQ==", + "dev": true, + "license": "MIT" + }, + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@volar/language-server/node_modules/vscode-languageserver/node_modules/vscode-languageserver-protocol": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", + "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", "dev": true, "license": "MIT", "dependencies": { - "ms": "^2.1.3" - }, + "vscode-jsonrpc": "8.2.0", + "vscode-languageserver-types": "3.17.5" + } + }, + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@volar/language-server/node_modules/vscode-languageserver/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", + "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=14.0.0" } }, - "media/demo/node_modules/eslint/node_modules/debug/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@volar/language-server/node_modules/vscode-languageserver/node_modules/vscode-languageserver-protocol/node_modules/vscode-languageserver-types": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", "dev": true, "license": "MIT" }, - "media/demo/node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@volar/language-service": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/language-service/-/language-service-2.4.28.tgz", + "integrity": "sha512-Rh/wYCZJrI5vCwMk9xyw/Z+MsWxlJY1rmMZPsxUoJKfzIRjS/NF1NmnuEcrMbEVGja00aVpCsInJfixQTMdvLw==", "dev": true, "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "@volar/language-core": "2.4.28", + "vscode-languageserver-protocol": "^3.17.5", + "vscode-languageserver-textdocument": "^1.0.11", + "vscode-uri": "^3.0.8" } }, - "media/demo/node_modules/eslint/node_modules/eslint-scope": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", - "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@volar/language-service/node_modules/vscode-languageserver-protocol": { + "version": "3.18.3", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.18.3.tgz", + "integrity": "sha512-DF49+WeV5py4zO5hhobp60jjsDSK0lAqA0OuKBLBvp423HPWQcCbhZz3JgyfIewsEz2f8U+X75xNIFHdiXZm2w==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "vscode-jsonrpc": "9.0.2", + "vscode-languageserver-types": "3.18.3" } }, - "media/demo/node_modules/eslint/node_modules/eslint-scope/node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@volar/language-service/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-9.0.2.tgz", + "integrity": "sha512-SbQSV9yRemARxeXw6LU5sS6Zq0e9/DgCCX5yelH263ZQWukbTk8EF8fjTrr1dziasf4GwlJbvTwFnTrnQFWZXQ==", "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, + "license": "MIT", "engines": { - "node": ">=4.0" + "node": ">=14.0.0" } }, - "media/demo/node_modules/eslint/node_modules/eslint-scope/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@volar/language-service/node_modules/vscode-languageserver-protocol/node_modules/vscode-languageserver-types": { + "version": "3.18.3", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.18.3.tgz", + "integrity": "sha512-XIlzJ7Qp/jzSI1ds7/FwPAWrPeTZA7pAtlW4hdJ1J6xXWJL6dR9QYnDhJOdLzdKhUQ5Mm6mvUMw+3DcOQQasPw==", "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } + "license": "MIT" }, - "media/demo/node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@volar/language-service/node_modules/vscode-languageserver-textdocument": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.14.tgz", + "integrity": "sha512-EQyqJMi552E4ZTf46izQ4Fj6XquqxCySR3J5ZSD1SisMf6RfpeOWHxGBE8Gr6V0/3GHIGdAzDn8F8+1nTGCnoQ==", "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } + "license": "MIT" }, - "media/demo/node_modules/eslint/node_modules/espree": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT" + }, + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", "dependencies": { - "acorn": "^8.15.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.1" + "fdir": "^6.5.0", + "picomatch": "^4.0.4" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=12.0.0" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sponsors/SuperchupuDev" } }, - "media/demo/node_modules/eslint/node_modules/espree/node_modules/acorn": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", - "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/tinyglobby/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", - "bin": { - "acorn": "bin/acorn" + "engines": { + "node": ">=12.0.0" }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=0.4.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "media/demo/node_modules/eslint/node_modules/espree/node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-css": { + "version": "0.0.71", + "resolved": "https://registry.npmjs.org/volar-service-css/-/volar-service-css-0.0.71.tgz", + "integrity": "sha512-wRRFt9BpjMKCazcgOh67MSjUjiWUCAh99DyYSDIOTuxaRjEtDC7PpB0k1Y1wbJIW/pVtMUSVbpPo3UGSm0Byxw==", "dev": true, "license": "MIT", + "dependencies": { + "vscode-css-languageservice": "^6.3.0", + "vscode-languageserver-textdocument": "^1.0.11", + "vscode-uri": "^3.0.8" + }, "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + "@volar/language-service": "~2.4.0" + }, + "peerDependenciesMeta": { + "@volar/language-service": { + "optional": true + } } }, - "media/demo/node_modules/eslint/node_modules/esquery": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", - "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-css/node_modules/vscode-css-languageservice": { + "version": "6.3.10", + "resolved": "https://registry.npmjs.org/vscode-css-languageservice/-/vscode-css-languageservice-6.3.10.tgz", + "integrity": "sha512-eq5N9Er3fC4vA9zd9EFhyBG90wtCCuXgRSpAndaOgXMh1Wgep5lBgRIeDgjZBW9pa+332yC9+49cZMW8jcL3MA==", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" + "@vscode/l10n": "^0.0.18", + "vscode-languageserver-textdocument": "^1.0.12", + "vscode-languageserver-types": "3.17.5", + "vscode-uri": "^3.1.0" } }, - "media/demo/node_modules/eslint/node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-css/node_modules/vscode-css-languageservice/node_modules/@vscode/l10n": { + "version": "0.0.18", + "resolved": "https://registry.npmjs.org/@vscode/l10n/-/l10n-0.0.18.tgz", + "integrity": "sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==", "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } + "license": "MIT" }, - "media/demo/node_modules/eslint/node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-css/node_modules/vscode-css-languageservice/node_modules/vscode-languageserver-types": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } + "license": "MIT" }, - "media/demo/node_modules/eslint/node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-css/node_modules/vscode-languageserver-textdocument": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.14.tgz", + "integrity": "sha512-EQyqJMi552E4ZTf46izQ4Fj6XquqxCySR3J5ZSD1SisMf6RfpeOWHxGBE8Gr6V0/3GHIGdAzDn8F8+1nTGCnoQ==", "dev": true, "license": "MIT" }, - "media/demo/node_modules/eslint/node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-emmet": { + "version": "0.0.71", + "resolved": "https://registry.npmjs.org/volar-service-emmet/-/volar-service-emmet-0.0.71.tgz", + "integrity": "sha512-zqjzt6bN95e3CUstBm0PBFAJnrfz0ZAARka87fart46/gNCLLuP3Vujy8V/J8HEziTFLnfkgIASLFYPUhonJcA==", "dev": true, "license": "MIT", "dependencies": { - "flat-cache": "^4.0.0" + "@emmetio/css-parser": "^0.4.1", + "@emmetio/html-matcher": "^1.3.0", + "@vscode/emmet-helper": "^2.9.3", + "vscode-uri": "^3.0.8" }, - "engines": { - "node": ">=16.0.0" + "peerDependencies": { + "@volar/language-service": "~2.4.0" + }, + "peerDependenciesMeta": { + "@volar/language-service": { + "optional": true + } } }, - "media/demo/node_modules/eslint/node_modules/file-entry-cache/node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-emmet/node_modules/@emmetio/css-parser": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@emmetio/css-parser/-/css-parser-0.4.1.tgz", + "integrity": "sha512-2bC6m0MV/voF4CTZiAbG5MWKbq5EBmDPKu9Sb7s7nVcEzNQlrZP6mFFFlIaISM8X6514H9shWMme1fCm8cWAfQ==", "dev": true, "license": "MIT", "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" + "@emmetio/stream-reader": "^2.2.0", + "@emmetio/stream-reader-utils": "^0.1.0" } }, - "media/demo/node_modules/eslint/node_modules/file-entry-cache/node_modules/flat-cache/node_modules/flatted": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz", - "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-emmet/node_modules/@emmetio/css-parser/node_modules/@emmetio/stream-reader": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@emmetio/stream-reader/-/stream-reader-2.2.0.tgz", + "integrity": "sha512-fXVXEyFA5Yv3M3n8sUGT7+fvecGrZP4k6FnWWMSZVQf69kAq0LLpaBQLGcPR30m3zMmKYhECP4k/ZkzvhEW5kw==", "dev": true, - "license": "ISC" + "license": "MIT" }, - "media/demo/node_modules/eslint/node_modules/file-entry-cache/node_modules/flat-cache/node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-emmet/node_modules/@emmetio/css-parser/node_modules/@emmetio/stream-reader-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@emmetio/stream-reader-utils/-/stream-reader-utils-0.1.0.tgz", + "integrity": "sha512-ZsZ2I9Vzso3Ho/pjZFsmmZ++FWeEd/txqybHTm4OgaZzdS8V9V/YYWQwg5TC38Z7uLWUV1vavpLLbjJtKubR1A==", "dev": true, - "license": "MIT", + "license": "MIT" + }, + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-emmet/node_modules/@emmetio/html-matcher": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@emmetio/html-matcher/-/html-matcher-1.3.0.tgz", + "integrity": "sha512-NTbsvppE5eVyBMuyGfVu2CRrLvo7J4YHb6t9sBFLyY03WYhXET37qA4zOYUjBWFCRHO7pS1B9khERtY0f5JXPQ==", + "dev": true, + "license": "ISC", "dependencies": { - "json-buffer": "3.0.1" + "@emmetio/scanner": "^1.0.0" } }, - "media/demo/node_modules/eslint/node_modules/file-entry-cache/node_modules/flat-cache/node_modules/keyv/node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-emmet/node_modules/@emmetio/html-matcher/node_modules/@emmetio/scanner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@emmetio/scanner/-/scanner-1.0.4.tgz", + "integrity": "sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA==", "dev": true, "license": "MIT" }, - "media/demo/node_modules/eslint/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-emmet/node_modules/@vscode/emmet-helper": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@vscode/emmet-helper/-/emmet-helper-2.11.0.tgz", + "integrity": "sha512-QLxjQR3imPZPQltfbWRnHU6JecWTF1QSWhx3GAKQpslx7y3Dp6sIIXhKjiUJ/BR9FX8PVthjr9PD6pNwOJfAzw==", "dev": true, "license": "MIT", "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "emmet": "^2.4.3", + "jsonc-parser": "^2.3.0", + "vscode-languageserver-textdocument": "^1.0.1", + "vscode-languageserver-types": "^3.15.1", + "vscode-uri": "^3.0.8" } }, - "media/demo/node_modules/eslint/node_modules/find-up/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-emmet/node_modules/@vscode/emmet-helper/node_modules/emmet": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/emmet/-/emmet-2.4.11.tgz", + "integrity": "sha512-23QPJB3moh/U9sT4rQzGgeyyGIrcM+GH5uVYg2C6wZIxAIJq7Ng3QLT79tl8FUwDXhyq9SusfknOrofAKqvgyQ==", "dev": true, "license": "MIT", + "workspaces": [ + "./packages/scanner", + "./packages/abbreviation", + "./packages/css-abbreviation", + "./" + ], "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@emmetio/abbreviation": "^2.3.3", + "@emmetio/css-abbreviation": "^2.1.8" } }, - "media/demo/node_modules/eslint/node_modules/find-up/node_modules/locate-path/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-emmet/node_modules/@vscode/emmet-helper/node_modules/emmet/node_modules/@emmetio/abbreviation": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@emmetio/abbreviation/-/abbreviation-2.3.3.tgz", + "integrity": "sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA==", "dev": true, "license": "MIT", "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@emmetio/scanner": "^1.0.4" } }, - "media/demo/node_modules/eslint/node_modules/find-up/node_modules/locate-path/node_modules/p-locate/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-emmet/node_modules/@vscode/emmet-helper/node_modules/emmet/node_modules/@emmetio/abbreviation/node_modules/@emmetio/scanner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@emmetio/scanner/-/scanner-1.0.4.tgz", + "integrity": "sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA==", + "dev": true, + "license": "MIT" + }, + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-emmet/node_modules/@vscode/emmet-helper/node_modules/emmet/node_modules/@emmetio/css-abbreviation": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@emmetio/css-abbreviation/-/css-abbreviation-2.1.8.tgz", + "integrity": "sha512-s9yjhJ6saOO/uk1V74eifykk2CBYi01STTK3WlXWGOepyKa23ymJ053+DNQjpFcy1ingpaO7AxCcwLvHFY9tuw==", "dev": true, "license": "MIT", "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@emmetio/scanner": "^1.0.4" } }, - "media/demo/node_modules/eslint/node_modules/find-up/node_modules/locate-path/node_modules/p-locate/node_modules/p-limit/node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-emmet/node_modules/@vscode/emmet-helper/node_modules/emmet/node_modules/@emmetio/css-abbreviation/node_modules/@emmetio/scanner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@emmetio/scanner/-/scanner-1.0.4.tgz", + "integrity": "sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "license": "MIT" }, - "media/demo/node_modules/eslint/node_modules/find-up/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-emmet/node_modules/@vscode/emmet-helper/node_modules/jsonc-parser": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.3.1.tgz", + "integrity": "sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "media/demo/node_modules/eslint/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-emmet/node_modules/@vscode/emmet-helper/node_modules/vscode-languageserver-textdocument": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.14.tgz", + "integrity": "sha512-EQyqJMi552E4ZTf46izQ4Fj6XquqxCySR3J5ZSD1SisMf6RfpeOWHxGBE8Gr6V0/3GHIGdAzDn8F8+1nTGCnoQ==", + "dev": true, + "license": "MIT" + }, + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-emmet/node_modules/@vscode/emmet-helper/node_modules/vscode-languageserver-types": { + "version": "3.18.3", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.18.3.tgz", + "integrity": "sha512-XIlzJ7Qp/jzSI1ds7/FwPAWrPeTZA7pAtlW4hdJ1J6xXWJL6dR9QYnDhJOdLzdKhUQ5Mm6mvUMw+3DcOQQasPw==", + "dev": true, + "license": "MIT" + }, + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-html": { + "version": "0.0.71", + "resolved": "https://registry.npmjs.org/volar-service-html/-/volar-service-html-0.0.71.tgz", + "integrity": "sha512-e8tHPhgQ7ooLfudAEIku+kgd9pWkq3SSz8RbnQDI1+Eb8wbenkLGHqoirLqz5ORLV6wIMr2Iv08RWBG5eOcgpw==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "is-glob": "^4.0.3" + "vscode-html-languageservice": "^5.3.0", + "vscode-languageserver-textdocument": "^1.0.11", + "vscode-uri": "^3.0.8" }, - "engines": { - "node": ">=10.13.0" + "peerDependencies": { + "@volar/language-service": "~2.4.0" + }, + "peerDependenciesMeta": { + "@volar/language-service": { + "optional": true + } } }, - "media/demo/node_modules/eslint/node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-html/node_modules/vscode-languageserver-textdocument": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.14.tgz", + "integrity": "sha512-EQyqJMi552E4ZTf46izQ4Fj6XquqxCySR3J5ZSD1SisMf6RfpeOWHxGBE8Gr6V0/3GHIGdAzDn8F8+1nTGCnoQ==", "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } + "license": "MIT" }, - "media/demo/node_modules/eslint/node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-prettier": { + "version": "0.0.71", + "resolved": "https://registry.npmjs.org/volar-service-prettier/-/volar-service-prettier-0.0.71.tgz", + "integrity": "sha512-Rz7JVH3qD108UCdmIEiZvOBNljMt2nLFdbN8AXcDfn7xD9F5I2aCIsDVqBbXw21PsnxG0b7MfwtNF+zPS/NKUg==", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.8.19" + "dependencies": { + "vscode-uri": "^3.0.8" + }, + "peerDependencies": { + "@volar/language-service": "~2.4.0", + "prettier": "^2.2 || ^3.0" + }, + "peerDependenciesMeta": { + "@volar/language-service": { + "optional": true + }, + "prettier": { + "optional": true + } } }, - "media/demo/node_modules/eslint/node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-typescript": { + "version": "0.0.71", + "resolved": "https://registry.npmjs.org/volar-service-typescript/-/volar-service-typescript-0.0.71.tgz", + "integrity": "sha512-yTtM/BVT6hoyEYnDtaCyAtNhdNeS/mhTTABlBOdw3NNiRBUin3IznFJpgfjer4c6RYopiPjjQjc9VFhxVl1mLw==", "dev": true, "license": "MIT", "dependencies": { - "is-extglob": "^2.1.1" + "path-browserify": "^1.0.1", + "semver": "^7.6.2", + "typescript-auto-import-cache": "^0.3.5", + "vscode-languageserver-textdocument": "^1.0.11", + "vscode-nls": "^5.2.0", + "vscode-uri": "^3.0.8" }, - "engines": { - "node": ">=0.10.0" + "peerDependencies": { + "@volar/language-service": "~2.4.0" + }, + "peerDependenciesMeta": { + "@volar/language-service": { + "optional": true + } } }, - "media/demo/node_modules/eslint/node_modules/is-glob/node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-typescript-twoslash-queries": { + "version": "0.0.71", + "resolved": "https://registry.npmjs.org/volar-service-typescript-twoslash-queries/-/volar-service-typescript-twoslash-queries-0.0.71.tgz", + "integrity": "sha512-9K2k72s4n7rV9s4bX0MyjbX9iBribvKZbBJKuEmTCZfeWJXs6Yh7bGpY4eoc7UufAjvpheBqwyZCOIPBvxCv0A==", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "vscode-uri": "^3.0.8" + }, + "peerDependencies": { + "@volar/language-service": "~2.4.0" + }, + "peerDependenciesMeta": { + "@volar/language-service": { + "optional": true + } } }, - "media/demo/node_modules/eslint/node_modules/json-stable-stringify-without-jsonify": { + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-typescript/node_modules/path-browserify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "license": "MIT" - }, - "media/demo/node_modules/eslint/node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", "dev": true, "license": "MIT" }, - "media/demo/node_modules/eslint/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-typescript/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", "dev": true, "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": "*" + "node": ">=10" } }, - "media/demo/node_modules/eslint/node_modules/minimatch/node_modules/brace-expansion": { - "version": "1.1.21", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.21.tgz", - "integrity": "sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-typescript/node_modules/typescript-auto-import-cache": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/typescript-auto-import-cache/-/typescript-auto-import-cache-0.3.6.tgz", + "integrity": "sha512-RpuHXrknHdVdK7wv/8ug3Fr0WNsNi5l5aB8MYYuXhq2UH5lnEB1htJ1smhtD5VeCsGr2p8mUDtd83LCQDFVgjQ==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "semver": "^7.3.8" } }, - "media/demo/node_modules/eslint/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-typescript/node_modules/vscode-languageserver-textdocument": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.14.tgz", + "integrity": "sha512-EQyqJMi552E4ZTf46izQ4Fj6XquqxCySR3J5ZSD1SisMf6RfpeOWHxGBE8Gr6V0/3GHIGdAzDn8F8+1nTGCnoQ==", "dev": true, "license": "MIT" }, - "media/demo/node_modules/eslint/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-typescript/node_modules/vscode-nls": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/vscode-nls/-/vscode-nls-5.2.0.tgz", + "integrity": "sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==", "dev": true, "license": "MIT" }, - "media/demo/node_modules/eslint/node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-yaml": { + "version": "0.0.71", + "resolved": "https://registry.npmjs.org/volar-service-yaml/-/volar-service-yaml-0.0.71.tgz", + "integrity": "sha512-qYGWGuVpUTnZGu5P/CR4KLK4aIR8RrcVnmfZ2eRcj9q/I8VZCoC5yy9FtEvfNvnDp4MU17yhdJcvpQPIqhJS2Q==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "vscode-uri": "^3.0.8", + "yaml-language-server": "~1.23.0" + }, + "peerDependencies": { + "@volar/language-service": "~2.4.0" + }, + "peerDependenciesMeta": { + "@volar/language-service": { + "optional": true + } + } }, - "media/demo/node_modules/eslint/node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-yaml/node_modules/yaml-language-server": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/yaml-language-server/-/yaml-language-server-1.23.0.tgz", + "integrity": "sha512-3qVyCOexLCWw06PQa5kRPwvMWMZ/eZeCRWUvgD6a0OkqL/4iCnxy2WumbWifa937Uo5xhyWJ0uxlU39ljhNh7A==", "dev": true, "license": "MIT", "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" + "@vscode/l10n": "^0.0.18", + "ajv": "^8.17.1", + "ajv-draft-04": "^1.0.0", + "ajv-i18n": "^4.2.0", + "prettier": "^3.8.1", + "request-light": "^0.5.7", + "vscode-json-languageservice": "4.1.8", + "vscode-languageserver": "^9.0.0", + "vscode-languageserver-textdocument": "^1.0.1", + "vscode-languageserver-types": "^3.16.0", + "vscode-uri": "^3.0.2", + "yaml": "2.8.3" }, - "engines": { - "node": ">= 0.8.0" + "bin": { + "yaml-language-server": "bin/yaml-language-server" } }, - "media/demo/node_modules/eslint/node_modules/optionator/node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-yaml/node_modules/yaml-language-server/node_modules/@vscode/l10n": { + "version": "0.0.18", + "resolved": "https://registry.npmjs.org/@vscode/l10n/-/l10n-0.0.18.tgz", + "integrity": "sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==", "dev": true, "license": "MIT" }, - "media/demo/node_modules/eslint/node_modules/optionator/node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-yaml/node_modules/yaml-language-server/node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } }, - "media/demo/node_modules/eslint/node_modules/optionator/node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-yaml/node_modules/yaml-language-server/node_modules/ajv-draft-04": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", + "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", "dev": true, "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" + "peerDependencies": { + "ajv": "^8.5.0" }, - "engines": { - "node": ">= 0.8.0" + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, - "media/demo/node_modules/eslint/node_modules/optionator/node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-yaml/node_modules/yaml-language-server/node_modules/ajv-i18n": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/ajv-i18n/-/ajv-i18n-4.2.0.tgz", + "integrity": "sha512-v/ei2UkCEeuKNXh8RToiFsUclmU+G57LO1Oo22OagNMENIw+Yb8eMwvHu7Vn9fmkjJyv6XclhJ8TbuigSglPkg==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.8.0" + "peerDependencies": { + "ajv": "^8.0.0-beta.0" } }, - "media/demo/node_modules/eslint/node_modules/optionator/node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-yaml/node_modules/yaml-language-server/node_modules/ajv/node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } + "license": "MIT" }, - "media/demo/node_modules/eslint/node_modules/optionator/node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-yaml/node_modules/yaml-language-server/node_modules/ajv/node_modules/fast-uri": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.8.tgz", + "integrity": "sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-yaml/node_modules/yaml-language-server/node_modules/ajv/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-yaml/node_modules/yaml-language-server/node_modules/ajv/node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "media/demo/node_modules/prettier": { - "version": "3.9.7", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.7.tgz", - "integrity": "sha512-T3mF5P7HFzZVLDQuCUNtJj6WK1pcpLMweMNUVwGb01bLNkH9AkKxtZvmInw8K6bnn2O3d6/5RHl6zSHiBAD0Og==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-yaml/node_modules/yaml-language-server/node_modules/prettier": { + "version": "3.9.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.8.tgz", + "integrity": "sha512-WRFq3Wn3WId7LLROfMLdH7xaFr2jR62wU8nLO6rQUOLOxNZUviyJQs1M0iIhLexSFy+L+w0ch66wtoO2jRjG0A==", "dev": true, "license": "MIT", "bin": { @@ -9849,1611 +14208,1449 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "media/demo/node_modules/react": { - "version": "19.3.0", - "resolved": "https://registry.npmjs.org/react/-/react-19.3.0.tgz", - "integrity": "sha512-E8LUcbtBWt20bbl2YoHfx4ZDBdxVTfOKtCZn9cDSJ4l6/nuoApcpIBcj47t2wZoVX8g2ZHuMHbiShgCR1T5Sog==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-yaml/node_modules/yaml-language-server/node_modules/request-light": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/request-light/-/request-light-0.5.8.tgz", + "integrity": "sha512-3Zjgh+8b5fhRJBQZoy+zbVKpAQGLyka0MPgW3zruTF4dFFJ8Fqcfu9YsAvi/rvdcaTeWG3MkbZv4WKxAn/84Lg==", + "dev": true, + "license": "MIT" }, - "media/demo/node_modules/react-dom": { - "version": "19.3.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.3.0.tgz", - "integrity": "sha512-JDk8dgif51OjFoDE70+OT9ICyYr+69HlmihNwp1+Nsfbna3t5sIiCa9ZJktDmQ4/1b/rn26hIAR2uYXDMr5r0Q==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-yaml/node_modules/yaml-language-server/node_modules/vscode-json-languageservice": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/vscode-json-languageservice/-/vscode-json-languageservice-4.1.8.tgz", + "integrity": "sha512-0vSpg6Xd9hfV+eZAaYN63xVVMOTmJ4GgHxXnkLCh+9RsQBkWKIghzLhW2B9ebfG+LQQg8uLtsQ2aUKjTgE+QOg==", + "dev": true, "license": "MIT", "dependencies": { - "scheduler": "^0.28.0" + "jsonc-parser": "^3.0.0", + "vscode-languageserver-textdocument": "^1.0.1", + "vscode-languageserver-types": "^3.16.0", + "vscode-nls": "^5.0.0", + "vscode-uri": "^3.0.2" }, - "peerDependencies": { - "react": "^19.3.0" + "engines": { + "npm": ">=7.0.0" } }, - "media/demo/node_modules/react-dom/node_modules/scheduler": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.28.0.tgz", - "integrity": "sha512-juorfCmIkIw8tT+p5BXSm6PJjQF/ycEYmKyzURCIt/RaZIhL+PulbQ9Yu2z1HdOJDdqDTlxA1+xKBmHXJsczAw==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-yaml/node_modules/yaml-language-server/node_modules/vscode-json-languageservice/node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "dev": true, "license": "MIT" }, - "media/demo/node_modules/remotion": { - "version": "4.0.525", - "resolved": "https://registry.npmjs.org/remotion/-/remotion-4.0.525.tgz", - "integrity": "sha512-A/Hrt0MytCza0gOSVZrIZ+tSTx296VEW0ISGt+xNWN8+ik1i1xSAwlRcA+8Zb+NoFgddyozfldto5Azq4uWfeA==", - "license": "SEE LICENSE IN LICENSE.md", - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-yaml/node_modules/yaml-language-server/node_modules/vscode-json-languageservice/node_modules/vscode-nls": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/vscode-nls/-/vscode-nls-5.2.0.tgz", + "integrity": "sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==", + "dev": true, + "license": "MIT" }, - "media/demo/node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "devOptional": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-yaml/node_modules/yaml-language-server/node_modules/vscode-languageserver": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz", + "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "vscode-languageserver-protocol": "3.17.5" }, - "engines": { - "node": ">=14.17" + "bin": { + "installServerIntoExtension": "bin/installServerIntoExtension" } }, - "node_modules/@conn/brand": { - "resolved": "packages/brand", - "link": true - }, - "node_modules/@conn/themes": { - "resolved": "packages/themes", - "link": true - }, - "node_modules/conn-demo": { - "resolved": "media/demo", - "link": true - }, - "node_modules/conn-desktop": { - "resolved": "frontends/tauri", - "link": true - }, - "node_modules/conn-site": { - "resolved": "site", - "link": true - }, - "packages/brand": { - "name": "@conn/brand", - "version": "0.0.0" - }, - "packages/themes": { - "name": "@conn/themes", - "version": "0.0.0" + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-yaml/node_modules/yaml-language-server/node_modules/vscode-languageserver-textdocument": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.14.tgz", + "integrity": "sha512-EQyqJMi552E4ZTf46izQ4Fj6XquqxCySR3J5ZSD1SisMf6RfpeOWHxGBE8Gr6V0/3GHIGdAzDn8F8+1nTGCnoQ==", + "dev": true, + "license": "MIT" }, - "site": { - "name": "conn-site", - "version": "0.0.0", - "dependencies": { - "@astrojs/starlight": "^0.42.2", - "@conn/brand": "*", - "@fontsource-variable/noto-sans-kr": "^5.3.0", - "@vercel/analytics": "^2.0.1", - "astro": "^7.3.3", - "sharp": "^0.35.4" - }, - "devDependencies": { - "@astrojs/check": "^0.9.4", - "typescript": "^5.6.0" - } + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-yaml/node_modules/yaml-language-server/node_modules/vscode-languageserver-types": { + "version": "3.18.3", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.18.3.tgz", + "integrity": "sha512-XIlzJ7Qp/jzSI1ds7/FwPAWrPeTZA7pAtlW4hdJ1J6xXWJL6dR9QYnDhJOdLzdKhUQ5Mm6mvUMw+3DcOQQasPw==", + "dev": true, + "license": "MIT" }, - "site/node_modules/@astrojs/check": { - "version": "0.9.10", - "resolved": "https://registry.npmjs.org/@astrojs/check/-/check-0.9.10.tgz", - "integrity": "sha512-zgx/UQMozdjOa3bOxjgeCFdtpE3c9rRX6xHwa+2QXvy8z8Akifu2AtubHyv/zzC2znO8dl8fFWL4K+Ba9kS8HQ==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-yaml/node_modules/yaml-language-server/node_modules/vscode-languageserver/node_modules/vscode-languageserver-protocol": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", + "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", "dev": true, "license": "MIT", "dependencies": { - "@astrojs/language-server": "^2.16.7", - "chokidar": "^4.0.3", - "kleur": "^4.1.5", - "yargs": "^18.0.0" - }, - "bin": { - "astro-check": "bin/astro-check.js" - }, - "peerDependencies": { - "typescript": "^5.0.0 || ^6.0.0" + "vscode-jsonrpc": "8.2.0", + "vscode-languageserver-types": "3.17.5" } }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/@astrojs/language-server/-/language-server-2.17.0.tgz", - "integrity": "sha512-ZvT7UEo7/jBdfjXD3nNYssziEezNKM8G6FUYRnGUidAs7FmowqsQhQ0Xwl5Q4tjqlOjhnpxQuoEb4jwESL+nKQ==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-yaml/node_modules/yaml-language-server/node_modules/vscode-languageserver/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", + "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", "dev": true, "license": "MIT", - "dependencies": { - "@astrojs/astro2tsx": "^0.1.0", - "@astrojs/yaml2ts": "^0.2.4", - "@volar/kit": "~2.4.28", - "@volar/language-core": "~2.4.28", - "@volar/language-server": "~2.4.28", - "@volar/language-service": "~2.4.28", - "muggle-string": "^0.4.1", - "tinyglobby": "^0.2.16", - "volar-service-css": "0.0.71", - "volar-service-emmet": "0.0.71", - "volar-service-html": "0.0.71", - "volar-service-prettier": "0.0.71", - "volar-service-typescript": "0.0.71", - "volar-service-typescript-twoslash-queries": "0.0.71", - "volar-service-yaml": "0.0.71", - "vscode-html-languageservice": "^5.6.2", - "vscode-uri": "^3.1.0" - }, - "bin": { - "astro-ls": "bin/nodeServer.js" - }, - "peerDependencies": { - "prettier": "^3.0.0", - "prettier-plugin-astro": ">=0.11.0" - }, - "peerDependenciesMeta": { - "prettier": { - "optional": true - }, - "prettier-plugin-astro": { - "optional": true - } + "engines": { + "node": ">=14.0.0" } }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@astrojs/astro2tsx": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@astrojs/astro2tsx/-/astro2tsx-0.1.0.tgz", - "integrity": "sha512-tgprkax8mcF+BiHJQBdoQ+REqtvvnLlYzV0yCeLMdcv3pJIutdlinWNHUzN1jMOT5VRlYTtMmDdaoPrtd3cBAQ==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-yaml/node_modules/yaml-language-server/node_modules/vscode-languageserver/node_modules/vscode-languageserver-protocol/node_modules/vscode-languageserver-types": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", "dev": true, - "license": "MIT", - "dependencies": { - "@emnapi/core": "1.11.3", - "@napi-rs/wasm-runtime": "1.2.4" + "license": "MIT" + }, + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-yaml/node_modules/yaml-language-server/node_modules/yaml": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz", + "integrity": "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" }, "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" } }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@astrojs/astro2tsx/node_modules/@emnapi/core": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.3.tgz", - "integrity": "sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/vscode-html-languageservice": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/vscode-html-languageservice/-/vscode-html-languageservice-5.6.2.tgz", + "integrity": "sha512-ulCrSnFnfQ16YzvwnYUgEbUEl/ZG7u2eV27YhvLObSHKkb8fw1Z9cgsnUwjTEeDIdJDoTDTDpxuhQwoenoLNMg==", "dev": true, "license": "MIT", "dependencies": { - "@emnapi/wasi-threads": "1.2.3", - "tslib": "^2.4.0" + "@vscode/l10n": "^0.0.18", + "vscode-languageserver-textdocument": "^1.0.12", + "vscode-languageserver-types": "^3.17.5", + "vscode-uri": "^3.1.0" } }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@astrojs/astro2tsx/node_modules/@emnapi/core/node_modules/@emnapi/wasi-threads": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.3.tgz", - "integrity": "sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/vscode-html-languageservice/node_modules/@vscode/l10n": { + "version": "0.0.18", + "resolved": "https://registry.npmjs.org/@vscode/l10n/-/l10n-0.0.18.tgz", + "integrity": "sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==", "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^2.4.0" - } + "license": "MIT" }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@astrojs/astro2tsx/node_modules/@emnapi/core/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/vscode-html-languageservice/node_modules/vscode-languageserver-textdocument": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.14.tgz", + "integrity": "sha512-EQyqJMi552E4ZTf46izQ4Fj6XquqxCySR3J5ZSD1SisMf6RfpeOWHxGBE8Gr6V0/3GHIGdAzDn8F8+1nTGCnoQ==", "dev": true, - "license": "0BSD" + "license": "MIT" }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@astrojs/astro2tsx/node_modules/@emnapi/runtime": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.3.tgz", - "integrity": "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/vscode-html-languageservice/node_modules/vscode-languageserver-types": { + "version": "3.18.3", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.18.3.tgz", + "integrity": "sha512-XIlzJ7Qp/jzSI1ds7/FwPAWrPeTZA7pAtlW4hdJ1J6xXWJL6dR9QYnDhJOdLzdKhUQ5Mm6mvUMw+3DcOQQasPw==", "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "tslib": "^2.4.0" - } + "license": "MIT" }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@astrojs/astro2tsx/node_modules/@emnapi/runtime/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/vscode-uri": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.2.0.tgz", + "integrity": "sha512-m2gXo3bn0G1kT9InzMf07fTbqMbGtyckj3bH5ktLO+1Ssv+yiATZ4dhwaQv9UZWxJh6E9IFGnQyjgWVDWVBDrg==", "dev": true, - "license": "0BSD", - "peer": true + "license": "MIT" }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@astrojs/astro2tsx/node_modules/@napi-rs/wasm-runtime": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.2.4.tgz", - "integrity": "sha512-AJxoUD2/15ESHbvpcyjU274nsAPLuOtPHCk0vKJM5pj//Fg/B1FXNWjPnXTT9PymCYYiHo4zPj0ZomXBKhoy7g==", + "site/node_modules/@astrojs/check/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "dev": true, "license": "MIT", "dependencies": { - "@tybys/wasm-util": "^0.10.3" + "readdirp": "^4.0.1" }, "engines": { - "node": "^20.19.0 || ^22.13.0 || >=23.5.0" + "node": ">= 14.16.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - }, - "peerDependencies": { - "@emnapi/core": "^1.7.1 || ^2.0.0-alpha.4", - "@emnapi/runtime": "^1.7.1 || ^2.0.0-alpha.4" + "url": "https://paulmillr.com/funding/" } }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@astrojs/astro2tsx/node_modules/@napi-rs/wasm-runtime/node_modules/@tybys/wasm-util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.4.tgz", - "integrity": "sha512-W3c4gRigFS0T/Ma4qIYF3GDAc5AQdHb1yL5znJT1Zv1YaD9Kitx656wBjvr19qbiosmZT8lWDM5BEMynUqX65A==", + "site/node_modules/@astrojs/check/node_modules/chokidar/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "dev": true, "license": "MIT", - "dependencies": { - "tslib": "^2.4.0" + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@astrojs/astro2tsx/node_modules/@napi-rs/wasm-runtime/node_modules/@tybys/wasm-util/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD" - }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@astrojs/yaml2ts": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@astrojs/yaml2ts/-/yaml2ts-0.2.4.tgz", - "integrity": "sha512-8oddpOae35pJsXPQXhTkM0ypfKPskVsh2bCxRtbf7e+/Epw2nReakFYpLKjZMEr75CsoF203PMnCocpfz0s69A==", + "site/node_modules/@astrojs/check/node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", "dev": true, "license": "MIT", - "dependencies": { - "yaml": "^2.8.3" + "engines": { + "node": ">=6" } }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@astrojs/yaml2ts/node_modules/yaml": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.1.tgz", - "integrity": "sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw==", + "site/node_modules/@astrojs/check/node_modules/yargs": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.1.0.tgz", + "integrity": "sha512-2rAgRKu54VsHkqI0/tYkmluGXHD4KW7yZoycuqDQ15QOTnc2VVfy0nN/1eMhnQLO00A+dwtK20xuCnc1YGeUyg==", "dev": true, - "license": "ISC", - "bin": { - "yaml": "bin.mjs" + "license": "MIT", + "dependencies": { + "cliui": "^9.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "string-width": "^8.2.1", + "y18n": "^5.0.5", + "yargs-parser": "^22.0.0" }, "engines": { - "node": ">= 14.6" - }, - "funding": { - "url": "https://github.com/sponsors/eemeli" + "node": "^20.19.0 || ^22.12.0 || >=23" } }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@volar/kit": { - "version": "2.4.28", - "resolved": "https://registry.npmjs.org/@volar/kit/-/kit-2.4.28.tgz", - "integrity": "sha512-cKX4vK9dtZvDRaAzeoUdaAJEew6IdxHNCRrdp5Kvcl6zZOqb6jTOfk3kXkIkG3T7oTFXguEMt5+9ptyqYR84Pg==", + "site/node_modules/@astrojs/check/node_modules/yargs/node_modules/cliui": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", + "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "@volar/language-service": "2.4.28", - "@volar/typescript": "2.4.28", - "typesafe-path": "^0.2.2", - "vscode-languageserver-textdocument": "^1.0.11", - "vscode-uri": "^3.0.8" + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" }, - "peerDependencies": { - "typescript": "*" + "engines": { + "node": ">=20" } }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@volar/kit/node_modules/@volar/typescript": { - "version": "2.4.28", - "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.28.tgz", - "integrity": "sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==", + "site/node_modules/@astrojs/check/node_modules/yargs/node_modules/cliui/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, "license": "MIT", "dependencies": { - "@volar/language-core": "2.4.28", - "path-browserify": "^1.0.1", - "vscode-uri": "^3.0.8" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@volar/kit/node_modules/@volar/typescript/node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "dev": true, - "license": "MIT" - }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@volar/kit/node_modules/typesafe-path": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/typesafe-path/-/typesafe-path-0.2.2.tgz", - "integrity": "sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA==", + "site/node_modules/@astrojs/check/node_modules/yargs/node_modules/cliui/node_modules/string-width/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", "dev": true, "license": "MIT" }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@volar/kit/node_modules/vscode-languageserver-textdocument": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.14.tgz", - "integrity": "sha512-EQyqJMi552E4ZTf46izQ4Fj6XquqxCySR3J5ZSD1SisMf6RfpeOWHxGBE8Gr6V0/3GHIGdAzDn8F8+1nTGCnoQ==", + "site/node_modules/@astrojs/check/node_modules/yargs/node_modules/cliui/node_modules/string-width/node_modules/get-east-asian-width": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.7.0.tgz", + "integrity": "sha512-XjH1AECxf0giL2V1aU8vKyRR2ppRUb5c0EvT7zuJTokQ74bNo52zOtghqdWIqrhUD79fo3x0WfKZdOqxF6LG1Q==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@volar/language-core": { - "version": "2.4.28", - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.28.tgz", - "integrity": "sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==", + "site/node_modules/@astrojs/check/node_modules/yargs/node_modules/cliui/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, "license": "MIT", "dependencies": { - "@volar/source-map": "2.4.28" + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@volar/language-core/node_modules/@volar/source-map": { - "version": "2.4.28", - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.28.tgz", - "integrity": "sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==", + "site/node_modules/@astrojs/check/node_modules/yargs/node_modules/cliui/node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.3.0.tgz", + "integrity": "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@volar/language-server": { - "version": "2.4.28", - "resolved": "https://registry.npmjs.org/@volar/language-server/-/language-server-2.4.28.tgz", - "integrity": "sha512-NqcLnE5gERKuS4PUFwlhMxf6vqYo7hXtbMFbViXcbVkbZ905AIVWhnSo0ZNBC2V127H1/2zP7RvVOVnyITFfBw==", + "site/node_modules/@astrojs/check/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "dev": true, "license": "MIT", "dependencies": { - "@volar/language-core": "2.4.28", - "@volar/language-service": "2.4.28", - "@volar/typescript": "2.4.28", - "path-browserify": "^1.0.1", - "request-light": "^0.7.0", - "vscode-languageserver": "^9.0.1", - "vscode-languageserver-protocol": "^3.17.5", - "vscode-languageserver-textdocument": "^1.0.11", - "vscode-uri": "^3.0.8" + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@volar/language-server/node_modules/@volar/typescript": { - "version": "2.4.28", - "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.28.tgz", - "integrity": "sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==", + "site/node_modules/@astrojs/check/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, "license": "MIT", - "dependencies": { - "@volar/language-core": "2.4.28", - "path-browserify": "^1.0.1", - "vscode-uri": "^3.0.8" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@volar/language-server/node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "site/node_modules/@astrojs/check/node_modules/yargs/node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=6" + } }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@volar/language-server/node_modules/request-light": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/request-light/-/request-light-0.7.0.tgz", - "integrity": "sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q==", + "site/node_modules/@astrojs/check/node_modules/yargs/node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, - "license": "MIT" + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@volar/language-server/node_modules/vscode-languageserver": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz", - "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", + "site/node_modules/@astrojs/check/node_modules/yargs/node_modules/string-width": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.2.tgz", + "integrity": "sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==", "dev": true, "license": "MIT", "dependencies": { - "vscode-languageserver-protocol": "3.17.5" + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" }, - "bin": { - "installServerIntoExtension": "bin/installServerIntoExtension" + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@volar/language-server/node_modules/vscode-languageserver-protocol": { - "version": "3.18.3", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.18.3.tgz", - "integrity": "sha512-DF49+WeV5py4zO5hhobp60jjsDSK0lAqA0OuKBLBvp423HPWQcCbhZz3JgyfIewsEz2f8U+X75xNIFHdiXZm2w==", + "site/node_modules/@astrojs/check/node_modules/yargs/node_modules/string-width/node_modules/get-east-asian-width": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.7.0.tgz", + "integrity": "sha512-XjH1AECxf0giL2V1aU8vKyRR2ppRUb5c0EvT7zuJTokQ74bNo52zOtghqdWIqrhUD79fo3x0WfKZdOqxF6LG1Q==", "dev": true, "license": "MIT", - "dependencies": { - "vscode-jsonrpc": "9.0.2", - "vscode-languageserver-types": "3.18.3" + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@volar/language-server/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-9.0.2.tgz", - "integrity": "sha512-SbQSV9yRemARxeXw6LU5sS6Zq0e9/DgCCX5yelH263ZQWukbTk8EF8fjTrr1dziasf4GwlJbvTwFnTrnQFWZXQ==", + "site/node_modules/@astrojs/check/node_modules/yargs/node_modules/string-width/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, "engines": { - "node": ">=14.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@volar/language-server/node_modules/vscode-languageserver-protocol/node_modules/vscode-languageserver-types": { - "version": "3.18.3", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.18.3.tgz", - "integrity": "sha512-XIlzJ7Qp/jzSI1ds7/FwPAWrPeTZA7pAtlW4hdJ1J6xXWJL6dR9QYnDhJOdLzdKhUQ5Mm6mvUMw+3DcOQQasPw==", - "dev": true, - "license": "MIT" - }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@volar/language-server/node_modules/vscode-languageserver-textdocument": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.14.tgz", - "integrity": "sha512-EQyqJMi552E4ZTf46izQ4Fj6XquqxCySR3J5ZSD1SisMf6RfpeOWHxGBE8Gr6V0/3GHIGdAzDn8F8+1nTGCnoQ==", - "dev": true, - "license": "MIT" - }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@volar/language-server/node_modules/vscode-languageserver/node_modules/vscode-languageserver-protocol": { - "version": "3.17.5", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", - "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", + "site/node_modules/@astrojs/check/node_modules/yargs/node_modules/string-width/node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.3.0.tgz", + "integrity": "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==", "dev": true, "license": "MIT", - "dependencies": { - "vscode-jsonrpc": "8.2.0", - "vscode-languageserver-types": "3.17.5" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@volar/language-server/node_modules/vscode-languageserver/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", - "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", + "site/node_modules/@astrojs/check/node_modules/yargs/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, - "license": "MIT", + "license": "ISC", "engines": { - "node": ">=14.0.0" + "node": ">=10" } }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@volar/language-server/node_modules/vscode-languageserver/node_modules/vscode-languageserver-protocol/node_modules/vscode-languageserver-types": { - "version": "3.17.5", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", - "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", + "site/node_modules/@astrojs/check/node_modules/yargs/node_modules/yargs-parser": { + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", "dev": true, - "license": "MIT" + "license": "ISC", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@volar/language-service": { - "version": "2.4.28", - "resolved": "https://registry.npmjs.org/@volar/language-service/-/language-service-2.4.28.tgz", - "integrity": "sha512-Rh/wYCZJrI5vCwMk9xyw/Z+MsWxlJY1rmMZPsxUoJKfzIRjS/NF1NmnuEcrMbEVGja00aVpCsInJfixQTMdvLw==", - "dev": true, + "site/node_modules/@astrojs/starlight": { + "version": "0.42.2", + "resolved": "https://registry.npmjs.org/@astrojs/starlight/-/starlight-0.42.2.tgz", + "integrity": "sha512-rDAgv3QCJOo0F4EoWeuFG31OdhQOrcipATl9+gCkOqpQiO7u7FR8uVam+HHNJO8Sl21TOAQKUSUEvCXv8jEgJA==", "license": "MIT", "dependencies": { - "@volar/language-core": "2.4.28", - "vscode-languageserver-protocol": "^3.17.5", - "vscode-languageserver-textdocument": "^1.0.11", - "vscode-uri": "^3.0.8" + "@astrojs/markdown-satteri": "^0.4.0", + "@astrojs/mdx": "^8.0.0", + "@astrojs/sitemap": "^3.7.3", + "@pagefind/default-ui": "^1.3.0", + "@types/hast": "^3.0.5", + "@types/js-yaml": "^4.0.9", + "@types/mdast": "^4.0.4", + "astro-expressive-code": "^0.44.0", + "bcp-47": "^2.1.0", + "hast-util-format": "^1.1.0", + "hast-util-select": "^6.0.4", + "hast-util-to-html": "^9.0.5", + "hast-util-to-string": "^3.0.1", + "hastscript": "^9.0.1", + "i18next": "^26.0.7", + "js-yaml": "^4.1.1", + "klona": "^2.0.6", + "magic-string": "^1.2.3", + "mdast-util-directive": "^3.1.0", + "mdast-util-to-markdown": "^2.1.2", + "mdast-util-to-string": "^4.0.0", + "pagefind": "^1.5.2", + "remark-directive": "^4.0.0", + "satteri": "^0.10.3", + "ultrahtml": "^1.6.0", + "unified": "^11.0.5", + "unist-util-visit": "^5.1.0", + "vfile": "^6.0.3" + }, + "peerDependencies": { + "@astrojs/markdown-remark": "^7.3.0", + "astro": "^7.2.10" + }, + "peerDependenciesMeta": { + "@astrojs/markdown-remark": { + "optional": true + } } }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@volar/language-service/node_modules/vscode-languageserver-protocol": { - "version": "3.18.3", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.18.3.tgz", - "integrity": "sha512-DF49+WeV5py4zO5hhobp60jjsDSK0lAqA0OuKBLBvp423HPWQcCbhZz3JgyfIewsEz2f8U+X75xNIFHdiXZm2w==", - "dev": true, + "site/node_modules/@astrojs/starlight/node_modules/@astrojs/markdown-satteri": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@astrojs/markdown-satteri/-/markdown-satteri-0.4.1.tgz", + "integrity": "sha512-EniHbFNa6SQHDih7JnpPos3NWXO6hdt4raBcOosfGmlfc3gP9CI/sESA3VOf1PgJZ7SFfewlZW9Livn0JugEZg==", + "license": "MIT", + "dependencies": { + "@astrojs/internal-helpers": "0.11.0", + "@astrojs/prism": "4.0.2", + "github-slugger": "^2.0.0", + "satteri": "^0.10.3" + } + }, + "site/node_modules/@astrojs/starlight/node_modules/@astrojs/markdown-satteri/node_modules/@astrojs/internal-helpers": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.11.0.tgz", + "integrity": "sha512-3rzxJ+xbo0+8YyqOzLziIN32wmsHdCjEVz2sGOpRxJ+Ben/KiLph4ItxBy1abEL+E8fkRzqjg0rfXmaHJGw9JA==", "license": "MIT", "dependencies": { - "vscode-jsonrpc": "9.0.2", - "vscode-languageserver-types": "3.18.3" + "@types/hast": "^3.0.4", + "@types/mdast": "^4.0.4", + "js-yaml": "^4.3.0", + "picomatch": "^4.0.4", + "retext-smartypants": "^6.2.0", + "shiki": "^4.0.2", + "smol-toml": "^1.6.0", + "unified": "^11.0.5" } }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@volar/language-service/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-9.0.2.tgz", - "integrity": "sha512-SbQSV9yRemARxeXw6LU5sS6Zq0e9/DgCCX5yelH263ZQWukbTk8EF8fjTrr1dziasf4GwlJbvTwFnTrnQFWZXQ==", - "dev": true, + "site/node_modules/@astrojs/starlight/node_modules/@astrojs/markdown-satteri/node_modules/@astrojs/internal-helpers/node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", "license": "MIT", "engines": { - "node": ">=14.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@volar/language-service/node_modules/vscode-languageserver-protocol/node_modules/vscode-languageserver-types": { - "version": "3.18.3", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.18.3.tgz", - "integrity": "sha512-XIlzJ7Qp/jzSI1ds7/FwPAWrPeTZA7pAtlW4hdJ1J6xXWJL6dR9QYnDhJOdLzdKhUQ5Mm6mvUMw+3DcOQQasPw==", - "dev": true, - "license": "MIT" + "site/node_modules/@astrojs/starlight/node_modules/@astrojs/markdown-satteri/node_modules/@astrojs/internal-helpers/node_modules/retext-smartypants": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/retext-smartypants/-/retext-smartypants-6.2.0.tgz", + "integrity": "sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "nlcst-to-string": "^4.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/@volar/language-service/node_modules/vscode-languageserver-textdocument": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.14.tgz", - "integrity": "sha512-EQyqJMi552E4ZTf46izQ4Fj6XquqxCySR3J5ZSD1SisMf6RfpeOWHxGBE8Gr6V0/3GHIGdAzDn8F8+1nTGCnoQ==", - "dev": true, - "license": "MIT" + "site/node_modules/@astrojs/starlight/node_modules/@astrojs/markdown-satteri/node_modules/@astrojs/internal-helpers/node_modules/retext-smartypants/node_modules/@types/nlcst": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/nlcst/-/nlcst-2.0.3.tgz", + "integrity": "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/muggle-string": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", - "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", - "dev": true, + "site/node_modules/@astrojs/starlight/node_modules/@astrojs/markdown-satteri/node_modules/@astrojs/internal-helpers/node_modules/retext-smartypants/node_modules/@types/nlcst/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" }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/tinyglobby": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", - "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", - "dev": true, + "site/node_modules/@astrojs/starlight/node_modules/@astrojs/markdown-satteri/node_modules/@astrojs/internal-helpers/node_modules/retext-smartypants/node_modules/nlcst-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-4.0.0.tgz", + "integrity": "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==", "license": "MIT", "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.4" - }, - "engines": { - "node": ">=12.0.0" + "@types/nlcst": "^2.0.0" }, "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/tinyglobby/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, + "site/node_modules/@astrojs/starlight/node_modules/@astrojs/markdown-satteri/node_modules/@astrojs/internal-helpers/node_modules/shiki": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-4.4.3.tgz", + "integrity": "sha512-Mb/GvXPHBAXdgGIcnfU5L3ldpn1XcxrGkPHwqgRx17/I2XRfqlFKk2vGkHWINn1kdXvzJZeuO3is6I9KLPFm0g==", "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" + "dependencies": { + "@shikijs/core": "4.4.3", + "@shikijs/engine-javascript": "4.4.3", + "@shikijs/engine-oniguruma": "4.4.3", + "@shikijs/langs": "4.4.3", + "@shikijs/themes": "4.4.3", + "@shikijs/types": "4.4.3", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.5" }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } + "engines": { + "node": ">=20" } }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", - "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", - "dev": true, + "site/node_modules/@astrojs/starlight/node_modules/@astrojs/markdown-satteri/node_modules/@astrojs/internal-helpers/node_modules/shiki/node_modules/@shikijs/core": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-4.4.3.tgz", + "integrity": "sha512-QCR4q2ZO/ILJEuwiBMel4wdcTDb1JGwfjKTxPDF6x8ixOaluPrVqIn06C99AcRPhmYlBR56d/Fb+GN58GzExpg==", "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "@shikijs/primitive": "4.4.3", + "@shikijs/types": "4.4.3", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.5", + "hast-util-to-html": "^9.0.5" }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "engines": { + "node": ">=20" } }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-css": { - "version": "0.0.71", - "resolved": "https://registry.npmjs.org/volar-service-css/-/volar-service-css-0.0.71.tgz", - "integrity": "sha512-wRRFt9BpjMKCazcgOh67MSjUjiWUCAh99DyYSDIOTuxaRjEtDC7PpB0k1Y1wbJIW/pVtMUSVbpPo3UGSm0Byxw==", - "dev": true, + "site/node_modules/@astrojs/starlight/node_modules/@astrojs/markdown-satteri/node_modules/@astrojs/internal-helpers/node_modules/shiki/node_modules/@shikijs/core/node_modules/@shikijs/primitive": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@shikijs/primitive/-/primitive-4.4.3.tgz", + "integrity": "sha512-m0wBeLDQDeIxRdUmrCPdQqfuUamDwRL5isCfYbguKD6NiaKpVbsv+3J81DyIKgNW5h4WAIIr8T4EkgQrBBxvaQ==", "license": "MIT", "dependencies": { - "vscode-css-languageservice": "^6.3.0", - "vscode-languageserver-textdocument": "^1.0.11", - "vscode-uri": "^3.0.8" - }, - "peerDependencies": { - "@volar/language-service": "~2.4.0" + "@shikijs/types": "4.4.3", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.5" }, - "peerDependenciesMeta": { - "@volar/language-service": { - "optional": true - } + "engines": { + "node": ">=20" } }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-css/node_modules/vscode-css-languageservice": { - "version": "6.3.10", - "resolved": "https://registry.npmjs.org/vscode-css-languageservice/-/vscode-css-languageservice-6.3.10.tgz", - "integrity": "sha512-eq5N9Er3fC4vA9zd9EFhyBG90wtCCuXgRSpAndaOgXMh1Wgep5lBgRIeDgjZBW9pa+332yC9+49cZMW8jcL3MA==", - "dev": true, + "site/node_modules/@astrojs/starlight/node_modules/@astrojs/markdown-satteri/node_modules/@astrojs/internal-helpers/node_modules/shiki/node_modules/@shikijs/engine-javascript": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-4.4.3.tgz", + "integrity": "sha512-FbOjFJp9VLdo1Wevs10BBtVxiTWwNLqZh5Gkhjgda/ioL15YOgeSl9n+6XMa3qRlPQzfhFNe641SrynFHYG0nQ==", "license": "MIT", "dependencies": { - "@vscode/l10n": "^0.0.18", - "vscode-languageserver-textdocument": "^1.0.12", - "vscode-languageserver-types": "3.17.5", - "vscode-uri": "^3.1.0" + "@shikijs/types": "4.4.3", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^4.3.6" + }, + "engines": { + "node": ">=20" } }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-css/node_modules/vscode-css-languageservice/node_modules/@vscode/l10n": { - "version": "0.0.18", - "resolved": "https://registry.npmjs.org/@vscode/l10n/-/l10n-0.0.18.tgz", - "integrity": "sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==", - "dev": true, - "license": "MIT" - }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-css/node_modules/vscode-css-languageservice/node_modules/vscode-languageserver-types": { - "version": "3.17.5", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", - "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", - "dev": true, - "license": "MIT" + "site/node_modules/@astrojs/starlight/node_modules/@astrojs/markdown-satteri/node_modules/@astrojs/internal-helpers/node_modules/shiki/node_modules/@shikijs/engine-javascript/node_modules/oniguruma-to-es": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.6.tgz", + "integrity": "sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==", + "license": "MIT", + "dependencies": { + "oniguruma-parser": "^0.12.2", + "regex": "^6.1.0", + "regex-recursion": "^6.0.2" + } }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-css/node_modules/vscode-languageserver-textdocument": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.14.tgz", - "integrity": "sha512-EQyqJMi552E4ZTf46izQ4Fj6XquqxCySR3J5ZSD1SisMf6RfpeOWHxGBE8Gr6V0/3GHIGdAzDn8F8+1nTGCnoQ==", - "dev": true, + "site/node_modules/@astrojs/starlight/node_modules/@astrojs/markdown-satteri/node_modules/@astrojs/internal-helpers/node_modules/shiki/node_modules/@shikijs/engine-javascript/node_modules/oniguruma-to-es/node_modules/oniguruma-parser": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.2.tgz", + "integrity": "sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==", "license": "MIT" }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-emmet": { - "version": "0.0.71", - "resolved": "https://registry.npmjs.org/volar-service-emmet/-/volar-service-emmet-0.0.71.tgz", - "integrity": "sha512-zqjzt6bN95e3CUstBm0PBFAJnrfz0ZAARka87fart46/gNCLLuP3Vujy8V/J8HEziTFLnfkgIASLFYPUhonJcA==", - "dev": true, + "site/node_modules/@astrojs/starlight/node_modules/@astrojs/markdown-satteri/node_modules/@astrojs/internal-helpers/node_modules/shiki/node_modules/@shikijs/engine-javascript/node_modules/oniguruma-to-es/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": { - "@emmetio/css-parser": "^0.4.1", - "@emmetio/html-matcher": "^1.3.0", - "@vscode/emmet-helper": "^2.9.3", - "vscode-uri": "^3.0.8" - }, - "peerDependencies": { - "@volar/language-service": "~2.4.0" - }, - "peerDependenciesMeta": { - "@volar/language-service": { - "optional": true - } + "regex-utilities": "^2.3.0" } }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-emmet/node_modules/@emmetio/css-parser": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@emmetio/css-parser/-/css-parser-0.4.1.tgz", - "integrity": "sha512-2bC6m0MV/voF4CTZiAbG5MWKbq5EBmDPKu9Sb7s7nVcEzNQlrZP6mFFFlIaISM8X6514H9shWMme1fCm8cWAfQ==", - "dev": true, + "site/node_modules/@astrojs/starlight/node_modules/@astrojs/markdown-satteri/node_modules/@astrojs/internal-helpers/node_modules/shiki/node_modules/@shikijs/engine-javascript/node_modules/oniguruma-to-es/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": { - "@emmetio/stream-reader": "^2.2.0", - "@emmetio/stream-reader-utils": "^0.1.0" + "regex-utilities": "^2.3.0" } }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-emmet/node_modules/@emmetio/css-parser/node_modules/@emmetio/stream-reader": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@emmetio/stream-reader/-/stream-reader-2.2.0.tgz", - "integrity": "sha512-fXVXEyFA5Yv3M3n8sUGT7+fvecGrZP4k6FnWWMSZVQf69kAq0LLpaBQLGcPR30m3zMmKYhECP4k/ZkzvhEW5kw==", - "dev": true, + "site/node_modules/@astrojs/starlight/node_modules/@astrojs/markdown-satteri/node_modules/@astrojs/internal-helpers/node_modules/shiki/node_modules/@shikijs/engine-javascript/node_modules/oniguruma-to-es/node_modules/regex-recursion/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" }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-emmet/node_modules/@emmetio/css-parser/node_modules/@emmetio/stream-reader-utils": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@emmetio/stream-reader-utils/-/stream-reader-utils-0.1.0.tgz", - "integrity": "sha512-ZsZ2I9Vzso3Ho/pjZFsmmZ++FWeEd/txqybHTm4OgaZzdS8V9V/YYWQwg5TC38Z7uLWUV1vavpLLbjJtKubR1A==", - "dev": true, + "site/node_modules/@astrojs/starlight/node_modules/@astrojs/markdown-satteri/node_modules/@astrojs/internal-helpers/node_modules/shiki/node_modules/@shikijs/engine-javascript/node_modules/oniguruma-to-es/node_modules/regex/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" }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-emmet/node_modules/@emmetio/html-matcher": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@emmetio/html-matcher/-/html-matcher-1.3.0.tgz", - "integrity": "sha512-NTbsvppE5eVyBMuyGfVu2CRrLvo7J4YHb6t9sBFLyY03WYhXET37qA4zOYUjBWFCRHO7pS1B9khERtY0f5JXPQ==", - "dev": true, - "license": "ISC", + "site/node_modules/@astrojs/starlight/node_modules/@astrojs/markdown-satteri/node_modules/@astrojs/internal-helpers/node_modules/shiki/node_modules/@shikijs/engine-oniguruma": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-4.4.3.tgz", + "integrity": "sha512-EcOQkxdxGQrc1Row/cC2c96/v1dbZqGnEVu1qTuT/MJmp6+cXCvQussowVmCv5Tqr3KuY3c7IbM6HTW3LJ1k9w==", + "license": "MIT", "dependencies": { - "@emmetio/scanner": "^1.0.0" + "@shikijs/types": "4.4.3", + "@shikijs/vscode-textmate": "^10.0.2" + }, + "engines": { + "node": ">=20" } }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-emmet/node_modules/@emmetio/html-matcher/node_modules/@emmetio/scanner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@emmetio/scanner/-/scanner-1.0.4.tgz", - "integrity": "sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA==", - "dev": true, - "license": "MIT" - }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-emmet/node_modules/@vscode/emmet-helper": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/@vscode/emmet-helper/-/emmet-helper-2.11.0.tgz", - "integrity": "sha512-QLxjQR3imPZPQltfbWRnHU6JecWTF1QSWhx3GAKQpslx7y3Dp6sIIXhKjiUJ/BR9FX8PVthjr9PD6pNwOJfAzw==", - "dev": true, + "site/node_modules/@astrojs/starlight/node_modules/@astrojs/markdown-satteri/node_modules/@astrojs/internal-helpers/node_modules/shiki/node_modules/@shikijs/langs": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-4.4.3.tgz", + "integrity": "sha512-ePic0yfAJGOF83D5wBHK/00EjK65oahBYxFk5epgq33WRv7X9UuxLEV8PtR0szC0z8dl7INIpIodB99JRFlR+A==", "license": "MIT", "dependencies": { - "emmet": "^2.4.3", - "jsonc-parser": "^2.3.0", - "vscode-languageserver-textdocument": "^1.0.1", - "vscode-languageserver-types": "^3.15.1", - "vscode-uri": "^3.0.8" + "@shikijs/types": "4.4.3" + }, + "engines": { + "node": ">=20" } }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-emmet/node_modules/@vscode/emmet-helper/node_modules/emmet": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/emmet/-/emmet-2.4.11.tgz", - "integrity": "sha512-23QPJB3moh/U9sT4rQzGgeyyGIrcM+GH5uVYg2C6wZIxAIJq7Ng3QLT79tl8FUwDXhyq9SusfknOrofAKqvgyQ==", - "dev": true, + "site/node_modules/@astrojs/starlight/node_modules/@astrojs/markdown-satteri/node_modules/@astrojs/internal-helpers/node_modules/shiki/node_modules/@shikijs/themes": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-4.4.3.tgz", + "integrity": "sha512-w8UHjeUnIR965KMWJHUPXOc2mNJUnK3vpVLYLvw5IYU2mnTTJ89E24OrJDBNiJDQ0qzb0tc4l7mrIXx5cFeIyw==", "license": "MIT", - "workspaces": [ - "./packages/scanner", - "./packages/abbreviation", - "./packages/css-abbreviation", - "./" - ], "dependencies": { - "@emmetio/abbreviation": "^2.3.3", - "@emmetio/css-abbreviation": "^2.1.8" + "@shikijs/types": "4.4.3" + }, + "engines": { + "node": ">=20" } }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-emmet/node_modules/@vscode/emmet-helper/node_modules/emmet/node_modules/@emmetio/abbreviation": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@emmetio/abbreviation/-/abbreviation-2.3.3.tgz", - "integrity": "sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA==", - "dev": true, + "site/node_modules/@astrojs/starlight/node_modules/@astrojs/markdown-satteri/node_modules/@astrojs/internal-helpers/node_modules/shiki/node_modules/@shikijs/types": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.4.3.tgz", + "integrity": "sha512-UEJxmRR++MAGR6hugn0vgVS2W/6lWAts84FFSrnlH9sP0LNol7E5+NQ792pH8liWUhyMyjhTgSUH3k7iD7tc5g==", "license": "MIT", "dependencies": { - "@emmetio/scanner": "^1.0.4" + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.5" + }, + "engines": { + "node": ">=20" } }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-emmet/node_modules/@vscode/emmet-helper/node_modules/emmet/node_modules/@emmetio/abbreviation/node_modules/@emmetio/scanner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@emmetio/scanner/-/scanner-1.0.4.tgz", - "integrity": "sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA==", - "dev": true, + "site/node_modules/@astrojs/starlight/node_modules/@astrojs/markdown-satteri/node_modules/@astrojs/internal-helpers/node_modules/shiki/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" }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-emmet/node_modules/@vscode/emmet-helper/node_modules/emmet/node_modules/@emmetio/css-abbreviation": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@emmetio/css-abbreviation/-/css-abbreviation-2.1.8.tgz", - "integrity": "sha512-s9yjhJ6saOO/uk1V74eifykk2CBYi01STTK3WlXWGOepyKa23ymJ053+DNQjpFcy1ingpaO7AxCcwLvHFY9tuw==", - "dev": true, + "site/node_modules/@astrojs/starlight/node_modules/@astrojs/markdown-satteri/node_modules/@astrojs/internal-helpers/node_modules/smol-toml": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.8.0.tgz", + "integrity": "sha512-kCZr2V3ch9i00x8zXRhjUNVcjG9ijES5dDudkXvUVCT5QlJNQWElSJdZqyPemffHoLNUYwOcou0Fy+ojN0uHSQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 18" + }, + "funding": { + "url": "https://github.com/sponsors/cyyynthia" + } + }, + "site/node_modules/@astrojs/starlight/node_modules/@astrojs/markdown-satteri/node_modules/@astrojs/prism": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-4.0.2.tgz", + "integrity": "sha512-KTivpmnz6lDsC6o9H4+DNm2SrE/GHzw8cNAvEJwAvUT+eoaEnn/4NtbDNfRRaxaJHdp15gf+tfHAWiXR4wB3BA==", "license": "MIT", "dependencies": { - "@emmetio/scanner": "^1.0.4" + "prismjs": "^1.30.0" + }, + "engines": { + "node": ">=22.12.0" } }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-emmet/node_modules/@vscode/emmet-helper/node_modules/emmet/node_modules/@emmetio/css-abbreviation/node_modules/@emmetio/scanner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@emmetio/scanner/-/scanner-1.0.4.tgz", - "integrity": "sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA==", - "dev": true, - "license": "MIT" - }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-emmet/node_modules/@vscode/emmet-helper/node_modules/jsonc-parser": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.3.1.tgz", - "integrity": "sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==", - "dev": true, - "license": "MIT" - }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-emmet/node_modules/@vscode/emmet-helper/node_modules/vscode-languageserver-textdocument": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.14.tgz", - "integrity": "sha512-EQyqJMi552E4ZTf46izQ4Fj6XquqxCySR3J5ZSD1SisMf6RfpeOWHxGBE8Gr6V0/3GHIGdAzDn8F8+1nTGCnoQ==", - "dev": true, - "license": "MIT" + "site/node_modules/@astrojs/starlight/node_modules/@astrojs/markdown-satteri/node_modules/@astrojs/prism/node_modules/prismjs": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "license": "MIT", + "engines": { + "node": ">=6" + } }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-emmet/node_modules/@vscode/emmet-helper/node_modules/vscode-languageserver-types": { - "version": "3.18.3", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.18.3.tgz", - "integrity": "sha512-XIlzJ7Qp/jzSI1ds7/FwPAWrPeTZA7pAtlW4hdJ1J6xXWJL6dR9QYnDhJOdLzdKhUQ5Mm6mvUMw+3DcOQQasPw==", - "dev": true, - "license": "MIT" + "site/node_modules/@astrojs/starlight/node_modules/@astrojs/markdown-satteri/node_modules/github-slugger": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", + "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==", + "license": "ISC" }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-html": { - "version": "0.0.71", - "resolved": "https://registry.npmjs.org/volar-service-html/-/volar-service-html-0.0.71.tgz", - "integrity": "sha512-e8tHPhgQ7ooLfudAEIku+kgd9pWkq3SSz8RbnQDI1+Eb8wbenkLGHqoirLqz5ORLV6wIMr2Iv08RWBG5eOcgpw==", - "dev": true, + "site/node_modules/@astrojs/starlight/node_modules/@astrojs/mdx": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-8.0.1.tgz", + "integrity": "sha512-VKodp/f3+XE6L0950K+ZOAolY47vdt0R78Ao+L2RdJ1hfAdYffL7IEjc/MsoyuS7CPVvCsd5/I3RP0ZyAIewdQ==", "license": "MIT", "dependencies": { - "vscode-html-languageservice": "^5.3.0", - "vscode-languageserver-textdocument": "^1.0.11", - "vscode-uri": "^3.0.8" + "@astrojs/internal-helpers": "0.11.0", + "@astrojs/markdown-satteri": "0.4.1", + "es-module-lexer": "^2.0.0" + }, + "engines": { + "node": ">=22.12.0" }, "peerDependencies": { - "@volar/language-service": "~2.4.0" + "@astrojs/markdown-remark": "^7.3.0", + "@astrojs/markdown-satteri": "^0.4.0", + "astro": "^7.2.6" }, "peerDependenciesMeta": { - "@volar/language-service": { + "@astrojs/markdown-remark": { "optional": true } } }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-html/node_modules/vscode-languageserver-textdocument": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.14.tgz", - "integrity": "sha512-EQyqJMi552E4ZTf46izQ4Fj6XquqxCySR3J5ZSD1SisMf6RfpeOWHxGBE8Gr6V0/3GHIGdAzDn8F8+1nTGCnoQ==", - "dev": true, - "license": "MIT" - }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-prettier": { - "version": "0.0.71", - "resolved": "https://registry.npmjs.org/volar-service-prettier/-/volar-service-prettier-0.0.71.tgz", - "integrity": "sha512-Rz7JVH3qD108UCdmIEiZvOBNljMt2nLFdbN8AXcDfn7xD9F5I2aCIsDVqBbXw21PsnxG0b7MfwtNF+zPS/NKUg==", - "dev": true, + "site/node_modules/@astrojs/starlight/node_modules/@astrojs/mdx/node_modules/@astrojs/internal-helpers": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.11.0.tgz", + "integrity": "sha512-3rzxJ+xbo0+8YyqOzLziIN32wmsHdCjEVz2sGOpRxJ+Ben/KiLph4ItxBy1abEL+E8fkRzqjg0rfXmaHJGw9JA==", "license": "MIT", "dependencies": { - "vscode-uri": "^3.0.8" + "@types/hast": "^3.0.4", + "@types/mdast": "^4.0.4", + "js-yaml": "^4.3.0", + "picomatch": "^4.0.4", + "retext-smartypants": "^6.2.0", + "shiki": "^4.0.2", + "smol-toml": "^1.6.0", + "unified": "^11.0.5" + } + }, + "site/node_modules/@astrojs/starlight/node_modules/@astrojs/mdx/node_modules/@astrojs/internal-helpers/node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "license": "MIT", + "engines": { + "node": ">=12" }, - "peerDependencies": { - "@volar/language-service": "~2.4.0", - "prettier": "^2.2 || ^3.0" + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "site/node_modules/@astrojs/starlight/node_modules/@astrojs/mdx/node_modules/@astrojs/internal-helpers/node_modules/retext-smartypants": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/retext-smartypants/-/retext-smartypants-6.2.0.tgz", + "integrity": "sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "nlcst-to-string": "^4.0.0", + "unist-util-visit": "^5.0.0" }, - "peerDependenciesMeta": { - "@volar/language-service": { - "optional": true - }, - "prettier": { - "optional": true - } + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "site/node_modules/@astrojs/starlight/node_modules/@astrojs/mdx/node_modules/@astrojs/internal-helpers/node_modules/retext-smartypants/node_modules/@types/nlcst": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/nlcst/-/nlcst-2.0.3.tgz", + "integrity": "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" } }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-typescript": { - "version": "0.0.71", - "resolved": "https://registry.npmjs.org/volar-service-typescript/-/volar-service-typescript-0.0.71.tgz", - "integrity": "sha512-yTtM/BVT6hoyEYnDtaCyAtNhdNeS/mhTTABlBOdw3NNiRBUin3IznFJpgfjer4c6RYopiPjjQjc9VFhxVl1mLw==", - "dev": true, + "site/node_modules/@astrojs/starlight/node_modules/@astrojs/mdx/node_modules/@astrojs/internal-helpers/node_modules/retext-smartypants/node_modules/@types/nlcst/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" + }, + "site/node_modules/@astrojs/starlight/node_modules/@astrojs/mdx/node_modules/@astrojs/internal-helpers/node_modules/retext-smartypants/node_modules/nlcst-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-4.0.0.tgz", + "integrity": "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==", "license": "MIT", "dependencies": { - "path-browserify": "^1.0.1", - "semver": "^7.6.2", - "typescript-auto-import-cache": "^0.3.5", - "vscode-languageserver-textdocument": "^1.0.11", - "vscode-nls": "^5.2.0", - "vscode-uri": "^3.0.8" - }, - "peerDependencies": { - "@volar/language-service": "~2.4.0" + "@types/nlcst": "^2.0.0" }, - "peerDependenciesMeta": { - "@volar/language-service": { - "optional": true - } + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-typescript-twoslash-queries": { - "version": "0.0.71", - "resolved": "https://registry.npmjs.org/volar-service-typescript-twoslash-queries/-/volar-service-typescript-twoslash-queries-0.0.71.tgz", - "integrity": "sha512-9K2k72s4n7rV9s4bX0MyjbX9iBribvKZbBJKuEmTCZfeWJXs6Yh7bGpY4eoc7UufAjvpheBqwyZCOIPBvxCv0A==", - "dev": true, + "site/node_modules/@astrojs/starlight/node_modules/@astrojs/mdx/node_modules/@astrojs/internal-helpers/node_modules/shiki": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-4.4.3.tgz", + "integrity": "sha512-Mb/GvXPHBAXdgGIcnfU5L3ldpn1XcxrGkPHwqgRx17/I2XRfqlFKk2vGkHWINn1kdXvzJZeuO3is6I9KLPFm0g==", "license": "MIT", "dependencies": { - "vscode-uri": "^3.0.8" - }, - "peerDependencies": { - "@volar/language-service": "~2.4.0" + "@shikijs/core": "4.4.3", + "@shikijs/engine-javascript": "4.4.3", + "@shikijs/engine-oniguruma": "4.4.3", + "@shikijs/langs": "4.4.3", + "@shikijs/themes": "4.4.3", + "@shikijs/types": "4.4.3", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.5" }, - "peerDependenciesMeta": { - "@volar/language-service": { - "optional": true - } + "engines": { + "node": ">=20" } }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-typescript/node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "dev": true, - "license": "MIT" - }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-typescript/node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "site/node_modules/@astrojs/starlight/node_modules/@astrojs/mdx/node_modules/@astrojs/internal-helpers/node_modules/shiki/node_modules/@shikijs/core": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-4.4.3.tgz", + "integrity": "sha512-QCR4q2ZO/ILJEuwiBMel4wdcTDb1JGwfjKTxPDF6x8ixOaluPrVqIn06C99AcRPhmYlBR56d/Fb+GN58GzExpg==", + "license": "MIT", + "dependencies": { + "@shikijs/primitive": "4.4.3", + "@shikijs/types": "4.4.3", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.5", + "hast-util-to-html": "^9.0.5" }, "engines": { - "node": ">=10" + "node": ">=20" } }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-typescript/node_modules/typescript-auto-import-cache": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/typescript-auto-import-cache/-/typescript-auto-import-cache-0.3.6.tgz", - "integrity": "sha512-RpuHXrknHdVdK7wv/8ug3Fr0WNsNi5l5aB8MYYuXhq2UH5lnEB1htJ1smhtD5VeCsGr2p8mUDtd83LCQDFVgjQ==", - "dev": true, + "site/node_modules/@astrojs/starlight/node_modules/@astrojs/mdx/node_modules/@astrojs/internal-helpers/node_modules/shiki/node_modules/@shikijs/core/node_modules/@shikijs/primitive": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@shikijs/primitive/-/primitive-4.4.3.tgz", + "integrity": "sha512-m0wBeLDQDeIxRdUmrCPdQqfuUamDwRL5isCfYbguKD6NiaKpVbsv+3J81DyIKgNW5h4WAIIr8T4EkgQrBBxvaQ==", "license": "MIT", "dependencies": { - "semver": "^7.3.8" + "@shikijs/types": "4.4.3", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.5" + }, + "engines": { + "node": ">=20" } }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-typescript/node_modules/vscode-languageserver-textdocument": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.14.tgz", - "integrity": "sha512-EQyqJMi552E4ZTf46izQ4Fj6XquqxCySR3J5ZSD1SisMf6RfpeOWHxGBE8Gr6V0/3GHIGdAzDn8F8+1nTGCnoQ==", - "dev": true, - "license": "MIT" - }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-typescript/node_modules/vscode-nls": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/vscode-nls/-/vscode-nls-5.2.0.tgz", - "integrity": "sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==", - "dev": true, - "license": "MIT" - }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-yaml": { - "version": "0.0.71", - "resolved": "https://registry.npmjs.org/volar-service-yaml/-/volar-service-yaml-0.0.71.tgz", - "integrity": "sha512-qYGWGuVpUTnZGu5P/CR4KLK4aIR8RrcVnmfZ2eRcj9q/I8VZCoC5yy9FtEvfNvnDp4MU17yhdJcvpQPIqhJS2Q==", - "dev": true, + "site/node_modules/@astrojs/starlight/node_modules/@astrojs/mdx/node_modules/@astrojs/internal-helpers/node_modules/shiki/node_modules/@shikijs/engine-javascript": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-4.4.3.tgz", + "integrity": "sha512-FbOjFJp9VLdo1Wevs10BBtVxiTWwNLqZh5Gkhjgda/ioL15YOgeSl9n+6XMa3qRlPQzfhFNe641SrynFHYG0nQ==", "license": "MIT", "dependencies": { - "vscode-uri": "^3.0.8", - "yaml-language-server": "~1.23.0" - }, - "peerDependencies": { - "@volar/language-service": "~2.4.0" + "@shikijs/types": "4.4.3", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^4.3.6" }, - "peerDependenciesMeta": { - "@volar/language-service": { - "optional": true - } + "engines": { + "node": ">=20" } }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-yaml/node_modules/yaml-language-server": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/yaml-language-server/-/yaml-language-server-1.23.0.tgz", - "integrity": "sha512-3qVyCOexLCWw06PQa5kRPwvMWMZ/eZeCRWUvgD6a0OkqL/4iCnxy2WumbWifa937Uo5xhyWJ0uxlU39ljhNh7A==", - "dev": true, + "site/node_modules/@astrojs/starlight/node_modules/@astrojs/mdx/node_modules/@astrojs/internal-helpers/node_modules/shiki/node_modules/@shikijs/engine-javascript/node_modules/oniguruma-to-es": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.6.tgz", + "integrity": "sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==", "license": "MIT", "dependencies": { - "@vscode/l10n": "^0.0.18", - "ajv": "^8.17.1", - "ajv-draft-04": "^1.0.0", - "ajv-i18n": "^4.2.0", - "prettier": "^3.8.1", - "request-light": "^0.5.7", - "vscode-json-languageservice": "4.1.8", - "vscode-languageserver": "^9.0.0", - "vscode-languageserver-textdocument": "^1.0.1", - "vscode-languageserver-types": "^3.16.0", - "vscode-uri": "^3.0.2", - "yaml": "2.8.3" - }, - "bin": { - "yaml-language-server": "bin/yaml-language-server" + "oniguruma-parser": "^0.12.2", + "regex": "^6.1.0", + "regex-recursion": "^6.0.2" } }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-yaml/node_modules/yaml-language-server/node_modules/@vscode/l10n": { - "version": "0.0.18", - "resolved": "https://registry.npmjs.org/@vscode/l10n/-/l10n-0.0.18.tgz", - "integrity": "sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==", - "dev": true, + "site/node_modules/@astrojs/starlight/node_modules/@astrojs/mdx/node_modules/@astrojs/internal-helpers/node_modules/shiki/node_modules/@shikijs/engine-javascript/node_modules/oniguruma-to-es/node_modules/oniguruma-parser": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.2.tgz", + "integrity": "sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==", "license": "MIT" }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-yaml/node_modules/yaml-language-server/node_modules/ajv": { - "version": "8.20.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", - "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", - "dev": true, + "site/node_modules/@astrojs/starlight/node_modules/@astrojs/mdx/node_modules/@astrojs/internal-helpers/node_modules/shiki/node_modules/@shikijs/engine-javascript/node_modules/oniguruma-to-es/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": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-yaml/node_modules/yaml-language-server/node_modules/ajv-draft-04": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", - "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "ajv": "^8.5.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } + "regex-utilities": "^2.3.0" } }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-yaml/node_modules/yaml-language-server/node_modules/ajv-i18n": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/ajv-i18n/-/ajv-i18n-4.2.0.tgz", - "integrity": "sha512-v/ei2UkCEeuKNXh8RToiFsUclmU+G57LO1Oo22OagNMENIw+Yb8eMwvHu7Vn9fmkjJyv6XclhJ8TbuigSglPkg==", - "dev": true, + "site/node_modules/@astrojs/starlight/node_modules/@astrojs/mdx/node_modules/@astrojs/internal-helpers/node_modules/shiki/node_modules/@shikijs/engine-javascript/node_modules/oniguruma-to-es/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", - "peerDependencies": { - "ajv": "^8.0.0-beta.0" + "dependencies": { + "regex-utilities": "^2.3.0" } }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-yaml/node_modules/yaml-language-server/node_modules/ajv/node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, + "site/node_modules/@astrojs/starlight/node_modules/@astrojs/mdx/node_modules/@astrojs/internal-helpers/node_modules/shiki/node_modules/@shikijs/engine-javascript/node_modules/oniguruma-to-es/node_modules/regex-recursion/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" }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-yaml/node_modules/yaml-language-server/node_modules/ajv/node_modules/fast-uri": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.8.tgz", - "integrity": "sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause" - }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-yaml/node_modules/yaml-language-server/node_modules/ajv/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, + "site/node_modules/@astrojs/starlight/node_modules/@astrojs/mdx/node_modules/@astrojs/internal-helpers/node_modules/shiki/node_modules/@shikijs/engine-javascript/node_modules/oniguruma-to-es/node_modules/regex/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" }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-yaml/node_modules/yaml-language-server/node_modules/ajv/node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, + "site/node_modules/@astrojs/starlight/node_modules/@astrojs/mdx/node_modules/@astrojs/internal-helpers/node_modules/shiki/node_modules/@shikijs/engine-oniguruma": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-4.4.3.tgz", + "integrity": "sha512-EcOQkxdxGQrc1Row/cC2c96/v1dbZqGnEVu1qTuT/MJmp6+cXCvQussowVmCv5Tqr3KuY3c7IbM6HTW3LJ1k9w==", "license": "MIT", + "dependencies": { + "@shikijs/types": "4.4.3", + "@shikijs/vscode-textmate": "^10.0.2" + }, "engines": { - "node": ">=0.10.0" + "node": ">=20" } }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-yaml/node_modules/yaml-language-server/node_modules/prettier": { - "version": "3.9.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.8.tgz", - "integrity": "sha512-WRFq3Wn3WId7LLROfMLdH7xaFr2jR62wU8nLO6rQUOLOxNZUviyJQs1M0iIhLexSFy+L+w0ch66wtoO2jRjG0A==", - "dev": true, + "site/node_modules/@astrojs/starlight/node_modules/@astrojs/mdx/node_modules/@astrojs/internal-helpers/node_modules/shiki/node_modules/@shikijs/langs": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-4.4.3.tgz", + "integrity": "sha512-ePic0yfAJGOF83D5wBHK/00EjK65oahBYxFk5epgq33WRv7X9UuxLEV8PtR0szC0z8dl7INIpIodB99JRFlR+A==", "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" + "dependencies": { + "@shikijs/types": "4.4.3" }, "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "node": ">=20" } }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-yaml/node_modules/yaml-language-server/node_modules/request-light": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/request-light/-/request-light-0.5.8.tgz", - "integrity": "sha512-3Zjgh+8b5fhRJBQZoy+zbVKpAQGLyka0MPgW3zruTF4dFFJ8Fqcfu9YsAvi/rvdcaTeWG3MkbZv4WKxAn/84Lg==", - "dev": true, - "license": "MIT" + "site/node_modules/@astrojs/starlight/node_modules/@astrojs/mdx/node_modules/@astrojs/internal-helpers/node_modules/shiki/node_modules/@shikijs/themes": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-4.4.3.tgz", + "integrity": "sha512-w8UHjeUnIR965KMWJHUPXOc2mNJUnK3vpVLYLvw5IYU2mnTTJ89E24OrJDBNiJDQ0qzb0tc4l7mrIXx5cFeIyw==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.4.3" + }, + "engines": { + "node": ">=20" + } }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-yaml/node_modules/yaml-language-server/node_modules/vscode-json-languageservice": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/vscode-json-languageservice/-/vscode-json-languageservice-4.1.8.tgz", - "integrity": "sha512-0vSpg6Xd9hfV+eZAaYN63xVVMOTmJ4GgHxXnkLCh+9RsQBkWKIghzLhW2B9ebfG+LQQg8uLtsQ2aUKjTgE+QOg==", - "dev": true, + "site/node_modules/@astrojs/starlight/node_modules/@astrojs/mdx/node_modules/@astrojs/internal-helpers/node_modules/shiki/node_modules/@shikijs/types": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.4.3.tgz", + "integrity": "sha512-UEJxmRR++MAGR6hugn0vgVS2W/6lWAts84FFSrnlH9sP0LNol7E5+NQ792pH8liWUhyMyjhTgSUH3k7iD7tc5g==", "license": "MIT", "dependencies": { - "jsonc-parser": "^3.0.0", - "vscode-languageserver-textdocument": "^1.0.1", - "vscode-languageserver-types": "^3.16.0", - "vscode-nls": "^5.0.0", - "vscode-uri": "^3.0.2" + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.5" }, "engines": { - "npm": ">=7.0.0" + "node": ">=20" } }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-yaml/node_modules/yaml-language-server/node_modules/vscode-json-languageservice/node_modules/jsonc-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", - "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", - "dev": true, + "site/node_modules/@astrojs/starlight/node_modules/@astrojs/mdx/node_modules/@astrojs/internal-helpers/node_modules/shiki/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" }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-yaml/node_modules/yaml-language-server/node_modules/vscode-json-languageservice/node_modules/vscode-nls": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/vscode-nls/-/vscode-nls-5.2.0.tgz", - "integrity": "sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==", - "dev": true, + "site/node_modules/@astrojs/starlight/node_modules/@astrojs/mdx/node_modules/@astrojs/internal-helpers/node_modules/smol-toml": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.8.0.tgz", + "integrity": "sha512-kCZr2V3ch9i00x8zXRhjUNVcjG9ijES5dDudkXvUVCT5QlJNQWElSJdZqyPemffHoLNUYwOcou0Fy+ojN0uHSQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 18" + }, + "funding": { + "url": "https://github.com/sponsors/cyyynthia" + } + }, + "site/node_modules/@astrojs/starlight/node_modules/@astrojs/mdx/node_modules/es-module-lexer": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.2.tgz", + "integrity": "sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==", "license": "MIT" }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-yaml/node_modules/yaml-language-server/node_modules/vscode-languageserver": { + "site/node_modules/@astrojs/starlight/node_modules/@astrojs/sitemap": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@astrojs/sitemap/-/sitemap-3.7.4.tgz", + "integrity": "sha512-LbKNC24bdUWcQf/pThB6qLlSqHojxGjZDURIzFocY8rlWnAn2t74nnhnK6S5x0NHriHoAduLEpVjRykmeGiVvA==", + "license": "MIT", + "dependencies": { + "sitemap": "^9.0.0", + "zod": "^4.3.6" + } + }, + "site/node_modules/@astrojs/starlight/node_modules/@astrojs/sitemap/node_modules/sitemap": { "version": "9.0.1", - "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz", - "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", - "dev": true, + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-9.0.1.tgz", + "integrity": "sha512-S6hzjGJSG3d6if0YoF5kTyeRJvia6FSTBroE5fQ0bu1QNxyJqhhinfUsXi9fH3MgtXODWvwo2BDyQSnhPQ88uQ==", "license": "MIT", "dependencies": { - "vscode-languageserver-protocol": "3.17.5" + "@types/node": "^24.9.2", + "@types/sax": "^1.2.1", + "arg": "^5.0.0", + "sax": "^1.4.1" }, "bin": { - "installServerIntoExtension": "bin/installServerIntoExtension" + "sitemap": "dist/esm/cli.js" + }, + "engines": { + "node": ">=20.19.5", + "npm": ">=10.8.2" } }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-yaml/node_modules/yaml-language-server/node_modules/vscode-languageserver-textdocument": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.14.tgz", - "integrity": "sha512-EQyqJMi552E4ZTf46izQ4Fj6XquqxCySR3J5ZSD1SisMf6RfpeOWHxGBE8Gr6V0/3GHIGdAzDn8F8+1nTGCnoQ==", - "dev": true, - "license": "MIT" - }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-yaml/node_modules/yaml-language-server/node_modules/vscode-languageserver-types": { - "version": "3.18.3", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.18.3.tgz", - "integrity": "sha512-XIlzJ7Qp/jzSI1ds7/FwPAWrPeTZA7pAtlW4hdJ1J6xXWJL6dR9QYnDhJOdLzdKhUQ5Mm6mvUMw+3DcOQQasPw==", - "dev": true, - "license": "MIT" - }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-yaml/node_modules/yaml-language-server/node_modules/vscode-languageserver/node_modules/vscode-languageserver-protocol": { - "version": "3.17.5", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", - "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", - "dev": true, + "site/node_modules/@astrojs/starlight/node_modules/@astrojs/sitemap/node_modules/sitemap/node_modules/@types/node": { + "version": "24.13.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.6.tgz", + "integrity": "sha512-SGrw/h3KPFshy3OE6ZL53LMBG5vGQQ8/gIpiqz/kRZhPJ7HgwCEs8LBuNtWLa8dvGZVpSF7+Bf+c11HUrCb/yg==", "license": "MIT", "dependencies": { - "vscode-jsonrpc": "8.2.0", - "vscode-languageserver-types": "3.17.5" + "undici-types": "~7.18.0" } }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-yaml/node_modules/yaml-language-server/node_modules/vscode-languageserver/node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", - "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", - "dev": true, + "site/node_modules/@astrojs/starlight/node_modules/@astrojs/sitemap/node_modules/sitemap/node_modules/@types/node/node_modules/undici-types": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "license": "MIT" + }, + "site/node_modules/@astrojs/starlight/node_modules/@astrojs/sitemap/node_modules/sitemap/node_modules/@types/sax": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", + "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", "license": "MIT", - "engines": { - "node": ">=14.0.0" + "dependencies": { + "@types/node": "*" } }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-yaml/node_modules/yaml-language-server/node_modules/vscode-languageserver/node_modules/vscode-languageserver-protocol/node_modules/vscode-languageserver-types": { - "version": "3.17.5", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", - "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", - "dev": true, + "site/node_modules/@astrojs/starlight/node_modules/@astrojs/sitemap/node_modules/sitemap/node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", "license": "MIT" }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/volar-service-yaml/node_modules/yaml-language-server/node_modules/yaml": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz", - "integrity": "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==", - "dev": true, - "license": "ISC", - "bin": { - "yaml": "bin.mjs" - }, + "site/node_modules/@astrojs/starlight/node_modules/@astrojs/sitemap/node_modules/sitemap/node_modules/sax": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.1.tgz", + "integrity": "sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==", + "license": "BlueOak-1.0.0", "engines": { - "node": ">= 14.6" - }, - "funding": { - "url": "https://github.com/sponsors/eemeli" + "node": ">=11.0.0" } }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/vscode-html-languageservice": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/vscode-html-languageservice/-/vscode-html-languageservice-5.6.2.tgz", - "integrity": "sha512-ulCrSnFnfQ16YzvwnYUgEbUEl/ZG7u2eV27YhvLObSHKkb8fw1Z9cgsnUwjTEeDIdJDoTDTDpxuhQwoenoLNMg==", - "dev": true, + "site/node_modules/@astrojs/starlight/node_modules/@astrojs/sitemap/node_modules/zod": { + "version": "4.6.5", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.6.5.tgz", + "integrity": "sha512-v5l/aFXZQeai4awLbOpSoHecE9UiMrnfx75tEXLjNonXVARxQ5mOeipTjROUchszUNCqnE+hqAMujRsRHsut2Q==", "license": "MIT", - "dependencies": { - "@vscode/l10n": "^0.0.18", - "vscode-languageserver-textdocument": "^1.0.12", - "vscode-languageserver-types": "^3.17.5", - "vscode-uri": "^3.1.0" + "funding": { + "url": "https://github.com/sponsors/colinhacks" } }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/vscode-html-languageservice/node_modules/@vscode/l10n": { - "version": "0.0.18", - "resolved": "https://registry.npmjs.org/@vscode/l10n/-/l10n-0.0.18.tgz", - "integrity": "sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==", - "dev": true, + "site/node_modules/@astrojs/starlight/node_modules/@pagefind/default-ui": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@pagefind/default-ui/-/default-ui-1.5.2.tgz", + "integrity": "sha512-pm1LMnQg8N2B3n2TnjKlhaFihpz6zTiA4HiGQ6/slKO/+8K9CAU5kcjdSSPgpuk1PMuuN4hxLipUIifnrkl3Sg==", "license": "MIT" }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/vscode-html-languageservice/node_modules/vscode-languageserver-textdocument": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.14.tgz", - "integrity": "sha512-EQyqJMi552E4ZTf46izQ4Fj6XquqxCySR3J5ZSD1SisMf6RfpeOWHxGBE8Gr6V0/3GHIGdAzDn8F8+1nTGCnoQ==", - "dev": true, - "license": "MIT" + "site/node_modules/@astrojs/starlight/node_modules/@types/hast": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.5.tgz", + "integrity": "sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/vscode-html-languageservice/node_modules/vscode-languageserver-types": { - "version": "3.18.3", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.18.3.tgz", - "integrity": "sha512-XIlzJ7Qp/jzSI1ds7/FwPAWrPeTZA7pAtlW4hdJ1J6xXWJL6dR9QYnDhJOdLzdKhUQ5Mm6mvUMw+3DcOQQasPw==", - "dev": true, + "site/node_modules/@astrojs/starlight/node_modules/@types/hast/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" }, - "site/node_modules/@astrojs/check/node_modules/@astrojs/language-server/node_modules/vscode-uri": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.2.0.tgz", - "integrity": "sha512-m2gXo3bn0G1kT9InzMf07fTbqMbGtyckj3bH5ktLO+1Ssv+yiATZ4dhwaQv9UZWxJh6E9IFGnQyjgWVDWVBDrg==", - "dev": true, + "site/node_modules/@astrojs/starlight/node_modules/@types/js-yaml": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz", + "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==", "license": "MIT" }, - "site/node_modules/@astrojs/check/node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "dev": true, + "site/node_modules/@astrojs/starlight/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": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" + "@types/unist": "*" } }, - "site/node_modules/@astrojs/check/node_modules/chokidar/node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.18.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } + "site/node_modules/@astrojs/starlight/node_modules/@types/mdast/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" }, - "site/node_modules/@astrojs/check/node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "dev": true, + "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code": { + "version": "0.44.2", + "resolved": "https://registry.npmjs.org/astro-expressive-code/-/astro-expressive-code-0.44.2.tgz", + "integrity": "sha512-avop7nZcRwC7quvIxVguhwEZ9Tp6IoTzKUCLwP30Fb7+er+pWQgcysP01dcuzRIJo81kLGg30q/YAI2Yb1Sdzg==", "license": "MIT", - "engines": { - "node": ">=6" + "dependencies": { + "rehype-expressive-code": "^0.44.2", + "url-extras": "^0.1.0" + }, + "peerDependencies": { + "astro": "^4.0.0-beta || ^5.0.0-beta || ^3.3.0 || ^6.0.0-beta || ^7.0.0" } }, - "site/node_modules/@astrojs/check/node_modules/yargs": { - "version": "18.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.1.0.tgz", - "integrity": "sha512-2rAgRKu54VsHkqI0/tYkmluGXHD4KW7yZoycuqDQ15QOTnc2VVfy0nN/1eMhnQLO00A+dwtK20xuCnc1YGeUyg==", - "dev": true, + "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code": { + "version": "0.44.2", + "resolved": "https://registry.npmjs.org/rehype-expressive-code/-/rehype-expressive-code-0.44.2.tgz", + "integrity": "sha512-jvjQpsfWKBquDrEl5YQA3CJybRRIuDOYsui1BJTs5oKDUK8pPkJSSxY8FjxNlIFIdtgrTjC1zuahuY4Cc1j9SQ==", "license": "MIT", "dependencies": { - "cliui": "^9.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "string-width": "^8.2.1", - "y18n": "^5.0.5", - "yargs-parser": "^22.0.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=23" + "expressive-code": "^0.44.2" } }, - "site/node_modules/@astrojs/check/node_modules/yargs/node_modules/cliui": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", - "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", - "dev": true, - "license": "ISC", + "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code": { + "version": "0.44.2", + "resolved": "https://registry.npmjs.org/expressive-code/-/expressive-code-0.44.2.tgz", + "integrity": "sha512-MLNghkvhyFgVW4oCD5DxBuYnnTXIf0PygzGmfT6OZeOOYWh/D4sH1j931biElkA5RG/J9wY/iuSMGAPF5vzHOg==", + "license": "MIT", "dependencies": { - "string-width": "^7.2.0", - "strip-ansi": "^7.1.0", - "wrap-ansi": "^9.0.0" - }, - "engines": { - "node": ">=20" + "@expressive-code/core": "^0.44.2", + "@expressive-code/plugin-frames": "^0.44.2", + "@expressive-code/plugin-shiki": "^0.44.2", + "@expressive-code/plugin-text-markers": "^0.44.2" } }, - "site/node_modules/@astrojs/check/node_modules/yargs/node_modules/cliui/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "dev": true, + "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/core": { + "version": "0.44.2", + "resolved": "https://registry.npmjs.org/@expressive-code/core/-/core-0.44.2.tgz", + "integrity": "sha512-Yw5KonQCD1HoOO2P89y4wifqS9qrJcGVY0LkVMUsVZjhi++bhz4WwQ37inenKFNOEVo50P7cjoVsCdaVnUbq8w==", "license": "MIT", "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@ctrl/tinycolor": "^4.0.4", + "hast-util-select": "^6.0.2", + "hast-util-to-html": "^9.0.1", + "hast-util-to-text": "^4.0.1", + "hastscript": "^9.0.0", + "postcss": "^8.4.38", + "postcss-nested": "^6.0.1", + "unist-util-visit": "^5.0.0", + "unist-util-visit-parents": "^6.0.1" } }, - "site/node_modules/@astrojs/check/node_modules/yargs/node_modules/cliui/node_modules/string-width/node_modules/emoji-regex": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", - "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "dev": true, - "license": "MIT" - }, - "site/node_modules/@astrojs/check/node_modules/yargs/node_modules/cliui/node_modules/string-width/node_modules/get-east-asian-width": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.7.0.tgz", - "integrity": "sha512-XjH1AECxf0giL2V1aU8vKyRR2ppRUb5c0EvT7zuJTokQ74bNo52zOtghqdWIqrhUD79fo3x0WfKZdOqxF6LG1Q==", - "dev": true, + "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/core/node_modules/@ctrl/tinycolor": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-4.2.1.tgz", + "integrity": "sha512-Vh5uy9Y1JBMId6J1f68TMXnZrTCvNdo9Fu2k0d1YnJngR+sM5kWTKl441c/3TFs+cG0NWOjRWgQ/iaWhbYx+7A==", "license": "MIT", "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=14" } }, - "site/node_modules/@astrojs/check/node_modules/yargs/node_modules/cliui/node_modules/strip-ansi": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", - "dev": true, + "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/core/node_modules/hast-util-to-text": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz", + "integrity": "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==", "license": "MIT", "dependencies": { - "ansi-regex": "^6.2.2" - }, - "engines": { - "node": ">=12" + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "hast-util-is-element": "^3.0.0", + "unist-util-find-after": "^5.0.0" }, "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "site/node_modules/@astrojs/check/node_modules/yargs/node_modules/cliui/node_modules/strip-ansi/node_modules/ansi-regex": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.3.0.tgz", - "integrity": "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==", - "dev": true, + "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/core/node_modules/hast-util-to-text/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" + }, + "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/core/node_modules/hast-util-to-text/node_modules/hast-util-is-element": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", + "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "@types/hast": "^3.0.0" }, "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "site/node_modules/@astrojs/check/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", - "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", - "dev": true, + "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/core/node_modules/hast-util-to-text/node_modules/unist-util-find-after": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz", + "integrity": "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==", "license": "MIT", "dependencies": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" }, "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "site/node_modules/@astrojs/check/node_modules/yargs/node_modules/cliui/node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "dev": true, + "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/core/node_modules/hast-util-to-text/node_modules/unist-util-find-after/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", - "engines": { - "node": ">=12" + "dependencies": { + "@types/unist": "^3.0.0" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "site/node_modules/@astrojs/check/node_modules/yargs/node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "site/node_modules/@astrojs/check/node_modules/yargs/node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "site/node_modules/@astrojs/check/node_modules/yargs/node_modules/string-width": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.2.tgz", - "integrity": "sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==", - "dev": true, + "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/core/node_modules/postcss": { + "version": "8.5.28", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.28.tgz", + "integrity": "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", "dependencies": { - "get-east-asian-width": "^1.5.0", - "strip-ansi": "^7.1.2" + "nanoid": "^3.3.18", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^10 || ^12 || >=14" } }, - "site/node_modules/@astrojs/check/node_modules/yargs/node_modules/string-width/node_modules/get-east-asian-width": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.7.0.tgz", - "integrity": "sha512-XjH1AECxf0giL2V1aU8vKyRR2ppRUb5c0EvT7zuJTokQ74bNo52zOtghqdWIqrhUD79fo3x0WfKZdOqxF6LG1Q==", - "dev": true, + "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/core/node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, "engines": { - "node": ">=18" + "node": ">=12.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "postcss": "^8.2.14" } }, - "site/node_modules/@astrojs/check/node_modules/yargs/node_modules/string-width/node_modules/strip-ansi": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", - "dev": true, + "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/core/node_modules/postcss-nested/node_modules/postcss-selector-parser": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.4.tgz", + "integrity": "sha512-bIoJLOmjCO1S9XdY/DcnR5hJxvrDir1PbGChrzXG3vw0/FOliy/fA3dmdhQ441kah4gKv+TwckGzex6wNS5cnQ==", "license": "MIT", "dependencies": { - "ansi-regex": "^6.2.2" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": ">=4" } }, - "site/node_modules/@astrojs/check/node_modules/yargs/node_modules/string-width/node_modules/strip-ansi/node_modules/ansi-regex": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.3.0.tgz", - "integrity": "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==", - "dev": true, + "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/core/node_modules/postcss-nested/node_modules/postcss-selector-parser/node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "license": "MIT", - "engines": { - "node": ">=12" + "bin": { + "cssesc": "bin/cssesc" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "site/node_modules/@astrojs/check/node_modules/yargs/node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "license": "ISC", "engines": { - "node": ">=10" + "node": ">=4" } }, - "site/node_modules/@astrojs/check/node_modules/yargs/node_modules/yargs-parser": { - "version": "22.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", - "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=23" - } + "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/core/node_modules/postcss-nested/node_modules/postcss-selector-parser/node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" }, - "site/node_modules/@astrojs/starlight": { - "version": "0.42.2", - "resolved": "https://registry.npmjs.org/@astrojs/starlight/-/starlight-0.42.2.tgz", - "integrity": "sha512-rDAgv3QCJOo0F4EoWeuFG31OdhQOrcipATl9+gCkOqpQiO7u7FR8uVam+HHNJO8Sl21TOAQKUSUEvCXv8jEgJA==", - "license": "MIT", - "dependencies": { - "@astrojs/markdown-satteri": "^0.4.0", - "@astrojs/mdx": "^8.0.0", - "@astrojs/sitemap": "^3.7.3", - "@pagefind/default-ui": "^1.3.0", - "@types/hast": "^3.0.5", - "@types/js-yaml": "^4.0.9", - "@types/mdast": "^4.0.4", - "astro-expressive-code": "^0.44.0", - "bcp-47": "^2.1.0", - "hast-util-format": "^1.1.0", - "hast-util-select": "^6.0.4", - "hast-util-to-html": "^9.0.5", - "hast-util-to-string": "^3.0.1", - "hastscript": "^9.0.1", - "i18next": "^26.0.7", - "js-yaml": "^4.1.1", - "klona": "^2.0.6", - "magic-string": "^1.2.3", - "mdast-util-directive": "^3.1.0", - "mdast-util-to-markdown": "^2.1.2", - "mdast-util-to-string": "^4.0.0", - "pagefind": "^1.5.2", - "remark-directive": "^4.0.0", - "satteri": "^0.10.3", - "ultrahtml": "^1.6.0", - "unified": "^11.0.5", - "unist-util-visit": "^5.1.0", - "vfile": "^6.0.3" - }, - "peerDependencies": { - "@astrojs/markdown-remark": "^7.3.0", - "astro": "^7.2.10" - }, - "peerDependenciesMeta": { - "@astrojs/markdown-remark": { - "optional": true + "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/core/node_modules/postcss/node_modules/nanoid": { + "version": "3.3.19", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.19.tgz", + "integrity": "sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" } - } - }, - "site/node_modules/@astrojs/starlight/node_modules/@astrojs/markdown-satteri": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@astrojs/markdown-satteri/-/markdown-satteri-0.4.1.tgz", - "integrity": "sha512-EniHbFNa6SQHDih7JnpPos3NWXO6hdt4raBcOosfGmlfc3gP9CI/sESA3VOf1PgJZ7SFfewlZW9Livn0JugEZg==", + ], "license": "MIT", - "dependencies": { - "@astrojs/internal-helpers": "0.11.0", - "@astrojs/prism": "4.0.2", - "github-slugger": "^2.0.0", - "satteri": "^0.10.3" + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "site/node_modules/@astrojs/starlight/node_modules/@astrojs/markdown-satteri/node_modules/@astrojs/internal-helpers": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.11.0.tgz", - "integrity": "sha512-3rzxJ+xbo0+8YyqOzLziIN32wmsHdCjEVz2sGOpRxJ+Ben/KiLph4ItxBy1abEL+E8fkRzqjg0rfXmaHJGw9JA==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.4", - "@types/mdast": "^4.0.4", - "js-yaml": "^4.3.0", - "picomatch": "^4.0.4", - "retext-smartypants": "^6.2.0", - "shiki": "^4.0.2", - "smol-toml": "^1.6.0", - "unified": "^11.0.5" - } + "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/core/node_modules/postcss/node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" }, - "site/node_modules/@astrojs/starlight/node_modules/@astrojs/markdown-satteri/node_modules/@astrojs/internal-helpers/node_modules/picomatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", - "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", - "license": "MIT", + "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/core/node_modules/postcss/node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "node": ">=0.10.0" } }, - "site/node_modules/@astrojs/starlight/node_modules/@astrojs/markdown-satteri/node_modules/@astrojs/internal-helpers/node_modules/retext-smartypants": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/retext-smartypants/-/retext-smartypants-6.2.0.tgz", - "integrity": "sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==", + "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/core/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", "dependencies": { - "@types/nlcst": "^2.0.0", - "nlcst-to-string": "^4.0.0", - "unist-util-visit": "^5.0.0" + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "site/node_modules/@astrojs/starlight/node_modules/@astrojs/markdown-satteri/node_modules/@astrojs/internal-helpers/node_modules/retext-smartypants/node_modules/@types/nlcst": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/nlcst/-/nlcst-2.0.3.tgz", - "integrity": "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==", - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, - "site/node_modules/@astrojs/starlight/node_modules/@astrojs/markdown-satteri/node_modules/@astrojs/internal-helpers/node_modules/retext-smartypants/node_modules/@types/nlcst/node_modules/@types/unist": { + "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/core/node_modules/unist-util-visit-parents/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" }, - "site/node_modules/@astrojs/starlight/node_modules/@astrojs/markdown-satteri/node_modules/@astrojs/internal-helpers/node_modules/retext-smartypants/node_modules/nlcst-to-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-4.0.0.tgz", - "integrity": "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==", + "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/core/node_modules/unist-util-visit-parents/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/nlcst": "^2.0.0" + "@types/unist": "^3.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "site/node_modules/@astrojs/starlight/node_modules/@astrojs/markdown-satteri/node_modules/@astrojs/internal-helpers/node_modules/shiki": { + "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/plugin-frames": { + "version": "0.44.2", + "resolved": "https://registry.npmjs.org/@expressive-code/plugin-frames/-/plugin-frames-0.44.2.tgz", + "integrity": "sha512-gVLm6TQMNIRWIaM7o+mCtxkGNjLZY5/2faSTLoXeo9wv/Pkj/0QAtZyXPVPrRsPARqiipATNFmfvQFLJudxPHQ==", + "license": "MIT", + "dependencies": { + "@expressive-code/core": "^0.44.2" + } + }, + "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/plugin-shiki": { + "version": "0.44.2", + "resolved": "https://registry.npmjs.org/@expressive-code/plugin-shiki/-/plugin-shiki-0.44.2.tgz", + "integrity": "sha512-ebWIvCDzXvjyD8rH6T6DfytYJw1GoArLR4nusIAE4VxXrCQf3d+owytiv010KU/dUg+SRLZskDn0N+HaFXeuSg==", + "license": "MIT", + "dependencies": { + "@expressive-code/core": "^0.44.2", + "shiki": "^4.0.2" + } + }, + "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/plugin-shiki/node_modules/shiki": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/shiki/-/shiki-4.4.3.tgz", "integrity": "sha512-Mb/GvXPHBAXdgGIcnfU5L3ldpn1XcxrGkPHwqgRx17/I2XRfqlFKk2vGkHWINn1kdXvzJZeuO3is6I9KLPFm0g==", @@ -11472,7 +15669,7 @@ "node": ">=20" } }, - "site/node_modules/@astrojs/starlight/node_modules/@astrojs/markdown-satteri/node_modules/@astrojs/internal-helpers/node_modules/shiki/node_modules/@shikijs/core": { + "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/plugin-shiki/node_modules/shiki/node_modules/@shikijs/core": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-4.4.3.tgz", "integrity": "sha512-QCR4q2ZO/ILJEuwiBMel4wdcTDb1JGwfjKTxPDF6x8ixOaluPrVqIn06C99AcRPhmYlBR56d/Fb+GN58GzExpg==", @@ -11488,7 +15685,7 @@ "node": ">=20" } }, - "site/node_modules/@astrojs/starlight/node_modules/@astrojs/markdown-satteri/node_modules/@astrojs/internal-helpers/node_modules/shiki/node_modules/@shikijs/core/node_modules/@shikijs/primitive": { + "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/plugin-shiki/node_modules/shiki/node_modules/@shikijs/core/node_modules/@shikijs/primitive": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/@shikijs/primitive/-/primitive-4.4.3.tgz", "integrity": "sha512-m0wBeLDQDeIxRdUmrCPdQqfuUamDwRL5isCfYbguKD6NiaKpVbsv+3J81DyIKgNW5h4WAIIr8T4EkgQrBBxvaQ==", @@ -11502,7 +15699,7 @@ "node": ">=20" } }, - "site/node_modules/@astrojs/starlight/node_modules/@astrojs/markdown-satteri/node_modules/@astrojs/internal-helpers/node_modules/shiki/node_modules/@shikijs/engine-javascript": { + "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/plugin-shiki/node_modules/shiki/node_modules/@shikijs/engine-javascript": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-4.4.3.tgz", "integrity": "sha512-FbOjFJp9VLdo1Wevs10BBtVxiTWwNLqZh5Gkhjgda/ioL15YOgeSl9n+6XMa3qRlPQzfhFNe641SrynFHYG0nQ==", @@ -11516,7 +15713,7 @@ "node": ">=20" } }, - "site/node_modules/@astrojs/starlight/node_modules/@astrojs/markdown-satteri/node_modules/@astrojs/internal-helpers/node_modules/shiki/node_modules/@shikijs/engine-javascript/node_modules/oniguruma-to-es": { + "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/plugin-shiki/node_modules/shiki/node_modules/@shikijs/engine-javascript/node_modules/oniguruma-to-es": { "version": "4.3.6", "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.6.tgz", "integrity": "sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==", @@ -11527,13 +15724,13 @@ "regex-recursion": "^6.0.2" } }, - "site/node_modules/@astrojs/starlight/node_modules/@astrojs/markdown-satteri/node_modules/@astrojs/internal-helpers/node_modules/shiki/node_modules/@shikijs/engine-javascript/node_modules/oniguruma-to-es/node_modules/oniguruma-parser": { + "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/plugin-shiki/node_modules/shiki/node_modules/@shikijs/engine-javascript/node_modules/oniguruma-to-es/node_modules/oniguruma-parser": { "version": "0.12.2", "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.2.tgz", "integrity": "sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==", "license": "MIT" }, - "site/node_modules/@astrojs/starlight/node_modules/@astrojs/markdown-satteri/node_modules/@astrojs/internal-helpers/node_modules/shiki/node_modules/@shikijs/engine-javascript/node_modules/oniguruma-to-es/node_modules/regex": { + "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/plugin-shiki/node_modules/shiki/node_modules/@shikijs/engine-javascript/node_modules/oniguruma-to-es/node_modules/regex": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz", "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", @@ -11542,7 +15739,7 @@ "regex-utilities": "^2.3.0" } }, - "site/node_modules/@astrojs/starlight/node_modules/@astrojs/markdown-satteri/node_modules/@astrojs/internal-helpers/node_modules/shiki/node_modules/@shikijs/engine-javascript/node_modules/oniguruma-to-es/node_modules/regex-recursion": { + "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/plugin-shiki/node_modules/shiki/node_modules/@shikijs/engine-javascript/node_modules/oniguruma-to-es/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==", @@ -11551,19 +15748,19 @@ "regex-utilities": "^2.3.0" } }, - "site/node_modules/@astrojs/starlight/node_modules/@astrojs/markdown-satteri/node_modules/@astrojs/internal-helpers/node_modules/shiki/node_modules/@shikijs/engine-javascript/node_modules/oniguruma-to-es/node_modules/regex-recursion/node_modules/regex-utilities": { + "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/plugin-shiki/node_modules/shiki/node_modules/@shikijs/engine-javascript/node_modules/oniguruma-to-es/node_modules/regex-recursion/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" }, - "site/node_modules/@astrojs/starlight/node_modules/@astrojs/markdown-satteri/node_modules/@astrojs/internal-helpers/node_modules/shiki/node_modules/@shikijs/engine-javascript/node_modules/oniguruma-to-es/node_modules/regex/node_modules/regex-utilities": { + "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/plugin-shiki/node_modules/shiki/node_modules/@shikijs/engine-javascript/node_modules/oniguruma-to-es/node_modules/regex/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" }, - "site/node_modules/@astrojs/starlight/node_modules/@astrojs/markdown-satteri/node_modules/@astrojs/internal-helpers/node_modules/shiki/node_modules/@shikijs/engine-oniguruma": { + "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/plugin-shiki/node_modules/shiki/node_modules/@shikijs/engine-oniguruma": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-4.4.3.tgz", "integrity": "sha512-EcOQkxdxGQrc1Row/cC2c96/v1dbZqGnEVu1qTuT/MJmp6+cXCvQussowVmCv5Tqr3KuY3c7IbM6HTW3LJ1k9w==", @@ -11576,7 +15773,7 @@ "node": ">=20" } }, - "site/node_modules/@astrojs/starlight/node_modules/@astrojs/markdown-satteri/node_modules/@astrojs/internal-helpers/node_modules/shiki/node_modules/@shikijs/langs": { + "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/plugin-shiki/node_modules/shiki/node_modules/@shikijs/langs": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-4.4.3.tgz", "integrity": "sha512-ePic0yfAJGOF83D5wBHK/00EjK65oahBYxFk5epgq33WRv7X9UuxLEV8PtR0szC0z8dl7INIpIodB99JRFlR+A==", @@ -11588,7 +15785,7 @@ "node": ">=20" } }, - "site/node_modules/@astrojs/starlight/node_modules/@astrojs/markdown-satteri/node_modules/@astrojs/internal-helpers/node_modules/shiki/node_modules/@shikijs/themes": { + "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/plugin-shiki/node_modules/shiki/node_modules/@shikijs/themes": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-4.4.3.tgz", "integrity": "sha512-w8UHjeUnIR965KMWJHUPXOc2mNJUnK3vpVLYLvw5IYU2mnTTJ89E24OrJDBNiJDQ0qzb0tc4l7mrIXx5cFeIyw==", @@ -11600,7 +15797,7 @@ "node": ">=20" } }, - "site/node_modules/@astrojs/starlight/node_modules/@astrojs/markdown-satteri/node_modules/@astrojs/internal-helpers/node_modules/shiki/node_modules/@shikijs/types": { + "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/plugin-shiki/node_modules/shiki/node_modules/@shikijs/types": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.4.3.tgz", "integrity": "sha512-UEJxmRR++MAGR6hugn0vgVS2W/6lWAts84FFSrnlH9sP0LNol7E5+NQ792pH8liWUhyMyjhTgSUH3k7iD7tc5g==", @@ -11613,1174 +15810,1527 @@ "node": ">=20" } }, - "site/node_modules/@astrojs/starlight/node_modules/@astrojs/markdown-satteri/node_modules/@astrojs/internal-helpers/node_modules/shiki/node_modules/@shikijs/vscode-textmate": { + "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/plugin-shiki/node_modules/shiki/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" }, - "site/node_modules/@astrojs/starlight/node_modules/@astrojs/markdown-satteri/node_modules/@astrojs/internal-helpers/node_modules/smol-toml": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.8.0.tgz", - "integrity": "sha512-kCZr2V3ch9i00x8zXRhjUNVcjG9ijES5dDudkXvUVCT5QlJNQWElSJdZqyPemffHoLNUYwOcou0Fy+ojN0uHSQ==", - "license": "BSD-3-Clause", + "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/plugin-text-markers": { + "version": "0.44.2", + "resolved": "https://registry.npmjs.org/@expressive-code/plugin-text-markers/-/plugin-text-markers-0.44.2.tgz", + "integrity": "sha512-SNI7EgUSiADqbqUzzMbj1ZeC/r2pa5eg3KyFOGAd3a7EsIA4qzjXQLp+ODWQtHVDKFCdGs4J3ovSJUqvKIK96g==", + "license": "MIT", + "dependencies": { + "@expressive-code/core": "^0.44.2" + } + }, + "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/url-extras": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/url-extras/-/url-extras-0.1.0.tgz", + "integrity": "sha512-8tzwTeXFPuX/5PHuCDQE5Dd9Ts4rwoq2t9aIT+HS4iAVpmj5l4Ao7Q+BuuFjvWRqrLswBhQDk8O96ZicgCqQqw==", + "license": "MIT", "engines": { - "node": ">= 18" + "node": ">=20" }, "funding": { - "url": "https://github.com/sponsors/cyyynthia" + "url": "https://github.com/sponsors/sindresorhus" } }, - "site/node_modules/@astrojs/starlight/node_modules/@astrojs/markdown-satteri/node_modules/@astrojs/prism": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-4.0.2.tgz", - "integrity": "sha512-KTivpmnz6lDsC6o9H4+DNm2SrE/GHzw8cNAvEJwAvUT+eoaEnn/4NtbDNfRRaxaJHdp15gf+tfHAWiXR4wB3BA==", + "site/node_modules/@astrojs/starlight/node_modules/bcp-47": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bcp-47/-/bcp-47-2.1.1.tgz", + "integrity": "sha512-KLw+H/gd2p4zly1X7Yh/qziuyae5/w/QFnvTng9eZL5fvszL7Whl3MBoWF8yxL7ksUjBfOD+OxkytiqbBpG+Fw==", "license": "MIT", "dependencies": { - "prismjs": "^1.30.0" + "is-alphabetical": "^2.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0" }, - "engines": { - "node": ">=22.12.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "site/node_modules/@astrojs/starlight/node_modules/@astrojs/markdown-satteri/node_modules/@astrojs/prism/node_modules/prismjs": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", - "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "site/node_modules/@astrojs/starlight/node_modules/bcp-47/node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", "license": "MIT", - "engines": { - "node": ">=6" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "site/node_modules/@astrojs/starlight/node_modules/@astrojs/markdown-satteri/node_modules/github-slugger": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", - "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==", - "license": "ISC" - }, - "site/node_modules/@astrojs/starlight/node_modules/@astrojs/mdx": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-8.0.1.tgz", - "integrity": "sha512-VKodp/f3+XE6L0950K+ZOAolY47vdt0R78Ao+L2RdJ1hfAdYffL7IEjc/MsoyuS7CPVvCsd5/I3RP0ZyAIewdQ==", + "site/node_modules/@astrojs/starlight/node_modules/bcp-47/node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", "license": "MIT", "dependencies": { - "@astrojs/internal-helpers": "0.11.0", - "@astrojs/markdown-satteri": "0.4.1", - "es-module-lexer": "^2.0.0" - }, - "engines": { - "node": ">=22.12.0" - }, - "peerDependencies": { - "@astrojs/markdown-remark": "^7.3.0", - "@astrojs/markdown-satteri": "^0.4.0", - "astro": "^7.2.6" + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" }, - "peerDependenciesMeta": { - "@astrojs/markdown-remark": { - "optional": true - } + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "site/node_modules/@astrojs/starlight/node_modules/@astrojs/mdx/node_modules/@astrojs/internal-helpers": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.11.0.tgz", - "integrity": "sha512-3rzxJ+xbo0+8YyqOzLziIN32wmsHdCjEVz2sGOpRxJ+Ben/KiLph4ItxBy1abEL+E8fkRzqjg0rfXmaHJGw9JA==", + "site/node_modules/@astrojs/starlight/node_modules/bcp-47/node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "site/node_modules/@astrojs/starlight/node_modules/hast-util-format": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hast-util-format/-/hast-util-format-1.1.0.tgz", + "integrity": "sha512-yY1UDz6bC9rDvCWHpx12aIBGRG7krurX0p0Fm6pT547LwDIZZiNr8a+IHDogorAdreULSEzP82Nlv5SZkHZcjA==", "license": "MIT", "dependencies": { - "@types/hast": "^3.0.4", - "@types/mdast": "^4.0.4", - "js-yaml": "^4.3.0", - "picomatch": "^4.0.4", - "retext-smartypants": "^6.2.0", - "shiki": "^4.0.2", - "smol-toml": "^1.6.0", - "unified": "^11.0.5" + "@types/hast": "^3.0.0", + "hast-util-embedded": "^3.0.0", + "hast-util-minify-whitespace": "^1.0.0", + "hast-util-phrasing": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "html-whitespace-sensitive-tag-names": "^3.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "site/node_modules/@astrojs/starlight/node_modules/@astrojs/mdx/node_modules/@astrojs/internal-helpers/node_modules/picomatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", - "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "site/node_modules/@astrojs/starlight/node_modules/hast-util-format/node_modules/hast-util-embedded": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-embedded/-/hast-util-embedded-3.0.0.tgz", + "integrity": "sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==", "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-is-element": "^3.0.0" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "site/node_modules/@astrojs/starlight/node_modules/@astrojs/mdx/node_modules/@astrojs/internal-helpers/node_modules/retext-smartypants": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/retext-smartypants/-/retext-smartypants-6.2.0.tgz", - "integrity": "sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==", + "site/node_modules/@astrojs/starlight/node_modules/hast-util-format/node_modules/hast-util-embedded/node_modules/hast-util-is-element": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", + "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", "license": "MIT", "dependencies": { - "@types/nlcst": "^2.0.0", - "nlcst-to-string": "^4.0.0", - "unist-util-visit": "^5.0.0" + "@types/hast": "^3.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "site/node_modules/@astrojs/starlight/node_modules/@astrojs/mdx/node_modules/@astrojs/internal-helpers/node_modules/retext-smartypants/node_modules/@types/nlcst": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/nlcst/-/nlcst-2.0.3.tgz", - "integrity": "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==", + "site/node_modules/@astrojs/starlight/node_modules/hast-util-format/node_modules/hast-util-minify-whitespace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hast-util-minify-whitespace/-/hast-util-minify-whitespace-1.0.1.tgz", + "integrity": "sha512-L96fPOVpnclQE0xzdWb/D12VT5FabA7SnZOUMtL1DbXmYiHJMXZvFkIZfiMmTCNJHUeO2K9UYNXoVyfz+QHuOw==", "license": "MIT", "dependencies": { - "@types/unist": "*" + "@types/hast": "^3.0.0", + "hast-util-embedded": "^3.0.0", + "hast-util-is-element": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "site/node_modules/@astrojs/starlight/node_modules/@astrojs/mdx/node_modules/@astrojs/internal-helpers/node_modules/retext-smartypants/node_modules/@types/nlcst/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" + "site/node_modules/@astrojs/starlight/node_modules/hast-util-format/node_modules/hast-util-minify-whitespace/node_modules/hast-util-is-element": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", + "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, - "site/node_modules/@astrojs/starlight/node_modules/@astrojs/mdx/node_modules/@astrojs/internal-helpers/node_modules/retext-smartypants/node_modules/nlcst-to-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-4.0.0.tgz", - "integrity": "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==", + "site/node_modules/@astrojs/starlight/node_modules/hast-util-format/node_modules/hast-util-minify-whitespace/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/nlcst": "^2.0.0" + "@types/unist": "^3.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "site/node_modules/@astrojs/starlight/node_modules/@astrojs/mdx/node_modules/@astrojs/internal-helpers/node_modules/shiki": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-4.4.3.tgz", - "integrity": "sha512-Mb/GvXPHBAXdgGIcnfU5L3ldpn1XcxrGkPHwqgRx17/I2XRfqlFKk2vGkHWINn1kdXvzJZeuO3is6I9KLPFm0g==", + "site/node_modules/@astrojs/starlight/node_modules/hast-util-format/node_modules/hast-util-minify-whitespace/node_modules/unist-util-is/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" + }, + "site/node_modules/@astrojs/starlight/node_modules/hast-util-format/node_modules/hast-util-phrasing": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/hast-util-phrasing/-/hast-util-phrasing-3.0.1.tgz", + "integrity": "sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==", "license": "MIT", "dependencies": { - "@shikijs/core": "4.4.3", - "@shikijs/engine-javascript": "4.4.3", - "@shikijs/engine-oniguruma": "4.4.3", - "@shikijs/langs": "4.4.3", - "@shikijs/themes": "4.4.3", - "@shikijs/types": "4.4.3", - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.5" + "@types/hast": "^3.0.0", + "hast-util-embedded": "^3.0.0", + "hast-util-has-property": "^3.0.0", + "hast-util-is-body-ok-link": "^3.0.0", + "hast-util-is-element": "^3.0.0" }, - "engines": { - "node": ">=20" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "site/node_modules/@astrojs/starlight/node_modules/@astrojs/mdx/node_modules/@astrojs/internal-helpers/node_modules/shiki/node_modules/@shikijs/core": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-4.4.3.tgz", - "integrity": "sha512-QCR4q2ZO/ILJEuwiBMel4wdcTDb1JGwfjKTxPDF6x8ixOaluPrVqIn06C99AcRPhmYlBR56d/Fb+GN58GzExpg==", + "site/node_modules/@astrojs/starlight/node_modules/hast-util-format/node_modules/hast-util-phrasing/node_modules/hast-util-has-property": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-3.0.0.tgz", + "integrity": "sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==", "license": "MIT", "dependencies": { - "@shikijs/primitive": "4.4.3", - "@shikijs/types": "4.4.3", - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.5", - "hast-util-to-html": "^9.0.5" + "@types/hast": "^3.0.0" }, - "engines": { - "node": ">=20" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "site/node_modules/@astrojs/starlight/node_modules/@astrojs/mdx/node_modules/@astrojs/internal-helpers/node_modules/shiki/node_modules/@shikijs/core/node_modules/@shikijs/primitive": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/@shikijs/primitive/-/primitive-4.4.3.tgz", - "integrity": "sha512-m0wBeLDQDeIxRdUmrCPdQqfuUamDwRL5isCfYbguKD6NiaKpVbsv+3J81DyIKgNW5h4WAIIr8T4EkgQrBBxvaQ==", + "site/node_modules/@astrojs/starlight/node_modules/hast-util-format/node_modules/hast-util-phrasing/node_modules/hast-util-is-body-ok-link": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/hast-util-is-body-ok-link/-/hast-util-is-body-ok-link-3.0.1.tgz", + "integrity": "sha512-0qpnzOBLztXHbHQenVB8uNuxTnm/QBFUOmdOSsEn7GnBtyY07+ENTWVFBAnXd/zEgd9/SUG3lRY7hSIBWRgGpQ==", "license": "MIT", "dependencies": { - "@shikijs/types": "4.4.3", - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.5" + "@types/hast": "^3.0.0" }, - "engines": { - "node": ">=20" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "site/node_modules/@astrojs/starlight/node_modules/@astrojs/mdx/node_modules/@astrojs/internal-helpers/node_modules/shiki/node_modules/@shikijs/engine-javascript": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-4.4.3.tgz", - "integrity": "sha512-FbOjFJp9VLdo1Wevs10BBtVxiTWwNLqZh5Gkhjgda/ioL15YOgeSl9n+6XMa3qRlPQzfhFNe641SrynFHYG0nQ==", + "site/node_modules/@astrojs/starlight/node_modules/hast-util-format/node_modules/hast-util-phrasing/node_modules/hast-util-is-element": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", + "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", "license": "MIT", "dependencies": { - "@shikijs/types": "4.4.3", - "@shikijs/vscode-textmate": "^10.0.2", - "oniguruma-to-es": "^4.3.6" + "@types/hast": "^3.0.0" }, - "engines": { - "node": ">=20" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "site/node_modules/@astrojs/starlight/node_modules/@astrojs/mdx/node_modules/@astrojs/internal-helpers/node_modules/shiki/node_modules/@shikijs/engine-javascript/node_modules/oniguruma-to-es": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.6.tgz", - "integrity": "sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==", + "site/node_modules/@astrojs/starlight/node_modules/hast-util-format/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": { - "oniguruma-parser": "^0.12.2", - "regex": "^6.1.0", - "regex-recursion": "^6.0.2" + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "site/node_modules/@astrojs/starlight/node_modules/@astrojs/mdx/node_modules/@astrojs/internal-helpers/node_modules/shiki/node_modules/@shikijs/engine-javascript/node_modules/oniguruma-to-es/node_modules/oniguruma-parser": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.2.tgz", - "integrity": "sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==", - "license": "MIT" - }, - "site/node_modules/@astrojs/starlight/node_modules/@astrojs/mdx/node_modules/@astrojs/internal-helpers/node_modules/shiki/node_modules/@shikijs/engine-javascript/node_modules/oniguruma-to-es/node_modules/regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz", - "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", + "site/node_modules/@astrojs/starlight/node_modules/hast-util-format/node_modules/html-whitespace-sensitive-tag-names": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-whitespace-sensitive-tag-names/-/html-whitespace-sensitive-tag-names-3.0.1.tgz", + "integrity": "sha512-q+310vW8zmymYHALr1da4HyXUQ0zgiIwIicEfotYPWGN0OJVEN/58IJ3A4GBYcEq3LGAZqKb+ugvP0GNB9CEAA==", "license": "MIT", - "dependencies": { - "regex-utilities": "^2.3.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "site/node_modules/@astrojs/starlight/node_modules/@astrojs/mdx/node_modules/@astrojs/internal-helpers/node_modules/shiki/node_modules/@shikijs/engine-javascript/node_modules/oniguruma-to-es/node_modules/regex-recursion": { + "site/node_modules/@astrojs/starlight/node_modules/hast-util-format/node_modules/unist-util-visit-parents": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", - "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", "license": "MIT", "dependencies": { - "regex-utilities": "^2.3.0" + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "site/node_modules/@astrojs/starlight/node_modules/@astrojs/mdx/node_modules/@astrojs/internal-helpers/node_modules/shiki/node_modules/@shikijs/engine-javascript/node_modules/oniguruma-to-es/node_modules/regex-recursion/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" - }, - "site/node_modules/@astrojs/starlight/node_modules/@astrojs/mdx/node_modules/@astrojs/internal-helpers/node_modules/shiki/node_modules/@shikijs/engine-javascript/node_modules/oniguruma-to-es/node_modules/regex/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==", + "site/node_modules/@astrojs/starlight/node_modules/hast-util-format/node_modules/unist-util-visit-parents/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" }, - "site/node_modules/@astrojs/starlight/node_modules/@astrojs/mdx/node_modules/@astrojs/internal-helpers/node_modules/shiki/node_modules/@shikijs/engine-oniguruma": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-4.4.3.tgz", - "integrity": "sha512-EcOQkxdxGQrc1Row/cC2c96/v1dbZqGnEVu1qTuT/MJmp6+cXCvQussowVmCv5Tqr3KuY3c7IbM6HTW3LJ1k9w==", + "site/node_modules/@astrojs/starlight/node_modules/hast-util-format/node_modules/unist-util-visit-parents/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": { - "@shikijs/types": "4.4.3", - "@shikijs/vscode-textmate": "^10.0.2" + "@types/unist": "^3.0.0" }, - "engines": { - "node": ">=20" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "site/node_modules/@astrojs/starlight/node_modules/@astrojs/mdx/node_modules/@astrojs/internal-helpers/node_modules/shiki/node_modules/@shikijs/langs": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-4.4.3.tgz", - "integrity": "sha512-ePic0yfAJGOF83D5wBHK/00EjK65oahBYxFk5epgq33WRv7X9UuxLEV8PtR0szC0z8dl7INIpIodB99JRFlR+A==", + "site/node_modules/@astrojs/starlight/node_modules/hast-util-select": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/hast-util-select/-/hast-util-select-6.0.4.tgz", + "integrity": "sha512-RqGS1ZgI0MwxLaKLDxjprynNzINEkRHY2i8ln4DDjgv9ZhcYVIHN9rlpiYsqtFwrgpYU361SyWDQcGNIBVu3lw==", "license": "MIT", "dependencies": { - "@shikijs/types": "4.4.3" + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "bcp-47-match": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "css-selector-parser": "^3.0.0", + "devlop": "^1.0.0", + "direction": "^2.0.0", + "hast-util-has-property": "^3.0.0", + "hast-util-to-string": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "nth-check": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" }, - "engines": { - "node": ">=20" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "site/node_modules/@astrojs/starlight/node_modules/@astrojs/mdx/node_modules/@astrojs/internal-helpers/node_modules/shiki/node_modules/@shikijs/themes": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-4.4.3.tgz", - "integrity": "sha512-w8UHjeUnIR965KMWJHUPXOc2mNJUnK3vpVLYLvw5IYU2mnTTJ89E24OrJDBNiJDQ0qzb0tc4l7mrIXx5cFeIyw==", + "site/node_modules/@astrojs/starlight/node_modules/hast-util-select/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" + }, + "site/node_modules/@astrojs/starlight/node_modules/hast-util-select/node_modules/bcp-47-match": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/bcp-47-match/-/bcp-47-match-2.0.3.tgz", + "integrity": "sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==", "license": "MIT", - "dependencies": { - "@shikijs/types": "4.4.3" - }, - "engines": { - "node": ">=20" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "site/node_modules/@astrojs/starlight/node_modules/@astrojs/mdx/node_modules/@astrojs/internal-helpers/node_modules/shiki/node_modules/@shikijs/types": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.4.3.tgz", - "integrity": "sha512-UEJxmRR++MAGR6hugn0vgVS2W/6lWAts84FFSrnlH9sP0LNol7E5+NQ792pH8liWUhyMyjhTgSUH3k7iD7tc5g==", + "site/node_modules/@astrojs/starlight/node_modules/hast-util-select/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", - "dependencies": { - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.5" - }, - "engines": { - "node": ">=20" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "site/node_modules/@astrojs/starlight/node_modules/@astrojs/mdx/node_modules/@astrojs/internal-helpers/node_modules/shiki/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==", + "site/node_modules/@astrojs/starlight/node_modules/hast-util-select/node_modules/css-selector-parser": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-3.3.0.tgz", + "integrity": "sha512-Y2asgMGFqJKF4fq4xHDSlFYIkeVfRsm69lQC1q9kbEsH5XtnINTMrweLkjYMeaUgiXBy/uvKeO/a1JHTNnmB2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], "license": "MIT" }, - "site/node_modules/@astrojs/starlight/node_modules/@astrojs/mdx/node_modules/@astrojs/internal-helpers/node_modules/smol-toml": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.8.0.tgz", - "integrity": "sha512-kCZr2V3ch9i00x8zXRhjUNVcjG9ijES5dDudkXvUVCT5QlJNQWElSJdZqyPemffHoLNUYwOcou0Fy+ojN0uHSQ==", - "license": "BSD-3-Clause", - "engines": { - "node": ">= 18" + "site/node_modules/@astrojs/starlight/node_modules/hast-util-select/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": { - "url": "https://github.com/sponsors/cyyynthia" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "site/node_modules/@astrojs/starlight/node_modules/@astrojs/mdx/node_modules/es-module-lexer": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.2.tgz", - "integrity": "sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==", - "license": "MIT" + "site/node_modules/@astrojs/starlight/node_modules/hast-util-select/node_modules/devlop/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" + } }, - "site/node_modules/@astrojs/starlight/node_modules/@astrojs/sitemap": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@astrojs/sitemap/-/sitemap-3.7.4.tgz", - "integrity": "sha512-LbKNC24bdUWcQf/pThB6qLlSqHojxGjZDURIzFocY8rlWnAn2t74nnhnK6S5x0NHriHoAduLEpVjRykmeGiVvA==", + "site/node_modules/@astrojs/starlight/node_modules/hast-util-select/node_modules/direction": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/direction/-/direction-2.0.1.tgz", + "integrity": "sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==", "license": "MIT", - "dependencies": { - "sitemap": "^9.0.0", - "zod": "^4.3.6" + "bin": { + "direction": "cli.js" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "site/node_modules/@astrojs/starlight/node_modules/@astrojs/sitemap/node_modules/sitemap": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-9.0.1.tgz", - "integrity": "sha512-S6hzjGJSG3d6if0YoF5kTyeRJvia6FSTBroE5fQ0bu1QNxyJqhhinfUsXi9fH3MgtXODWvwo2BDyQSnhPQ88uQ==", + "site/node_modules/@astrojs/starlight/node_modules/hast-util-select/node_modules/hast-util-has-property": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-3.0.0.tgz", + "integrity": "sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==", "license": "MIT", "dependencies": { - "@types/node": "^24.9.2", - "@types/sax": "^1.2.1", - "arg": "^5.0.0", - "sax": "^1.4.1" - }, - "bin": { - "sitemap": "dist/esm/cli.js" + "@types/hast": "^3.0.0" }, - "engines": { - "node": ">=20.19.5", - "npm": ">=10.8.2" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "site/node_modules/@astrojs/starlight/node_modules/@astrojs/sitemap/node_modules/sitemap/node_modules/@types/node": { - "version": "24.13.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.6.tgz", - "integrity": "sha512-SGrw/h3KPFshy3OE6ZL53LMBG5vGQQ8/gIpiqz/kRZhPJ7HgwCEs8LBuNtWLa8dvGZVpSF7+Bf+c11HUrCb/yg==", + "site/node_modules/@astrojs/starlight/node_modules/hast-util-select/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": { - "undici-types": "~7.18.0" + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "site/node_modules/@astrojs/starlight/node_modules/@astrojs/sitemap/node_modules/sitemap/node_modules/@types/node/node_modules/undici-types": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", - "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", - "license": "MIT" - }, - "site/node_modules/@astrojs/starlight/node_modules/@astrojs/sitemap/node_modules/sitemap/node_modules/@types/sax": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", - "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", - "license": "MIT", + "site/node_modules/@astrojs/starlight/node_modules/hast-util-select/node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "license": "BSD-2-Clause", "dependencies": { - "@types/node": "*" + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "site/node_modules/@astrojs/starlight/node_modules/@astrojs/sitemap/node_modules/sitemap/node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "license": "MIT" + "site/node_modules/@astrojs/starlight/node_modules/hast-util-select/node_modules/nth-check/node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "license": "ISC" }, - "site/node_modules/@astrojs/starlight/node_modules/@astrojs/sitemap/node_modules/sitemap/node_modules/sax": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.1.tgz", - "integrity": "sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==", - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=11.0.0" + "site/node_modules/@astrojs/starlight/node_modules/hast-util-select/node_modules/property-information": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.2.0.tgz", + "integrity": "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "site/node_modules/@astrojs/starlight/node_modules/@astrojs/sitemap/node_modules/zod": { - "version": "4.6.5", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.6.5.tgz", - "integrity": "sha512-v5l/aFXZQeai4awLbOpSoHecE9UiMrnfx75tEXLjNonXVARxQ5mOeipTjROUchszUNCqnE+hqAMujRsRHsut2Q==", + "site/node_modules/@astrojs/starlight/node_modules/hast-util-select/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": { - "url": "https://github.com/sponsors/colinhacks" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "site/node_modules/@astrojs/starlight/node_modules/@pagefind/default-ui": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@pagefind/default-ui/-/default-ui-1.5.2.tgz", - "integrity": "sha512-pm1LMnQg8N2B3n2TnjKlhaFihpz6zTiA4HiGQ6/slKO/+8K9CAU5kcjdSSPgpuk1PMuuN4hxLipUIifnrkl3Sg==", - "license": "MIT" - }, - "site/node_modules/@astrojs/starlight/node_modules/@types/hast": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.5.tgz", - "integrity": "sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==", + "site/node_modules/@astrojs/starlight/node_modules/hast-util-select/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", - "dependencies": { - "@types/unist": "*" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "site/node_modules/@astrojs/starlight/node_modules/@types/hast/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" - }, - "site/node_modules/@astrojs/starlight/node_modules/@types/js-yaml": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz", - "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==", - "license": "MIT" - }, - "site/node_modules/@astrojs/starlight/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==", + "site/node_modules/@astrojs/starlight/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/unist": "*" + "@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" } }, - "site/node_modules/@astrojs/starlight/node_modules/@types/mdast/node_modules/@types/unist": { + "site/node_modules/@astrojs/starlight/node_modules/hast-util-to-html/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" }, - "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code": { - "version": "0.44.2", - "resolved": "https://registry.npmjs.org/astro-expressive-code/-/astro-expressive-code-0.44.2.tgz", - "integrity": "sha512-avop7nZcRwC7quvIxVguhwEZ9Tp6IoTzKUCLwP30Fb7+er+pWQgcysP01dcuzRIJo81kLGg30q/YAI2Yb1Sdzg==", - "license": "MIT", - "dependencies": { - "rehype-expressive-code": "^0.44.2", - "url-extras": "^0.1.0" - }, - "peerDependencies": { - "astro": "^4.0.0-beta || ^5.0.0-beta || ^3.3.0 || ^6.0.0-beta || ^7.0.0" - } - }, - "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code": { - "version": "0.44.2", - "resolved": "https://registry.npmjs.org/rehype-expressive-code/-/rehype-expressive-code-0.44.2.tgz", - "integrity": "sha512-jvjQpsfWKBquDrEl5YQA3CJybRRIuDOYsui1BJTs5oKDUK8pPkJSSxY8FjxNlIFIdtgrTjC1zuahuY4Cc1j9SQ==", + "site/node_modules/@astrojs/starlight/node_modules/hast-util-to-html/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", - "dependencies": { - "expressive-code": "^0.44.2" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code": { - "version": "0.44.2", - "resolved": "https://registry.npmjs.org/expressive-code/-/expressive-code-0.44.2.tgz", - "integrity": "sha512-MLNghkvhyFgVW4oCD5DxBuYnnTXIf0PygzGmfT6OZeOOYWh/D4sH1j931biElkA5RG/J9wY/iuSMGAPF5vzHOg==", + "site/node_modules/@astrojs/starlight/node_modules/hast-util-to-html/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", - "dependencies": { - "@expressive-code/core": "^0.44.2", - "@expressive-code/plugin-frames": "^0.44.2", - "@expressive-code/plugin-shiki": "^0.44.2", - "@expressive-code/plugin-text-markers": "^0.44.2" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/core": { - "version": "0.44.2", - "resolved": "https://registry.npmjs.org/@expressive-code/core/-/core-0.44.2.tgz", - "integrity": "sha512-Yw5KonQCD1HoOO2P89y4wifqS9qrJcGVY0LkVMUsVZjhi++bhz4WwQ37inenKFNOEVo50P7cjoVsCdaVnUbq8w==", + "site/node_modules/@astrojs/starlight/node_modules/hast-util-to-html/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": { - "@ctrl/tinycolor": "^4.0.4", - "hast-util-select": "^6.0.2", - "hast-util-to-html": "^9.0.1", - "hast-util-to-text": "^4.0.1", - "hastscript": "^9.0.0", - "postcss": "^8.4.38", - "postcss-nested": "^6.0.1", - "unist-util-visit": "^5.0.0", - "unist-util-visit-parents": "^6.0.1" + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/core/node_modules/@ctrl/tinycolor": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-4.2.1.tgz", - "integrity": "sha512-Vh5uy9Y1JBMId6J1f68TMXnZrTCvNdo9Fu2k0d1YnJngR+sM5kWTKl441c/3TFs+cG0NWOjRWgQ/iaWhbYx+7A==", + "site/node_modules/@astrojs/starlight/node_modules/hast-util-to-html/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", - "engines": { - "node": ">=14" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/core/node_modules/hast-util-to-text": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz", - "integrity": "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==", + "site/node_modules/@astrojs/starlight/node_modules/hast-util-to-html/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/unist": "^3.0.0", - "hast-util-is-element": "^3.0.0", - "unist-util-find-after": "^5.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" } }, - "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/core/node_modules/hast-util-to-text/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" + "site/node_modules/@astrojs/starlight/node_modules/hast-util-to-html/node_modules/mdast-util-to-hast/node_modules/@ungap/structured-clone": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.4.0.tgz", + "integrity": "sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ==", + "license": "ISC" }, - "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/core/node_modules/hast-util-to-text/node_modules/hast-util-is-element": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", - "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", + "site/node_modules/@astrojs/starlight/node_modules/hast-util-to-html/node_modules/mdast-util-to-hast/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": { - "@types/hast": "^3.0.0" + "dequal": "^2.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/core/node_modules/hast-util-to-text/node_modules/unist-util-find-after": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz", - "integrity": "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==", + "site/node_modules/@astrojs/starlight/node_modules/hast-util-to-html/node_modules/mdast-util-to-hast/node_modules/devlop/node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=6" } }, - "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/core/node_modules/hast-util-to-text/node_modules/unist-util-find-after/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==", + "site/node_modules/@astrojs/starlight/node_modules/hast-util-to-html/node_modules/mdast-util-to-hast/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": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" } }, - "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/core/node_modules/postcss": { - "version": "8.5.28", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.28.tgz", - "integrity": "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==", + "site/node_modules/@astrojs/starlight/node_modules/hast-util-to-html/node_modules/mdast-util-to-hast/node_modules/micromark-util-sanitize-uri/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": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" }, { - "type": "github", - "url": "https://github.com/sponsors/ai" + "type": "OpenCollective", + "url": "https://opencollective.com/unified" } ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.18", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/core/node_modules/postcss-nested": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", - "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "site/node_modules/@astrojs/starlight/node_modules/hast-util-to-html/node_modules/mdast-util-to-hast/node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-character/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": "opencollective", - "url": "https://opencollective.com/postcss/" + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" }, { - "type": "github", - "url": "https://github.com/sponsors/ai" + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "site/node_modules/@astrojs/starlight/node_modules/hast-util-to-html/node_modules/mdast-util-to-hast/node_modules/micromark-util-sanitize-uri/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" + }, + "site/node_modules/@astrojs/starlight/node_modules/hast-util-to-html/node_modules/mdast-util-to-hast/node_modules/micromark-util-sanitize-uri/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" + }, + "site/node_modules/@astrojs/starlight/node_modules/hast-util-to-html/node_modules/mdast-util-to-hast/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", - "dependencies": { - "postcss-selector-parser": "^6.1.1" - }, - "engines": { - "node": ">=12.0" - }, - "peerDependencies": { - "postcss": "^8.2.14" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/core/node_modules/postcss-nested/node_modules/postcss-selector-parser": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.4.tgz", - "integrity": "sha512-bIoJLOmjCO1S9XdY/DcnR5hJxvrDir1PbGChrzXG3vw0/FOliy/fA3dmdhQ441kah4gKv+TwckGzex6wNS5cnQ==", + "site/node_modules/@astrojs/starlight/node_modules/hast-util-to-html/node_modules/mdast-util-to-hast/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": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" + "@types/unist": "^3.0.0" }, - "engines": { - "node": ">=4" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/core/node_modules/postcss-nested/node_modules/postcss-selector-parser/node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "site/node_modules/@astrojs/starlight/node_modules/hast-util-to-html/node_modules/property-information": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.2.0.tgz", + "integrity": "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==", "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/core/node_modules/postcss-nested/node_modules/postcss-selector-parser/node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" + "site/node_modules/@astrojs/starlight/node_modules/hast-util-to-html/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" + } }, - "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/core/node_modules/postcss/node_modules/nanoid": { - "version": "3.3.19", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.19.tgz", - "integrity": "sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + "site/node_modules/@astrojs/starlight/node_modules/hast-util-to-html/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", - "bin": { - "nanoid": "bin/nanoid.cjs" + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "site/node_modules/@astrojs/starlight/node_modules/hast-util-to-html/node_modules/stringify-entities/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" + } + }, + "site/node_modules/@astrojs/starlight/node_modules/hast-util-to-html/node_modules/stringify-entities/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" + } + }, + "site/node_modules/@astrojs/starlight/node_modules/hast-util-to-html/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" } }, - "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/core/node_modules/postcss/node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/core/node_modules/postcss/node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" + "site/node_modules/@astrojs/starlight/node_modules/hast-util-to-string": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-3.0.1.tgz", + "integrity": "sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/core/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==", + "site/node_modules/@astrojs/starlight/node_modules/hastscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", + "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", "license": "MIT", "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/core/node_modules/unist-util-visit-parents/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" + "site/node_modules/@astrojs/starlight/node_modules/hastscript/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" + } }, - "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/core/node_modules/unist-util-visit-parents/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==", + "site/node_modules/@astrojs/starlight/node_modules/hastscript/node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", "license": "MIT", "dependencies": { - "@types/unist": "^3.0.0" + "@types/hast": "^3.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/plugin-frames": { - "version": "0.44.2", - "resolved": "https://registry.npmjs.org/@expressive-code/plugin-frames/-/plugin-frames-0.44.2.tgz", - "integrity": "sha512-gVLm6TQMNIRWIaM7o+mCtxkGNjLZY5/2faSTLoXeo9wv/Pkj/0QAtZyXPVPrRsPARqiipATNFmfvQFLJudxPHQ==", + "site/node_modules/@astrojs/starlight/node_modules/hastscript/node_modules/property-information": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.2.0.tgz", + "integrity": "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==", "license": "MIT", - "dependencies": { - "@expressive-code/core": "^0.44.2" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/plugin-shiki": { - "version": "0.44.2", - "resolved": "https://registry.npmjs.org/@expressive-code/plugin-shiki/-/plugin-shiki-0.44.2.tgz", - "integrity": "sha512-ebWIvCDzXvjyD8rH6T6DfytYJw1GoArLR4nusIAE4VxXrCQf3d+owytiv010KU/dUg+SRLZskDn0N+HaFXeuSg==", + "site/node_modules/@astrojs/starlight/node_modules/hastscript/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", - "dependencies": { - "@expressive-code/core": "^0.44.2", - "shiki": "^4.0.2" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/plugin-shiki/node_modules/shiki": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-4.4.3.tgz", - "integrity": "sha512-Mb/GvXPHBAXdgGIcnfU5L3ldpn1XcxrGkPHwqgRx17/I2XRfqlFKk2vGkHWINn1kdXvzJZeuO3is6I9KLPFm0g==", + "site/node_modules/@astrojs/starlight/node_modules/i18next": { + "version": "26.4.2", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-26.4.2.tgz", + "integrity": "sha512-RX+R0VLg13IbvRuJSxnqykUFS9vQZTl8wYpWPCIUDWVrSGjsQywB5Y+pjzrkboxGAuYfJZVH1InFTdgBdxq6ug==", + "funding": [ + { + "type": "individual", + "url": "https://www.locize.com/i18next" + }, + { + "type": "individual", + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + }, + { + "type": "individual", + "url": "https://www.locize.com" + } + ], "license": "MIT", - "dependencies": { - "@shikijs/core": "4.4.3", - "@shikijs/engine-javascript": "4.4.3", - "@shikijs/engine-oniguruma": "4.4.3", - "@shikijs/langs": "4.4.3", - "@shikijs/themes": "4.4.3", - "@shikijs/types": "4.4.3", - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.5" + "peerDependencies": { + "typescript": "^5 || ^6 || ^7" }, - "engines": { - "node": ">=20" + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/plugin-shiki/node_modules/shiki/node_modules/@shikijs/core": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-4.4.3.tgz", - "integrity": "sha512-QCR4q2ZO/ILJEuwiBMel4wdcTDb1JGwfjKTxPDF6x8ixOaluPrVqIn06C99AcRPhmYlBR56d/Fb+GN58GzExpg==", + "site/node_modules/@astrojs/starlight/node_modules/js-yaml": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz", + "integrity": "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], "license": "MIT", "dependencies": { - "@shikijs/primitive": "4.4.3", - "@shikijs/types": "4.4.3", - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.5", - "hast-util-to-html": "^9.0.5" + "argparse": "^2.0.1" }, - "engines": { - "node": ">=20" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/plugin-shiki/node_modules/shiki/node_modules/@shikijs/core/node_modules/@shikijs/primitive": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/@shikijs/primitive/-/primitive-4.4.3.tgz", - "integrity": "sha512-m0wBeLDQDeIxRdUmrCPdQqfuUamDwRL5isCfYbguKD6NiaKpVbsv+3J81DyIKgNW5h4WAIIr8T4EkgQrBBxvaQ==", + "site/node_modules/@astrojs/starlight/node_modules/js-yaml/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "site/node_modules/@astrojs/starlight/node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", "license": "MIT", - "dependencies": { - "@shikijs/types": "4.4.3", - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.5" - }, "engines": { - "node": ">=20" + "node": ">= 8" } }, - "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/plugin-shiki/node_modules/shiki/node_modules/@shikijs/engine-javascript": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-4.4.3.tgz", - "integrity": "sha512-FbOjFJp9VLdo1Wevs10BBtVxiTWwNLqZh5Gkhjgda/ioL15YOgeSl9n+6XMa3qRlPQzfhFNe641SrynFHYG0nQ==", + "site/node_modules/@astrojs/starlight/node_modules/magic-string": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-1.4.1.tgz", + "integrity": "sha512-8lyCu36ErXR0J9uaGKlKQoiLZKmtI63YGLE8G2o9jyRPdr4X47LusSOwgOJOzcVtp81fTAAjxR7BwKz682Jhow==", "license": "MIT", "dependencies": { - "@shikijs/types": "4.4.3", - "@shikijs/vscode-textmate": "^10.0.2", - "oniguruma-to-es": "^4.3.6" - }, - "engines": { - "node": ">=20" + "@jridgewell/sourcemap-codec": "^1.6.0" } }, - "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/plugin-shiki/node_modules/shiki/node_modules/@shikijs/engine-javascript/node_modules/oniguruma-to-es": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.6.tgz", - "integrity": "sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==", + "site/node_modules/@astrojs/starlight/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", + "license": "MIT" + }, + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.1.0.tgz", + "integrity": "sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==", "license": "MIT", "dependencies": { - "oniguruma-parser": "^0.12.2", - "regex": "^6.1.0", - "regex-recursion": "^6.0.2" + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/plugin-shiki/node_modules/shiki/node_modules/@shikijs/engine-javascript/node_modules/oniguruma-to-es/node_modules/oniguruma-parser": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.2.tgz", - "integrity": "sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==", + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/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" }, - "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/plugin-shiki/node_modules/shiki/node_modules/@shikijs/engine-javascript/node_modules/oniguruma-to-es/node_modules/regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz", - "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/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", - "dependencies": { - "regex-utilities": "^2.3.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/plugin-shiki/node_modules/shiki/node_modules/@shikijs/engine-javascript/node_modules/oniguruma-to-es/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==", + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/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": { - "regex-utilities": "^2.3.0" + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/plugin-shiki/node_modules/shiki/node_modules/@shikijs/engine-javascript/node_modules/oniguruma-to-es/node_modules/regex-recursion/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" - }, - "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/plugin-shiki/node_modules/shiki/node_modules/@shikijs/engine-javascript/node_modules/oniguruma-to-es/node_modules/regex/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" - }, - "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/plugin-shiki/node_modules/shiki/node_modules/@shikijs/engine-oniguruma": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-4.4.3.tgz", - "integrity": "sha512-EcOQkxdxGQrc1Row/cC2c96/v1dbZqGnEVu1qTuT/MJmp6+cXCvQussowVmCv5Tqr3KuY3c7IbM6HTW3LJ1k9w==", + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/devlop/node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", "license": "MIT", - "dependencies": { - "@shikijs/types": "4.4.3", - "@shikijs/vscode-textmate": "^10.0.2" - }, "engines": { - "node": ">=20" + "node": ">=6" } }, - "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/plugin-shiki/node_modules/shiki/node_modules/@shikijs/langs": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-4.4.3.tgz", - "integrity": "sha512-ePic0yfAJGOF83D5wBHK/00EjK65oahBYxFk5epgq33WRv7X9UuxLEV8PtR0szC0z8dl7INIpIodB99JRFlR+A==", + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz", + "integrity": "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==", "license": "MIT", "dependencies": { - "@shikijs/types": "4.4.3" + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" }, - "engines": { - "node": ">=20" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/plugin-shiki/node_modules/shiki/node_modules/@shikijs/themes": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-4.4.3.tgz", - "integrity": "sha512-w8UHjeUnIR965KMWJHUPXOc2mNJUnK3vpVLYLvw5IYU2mnTTJ89E24OrJDBNiJDQ0qzb0tc4l7mrIXx5cFeIyw==", + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown/node_modules/decode-named-character-reference": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", + "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", "license": "MIT", "dependencies": { - "@shikijs/types": "4.4.3" + "character-entities": "^2.0.0" }, - "engines": { - "node": ">=20" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/plugin-shiki/node_modules/shiki/node_modules/@shikijs/types": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.4.3.tgz", - "integrity": "sha512-UEJxmRR++MAGR6hugn0vgVS2W/6lWAts84FFSrnlH9sP0LNol7E5+NQ792pH8liWUhyMyjhTgSUH3k7iD7tc5g==", + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown/node_modules/decode-named-character-reference/node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", "license": "MIT", - "dependencies": { - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.5" - }, - "engines": { - "node": ">=20" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/plugin-shiki/node_modules/shiki/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" + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown/node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } }, - "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/rehype-expressive-code/node_modules/expressive-code/node_modules/@expressive-code/plugin-text-markers": { - "version": "0.44.2", - "resolved": "https://registry.npmjs.org/@expressive-code/plugin-text-markers/-/plugin-text-markers-0.44.2.tgz", - "integrity": "sha512-SNI7EgUSiADqbqUzzMbj1ZeC/r2pa5eg3KyFOGAd3a7EsIA4qzjXQLp+ODWQtHVDKFCdGs4J3ovSJUqvKIK96g==", + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown/node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "@expressive-code/core": "^0.44.2" + "micromark-util-symbol": "^2.0.0" } }, - "site/node_modules/@astrojs/starlight/node_modules/astro-expressive-code/node_modules/url-extras": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/url-extras/-/url-extras-0.1.0.tgz", - "integrity": "sha512-8tzwTeXFPuX/5PHuCDQE5Dd9Ts4rwoq2t9aIT+HS4iAVpmj5l4Ao7Q+BuuFjvWRqrLswBhQDk8O96ZicgCqQqw==", + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown/node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" } }, - "site/node_modules/@astrojs/starlight/node_modules/bcp-47": { + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown/node_modules/micromark-util-decode-string/node_modules/micromark-util-character": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bcp-47/-/bcp-47-2.1.1.tgz", - "integrity": "sha512-KLw+H/gd2p4zly1X7Yh/qziuyae5/w/QFnvTng9eZL5fvszL7Whl3MBoWF8yxL7ksUjBfOD+OxkytiqbBpG+Fw==", + "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": { - "is-alphabetical": "^2.0.0", - "is-alphanumerical": "^2.0.0", - "is-decimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "site/node_modules/@astrojs/starlight/node_modules/bcp-47/node_modules/is-alphabetical": { + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown/node_modules/micromark-util-normalize-identifier": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", - "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "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" + } + }, + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown/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" + }, + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown/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" + }, + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown/node_modules/micromark/node_modules/@types/debug": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", + "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "dependencies": { + "@types/ms": "*" } }, - "site/node_modules/@astrojs/starlight/node_modules/bcp-47/node_modules/is-alphanumerical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", - "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown/node_modules/micromark/node_modules/@types/debug/node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown/node_modules/micromark/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", "dependencies": { - "is-alphabetical": "^2.0.0", - "is-decimal": "^2.0.0" + "ms": "^2.1.3" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "site/node_modules/@astrojs/starlight/node_modules/bcp-47/node_modules/is-decimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", - "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown/node_modules/micromark/node_modules/debug/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" }, - "site/node_modules/@astrojs/starlight/node_modules/hast-util-format": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hast-util-format/-/hast-util-format-1.1.0.tgz", - "integrity": "sha512-yY1UDz6bC9rDvCWHpx12aIBGRG7krurX0p0Fm6pT547LwDIZZiNr8a+IHDogorAdreULSEzP82Nlv5SZkHZcjA==", + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown/node_modules/micromark/node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-embedded": "^3.0.0", - "hast-util-minify-whitespace": "^1.0.0", - "hast-util-phrasing": "^3.0.0", - "hast-util-whitespace": "^3.0.0", - "html-whitespace-sensitive-tag-names": "^3.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "site/node_modules/@astrojs/starlight/node_modules/hast-util-format/node_modules/hast-util-embedded": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-embedded/-/hast-util-embedded-3.0.0.tgz", - "integrity": "sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==", + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown/node_modules/micromark/node_modules/micromark-core-commonmark/node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-is-element": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "site/node_modules/@astrojs/starlight/node_modules/hast-util-format/node_modules/hast-util-embedded/node_modules/hast-util-is-element": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", - "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown/node_modules/micromark/node_modules/micromark-core-commonmark/node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "site/node_modules/@astrojs/starlight/node_modules/hast-util-format/node_modules/hast-util-minify-whitespace": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hast-util-minify-whitespace/-/hast-util-minify-whitespace-1.0.1.tgz", - "integrity": "sha512-L96fPOVpnclQE0xzdWb/D12VT5FabA7SnZOUMtL1DbXmYiHJMXZvFkIZfiMmTCNJHUeO2K9UYNXoVyfz+QHuOw==", + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown/node_modules/micromark/node_modules/micromark-core-commonmark/node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-embedded": "^3.0.0", - "hast-util-is-element": "^3.0.0", - "hast-util-whitespace": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "site/node_modules/@astrojs/starlight/node_modules/hast-util-format/node_modules/hast-util-minify-whitespace/node_modules/hast-util-is-element": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", - "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown/node_modules/micromark/node_modules/micromark-core-commonmark/node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "site/node_modules/@astrojs/starlight/node_modules/hast-util-format/node_modules/hast-util-minify-whitespace/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==", + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown/node_modules/micromark/node_modules/micromark-core-commonmark/node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "site/node_modules/@astrojs/starlight/node_modules/hast-util-format/node_modules/hast-util-minify-whitespace/node_modules/unist-util-is/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" - }, - "site/node_modules/@astrojs/starlight/node_modules/hast-util-format/node_modules/hast-util-phrasing": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/hast-util-phrasing/-/hast-util-phrasing-3.0.1.tgz", - "integrity": "sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==", + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown/node_modules/micromark/node_modules/micromark-core-commonmark/node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown/node_modules/micromark/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-embedded": "^3.0.0", - "hast-util-has-property": "^3.0.0", - "hast-util-is-body-ok-link": "^3.0.0", - "hast-util-is-element": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "site/node_modules/@astrojs/starlight/node_modules/hast-util-format/node_modules/hast-util-phrasing/node_modules/hast-util-has-property": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-3.0.0.tgz", - "integrity": "sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==", + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown/node_modules/micromark/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": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "site/node_modules/@astrojs/starlight/node_modules/hast-util-format/node_modules/hast-util-phrasing/node_modules/hast-util-is-body-ok-link": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/hast-util-is-body-ok-link/-/hast-util-is-body-ok-link-3.0.1.tgz", - "integrity": "sha512-0qpnzOBLztXHbHQenVB8uNuxTnm/QBFUOmdOSsEn7GnBtyY07+ENTWVFBAnXd/zEgd9/SUG3lRY7hSIBWRgGpQ==", + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown/node_modules/micromark/node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "micromark-util-symbol": "^2.0.0" } }, - "site/node_modules/@astrojs/starlight/node_modules/hast-util-format/node_modules/hast-util-phrasing/node_modules/hast-util-is-element": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", - "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown/node_modules/micromark/node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "site/node_modules/@astrojs/starlight/node_modules/hast-util-format/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==", + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown/node_modules/micromark/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" + }, + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown/node_modules/micromark/node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "micromark-util-types": "^2.0.0" } }, - "site/node_modules/@astrojs/starlight/node_modules/hast-util-format/node_modules/html-whitespace-sensitive-tag-names": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/html-whitespace-sensitive-tag-names/-/html-whitespace-sensitive-tag-names-3.0.1.tgz", - "integrity": "sha512-q+310vW8zmymYHALr1da4HyXUQ0zgiIwIicEfotYPWGN0OJVEN/58IJ3A4GBYcEq3LGAZqKb+ugvP0GNB9CEAA==", + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown/node_modules/micromark/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", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" } }, - "site/node_modules/@astrojs/starlight/node_modules/hast-util-format/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==", + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown/node_modules/micromark/node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "site/node_modules/@astrojs/starlight/node_modules/hast-util-format/node_modules/unist-util-visit-parents/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" - }, - "site/node_modules/@astrojs/starlight/node_modules/hast-util-format/node_modules/unist-util-visit-parents/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==", + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown/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" @@ -12790,309 +17340,247 @@ "url": "https://opencollective.com/unified" } }, - "site/node_modules/@astrojs/starlight/node_modules/hast-util-select": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/hast-util-select/-/hast-util-select-6.0.4.tgz", - "integrity": "sha512-RqGS1ZgI0MwxLaKLDxjprynNzINEkRHY2i8ln4DDjgv9ZhcYVIHN9rlpiYsqtFwrgpYU361SyWDQcGNIBVu3lw==", + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", "license": "MIT", "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "bcp-47-match": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "css-selector-parser": "^3.0.0", - "devlop": "^1.0.0", - "direction": "^2.0.0", - "hast-util-has-property": "^3.0.0", - "hast-util-to-string": "^3.0.0", - "hast-util-whitespace": "^3.0.0", - "nth-check": "^2.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0", - "unist-util-visit": "^5.0.0", - "zwitch": "^2.0.0" + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "site/node_modules/@astrojs/starlight/node_modules/hast-util-select/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" - }, - "site/node_modules/@astrojs/starlight/node_modules/hast-util-select/node_modules/bcp-47-match": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/bcp-47-match/-/bcp-47-match-2.0.3.tgz", - "integrity": "sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==", + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/parse-entities/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" } }, - "site/node_modules/@astrojs/starlight/node_modules/hast-util-select/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==", + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/parse-entities/node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, - "site/node_modules/@astrojs/starlight/node_modules/hast-util-select/node_modules/css-selector-parser": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-3.3.0.tgz", - "integrity": "sha512-Y2asgMGFqJKF4fq4xHDSlFYIkeVfRsm69lQC1q9kbEsH5XtnINTMrweLkjYMeaUgiXBy/uvKeO/a1JHTNnmB2g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ], - "license": "MIT" - }, - "site/node_modules/@astrojs/starlight/node_modules/hast-util-select/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==", + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/parse-entities/node_modules/decode-named-character-reference": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", + "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", "license": "MIT", "dependencies": { - "dequal": "^2.0.0" + "character-entities": "^2.0.0" }, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, - "site/node_modules/@astrojs/starlight/node_modules/hast-util-select/node_modules/devlop/node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/parse-entities/node_modules/decode-named-character-reference/node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", "license": "MIT", - "engines": { - "node": ">=6" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "site/node_modules/@astrojs/starlight/node_modules/hast-util-select/node_modules/direction": { + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/parse-entities/node_modules/is-alphanumerical": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/direction/-/direction-2.0.1.tgz", - "integrity": "sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", "license": "MIT", - "bin": { - "direction": "cli.js" + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" }, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, - "site/node_modules/@astrojs/starlight/node_modules/hast-util-select/node_modules/hast-util-has-property": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-3.0.0.tgz", - "integrity": "sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==", + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/parse-entities/node_modules/is-alphanumerical/node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "site/node_modules/@astrojs/starlight/node_modules/hast-util-select/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==", + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/parse-entities/node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "site/node_modules/@astrojs/starlight/node_modules/hast-util-select/node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0" - }, + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/parse-entities/node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "license": "MIT", "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "site/node_modules/@astrojs/starlight/node_modules/hast-util-select/node_modules/nth-check/node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "license": "ISC" - }, - "site/node_modules/@astrojs/starlight/node_modules/hast-util-select/node_modules/property-information": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.2.0.tgz", - "integrity": "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==", + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/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" } }, - "site/node_modules/@astrojs/starlight/node_modules/hast-util-select/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==", + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/stringify-entities/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" } }, - "site/node_modules/@astrojs/starlight/node_modules/hast-util-select/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==", + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/stringify-entities/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" } }, - "site/node_modules/@astrojs/starlight/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==", + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/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", "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" + "unist-util-is": "^6.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "site/node_modules/@astrojs/starlight/node_modules/hast-util-to-html/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" - }, - "site/node_modules/@astrojs/starlight/node_modules/hast-util-to-html/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" - } - }, - "site/node_modules/@astrojs/starlight/node_modules/hast-util-to-html/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==", + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/unist-util-visit-parents/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": "github", - "url": "https://github.com/sponsors/wooorm" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "site/node_modules/@astrojs/starlight/node_modules/hast-util-to-html/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==", + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", "license": "MIT", "dependencies": { - "@types/hast": "^3.0.0" + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "site/node_modules/@astrojs/starlight/node_modules/hast-util-to-html/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==", + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-to-markdown/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" + }, + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-to-markdown/node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, - "site/node_modules/@astrojs/starlight/node_modules/hast-util-to-html/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==", + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-to-markdown/node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", "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" + "unist-util-is": "^6.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "site/node_modules/@astrojs/starlight/node_modules/hast-util-to-html/node_modules/mdast-util-to-hast/node_modules/@ungap/structured-clone": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.4.0.tgz", - "integrity": "sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ==", - "license": "ISC" - }, - "site/node_modules/@astrojs/starlight/node_modules/hast-util-to-html/node_modules/mdast-util-to-hast/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==", + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-to-markdown/node_modules/mdast-util-phrasing/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": { - "dequal": "^2.0.0" + "@types/unist": "^3.0.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "site/node_modules/@astrojs/starlight/node_modules/hast-util-to-html/node_modules/mdast-util-to-hast/node_modules/devlop/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" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "site/node_modules/@astrojs/starlight/node_modules/hast-util-to-html/node_modules/mdast-util-to-hast/node_modules/micromark-util-sanitize-uri": { + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-to-markdown/node_modules/micromark-util-classify-character": { "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==", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", "funding": [ { "type": "GitHub Sponsors", @@ -13106,11 +17594,11 @@ "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-symbol": "^2.0.0" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "site/node_modules/@astrojs/starlight/node_modules/hast-util-to-html/node_modules/mdast-util-to-hast/node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-character": { + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-to-markdown/node_modules/micromark-util-classify-character/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==", @@ -13130,10 +17618,10 @@ "micromark-util-types": "^2.0.0" } }, - "site/node_modules/@astrojs/starlight/node_modules/hast-util-to-html/node_modules/mdast-util-to-hast/node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-character/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==", + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-to-markdown/node_modules/micromark-util-classify-character/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", @@ -13146,10 +17634,10 @@ ], "license": "MIT" }, - "site/node_modules/@astrojs/starlight/node_modules/hast-util-to-html/node_modules/mdast-util-to-hast/node_modules/micromark-util-sanitize-uri/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==", + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-to-markdown/node_modules/micromark-util-classify-character/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", @@ -13162,10 +17650,10 @@ ], "license": "MIT" }, - "site/node_modules/@astrojs/starlight/node_modules/hast-util-to-html/node_modules/mdast-util-to-hast/node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-symbol": { + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-to-markdown/node_modules/micromark-util-decode-string": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", "funding": [ { "type": "GitHub Sponsors", @@ -13176,358 +17664,301 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT" - }, - "site/node_modules/@astrojs/starlight/node_modules/hast-util-to-html/node_modules/mdast-util-to-hast/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" - } - }, - "site/node_modules/@astrojs/starlight/node_modules/hast-util-to-html/node_modules/mdast-util-to-hast/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" - } - }, - "site/node_modules/@astrojs/starlight/node_modules/hast-util-to-html/node_modules/property-information": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.2.0.tgz", - "integrity": "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "site/node_modules/@astrojs/starlight/node_modules/hast-util-to-html/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" + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" } }, - "site/node_modules/@astrojs/starlight/node_modules/hast-util-to-html/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==", + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-to-markdown/node_modules/micromark-util-decode-string/node_modules/decode-named-character-reference": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", + "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", "license": "MIT", "dependencies": { - "character-entities-html4": "^2.0.0", - "character-entities-legacy": "^3.0.0" + "character-entities": "^2.0.0" }, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, - "site/node_modules/@astrojs/starlight/node_modules/hast-util-to-html/node_modules/stringify-entities/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" - } - }, - "site/node_modules/@astrojs/starlight/node_modules/hast-util-to-html/node_modules/stringify-entities/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" - } - }, - "site/node_modules/@astrojs/starlight/node_modules/hast-util-to-html/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" - } - }, - "site/node_modules/@astrojs/starlight/node_modules/hast-util-to-string": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-3.0.1.tgz", - "integrity": "sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "site/node_modules/@astrojs/starlight/node_modules/hastscript": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", - "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-parse-selector": "^4.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "site/node_modules/@astrojs/starlight/node_modules/hastscript/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==", + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-to-markdown/node_modules/micromark-util-decode-string/node_modules/decode-named-character-reference/node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, - "site/node_modules/@astrojs/starlight/node_modules/hastscript/node_modules/hast-util-parse-selector": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", - "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-to-markdown/node_modules/micromark-util-decode-string/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": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "site/node_modules/@astrojs/starlight/node_modules/hastscript/node_modules/property-information": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.2.0.tgz", - "integrity": "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "site/node_modules/@astrojs/starlight/node_modules/hastscript/node_modules/space-separated-tokens": { + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-to-markdown/node_modules/micromark-util-decode-string/node_modules/micromark-util-character/node_modules/micromark-util-types": { "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" - } - }, - "site/node_modules/@astrojs/starlight/node_modules/i18next": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-26.4.2.tgz", - "integrity": "sha512-RX+R0VLg13IbvRuJSxnqykUFS9vQZTl8wYpWPCIUDWVrSGjsQywB5Y+pjzrkboxGAuYfJZVH1InFTdgBdxq6ug==", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", "funding": [ { - "type": "individual", - "url": "https://www.locize.com/i18next" + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" }, { - "type": "individual", - "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-to-markdown/node_modules/micromark-util-decode-string/node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" }, { - "type": "individual", - "url": "https://www.locize.com" + "type": "OpenCollective", + "url": "https://opencollective.com/unified" } ], "license": "MIT", - "peerDependencies": { - "typescript": "^5 || ^6 || ^7" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "dependencies": { + "micromark-util-symbol": "^2.0.0" } }, - "site/node_modules/@astrojs/starlight/node_modules/js-yaml": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz", - "integrity": "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==", + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-to-markdown/node_modules/micromark-util-decode-string/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", - "url": "https://github.com/sponsors/puzrin" + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" }, { - "type": "github", - "url": "https://github.com/sponsors/nodeca" + "type": "OpenCollective", + "url": "https://opencollective.com/unified" } ], + "license": "MIT" + }, + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-to-markdown/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" + } + }, + "site/node_modules/@astrojs/starlight/node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", "license": "MIT", "dependencies": { - "argparse": "^2.0.1" + "@types/mdast": "^4.0.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "site/node_modules/@astrojs/starlight/node_modules/pagefind": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/pagefind/-/pagefind-1.5.2.tgz", + "integrity": "sha512-XTUaK0hXMCu2jszWE584JGQT7y284TmMV9l/HX3rnG5uo3rHI/uHU56XTyyyPFjeWEBxECbAi0CaFDJOONtG0Q==", + "license": "MIT", "bin": { - "js-yaml": "bin/js-yaml.js" + "pagefind": "lib/runner/bin.cjs" + }, + "optionalDependencies": { + "@pagefind/darwin-arm64": "1.5.2", + "@pagefind/darwin-x64": "1.5.2", + "@pagefind/freebsd-x64": "1.5.2", + "@pagefind/linux-arm64": "1.5.2", + "@pagefind/linux-x64": "1.5.2", + "@pagefind/windows-arm64": "1.5.2", + "@pagefind/windows-x64": "1.5.2" } }, - "site/node_modules/@astrojs/starlight/node_modules/js-yaml/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" + "site/node_modules/@astrojs/starlight/node_modules/pagefind/node_modules/@pagefind/darwin-arm64": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@pagefind/darwin-arm64/-/darwin-arm64-1.5.2.tgz", + "integrity": "sha512-MXpI+7HsAdPkvJ0gk9xj9g541BCqBZOBbdwj9g6lB5LCj6kSV6nqDSjzcAJwvOsfu0fjwvC8hQU+ecfhp+MpiQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] }, - "site/node_modules/@astrojs/starlight/node_modules/klona": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", - "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "site/node_modules/@astrojs/starlight/node_modules/pagefind/node_modules/@pagefind/darwin-x64": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@pagefind/darwin-x64/-/darwin-x64-1.5.2.tgz", + "integrity": "sha512-IojxFWMEJe0RQ7PQ3KXQsPIImNsbpPYpoZ+QUDrL8fAl/O27IX+LVLs74/UzEZy5uA2LD8Nz1AiwKr72vrkZQw==", + "cpu": [ + "x64" + ], "license": "MIT", - "engines": { - "node": ">= 8" - } + "optional": true, + "os": [ + "darwin" + ] }, - "site/node_modules/@astrojs/starlight/node_modules/magic-string": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-1.4.1.tgz", - "integrity": "sha512-8lyCu36ErXR0J9uaGKlKQoiLZKmtI63YGLE8G2o9jyRPdr4X47LusSOwgOJOzcVtp81fTAAjxR7BwKz682Jhow==", + "site/node_modules/@astrojs/starlight/node_modules/pagefind/node_modules/@pagefind/freebsd-x64": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@pagefind/freebsd-x64/-/freebsd-x64-1.5.2.tgz", + "integrity": "sha512-7EVzo9+0w+2cbe671BtMj10UlNo83I+HrLVLfRxO731svHRJKUfJ/mo05gU14pe9PCfpKNQT8FS3Xc/oDN6pOA==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.6.0" - } + "optional": true, + "os": [ + "freebsd" + ] }, - "site/node_modules/@astrojs/starlight/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", - "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", - "license": "MIT" + "site/node_modules/@astrojs/starlight/node_modules/pagefind/node_modules/@pagefind/linux-arm64": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@pagefind/linux-arm64/-/linux-arm64-1.5.2.tgz", + "integrity": "sha512-Ovt9+K35sqzn8H3ZMXGwls4TD/wMJuvRtShHIsmUQREmaxjrDEX7gHckRCrwYJ4XE1H1p6HkLz3wukrAnsfXQw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.1.0.tgz", - "integrity": "sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==", + "site/node_modules/@astrojs/starlight/node_modules/pagefind/node_modules/@pagefind/linux-x64": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@pagefind/linux-x64/-/linux-x64-1.5.2.tgz", + "integrity": "sha512-V+tFqHKXhQKq/WqPBD67AFy7scn1/aZID00ws4fSDd+1daSi5UHR9VVlRrOUYKxn3VuFQYRD7lYXdZK1WED1YA==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "ccount": "^2.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "parse-entities": "^4.0.0", - "stringify-entities": "^4.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } + "optional": true, + "os": [ + "linux" + ] }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/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" + "site/node_modules/@astrojs/starlight/node_modules/pagefind/node_modules/@pagefind/windows-arm64": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@pagefind/windows-arm64/-/windows-arm64-1.5.2.tgz", + "integrity": "sha512-hN9Nh90fNW61nNRCW9ZyQrAj/mD0eRvmJ8NlTUzkbuW8kIzGJUi3cxjFkEcMZ5h/8FsKWD/VcouZl4yo1F7B6g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/ccount": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", - "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "site/node_modules/@astrojs/starlight/node_modules/pagefind/node_modules/@pagefind/windows-x64": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@pagefind/windows-x64/-/windows-x64-1.5.2.tgz", + "integrity": "sha512-Fa2Iyw7kaDRzGMfNYNUXNW2zbL5FQVDgSOcbDHdzBrDEdpqOqg8TcZ68F22ol6NJ9IGzvUdmeyZypLW5dyhqsg==", + "cpu": [ + "x64" + ], "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } + "optional": true, + "os": [ + "win32" + ] }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/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==", + "site/node_modules/@astrojs/starlight/node_modules/remark-directive": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-4.0.0.tgz", + "integrity": "sha512-7sxn4RfF1o3izevPV1DheyGDD6X4c9hrGpfdUpm7uC++dqrnJxIZVkk7CoKqcLm0VUMAuOol7Mno3m6g8cfMuA==", "license": "MIT", "dependencies": { - "dequal": "^2.0.0" + "@types/mdast": "^4.0.0", + "mdast-util-directive": "^3.0.0", + "micromark-extension-directive": "^4.0.0", + "unified": "^11.0.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/devlop/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" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz", - "integrity": "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==", + "site/node_modules/@astrojs/starlight/node_modules/remark-directive/node_modules/micromark-extension-directive": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-4.0.0.tgz", + "integrity": "sha512-/C2nqVmXXmiseSSuCdItCMho7ybwwop6RrrRPk0KbOHW21JKoCldC+8rFOaundDoRBUWBnJJcxeA/Kvi34WQXg==", "license": "MIT", "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark": "^4.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-decode-string": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", - "unist-util-stringify-position": "^4.0.0" + "parse-entities": "^4.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown/node_modules/decode-named-character-reference": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", - "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", + "site/node_modules/@astrojs/starlight/node_modules/remark-directive/node_modules/micromark-extension-directive/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": { - "character-entities": "^2.0.0" + "dequal": "^2.0.0" }, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown/node_modules/decode-named-character-reference/node_modules/character-entities": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "site/node_modules/@astrojs/starlight/node_modules/remark-directive/node_modules/micromark-extension-directive/node_modules/devlop/node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "engines": { + "node": ">=6" } }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown/node_modules/micromark": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", - "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "site/node_modules/@astrojs/starlight/node_modules/remark-directive/node_modules/micromark-extension-directive/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "funding": [ { "type": "GitHub Sponsors", @@ -13540,29 +17971,14 @@ ], "license": "MIT", "dependencies": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown/node_modules/micromark-util-decode-numeric-character-reference": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", - "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "site/node_modules/@astrojs/starlight/node_modules/remark-directive/node_modules/micromark-extension-directive/node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", "funding": [ { "type": "GitHub Sponsors", @@ -13575,13 +17991,16 @@ ], "license": "MIT", "dependencies": { - "micromark-util-symbol": "^2.0.0" + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown/node_modules/micromark-util-decode-string": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", - "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "site/node_modules/@astrojs/starlight/node_modules/remark-directive/node_modules/micromark-extension-directive/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", @@ -13594,16 +18013,14 @@ ], "license": "MIT", "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-symbol": "^2.0.0" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown/node_modules/micromark-util-decode-string/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==", + "site/node_modules/@astrojs/starlight/node_modules/remark-directive/node_modules/micromark-extension-directive/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", @@ -13614,16 +18031,12 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } + "license": "MIT" }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown/node_modules/micromark-util-normalize-identifier": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", - "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "site/node_modules/@astrojs/starlight/node_modules/remark-directive/node_modules/micromark-extension-directive/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", @@ -13634,400 +18047,485 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT" + }, + "site/node_modules/@astrojs/starlight/node_modules/remark-directive/node_modules/micromark-extension-directive/node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "site/node_modules/@astrojs/starlight/node_modules/remark-directive/node_modules/micromark-extension-directive/node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "site/node_modules/@astrojs/starlight/node_modules/remark-directive/node_modules/micromark-extension-directive/node_modules/parse-entities/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" + } + }, + "site/node_modules/@astrojs/starlight/node_modules/remark-directive/node_modules/micromark-extension-directive/node_modules/parse-entities/node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "site/node_modules/@astrojs/starlight/node_modules/remark-directive/node_modules/micromark-extension-directive/node_modules/parse-entities/node_modules/decode-named-character-reference": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", + "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "site/node_modules/@astrojs/starlight/node_modules/remark-directive/node_modules/micromark-extension-directive/node_modules/parse-entities/node_modules/decode-named-character-reference/node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "site/node_modules/@astrojs/starlight/node_modules/remark-directive/node_modules/micromark-extension-directive/node_modules/parse-entities/node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "site/node_modules/@astrojs/starlight/node_modules/remark-directive/node_modules/micromark-extension-directive/node_modules/parse-entities/node_modules/is-alphanumerical/node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "site/node_modules/@astrojs/starlight/node_modules/remark-directive/node_modules/micromark-extension-directive/node_modules/parse-entities/node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "site/node_modules/@astrojs/starlight/node_modules/remark-directive/node_modules/micromark-extension-directive/node_modules/parse-entities/node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "site/node_modules/@astrojs/starlight/node_modules/satteri": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/satteri/-/satteri-0.10.5.tgz", + "integrity": "sha512-Ao1LKpAEa9Wdg0otgbVKViZHEq9ebdXe4DMrp3s9vQAU0HNIuHnFEuMuOcm0ZIXyV0Yzxj91NvhLpvXZJO/5ZQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.5", + "@types/hast": "^3.0.5", + "@types/mdast": "^4.0.4", + "@types/unist": "^3.0.3" + }, + "optionalDependencies": { + "@bruits/satteri-darwin-arm64": "0.10.5", + "@bruits/satteri-darwin-x64": "0.10.5", + "@bruits/satteri-linux-arm64-gnu": "0.10.5", + "@bruits/satteri-linux-arm64-musl": "0.10.5", + "@bruits/satteri-linux-x64-gnu": "0.10.5", + "@bruits/satteri-linux-x64-musl": "0.10.5", + "@bruits/satteri-wasm32-wasi": "0.10.5", + "@bruits/satteri-win32-arm64-msvc": "0.10.5", + "@bruits/satteri-win32-x64-msvc": "0.10.5" + } + }, + "site/node_modules/@astrojs/starlight/node_modules/satteri/node_modules/@bruits/satteri-darwin-arm64": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-darwin-arm64/-/satteri-darwin-arm64-0.10.5.tgz", + "integrity": "sha512-27KTVl4TJkVahMy/ohyA7qd4938G5UNneFUz/PsScYfpIhj0IVAS23mpcJXdPF44sa6nva198lmV/cKIb2YPyA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "site/node_modules/@astrojs/starlight/node_modules/satteri/node_modules/@bruits/satteri-darwin-x64": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-darwin-x64/-/satteri-darwin-x64-0.10.5.tgz", + "integrity": "sha512-IjnLe3nKspq6qaeqGgjT7MT8VrTV74yWRlaag7ZdNsI8TDAYZ0iPxMCo+9KQZHUk5EyVB+reBI/PFWL5KuFw9Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "site/node_modules/@astrojs/starlight/node_modules/satteri/node_modules/@bruits/satteri-linux-arm64-gnu": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-linux-arm64-gnu/-/satteri-linux-arm64-gnu-0.10.5.tgz", + "integrity": "sha512-glkYXZCJywjP13v67eAyAMSJdF+ncvEbYvgi/wOtffL9tQ27lr/zsyzUfgs+ovjJ9d8JNQKiXeiArJcX8PJL9w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "site/node_modules/@astrojs/starlight/node_modules/satteri/node_modules/@bruits/satteri-linux-arm64-musl": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-linux-arm64-musl/-/satteri-linux-arm64-musl-0.10.5.tgz", + "integrity": "sha512-yWdgG1g17Nh2QyGVlFUxGRa3FEFwiMcpZEyMNWkbM3deC94cmVc+/i9OuyFpdKuWo3GkgoCtYVOoxk1uCnCZIA==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } + "optional": true, + "os": [ + "linux" + ] }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown/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" - } + "site/node_modules/@astrojs/starlight/node_modules/satteri/node_modules/@bruits/satteri-linux-x64-gnu": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-linux-x64-gnu/-/satteri-linux-x64-gnu-0.10.5.tgz", + "integrity": "sha512-FVaLoPT1fBgGl0J+AYebyyXJYBachGl8Oyyrf1lye4RTqCB4S0Gwkj1uM9RJyThUOvx5VUmAT1CnNh1SFHA+kw==", + "cpu": [ + "x64" ], - "license": "MIT" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown/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" - } + "site/node_modules/@astrojs/starlight/node_modules/satteri/node_modules/@bruits/satteri-linux-x64-musl": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-linux-x64-musl/-/satteri-linux-x64-musl-0.10.5.tgz", + "integrity": "sha512-EHpVAx2bqW3GINHTKkljtxVfQmVDGWIuwOYOP5YghTj+0PkBa2o8oKPRtQ9Kbsr1Fye8jtUcDjhwj2jMNugZKg==", + "cpu": [ + "x64" ], - "license": "MIT" - }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown/node_modules/micromark/node_modules/@types/debug": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", - "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", "license": "MIT", - "dependencies": { - "@types/ms": "*" - } - }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown/node_modules/micromark/node_modules/@types/debug/node_modules/@types/ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", - "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", - "license": "MIT" + "optional": true, + "os": [ + "linux" + ] }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown/node_modules/micromark/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "site/node_modules/@astrojs/starlight/node_modules/satteri/node_modules/@bruits/satteri-wasm32-wasi": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-wasm32-wasi/-/satteri-wasm32-wasi-0.10.5.tgz", + "integrity": "sha512-ypz8c/Zmipxp4IoeDa228Gstv6TLzVmNs3yC6wKCoNSOjx1iwpgzu87Y3hTkXFdwChVGU85qeUDuOIarGUZQLw==", + "cpu": [ + "wasm32" + ], "license": "MIT", + "optional": true, "dependencies": { - "ms": "^2.1.3" + "@emnapi/core": "1.11.1", + "@emnapi/runtime": "1.11.1", + "@napi-rs/wasm-runtime": "^1.2.3" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=14.0.0" } }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown/node_modules/micromark/node_modules/debug/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown/node_modules/micromark/node_modules/micromark-core-commonmark": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", - "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "site/node_modules/@astrojs/starlight/node_modules/satteri/node_modules/@bruits/satteri-wasm32-wasi/node_modules/@emnapi/core": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz", + "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==", "license": "MIT", + "optional": true, "dependencies": { - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-destination": "^2.0.0", - "micromark-factory-label": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-factory-title": "^2.0.0", - "micromark-factory-whitespace": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-html-tag-name": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" + "@emnapi/wasi-threads": "1.2.2", + "tslib": "^2.4.0" } }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown/node_modules/micromark/node_modules/micromark-core-commonmark/node_modules/micromark-factory-destination": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", - "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "site/node_modules/@astrojs/starlight/node_modules/satteri/node_modules/@bruits/satteri-wasm32-wasi/node_modules/@emnapi/core/node_modules/@emnapi/wasi-threads": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", + "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==", "license": "MIT", + "optional": true, "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" + "tslib": "^2.4.0" } }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown/node_modules/micromark/node_modules/micromark-core-commonmark/node_modules/micromark-factory-label": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", - "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "site/node_modules/@astrojs/starlight/node_modules/satteri/node_modules/@bruits/satteri-wasm32-wasi/node_modules/@emnapi/core/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD", + "optional": true + }, + "site/node_modules/@astrojs/starlight/node_modules/satteri/node_modules/@bruits/satteri-wasm32-wasi/node_modules/@emnapi/runtime": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", + "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", "license": "MIT", + "optional": true, "dependencies": { - "devlop": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" + "tslib": "^2.4.0" } }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown/node_modules/micromark/node_modules/micromark-core-commonmark/node_modules/micromark-factory-title": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", - "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "site/node_modules/@astrojs/starlight/node_modules/satteri/node_modules/@bruits/satteri-wasm32-wasi/node_modules/@emnapi/runtime/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD", + "optional": true + }, + "site/node_modules/@astrojs/starlight/node_modules/satteri/node_modules/@bruits/satteri-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.2.4.tgz", + "integrity": "sha512-AJxoUD2/15ESHbvpcyjU274nsAPLuOtPHCk0vKJM5pj//Fg/B1FXNWjPnXTT9PymCYYiHo4zPj0ZomXBKhoy7g==", "license": "MIT", + "optional": true, "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" + "@tybys/wasm-util": "^0.10.3" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=23.5.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1 || ^2.0.0-alpha.4", + "@emnapi/runtime": "^1.7.1 || ^2.0.0-alpha.4" } }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown/node_modules/micromark/node_modules/micromark-core-commonmark/node_modules/micromark-factory-whitespace": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", - "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "site/node_modules/@astrojs/starlight/node_modules/satteri/node_modules/@bruits/satteri-wasm32-wasi/node_modules/@napi-rs/wasm-runtime/node_modules/@tybys/wasm-util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.4.tgz", + "integrity": "sha512-W3c4gRigFS0T/Ma4qIYF3GDAc5AQdHb1yL5znJT1Zv1YaD9Kitx656wBjvr19qbiosmZT8lWDM5BEMynUqX65A==", "license": "MIT", + "optional": true, "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" + "tslib": "^2.4.0" } }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown/node_modules/micromark/node_modules/micromark-core-commonmark/node_modules/micromark-util-classify-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", - "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } + "site/node_modules/@astrojs/starlight/node_modules/satteri/node_modules/@bruits/satteri-wasm32-wasi/node_modules/@napi-rs/wasm-runtime/node_modules/@tybys/wasm-util/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD", + "optional": true + }, + "site/node_modules/@astrojs/starlight/node_modules/satteri/node_modules/@bruits/satteri-win32-arm64-msvc": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-win32-arm64-msvc/-/satteri-win32-arm64-msvc-0.10.5.tgz", + "integrity": "sha512-siTV88nb0LRqNpkL2gXboqCwVdq95sLtzMHS1/3eONV2gLbB3NAK46wmSMvCO/yquBvI2lvaFIfd8P12ecsxBw==", + "cpu": [ + "arm64" ], "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "site/node_modules/@astrojs/starlight/node_modules/satteri/node_modules/@bruits/satteri-win32-x64-msvc": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-win32-x64-msvc/-/satteri-win32-x64-msvc-0.10.5.tgz", + "integrity": "sha512-C3IfPvfvMXmlzBxaMPKFS1XiuV9pu2mC7YqkPk7PSvTgPZ8gbdASIpHpztDLvTTQjqZ0z1Ol8tK5X+V6XXC0wQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "site/node_modules/@astrojs/starlight/node_modules/satteri/node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" + "@types/estree": "*" } }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown/node_modules/micromark/node_modules/micromark-core-commonmark/node_modules/micromark-util-html-tag-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", - "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "site/node_modules/@astrojs/starlight/node_modules/satteri/node_modules/@types/estree-jsx/node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", "license": "MIT" }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown/node_modules/micromark/node_modules/micromark-factory-space": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "site/node_modules/@astrojs/starlight/node_modules/satteri/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" + }, + "site/node_modules/@astrojs/starlight/node_modules/ultrahtml": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ultrahtml/-/ultrahtml-1.7.0.tgz", + "integrity": "sha512-2xRd0VHoAQE4M+vF/DvFFB7pUV0ZxTW1TLi7lHQWnF/Sb5TPeEUV/l+hxcNnGO00ZXGnR0voCMmYRKQf+rvJ2g==", + "license": "MIT" + }, + "site/node_modules/@astrojs/starlight/node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", "license": "MIT", "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown/node_modules/micromark/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" - } - ], + "site/node_modules/@astrojs/starlight/node_modules/unified/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" + }, + "site/node_modules/@astrojs/starlight/node_modules/unified/node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown/node_modules/micromark/node_modules/micromark-util-chunked": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", - "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "site/node_modules/@astrojs/starlight/node_modules/unified/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": { - "micromark-util-symbol": "^2.0.0" + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown/node_modules/micromark/node_modules/micromark-util-combine-extensions": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", - "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "site/node_modules/@astrojs/starlight/node_modules/unified/node_modules/devlop/node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", "license": "MIT", - "dependencies": { - "micromark-util-chunked": "^2.0.0", - "micromark-util-types": "^2.0.0" + "engines": { + "node": ">=6" } }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown/node_modules/micromark/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" - } - ], + "site/node_modules/@astrojs/starlight/node_modules/unified/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" }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown/node_modules/micromark/node_modules/micromark-util-resolve-all": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", - "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "site/node_modules/@astrojs/starlight/node_modules/unified/node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", "license": "MIT", - "dependencies": { - "micromark-util-types": "^2.0.0" - } - }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown/node_modules/micromark/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" - } - ], + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "site/node_modules/@astrojs/starlight/node_modules/unified/node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-symbol": "^2.0.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown/node_modules/micromark/node_modules/micromark-util-subtokenize": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", - "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "site/node_modules/@astrojs/starlight/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", "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown/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==", + "site/node_modules/@astrojs/starlight/node_modules/unist-util-visit/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" + }, + "site/node_modules/@astrojs/starlight/node_modules/unist-util-visit/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" @@ -14037,600 +18535,656 @@ "url": "https://opencollective.com/unified" } }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/parse-entities": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", - "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "site/node_modules/@astrojs/starlight/node_modules/unist-util-visit/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", "dependencies": { - "@types/unist": "^2.0.0", - "character-entities-legacy": "^3.0.0", - "character-reference-invalid": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "is-alphanumerical": "^2.0.0", - "is-decimal": "^2.0.0", - "is-hexadecimal": "^2.0.0" + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/parse-entities/node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", - "license": "MIT" - }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/parse-entities/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==", + "site/node_modules/@astrojs/starlight/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": "github", - "url": "https://github.com/sponsors/wooorm" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/parse-entities/node_modules/character-reference-invalid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", - "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "site/node_modules/@astrojs/starlight/node_modules/vfile/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" + }, + "site/node_modules/@astrojs/starlight/node_modules/vfile/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": "github", - "url": "https://github.com/sponsors/wooorm" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/parse-entities/node_modules/decode-named-character-reference": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", - "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", + "site/node_modules/@astrojs/starlight/node_modules/vfile/node_modules/vfile-message/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": { - "character-entities": "^2.0.0" + "@types/unist": "^3.0.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/parse-entities/node_modules/decode-named-character-reference/node_modules/character-entities": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", - "license": "MIT", + "site/node_modules/@fontsource-variable/noto-sans-kr": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@fontsource-variable/noto-sans-kr/-/noto-sans-kr-5.3.0.tgz", + "integrity": "sha512-h863ZOIVMKjX0PSr0hLMUp/SjrwOul2yp0f5P61avqXdhqDABSkakzG2Ee07d3W8gVYgS9dMmxULdCkoN09f1A==", + "license": "OFL-1.1", "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "url": "https://github.com/sponsors/ayuhito" } }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/parse-entities/node_modules/is-alphanumerical": { + "site/node_modules/@vercel/analytics": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", - "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "resolved": "https://registry.npmjs.org/@vercel/analytics/-/analytics-2.0.1.tgz", + "integrity": "sha512-MTQG6V9qQrt1tsDeF+2Uoo5aPjqbVPys1xvnIftXSJYG2SrwXRHnqEvVoYID7BTruDz4lCd2Z7rM1BdkUehk2g==", + "license": "MIT", + "peerDependencies": { + "@remix-run/react": "^2", + "@sveltejs/kit": "^1 || ^2", + "next": ">= 13", + "nuxt": ">= 3", + "react": "^18 || ^19 || ^19.0.0-rc", + "svelte": ">= 4", + "vue": "^3", + "vue-router": "^4" + }, + "peerDependenciesMeta": { + "@remix-run/react": { + "optional": true + }, + "@sveltejs/kit": { + "optional": true + }, + "next": { + "optional": true + }, + "nuxt": { + "optional": true + }, + "react": { + "optional": true + }, + "svelte": { + "optional": true + }, + "vue": { + "optional": true + }, + "vue-router": { + "optional": true + } + } + }, + "site/node_modules/astro": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/astro/-/astro-7.3.3.tgz", + "integrity": "sha512-NF08hk3edFkVmr9avf9HW/rQyf6NrpbVDyYj2cVN3JfijDhfJYh1ivWVTY5PUd5+rRZn/Vtu4iaeyNlP0Iv6mg==", "license": "MIT", "dependencies": { - "is-alphabetical": "^2.0.0", - "is-decimal": "^2.0.0" + "@astrojs/compiler-rs": "^0.4.0", + "@astrojs/internal-helpers": "0.11.0", + "@astrojs/markdown-satteri": "0.4.1", + "@astrojs/telemetry": "3.3.3", + "@capsizecss/unpack": "^4.0.0", + "@clack/prompts": "^1.1.0", + "@oslojs/encoding": "^1.1.0", + "am-i-vibing": "^0.4.0", + "aria-query": "^5.3.2", + "axobject-query": "^4.1.0", + "ci-info": "^4.4.0", + "clsx": "^2.1.1", + "common-ancestor-path": "^2.0.0", + "cookie": "^2.0.1", + "devalue": "^5.8.1", + "diff": "^9.0.0", + "dset": "^3.1.4", + "es-module-lexer": "^2.0.0", + "esbuild": "^0.28.0", + "find-proc": "0.2.0", + "flattie": "^1.1.1", + "fontace": "~0.4.1", + "get-tsconfig": "5.0.0-beta.4", + "github-slugger": "^2.0.0", + "html-escaper": "3.0.3", + "http-cache-semantics": "^4.2.0", + "js-yaml": "^4.3.0", + "jsonc-parser": "^3.3.1", + "magic-string": "^1.0.0", + "magicast": "^0.5.2", + "mrmime": "^2.0.1", + "neotraverse": "^1.0.1", + "obug": "^2.1.1", + "p-limit": "^7.3.0", + "p-queue": "^9.1.0", + "package-manager-detector": "^1.6.0", + "piccolore": "^0.1.3", + "picomatch": "^4.0.4", + "shiki": "^4.0.2", + "smol-toml": "^1.6.0", + "svgo": "^4.0.2", + "tinyclip": "^0.1.12", + "tinyexec": "^1.0.4", + "tinyglobby": "^0.2.15", + "ultrahtml": "^1.6.0", + "unifont": "~0.7.5", + "unstorage": "^1.17.5", + "verkit": "^0.4.0", + "vite": "^8.0.13", + "vitefu": "^1.1.2", + "xxhash-wasm": "^1.1.0", + "yargs-parser": "^22.0.0", + "zod": "^4.5.4" + }, + "bin": { + "astro": "bin/astro.mjs" + }, + "engines": { + "node": ">=22.12.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/parse-entities/node_modules/is-alphanumerical/node_modules/is-alphabetical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", - "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/parse-entities/node_modules/is-decimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", - "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "type": "opencollective", + "url": "https://opencollective.com/astrodotbuild" + }, + "optionalDependencies": { + "sharp": "^0.35.4" + }, + "peerDependencies": { + "@astrojs/markdown-remark": "^7.3.0" + }, + "peerDependenciesMeta": { + "@astrojs/markdown-remark": { + "optional": true + } } }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/parse-entities/node_modules/is-hexadecimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", - "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "site/node_modules/astro/node_modules/@astrojs/compiler-rs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-rs/-/compiler-rs-0.4.1.tgz", + "integrity": "sha512-//NmAuRhy7eU9iP0ceI5Pymy55M+nUZ//kS6XeOyhBWdDib2KbJOyFaVJ52k7sDkJwTKVox7oPu3SpYiVnGm5A==", "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "dependencies": { + "@astrojs/compiler-binding": "0.4.1" + }, + "engines": { + "node": ">=22.12.0" } }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/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==", + "site/node_modules/astro/node_modules/@astrojs/compiler-rs/node_modules/@astrojs/compiler-binding": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding/-/compiler-binding-0.4.1.tgz", + "integrity": "sha512-ZYVDW1P58OXyxqZbOMp+/2U9KA7y2esIx9r4pWdpZ/l6fCZhaw4ul+D7EgpRVxYLkyTWqzANbTTUFGPFP8zDHA==", "license": "MIT", - "dependencies": { - "character-entities-html4": "^2.0.0", - "character-entities-legacy": "^3.0.0" + "engines": { + "node": "^20.19.0 || >=22.12.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "optionalDependencies": { + "@astrojs/compiler-binding-android-arm64": "0.4.1", + "@astrojs/compiler-binding-darwin-arm64": "0.4.1", + "@astrojs/compiler-binding-darwin-x64": "0.4.1", + "@astrojs/compiler-binding-linux-arm64-gnu": "0.4.1", + "@astrojs/compiler-binding-linux-arm64-musl": "0.4.1", + "@astrojs/compiler-binding-linux-x64-gnu": "0.4.1", + "@astrojs/compiler-binding-linux-x64-musl": "0.4.1", + "@astrojs/compiler-binding-wasm32-wasi": "0.4.1", + "@astrojs/compiler-binding-win32-arm64-msvc": "0.4.1", + "@astrojs/compiler-binding-win32-x64-msvc": "0.4.1" } }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/stringify-entities/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==", + "site/node_modules/astro/node_modules/@astrojs/compiler-rs/node_modules/@astrojs/compiler-binding/node_modules/@astrojs/compiler-binding-android-arm64": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-android-arm64/-/compiler-binding-android-arm64-0.4.1.tgz", + "integrity": "sha512-Wtx2DZORuNTLASLLZ8hlrjFaJe1LUloatcCn9EPq7knBhRpjMGXeJANIJMeBZG4igvz7x+3nyAJM2iwCSW9xog==", + "cpu": [ + "arm64" + ], "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/stringify-entities/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==", + "site/node_modules/astro/node_modules/@astrojs/compiler-rs/node_modules/@astrojs/compiler-binding/node_modules/@astrojs/compiler-binding-darwin-arm64": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-darwin-arm64/-/compiler-binding-darwin-arm64-0.4.1.tgz", + "integrity": "sha512-7iwXcU+hB60Y1SvOfnWHNioT72gDsDQKaDipXh2Onwp/TvQMozhbvhy13wJR8Af940a0h6PbddCeJFpj791UDA==", + "cpu": [ + "arm64" + ], "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/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==", + "site/node_modules/astro/node_modules/@astrojs/compiler-rs/node_modules/@astrojs/compiler-binding/node_modules/@astrojs/compiler-binding-darwin-x64": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-darwin-x64/-/compiler-binding-darwin-x64-0.4.1.tgz", + "integrity": "sha512-pifjICos49RXhSVKSDu5gDB0/8j0O7DmxSp1DaWW2PyLG5ekwSkcrfOZto5JqhdI7QYMZB3XOiXpsdOXpS4npA==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-directive/node_modules/unist-util-visit-parents/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==", + "site/node_modules/astro/node_modules/@astrojs/compiler-rs/node_modules/@astrojs/compiler-binding/node_modules/@astrojs/compiler-binding-linux-arm64-gnu": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-linux-arm64-gnu/-/compiler-binding-linux-arm64-gnu-0.4.1.tgz", + "integrity": "sha512-hsZMlNWc6LqWHh9LlSwTq1/XCY7pxA5rkkKIdZRV8mgbOz9OwLvjEoe5Jry13eIZjMUQO8XnQyzk8o/Pjw2YFA==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-to-markdown": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", - "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "site/node_modules/astro/node_modules/@astrojs/compiler-rs/node_modules/@astrojs/compiler-binding/node_modules/@astrojs/compiler-binding-linux-arm64-musl": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-linux-arm64-musl/-/compiler-binding-linux-arm64-musl-0.4.1.tgz", + "integrity": "sha512-a3EW27f+Z9uf57vYmpLgUriA1y9wDhKz57PT8D8XlFZt2HZEWhUxKuxI1jvKVI9p8okYee11WXEm/FHY1G9yoQ==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "longest-streak": "^3.0.0", - "mdast-util-phrasing": "^4.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-decode-string": "^2.0.0", - "unist-util-visit": "^5.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-to-markdown/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" - }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-to-markdown/node_modules/longest-streak": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", - "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "site/node_modules/astro/node_modules/@astrojs/compiler-rs/node_modules/@astrojs/compiler-binding/node_modules/@astrojs/compiler-binding-linux-x64-gnu": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-linux-x64-gnu/-/compiler-binding-linux-x64-gnu-0.4.1.tgz", + "integrity": "sha512-XruPTKB/SS4DFzeAjQ1ZyM0ieHDjapHkOSnnzRApZ4FXY2YAI7UY3mETjfJiIS/acyZyrnPH5jObv1gATTdUJQ==", + "cpu": [ + "x64" + ], "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-to-markdown/node_modules/mdast-util-phrasing": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", - "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "site/node_modules/astro/node_modules/@astrojs/compiler-rs/node_modules/@astrojs/compiler-binding/node_modules/@astrojs/compiler-binding-linux-x64-musl": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-linux-x64-musl/-/compiler-binding-linux-x64-musl-0.4.1.tgz", + "integrity": "sha512-E8j7lGanqNpudtkUbsFaOLJhmwFe4Ecqux7K9hkj4wULIPNZRM2bYZNcMSj8r1oWvaUiwZl8LaaNwv3+14jqhw==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-to-markdown/node_modules/mdast-util-phrasing/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==", + "site/node_modules/astro/node_modules/@astrojs/compiler-rs/node_modules/@astrojs/compiler-binding/node_modules/@astrojs/compiler-binding-wasm32-wasi": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-wasm32-wasi/-/compiler-binding-wasm32-wasi-0.4.1.tgz", + "integrity": "sha512-vNLxIv41ZE+nmPFtw24cRW5ZXG+ZPcAGtgigtjCP8lvcxKI7u2GrXoMsCgEH5fMw8WCEJpwLvsVBg15rJKAkyA==", + "cpu": [ + "wasm32" + ], "license": "MIT", + "optional": true, "dependencies": { - "@types/unist": "^3.0.0" + "@napi-rs/wasm-runtime": "^1.2.4" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=14.0.0" } }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-to-markdown/node_modules/micromark-util-classify-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", - "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "site/node_modules/astro/node_modules/@astrojs/compiler-rs/node_modules/@astrojs/compiler-binding/node_modules/@astrojs/compiler-binding-wasm32-wasi/node_modules/@emnapi/core": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.3.tgz", + "integrity": "sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg==", "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" + "@emnapi/wasi-threads": "1.2.3", + "tslib": "^2.4.0" } }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-to-markdown/node_modules/micromark-util-classify-character/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" - } - ], + "site/node_modules/astro/node_modules/@astrojs/compiler-rs/node_modules/@astrojs/compiler-binding/node_modules/@astrojs/compiler-binding-wasm32-wasi/node_modules/@emnapi/core/node_modules/@emnapi/wasi-threads": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.3.tgz", + "integrity": "sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g==", "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" + "tslib": "^2.4.0" } }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-to-markdown/node_modules/micromark-util-classify-character/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" - }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-to-markdown/node_modules/micromark-util-classify-character/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" + "site/node_modules/astro/node_modules/@astrojs/compiler-rs/node_modules/@astrojs/compiler-binding/node_modules/@astrojs/compiler-binding-wasm32-wasi/node_modules/@emnapi/core/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD", + "optional": true, + "peer": true }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-to-markdown/node_modules/micromark-util-decode-string": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", - "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "site/node_modules/astro/node_modules/@astrojs/compiler-rs/node_modules/@astrojs/compiler-binding/node_modules/@astrojs/compiler-binding-wasm32-wasi/node_modules/@emnapi/runtime": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.3.tgz", + "integrity": "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==", "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-symbol": "^2.0.0" + "tslib": "^2.4.0" } }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-to-markdown/node_modules/micromark-util-decode-string/node_modules/decode-named-character-reference": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", - "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", + "site/node_modules/astro/node_modules/@astrojs/compiler-rs/node_modules/@astrojs/compiler-binding/node_modules/@astrojs/compiler-binding-wasm32-wasi/node_modules/@emnapi/runtime/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD", + "optional": true, + "peer": true + }, + "site/node_modules/astro/node_modules/@astrojs/compiler-rs/node_modules/@astrojs/compiler-binding/node_modules/@astrojs/compiler-binding-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.2.4.tgz", + "integrity": "sha512-AJxoUD2/15ESHbvpcyjU274nsAPLuOtPHCk0vKJM5pj//Fg/B1FXNWjPnXTT9PymCYYiHo4zPj0ZomXBKhoy7g==", "license": "MIT", + "optional": true, "dependencies": { - "character-entities": "^2.0.0" + "@tybys/wasm-util": "^0.10.3" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=23.5.0" }, "funding": { "type": "github", - "url": "https://github.com/sponsors/wooorm" + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1 || ^2.0.0-alpha.4", + "@emnapi/runtime": "^1.7.1 || ^2.0.0-alpha.4" } }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-to-markdown/node_modules/micromark-util-decode-string/node_modules/decode-named-character-reference/node_modules/character-entities": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "site/node_modules/astro/node_modules/@astrojs/compiler-rs/node_modules/@astrojs/compiler-binding/node_modules/@astrojs/compiler-binding-wasm32-wasi/node_modules/@napi-rs/wasm-runtime/node_modules/@tybys/wasm-util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.4.tgz", + "integrity": "sha512-W3c4gRigFS0T/Ma4qIYF3GDAc5AQdHb1yL5znJT1Zv1YaD9Kitx656wBjvr19qbiosmZT8lWDM5BEMynUqX65A==", "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "optional": true, + "dependencies": { + "tslib": "^2.4.0" } }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-to-markdown/node_modules/micromark-util-decode-string/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" - } + "site/node_modules/astro/node_modules/@astrojs/compiler-rs/node_modules/@astrojs/compiler-binding/node_modules/@astrojs/compiler-binding-wasm32-wasi/node_modules/@napi-rs/wasm-runtime/node_modules/@tybys/wasm-util/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD", + "optional": true + }, + "site/node_modules/astro/node_modules/@astrojs/compiler-rs/node_modules/@astrojs/compiler-binding/node_modules/@astrojs/compiler-binding-win32-arm64-msvc": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-win32-arm64-msvc/-/compiler-binding-win32-arm64-msvc-0.4.1.tgz", + "integrity": "sha512-/xTDgRsFDoTh0/+KFXJ74DY4Jqn8CoSHwa8UP5RAblHfnRHkenwfSl4zYDET61O9vXKLk09UzHjjq09yP20/AQ==", + "cpu": [ + "arm64" ], "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-to-markdown/node_modules/micromark-util-decode-string/node_modules/micromark-util-character/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" - } + "site/node_modules/astro/node_modules/@astrojs/compiler-rs/node_modules/@astrojs/compiler-binding/node_modules/@astrojs/compiler-binding-win32-x64-msvc": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-win32-x64-msvc/-/compiler-binding-win32-x64-msvc-0.4.1.tgz", + "integrity": "sha512-0x5J6iHZO0Fjo/CVzoIbXKzWnGESftDbEUQ/oXQ61HhUAFoR7+T1jfToZSNAS+gYyBXHSTpMWYC7lzarbhClcg==", + "cpu": [ + "x64" ], - "license": "MIT" - }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-to-markdown/node_modules/micromark-util-decode-string/node_modules/micromark-util-decode-numeric-character-reference": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", - "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } + "license": "MIT", + "optional": true, + "os": [ + "win32" ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "site/node_modules/astro/node_modules/@astrojs/internal-helpers": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.11.0.tgz", + "integrity": "sha512-3rzxJ+xbo0+8YyqOzLziIN32wmsHdCjEVz2sGOpRxJ+Ben/KiLph4ItxBy1abEL+E8fkRzqjg0rfXmaHJGw9JA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.4", + "@types/mdast": "^4.0.4", + "js-yaml": "^4.3.0", + "picomatch": "^4.0.4", + "retext-smartypants": "^6.2.0", + "shiki": "^4.0.2", + "smol-toml": "^1.6.0", + "unified": "^11.0.5" + } + }, + "site/node_modules/astro/node_modules/@astrojs/internal-helpers/node_modules/@types/hast": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.5.tgz", + "integrity": "sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==", "license": "MIT", "dependencies": { - "micromark-util-symbol": "^2.0.0" + "@types/unist": "*" } }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-to-markdown/node_modules/micromark-util-decode-string/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" - } - ], + "site/node_modules/astro/node_modules/@astrojs/internal-helpers/node_modules/@types/hast/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" }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-to-markdown/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==", + "site/node_modules/astro/node_modules/@astrojs/internal-helpers/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", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "dependencies": { + "@types/unist": "*" } }, - "site/node_modules/@astrojs/starlight/node_modules/mdast-util-to-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", - "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "site/node_modules/astro/node_modules/@astrojs/internal-helpers/node_modules/@types/mdast/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" + }, + "site/node_modules/astro/node_modules/@astrojs/internal-helpers/node_modules/retext-smartypants": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/retext-smartypants/-/retext-smartypants-6.2.0.tgz", + "integrity": "sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==", "license": "MIT", "dependencies": { - "@types/mdast": "^4.0.0" + "@types/nlcst": "^2.0.0", + "nlcst-to-string": "^4.0.0", + "unist-util-visit": "^5.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "site/node_modules/@astrojs/starlight/node_modules/pagefind": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/pagefind/-/pagefind-1.5.2.tgz", - "integrity": "sha512-XTUaK0hXMCu2jszWE584JGQT7y284TmMV9l/HX3rnG5uo3rHI/uHU56XTyyyPFjeWEBxECbAi0CaFDJOONtG0Q==", + "site/node_modules/astro/node_modules/@astrojs/internal-helpers/node_modules/retext-smartypants/node_modules/@types/nlcst": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/nlcst/-/nlcst-2.0.3.tgz", + "integrity": "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==", "license": "MIT", - "bin": { - "pagefind": "lib/runner/bin.cjs" - }, - "optionalDependencies": { - "@pagefind/darwin-arm64": "1.5.2", - "@pagefind/darwin-x64": "1.5.2", - "@pagefind/freebsd-x64": "1.5.2", - "@pagefind/linux-arm64": "1.5.2", - "@pagefind/linux-x64": "1.5.2", - "@pagefind/windows-arm64": "1.5.2", - "@pagefind/windows-x64": "1.5.2" + "dependencies": { + "@types/unist": "*" } }, - "site/node_modules/@astrojs/starlight/node_modules/pagefind/node_modules/@pagefind/darwin-arm64": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@pagefind/darwin-arm64/-/darwin-arm64-1.5.2.tgz", - "integrity": "sha512-MXpI+7HsAdPkvJ0gk9xj9g541BCqBZOBbdwj9g6lB5LCj6kSV6nqDSjzcAJwvOsfu0fjwvC8hQU+ecfhp+MpiQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "site/node_modules/@astrojs/starlight/node_modules/pagefind/node_modules/@pagefind/darwin-x64": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@pagefind/darwin-x64/-/darwin-x64-1.5.2.tgz", - "integrity": "sha512-IojxFWMEJe0RQ7PQ3KXQsPIImNsbpPYpoZ+QUDrL8fAl/O27IX+LVLs74/UzEZy5uA2LD8Nz1AiwKr72vrkZQw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "site/node_modules/@astrojs/starlight/node_modules/pagefind/node_modules/@pagefind/freebsd-x64": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@pagefind/freebsd-x64/-/freebsd-x64-1.5.2.tgz", - "integrity": "sha512-7EVzo9+0w+2cbe671BtMj10UlNo83I+HrLVLfRxO731svHRJKUfJ/mo05gU14pe9PCfpKNQT8FS3Xc/oDN6pOA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] + "site/node_modules/astro/node_modules/@astrojs/internal-helpers/node_modules/retext-smartypants/node_modules/@types/nlcst/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" }, - "site/node_modules/@astrojs/starlight/node_modules/pagefind/node_modules/@pagefind/linux-arm64": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@pagefind/linux-arm64/-/linux-arm64-1.5.2.tgz", - "integrity": "sha512-Ovt9+K35sqzn8H3ZMXGwls4TD/wMJuvRtShHIsmUQREmaxjrDEX7gHckRCrwYJ4XE1H1p6HkLz3wukrAnsfXQw==", - "cpu": [ - "arm64" - ], + "site/node_modules/astro/node_modules/@astrojs/internal-helpers/node_modules/retext-smartypants/node_modules/nlcst-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-4.0.0.tgz", + "integrity": "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "dependencies": { + "@types/nlcst": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, - "site/node_modules/@astrojs/starlight/node_modules/pagefind/node_modules/@pagefind/linux-x64": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@pagefind/linux-x64/-/linux-x64-1.5.2.tgz", - "integrity": "sha512-V+tFqHKXhQKq/WqPBD67AFy7scn1/aZID00ws4fSDd+1daSi5UHR9VVlRrOUYKxn3VuFQYRD7lYXdZK1WED1YA==", - "cpu": [ - "x64" - ], + "site/node_modules/astro/node_modules/@astrojs/internal-helpers/node_modules/retext-smartypants/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", - "optional": true, - "os": [ - "linux" - ] + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, - "site/node_modules/@astrojs/starlight/node_modules/pagefind/node_modules/@pagefind/windows-arm64": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@pagefind/windows-arm64/-/windows-arm64-1.5.2.tgz", - "integrity": "sha512-hN9Nh90fNW61nNRCW9ZyQrAj/mD0eRvmJ8NlTUzkbuW8kIzGJUi3cxjFkEcMZ5h/8FsKWD/VcouZl4yo1F7B6g==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "site/node_modules/astro/node_modules/@astrojs/internal-helpers/node_modules/retext-smartypants/node_modules/unist-util-visit/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" }, - "site/node_modules/@astrojs/starlight/node_modules/pagefind/node_modules/@pagefind/windows-x64": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@pagefind/windows-x64/-/windows-x64-1.5.2.tgz", - "integrity": "sha512-Fa2Iyw7kaDRzGMfNYNUXNW2zbL5FQVDgSOcbDHdzBrDEdpqOqg8TcZ68F22ol6NJ9IGzvUdmeyZypLW5dyhqsg==", - "cpu": [ - "x64" - ], + "site/node_modules/astro/node_modules/@astrojs/internal-helpers/node_modules/retext-smartypants/node_modules/unist-util-visit/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", - "optional": true, - "os": [ - "win32" - ] + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, - "site/node_modules/@astrojs/starlight/node_modules/remark-directive": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-4.0.0.tgz", - "integrity": "sha512-7sxn4RfF1o3izevPV1DheyGDD6X4c9hrGpfdUpm7uC++dqrnJxIZVkk7CoKqcLm0VUMAuOol7Mno3m6g8cfMuA==", + "site/node_modules/astro/node_modules/@astrojs/internal-helpers/node_modules/retext-smartypants/node_modules/unist-util-visit/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", "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-directive": "^3.0.0", - "micromark-extension-directive": "^4.0.0", - "unified": "^11.0.0" + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "site/node_modules/@astrojs/starlight/node_modules/remark-directive/node_modules/micromark-extension-directive": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-4.0.0.tgz", - "integrity": "sha512-/C2nqVmXXmiseSSuCdItCMho7ybwwop6RrrRPk0KbOHW21JKoCldC+8rFOaundDoRBUWBnJJcxeA/Kvi34WQXg==", + "site/node_modules/astro/node_modules/@astrojs/internal-helpers/node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", "license": "MIT", "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-factory-whitespace": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "parse-entities": "^4.0.0" + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "site/node_modules/@astrojs/starlight/node_modules/remark-directive/node_modules/micromark-extension-directive/node_modules/devlop": { + "site/node_modules/astro/node_modules/@astrojs/internal-helpers/node_modules/unified/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" + }, + "site/node_modules/astro/node_modules/@astrojs/internal-helpers/node_modules/unified/node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "site/node_modules/astro/node_modules/@astrojs/internal-helpers/node_modules/unified/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==", @@ -14643,7 +19197,7 @@ "url": "https://github.com/sponsors/wooorm" } }, - "site/node_modules/@astrojs/starlight/node_modules/remark-directive/node_modules/micromark-extension-directive/node_modules/devlop/node_modules/dequal": { + "site/node_modules/astro/node_modules/@astrojs/internal-helpers/node_modules/unified/node_modules/devlop/node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", @@ -14652,213 +19206,109 @@ "node": ">=6" } }, - "site/node_modules/@astrojs/starlight/node_modules/remark-directive/node_modules/micromark-extension-directive/node_modules/micromark-factory-space": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", - "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-types": "^2.0.0" - } - }, - "site/node_modules/@astrojs/starlight/node_modules/remark-directive/node_modules/micromark-extension-directive/node_modules/micromark-factory-whitespace": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", - "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "site/node_modules/@astrojs/starlight/node_modules/remark-directive/node_modules/micromark-extension-directive/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" - } - }, - "site/node_modules/@astrojs/starlight/node_modules/remark-directive/node_modules/micromark-extension-directive/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" - }, - "site/node_modules/@astrojs/starlight/node_modules/remark-directive/node_modules/micromark-extension-directive/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" - } - ], + "site/node_modules/astro/node_modules/@astrojs/internal-helpers/node_modules/unified/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" }, - "site/node_modules/@astrojs/starlight/node_modules/remark-directive/node_modules/micromark-extension-directive/node_modules/parse-entities": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", - "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "site/node_modules/astro/node_modules/@astrojs/internal-helpers/node_modules/unified/node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "character-entities-legacy": "^3.0.0", - "character-reference-invalid": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "is-alphanumerical": "^2.0.0", - "is-decimal": "^2.0.0", - "is-hexadecimal": "^2.0.0" + "engines": { + "node": ">=12" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "site/node_modules/@astrojs/starlight/node_modules/remark-directive/node_modules/micromark-extension-directive/node_modules/parse-entities/node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", - "license": "MIT" - }, - "site/node_modules/@astrojs/starlight/node_modules/remark-directive/node_modules/micromark-extension-directive/node_modules/parse-entities/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" + "url": "https://github.com/sponsors/sindresorhus" } }, - "site/node_modules/@astrojs/starlight/node_modules/remark-directive/node_modules/micromark-extension-directive/node_modules/parse-entities/node_modules/character-reference-invalid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", - "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "site/node_modules/astro/node_modules/@astrojs/internal-helpers/node_modules/unified/node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, - "site/node_modules/@astrojs/starlight/node_modules/remark-directive/node_modules/micromark-extension-directive/node_modules/parse-entities/node_modules/decode-named-character-reference": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", - "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", + "site/node_modules/astro/node_modules/@astrojs/internal-helpers/node_modules/unified/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": { - "character-entities": "^2.0.0" + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "site/node_modules/@astrojs/starlight/node_modules/remark-directive/node_modules/micromark-extension-directive/node_modules/parse-entities/node_modules/decode-named-character-reference/node_modules/character-entities": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "site/node_modules/astro/node_modules/@astrojs/internal-helpers/node_modules/unified/node_modules/vfile/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": "github", - "url": "https://github.com/sponsors/wooorm" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "site/node_modules/@astrojs/starlight/node_modules/remark-directive/node_modules/micromark-extension-directive/node_modules/parse-entities/node_modules/is-alphanumerical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", - "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "site/node_modules/astro/node_modules/@astrojs/internal-helpers/node_modules/unified/node_modules/vfile/node_modules/vfile-message/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": { - "is-alphabetical": "^2.0.0", - "is-decimal": "^2.0.0" + "@types/unist": "^3.0.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "site/node_modules/@astrojs/starlight/node_modules/remark-directive/node_modules/micromark-extension-directive/node_modules/parse-entities/node_modules/is-alphanumerical/node_modules/is-alphabetical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", - "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "site/node_modules/astro/node_modules/@astrojs/markdown-satteri": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@astrojs/markdown-satteri/-/markdown-satteri-0.4.1.tgz", + "integrity": "sha512-EniHbFNa6SQHDih7JnpPos3NWXO6hdt4raBcOosfGmlfc3gP9CI/sESA3VOf1PgJZ7SFfewlZW9Livn0JugEZg==", "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "dependencies": { + "@astrojs/internal-helpers": "0.11.0", + "@astrojs/prism": "4.0.2", + "github-slugger": "^2.0.0", + "satteri": "^0.10.3" } }, - "site/node_modules/@astrojs/starlight/node_modules/remark-directive/node_modules/micromark-extension-directive/node_modules/parse-entities/node_modules/is-decimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", - "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "site/node_modules/astro/node_modules/@astrojs/markdown-satteri/node_modules/@astrojs/prism": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-4.0.2.tgz", + "integrity": "sha512-KTivpmnz6lDsC6o9H4+DNm2SrE/GHzw8cNAvEJwAvUT+eoaEnn/4NtbDNfRRaxaJHdp15gf+tfHAWiXR4wB3BA==", "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "dependencies": { + "prismjs": "^1.30.0" + }, + "engines": { + "node": ">=22.12.0" } }, - "site/node_modules/@astrojs/starlight/node_modules/remark-directive/node_modules/micromark-extension-directive/node_modules/parse-entities/node_modules/is-hexadecimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", - "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "site/node_modules/astro/node_modules/@astrojs/markdown-satteri/node_modules/@astrojs/prism/node_modules/prismjs": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "engines": { + "node": ">=6" } }, - "site/node_modules/@astrojs/starlight/node_modules/satteri": { + "site/node_modules/astro/node_modules/@astrojs/markdown-satteri/node_modules/satteri": { "version": "0.10.5", "resolved": "https://registry.npmjs.org/satteri/-/satteri-0.10.5.tgz", "integrity": "sha512-Ao1LKpAEa9Wdg0otgbVKViZHEq9ebdXe4DMrp3s9vQAU0HNIuHnFEuMuOcm0ZIXyV0Yzxj91NvhLpvXZJO/5ZQ==", @@ -14881,7 +19331,7 @@ "@bruits/satteri-win32-x64-msvc": "0.10.5" } }, - "site/node_modules/@astrojs/starlight/node_modules/satteri/node_modules/@bruits/satteri-darwin-arm64": { + "site/node_modules/astro/node_modules/@astrojs/markdown-satteri/node_modules/satteri/node_modules/@bruits/satteri-darwin-arm64": { "version": "0.10.5", "resolved": "https://registry.npmjs.org/@bruits/satteri-darwin-arm64/-/satteri-darwin-arm64-0.10.5.tgz", "integrity": "sha512-27KTVl4TJkVahMy/ohyA7qd4938G5UNneFUz/PsScYfpIhj0IVAS23mpcJXdPF44sa6nva198lmV/cKIb2YPyA==", @@ -14894,7 +19344,7 @@ "darwin" ] }, - "site/node_modules/@astrojs/starlight/node_modules/satteri/node_modules/@bruits/satteri-darwin-x64": { + "site/node_modules/astro/node_modules/@astrojs/markdown-satteri/node_modules/satteri/node_modules/@bruits/satteri-darwin-x64": { "version": "0.10.5", "resolved": "https://registry.npmjs.org/@bruits/satteri-darwin-x64/-/satteri-darwin-x64-0.10.5.tgz", "integrity": "sha512-IjnLe3nKspq6qaeqGgjT7MT8VrTV74yWRlaag7ZdNsI8TDAYZ0iPxMCo+9KQZHUk5EyVB+reBI/PFWL5KuFw9Q==", @@ -14907,7 +19357,7 @@ "darwin" ] }, - "site/node_modules/@astrojs/starlight/node_modules/satteri/node_modules/@bruits/satteri-linux-arm64-gnu": { + "site/node_modules/astro/node_modules/@astrojs/markdown-satteri/node_modules/satteri/node_modules/@bruits/satteri-linux-arm64-gnu": { "version": "0.10.5", "resolved": "https://registry.npmjs.org/@bruits/satteri-linux-arm64-gnu/-/satteri-linux-arm64-gnu-0.10.5.tgz", "integrity": "sha512-glkYXZCJywjP13v67eAyAMSJdF+ncvEbYvgi/wOtffL9tQ27lr/zsyzUfgs+ovjJ9d8JNQKiXeiArJcX8PJL9w==", @@ -14920,7 +19370,7 @@ "linux" ] }, - "site/node_modules/@astrojs/starlight/node_modules/satteri/node_modules/@bruits/satteri-linux-arm64-musl": { + "site/node_modules/astro/node_modules/@astrojs/markdown-satteri/node_modules/satteri/node_modules/@bruits/satteri-linux-arm64-musl": { "version": "0.10.5", "resolved": "https://registry.npmjs.org/@bruits/satteri-linux-arm64-musl/-/satteri-linux-arm64-musl-0.10.5.tgz", "integrity": "sha512-yWdgG1g17Nh2QyGVlFUxGRa3FEFwiMcpZEyMNWkbM3deC94cmVc+/i9OuyFpdKuWo3GkgoCtYVOoxk1uCnCZIA==", @@ -14933,7 +19383,7 @@ "linux" ] }, - "site/node_modules/@astrojs/starlight/node_modules/satteri/node_modules/@bruits/satteri-linux-x64-gnu": { + "site/node_modules/astro/node_modules/@astrojs/markdown-satteri/node_modules/satteri/node_modules/@bruits/satteri-linux-x64-gnu": { "version": "0.10.5", "resolved": "https://registry.npmjs.org/@bruits/satteri-linux-x64-gnu/-/satteri-linux-x64-gnu-0.10.5.tgz", "integrity": "sha512-FVaLoPT1fBgGl0J+AYebyyXJYBachGl8Oyyrf1lye4RTqCB4S0Gwkj1uM9RJyThUOvx5VUmAT1CnNh1SFHA+kw==", @@ -14946,7 +19396,7 @@ "linux" ] }, - "site/node_modules/@astrojs/starlight/node_modules/satteri/node_modules/@bruits/satteri-linux-x64-musl": { + "site/node_modules/astro/node_modules/@astrojs/markdown-satteri/node_modules/satteri/node_modules/@bruits/satteri-linux-x64-musl": { "version": "0.10.5", "resolved": "https://registry.npmjs.org/@bruits/satteri-linux-x64-musl/-/satteri-linux-x64-musl-0.10.5.tgz", "integrity": "sha512-EHpVAx2bqW3GINHTKkljtxVfQmVDGWIuwOYOP5YghTj+0PkBa2o8oKPRtQ9Kbsr1Fye8jtUcDjhwj2jMNugZKg==", @@ -14959,7 +19409,7 @@ "linux" ] }, - "site/node_modules/@astrojs/starlight/node_modules/satteri/node_modules/@bruits/satteri-wasm32-wasi": { + "site/node_modules/astro/node_modules/@astrojs/markdown-satteri/node_modules/satteri/node_modules/@bruits/satteri-wasm32-wasi": { "version": "0.10.5", "resolved": "https://registry.npmjs.org/@bruits/satteri-wasm32-wasi/-/satteri-wasm32-wasi-0.10.5.tgz", "integrity": "sha512-ypz8c/Zmipxp4IoeDa228Gstv6TLzVmNs3yC6wKCoNSOjx1iwpgzu87Y3hTkXFdwChVGU85qeUDuOIarGUZQLw==", @@ -14977,7 +19427,7 @@ "node": ">=14.0.0" } }, - "site/node_modules/@astrojs/starlight/node_modules/satteri/node_modules/@bruits/satteri-wasm32-wasi/node_modules/@emnapi/core": { + "site/node_modules/astro/node_modules/@astrojs/markdown-satteri/node_modules/satteri/node_modules/@bruits/satteri-wasm32-wasi/node_modules/@emnapi/core": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz", "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==", @@ -14988,7 +19438,7 @@ "tslib": "^2.4.0" } }, - "site/node_modules/@astrojs/starlight/node_modules/satteri/node_modules/@bruits/satteri-wasm32-wasi/node_modules/@emnapi/core/node_modules/@emnapi/wasi-threads": { + "site/node_modules/astro/node_modules/@astrojs/markdown-satteri/node_modules/satteri/node_modules/@bruits/satteri-wasm32-wasi/node_modules/@emnapi/core/node_modules/@emnapi/wasi-threads": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==", @@ -14998,14 +19448,14 @@ "tslib": "^2.4.0" } }, - "site/node_modules/@astrojs/starlight/node_modules/satteri/node_modules/@bruits/satteri-wasm32-wasi/node_modules/@emnapi/core/node_modules/tslib": { + "site/node_modules/astro/node_modules/@astrojs/markdown-satteri/node_modules/satteri/node_modules/@bruits/satteri-wasm32-wasi/node_modules/@emnapi/core/node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD", "optional": true }, - "site/node_modules/@astrojs/starlight/node_modules/satteri/node_modules/@bruits/satteri-wasm32-wasi/node_modules/@emnapi/runtime": { + "site/node_modules/astro/node_modules/@astrojs/markdown-satteri/node_modules/satteri/node_modules/@bruits/satteri-wasm32-wasi/node_modules/@emnapi/runtime": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", @@ -15015,14 +19465,14 @@ "tslib": "^2.4.0" } }, - "site/node_modules/@astrojs/starlight/node_modules/satteri/node_modules/@bruits/satteri-wasm32-wasi/node_modules/@emnapi/runtime/node_modules/tslib": { + "site/node_modules/astro/node_modules/@astrojs/markdown-satteri/node_modules/satteri/node_modules/@bruits/satteri-wasm32-wasi/node_modules/@emnapi/runtime/node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD", "optional": true }, - "site/node_modules/@astrojs/starlight/node_modules/satteri/node_modules/@bruits/satteri-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { + "site/node_modules/astro/node_modules/@astrojs/markdown-satteri/node_modules/satteri/node_modules/@bruits/satteri-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.2.4.tgz", "integrity": "sha512-AJxoUD2/15ESHbvpcyjU274nsAPLuOtPHCk0vKJM5pj//Fg/B1FXNWjPnXTT9PymCYYiHo4zPj0ZomXBKhoy7g==", @@ -15043,7 +19493,7 @@ "@emnapi/runtime": "^1.7.1 || ^2.0.0-alpha.4" } }, - "site/node_modules/@astrojs/starlight/node_modules/satteri/node_modules/@bruits/satteri-wasm32-wasi/node_modules/@napi-rs/wasm-runtime/node_modules/@tybys/wasm-util": { + "site/node_modules/astro/node_modules/@astrojs/markdown-satteri/node_modules/satteri/node_modules/@bruits/satteri-wasm32-wasi/node_modules/@napi-rs/wasm-runtime/node_modules/@tybys/wasm-util": { "version": "0.10.4", "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.4.tgz", "integrity": "sha512-W3c4gRigFS0T/Ma4qIYF3GDAc5AQdHb1yL5znJT1Zv1YaD9Kitx656wBjvr19qbiosmZT8lWDM5BEMynUqX65A==", @@ -15053,14 +19503,14 @@ "tslib": "^2.4.0" } }, - "site/node_modules/@astrojs/starlight/node_modules/satteri/node_modules/@bruits/satteri-wasm32-wasi/node_modules/@napi-rs/wasm-runtime/node_modules/@tybys/wasm-util/node_modules/tslib": { + "site/node_modules/astro/node_modules/@astrojs/markdown-satteri/node_modules/satteri/node_modules/@bruits/satteri-wasm32-wasi/node_modules/@napi-rs/wasm-runtime/node_modules/@tybys/wasm-util/node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD", "optional": true }, - "site/node_modules/@astrojs/starlight/node_modules/satteri/node_modules/@bruits/satteri-win32-arm64-msvc": { + "site/node_modules/astro/node_modules/@astrojs/markdown-satteri/node_modules/satteri/node_modules/@bruits/satteri-win32-arm64-msvc": { "version": "0.10.5", "resolved": "https://registry.npmjs.org/@bruits/satteri-win32-arm64-msvc/-/satteri-win32-arm64-msvc-0.10.5.tgz", "integrity": "sha512-siTV88nb0LRqNpkL2gXboqCwVdq95sLtzMHS1/3eONV2gLbB3NAK46wmSMvCO/yquBvI2lvaFIfd8P12ecsxBw==", @@ -15073,7 +19523,7 @@ "win32" ] }, - "site/node_modules/@astrojs/starlight/node_modules/satteri/node_modules/@bruits/satteri-win32-x64-msvc": { + "site/node_modules/astro/node_modules/@astrojs/markdown-satteri/node_modules/satteri/node_modules/@bruits/satteri-win32-x64-msvc": { "version": "0.10.5", "resolved": "https://registry.npmjs.org/@bruits/satteri-win32-x64-msvc/-/satteri-win32-x64-msvc-0.10.5.tgz", "integrity": "sha512-C3IfPvfvMXmlzBxaMPKFS1XiuV9pu2mC7YqkPk7PSvTgPZ8gbdASIpHpztDLvTTQjqZ0z1Ol8tK5X+V6XXC0wQ==", @@ -15086,7 +19536,7 @@ "win32" ] }, - "site/node_modules/@astrojs/starlight/node_modules/satteri/node_modules/@types/estree-jsx": { + "site/node_modules/astro/node_modules/@astrojs/markdown-satteri/node_modules/satteri/node_modules/@types/estree-jsx": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", @@ -15095,594 +19545,706 @@ "@types/estree": "*" } }, - "site/node_modules/@astrojs/starlight/node_modules/satteri/node_modules/@types/estree-jsx/node_modules/@types/estree": { + "site/node_modules/astro/node_modules/@astrojs/markdown-satteri/node_modules/satteri/node_modules/@types/estree-jsx/node_modules/@types/estree": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", "license": "MIT" }, - "site/node_modules/@astrojs/starlight/node_modules/satteri/node_modules/@types/unist": { + "site/node_modules/astro/node_modules/@astrojs/markdown-satteri/node_modules/satteri/node_modules/@types/hast": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.5.tgz", + "integrity": "sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "site/node_modules/astro/node_modules/@astrojs/markdown-satteri/node_modules/satteri/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": "*" + } + }, + "site/node_modules/astro/node_modules/@astrojs/markdown-satteri/node_modules/satteri/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" }, - "site/node_modules/@astrojs/starlight/node_modules/ultrahtml": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/ultrahtml/-/ultrahtml-1.7.0.tgz", - "integrity": "sha512-2xRd0VHoAQE4M+vF/DvFFB7pUV0ZxTW1TLi7lHQWnF/Sb5TPeEUV/l+hxcNnGO00ZXGnR0voCMmYRKQf+rvJ2g==", + "site/node_modules/astro/node_modules/@astrojs/telemetry": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.3.3.tgz", + "integrity": "sha512-C1TLn5sPJr0x4vk56piHWKbnqlEB8BKyte5Y45V02U+D7BGO5eMqZDH5aPjnkXQWJggvmsTXxH03QMZ9NgWLzQ==", + "license": "MIT", + "dependencies": { + "ci-info": "^4.4.0", + "dset": "^3.1.4", + "is-docker": "^4.0.0", + "package-manager-detector": "^1.6.0" + }, + "engines": { + "node": "18.20.8 || ^20.3.0 || >=22.0.0" + } + }, + "site/node_modules/astro/node_modules/@astrojs/telemetry/node_modules/is-docker": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-4.0.0.tgz", + "integrity": "sha512-LHE+wROyG/Y/0ZnbktRCoTix2c1RhgWaZraMZ8o1Q7zCh0VSrICJQO5oqIIISrcSBtrXv0o233w1IYwsWCjTzA==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "site/node_modules/astro/node_modules/@capsizecss/unpack": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@capsizecss/unpack/-/unpack-4.0.1.tgz", + "integrity": "sha512-CuNiSqg7+e1cO/GjffyMOm5Tt2jUF9CWHHnvQ/UkqvtkGfHdgwEC0wpmq7fkN3gxwpRnrAN0WzO3vREKmNolMQ==", + "license": "MIT", + "dependencies": { + "fontkitten": "^1.0.3" + }, + "engines": { + "node": ">=18" + } + }, + "site/node_modules/astro/node_modules/@capsizecss/unpack/node_modules/fontkitten": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fontkitten/-/fontkitten-1.0.3.tgz", + "integrity": "sha512-Wp1zXWPVUPBmfoa3Cqc9ctaKuzKAV6uLstRqlR56kSjplf5uAce+qeyYym7F+PHbGTk+tCEdkCW6RD7DX/gBZw==", + "license": "MIT", + "dependencies": { + "tiny-inflate": "^1.0.3" + }, + "engines": { + "node": ">=20" + } + }, + "site/node_modules/astro/node_modules/@capsizecss/unpack/node_modules/fontkitten/node_modules/tiny-inflate": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", + "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", "license": "MIT" }, - "site/node_modules/@astrojs/starlight/node_modules/unified": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", - "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "site/node_modules/astro/node_modules/@clack/prompts": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-1.8.1.tgz", + "integrity": "sha512-dlT1m5e/0yUL0kRNcQn7yGLVThkgbB0Ga/1AmfDDC/8ik6AIiSf2QLQO2zPYvefsHP0aFgxO93cVLCCfDp7kzQ==", "license": "MIT", "dependencies": { - "@types/unist": "^3.0.0", - "bail": "^2.0.0", - "devlop": "^1.0.0", - "extend": "^3.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^6.0.0" + "@clack/core": "1.5.1", + "fast-string-width": "^3.0.2", + "fast-wrap-ansi": "^0.2.0", + "sisteransi": "^1.0.5" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">= 20.12.0" } }, - "site/node_modules/@astrojs/starlight/node_modules/unified/node_modules/@types/unist": { + "site/node_modules/astro/node_modules/@clack/prompts/node_modules/@clack/core": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@clack/core/-/core-1.5.1.tgz", + "integrity": "sha512-iHTrHA8MtVuLl2TfZySmcKv1qO2PoyC9Z7pfSDozEuV5vtY3/wcOPKJXlqJ5Oq2Cx5DDGQGAMVx6HZfRRoVEbQ==", + "license": "MIT", + "dependencies": { + "fast-wrap-ansi": "^0.2.0", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 20.12.0" + } + }, + "site/node_modules/astro/node_modules/@clack/prompts/node_modules/fast-string-width": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/fast-string-width/-/fast-string-width-3.0.2.tgz", + "integrity": "sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==", + "license": "MIT", + "dependencies": { + "fast-string-truncated-width": "^3.0.2" + } + }, + "site/node_modules/astro/node_modules/@clack/prompts/node_modules/fast-string-width/node_modules/fast-string-truncated-width": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "resolved": "https://registry.npmjs.org/fast-string-truncated-width/-/fast-string-truncated-width-3.0.3.tgz", + "integrity": "sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==", "license": "MIT" }, - "site/node_modules/@astrojs/starlight/node_modules/unified/node_modules/bail": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", - "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "site/node_modules/astro/node_modules/@clack/prompts/node_modules/fast-wrap-ansi": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/fast-wrap-ansi/-/fast-wrap-ansi-0.2.2.tgz", + "integrity": "sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==", "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "dependencies": { + "fast-string-width": "^3.0.2" } }, - "site/node_modules/@astrojs/starlight/node_modules/unified/node_modules/devlop": { + "site/node_modules/astro/node_modules/@clack/prompts/node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "license": "MIT" + }, + "site/node_modules/astro/node_modules/@oslojs/encoding": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", - "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "resolved": "https://registry.npmjs.org/@oslojs/encoding/-/encoding-1.1.0.tgz", + "integrity": "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==", + "license": "MIT" + }, + "site/node_modules/astro/node_modules/am-i-vibing": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/am-i-vibing/-/am-i-vibing-0.4.0.tgz", + "integrity": "sha512-MxT4XZL7pzLHpuvhDKdMaQHMGGkJDLluKBLsbstn+8wv9sWcFT6h+0ve9qkml95amVTZtZV83gQe2hY+ojgHLg==", + "license": "MIT", + "dependencies": { + "process-ancestry": "^0.1.0" + }, + "bin": { + "am-i-vibing": "dist/cli.mjs" + } + }, + "site/node_modules/astro/node_modules/am-i-vibing/node_modules/process-ancestry": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/process-ancestry/-/process-ancestry-0.1.0.tgz", + "integrity": "sha512-tGqJW/UnclpYASFcM6Xh8D8l/BMtaQ9+CSG0vlJSJTcdMM4lDRv4c6H0Pdcsfted+bVczdYSfk2fdukg2gQkZg==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, + "site/node_modules/astro/node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "site/node_modules/astro/node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "site/node_modules/astro/node_modules/ci-info": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "site/node_modules/astro/node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "site/node_modules/astro/node_modules/common-ancestor-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-2.0.0.tgz", + "integrity": "sha512-dnN3ibLeoRf2HNC+OlCiNc5d2zxbLJXOtiZUudNFSXZrNSydxcCsSpRzXwfu7BBWCIfHPw+xTayeBvJCP/D8Ng==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">= 18" + } + }, + "site/node_modules/astro/node_modules/cookie": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-2.0.1.tgz", + "integrity": "sha512-yuToqVvRrj6pfDXREyQAAv8SkAEk/8GS3jQRTiUMm66TVtBYmqQeoEjL2Lmq8Rpo6271vH76InTChTitEAm65w==", "license": "MIT", - "dependencies": { - "dequal": "^2.0.0" + "engines": { + "node": ">=22" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "site/node_modules/@astrojs/starlight/node_modules/unified/node_modules/devlop/node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "site/node_modules/astro/node_modules/devalue": { + "version": "5.9.4", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.9.4.tgz", + "integrity": "sha512-sPAT4pztbu6586/hrhOnMKS17IJrvg12mXiSPSS3W5qDeN2RGgvZ0diZCm31dBbnevfVmujNO3IM2wrS4Y2Rhg==", + "license": "MIT" + }, + "site/node_modules/astro/node_modules/diff": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-9.0.0.tgz", + "integrity": "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "site/node_modules/astro/node_modules/dset": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.4.tgz", + "integrity": "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==", "license": "MIT", "engines": { - "node": ">=6" + "node": ">=4" } }, - "site/node_modules/@astrojs/starlight/node_modules/unified/node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "site/node_modules/astro/node_modules/es-module-lexer": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.2.tgz", + "integrity": "sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==", "license": "MIT" }, - "site/node_modules/@astrojs/starlight/node_modules/unified/node_modules/is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "site/node_modules/astro/node_modules/esbuild": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.2.tgz", + "integrity": "sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==", + "hasInstallScript": true, "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, "engines": { - "node": ">=12" + "node": ">=18" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.28.2", + "@esbuild/android-arm": "0.28.2", + "@esbuild/android-arm64": "0.28.2", + "@esbuild/android-x64": "0.28.2", + "@esbuild/darwin-arm64": "0.28.2", + "@esbuild/darwin-x64": "0.28.2", + "@esbuild/freebsd-arm64": "0.28.2", + "@esbuild/freebsd-x64": "0.28.2", + "@esbuild/linux-arm": "0.28.2", + "@esbuild/linux-arm64": "0.28.2", + "@esbuild/linux-ia32": "0.28.2", + "@esbuild/linux-loong64": "0.28.2", + "@esbuild/linux-mips64el": "0.28.2", + "@esbuild/linux-ppc64": "0.28.2", + "@esbuild/linux-riscv64": "0.28.2", + "@esbuild/linux-s390x": "0.28.2", + "@esbuild/linux-x64": "0.28.2", + "@esbuild/netbsd-arm64": "0.28.2", + "@esbuild/netbsd-x64": "0.28.2", + "@esbuild/openbsd-arm64": "0.28.2", + "@esbuild/openbsd-x64": "0.28.2", + "@esbuild/openharmony-arm64": "0.28.2", + "@esbuild/sunos-x64": "0.28.2", + "@esbuild/win32-arm64": "0.28.2", + "@esbuild/win32-ia32": "0.28.2", + "@esbuild/win32-x64": "0.28.2" } }, - "site/node_modules/@astrojs/starlight/node_modules/unified/node_modules/trough": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", - "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "site/node_modules/astro/node_modules/esbuild/node_modules/@esbuild/aix-ppc64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz", + "integrity": "sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==", + "cpu": [ + "ppc64" + ], "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" } }, - "site/node_modules/@astrojs/starlight/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==", + "site/node_modules/astro/node_modules/esbuild/node_modules/@esbuild/android-arm": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.2.tgz", + "integrity": "sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==", + "cpu": [ + "arm" + ], "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" } }, - "site/node_modules/@astrojs/starlight/node_modules/unist-util-visit/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" - }, - "site/node_modules/@astrojs/starlight/node_modules/unist-util-visit/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==", + "site/node_modules/astro/node_modules/esbuild/node_modules/@esbuild/android-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.2.tgz", + "integrity": "sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" } }, - "site/node_modules/@astrojs/starlight/node_modules/unist-util-visit/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==", + "site/node_modules/astro/node_modules/esbuild/node_modules/@esbuild/android-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.2.tgz", + "integrity": "sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" } }, - "site/node_modules/@astrojs/starlight/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==", + "site/node_modules/astro/node_modules/esbuild/node_modules/@esbuild/darwin-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.2.tgz", + "integrity": "sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" } }, - "site/node_modules/@astrojs/starlight/node_modules/vfile/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" + "site/node_modules/astro/node_modules/esbuild/node_modules/@esbuild/darwin-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.2.tgz", + "integrity": "sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } }, - "site/node_modules/@astrojs/starlight/node_modules/vfile/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==", + "site/node_modules/astro/node_modules/esbuild/node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.2.tgz", + "integrity": "sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "site/node_modules/astro/node_modules/esbuild/node_modules/@esbuild/freebsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.2.tgz", + "integrity": "sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" } }, - "site/node_modules/@astrojs/starlight/node_modules/vfile/node_modules/vfile-message/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==", + "site/node_modules/astro/node_modules/esbuild/node_modules/@esbuild/linux-arm": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.2.tgz", + "integrity": "sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==", + "cpu": [ + "arm" + ], "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "site/node_modules/@fontsource-variable/noto-sans-kr": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@fontsource-variable/noto-sans-kr/-/noto-sans-kr-5.3.0.tgz", - "integrity": "sha512-h863ZOIVMKjX0PSr0hLMUp/SjrwOul2yp0f5P61avqXdhqDABSkakzG2Ee07d3W8gVYgS9dMmxULdCkoN09f1A==", - "license": "OFL-1.1", - "funding": { - "url": "https://github.com/sponsors/ayuhito" + "site/node_modules/astro/node_modules/esbuild/node_modules/@esbuild/linux-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.2.tgz", + "integrity": "sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "site/node_modules/@vercel/analytics": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@vercel/analytics/-/analytics-2.0.1.tgz", - "integrity": "sha512-MTQG6V9qQrt1tsDeF+2Uoo5aPjqbVPys1xvnIftXSJYG2SrwXRHnqEvVoYID7BTruDz4lCd2Z7rM1BdkUehk2g==", + "site/node_modules/astro/node_modules/esbuild/node_modules/@esbuild/linux-ia32": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.2.tgz", + "integrity": "sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==", + "cpu": [ + "ia32" + ], "license": "MIT", - "peerDependencies": { - "@remix-run/react": "^2", - "@sveltejs/kit": "^1 || ^2", - "next": ">= 13", - "nuxt": ">= 3", - "react": "^18 || ^19 || ^19.0.0-rc", - "svelte": ">= 4", - "vue": "^3", - "vue-router": "^4" - }, - "peerDependenciesMeta": { - "@remix-run/react": { - "optional": true - }, - "@sveltejs/kit": { - "optional": true - }, - "next": { - "optional": true - }, - "nuxt": { - "optional": true - }, - "react": { - "optional": true - }, - "svelte": { - "optional": true - }, - "vue": { - "optional": true - }, - "vue-router": { - "optional": true - } + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "site/node_modules/astro": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/astro/-/astro-7.3.3.tgz", - "integrity": "sha512-NF08hk3edFkVmr9avf9HW/rQyf6NrpbVDyYj2cVN3JfijDhfJYh1ivWVTY5PUd5+rRZn/Vtu4iaeyNlP0Iv6mg==", + "site/node_modules/astro/node_modules/esbuild/node_modules/@esbuild/linux-loong64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.2.tgz", + "integrity": "sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==", + "cpu": [ + "loong64" + ], "license": "MIT", - "dependencies": { - "@astrojs/compiler-rs": "^0.4.0", - "@astrojs/internal-helpers": "0.11.0", - "@astrojs/markdown-satteri": "0.4.1", - "@astrojs/telemetry": "3.3.3", - "@capsizecss/unpack": "^4.0.0", - "@clack/prompts": "^1.1.0", - "@oslojs/encoding": "^1.1.0", - "am-i-vibing": "^0.4.0", - "aria-query": "^5.3.2", - "axobject-query": "^4.1.0", - "ci-info": "^4.4.0", - "clsx": "^2.1.1", - "common-ancestor-path": "^2.0.0", - "cookie": "^2.0.1", - "devalue": "^5.8.1", - "diff": "^9.0.0", - "dset": "^3.1.4", - "es-module-lexer": "^2.0.0", - "esbuild": "^0.28.0", - "find-proc": "0.2.0", - "flattie": "^1.1.1", - "fontace": "~0.4.1", - "get-tsconfig": "5.0.0-beta.4", - "github-slugger": "^2.0.0", - "html-escaper": "3.0.3", - "http-cache-semantics": "^4.2.0", - "js-yaml": "^4.3.0", - "jsonc-parser": "^3.3.1", - "magic-string": "^1.0.0", - "magicast": "^0.5.2", - "mrmime": "^2.0.1", - "neotraverse": "^1.0.1", - "obug": "^2.1.1", - "p-limit": "^7.3.0", - "p-queue": "^9.1.0", - "package-manager-detector": "^1.6.0", - "piccolore": "^0.1.3", - "picomatch": "^4.0.4", - "shiki": "^4.0.2", - "smol-toml": "^1.6.0", - "svgo": "^4.0.2", - "tinyclip": "^0.1.12", - "tinyexec": "^1.0.4", - "tinyglobby": "^0.2.15", - "ultrahtml": "^1.6.0", - "unifont": "~0.7.5", - "unstorage": "^1.17.5", - "verkit": "^0.4.0", - "vite": "^8.0.13", - "vitefu": "^1.1.2", - "xxhash-wasm": "^1.1.0", - "yargs-parser": "^22.0.0", - "zod": "^4.5.4" - }, - "bin": { - "astro": "bin/astro.mjs" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=22.12.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/astrodotbuild" - }, - "optionalDependencies": { - "sharp": "^0.35.4" - }, - "peerDependencies": { - "@astrojs/markdown-remark": "^7.3.0" - }, - "peerDependenciesMeta": { - "@astrojs/markdown-remark": { - "optional": true - } + "node": ">=18" } }, - "site/node_modules/astro/node_modules/@astrojs/compiler-rs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@astrojs/compiler-rs/-/compiler-rs-0.4.1.tgz", - "integrity": "sha512-//NmAuRhy7eU9iP0ceI5Pymy55M+nUZ//kS6XeOyhBWdDib2KbJOyFaVJ52k7sDkJwTKVox7oPu3SpYiVnGm5A==", + "site/node_modules/astro/node_modules/esbuild/node_modules/@esbuild/linux-mips64el": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.2.tgz", + "integrity": "sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==", + "cpu": [ + "mips64el" + ], "license": "MIT", - "dependencies": { - "@astrojs/compiler-binding": "0.4.1" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=22.12.0" + "node": ">=18" } }, - "site/node_modules/astro/node_modules/@astrojs/compiler-rs/node_modules/@astrojs/compiler-binding": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding/-/compiler-binding-0.4.1.tgz", - "integrity": "sha512-ZYVDW1P58OXyxqZbOMp+/2U9KA7y2esIx9r4pWdpZ/l6fCZhaw4ul+D7EgpRVxYLkyTWqzANbTTUFGPFP8zDHA==", + "site/node_modules/astro/node_modules/esbuild/node_modules/@esbuild/linux-ppc64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.2.tgz", + "integrity": "sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==", + "cpu": [ + "ppc64" + ], "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "optionalDependencies": { - "@astrojs/compiler-binding-android-arm64": "0.4.1", - "@astrojs/compiler-binding-darwin-arm64": "0.4.1", - "@astrojs/compiler-binding-darwin-x64": "0.4.1", - "@astrojs/compiler-binding-linux-arm64-gnu": "0.4.1", - "@astrojs/compiler-binding-linux-arm64-musl": "0.4.1", - "@astrojs/compiler-binding-linux-x64-gnu": "0.4.1", - "@astrojs/compiler-binding-linux-x64-musl": "0.4.1", - "@astrojs/compiler-binding-wasm32-wasi": "0.4.1", - "@astrojs/compiler-binding-win32-arm64-msvc": "0.4.1", - "@astrojs/compiler-binding-win32-x64-msvc": "0.4.1" + "node": ">=18" } }, - "site/node_modules/astro/node_modules/@astrojs/compiler-rs/node_modules/@astrojs/compiler-binding/node_modules/@astrojs/compiler-binding-android-arm64": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-android-arm64/-/compiler-binding-android-arm64-0.4.1.tgz", - "integrity": "sha512-Wtx2DZORuNTLASLLZ8hlrjFaJe1LUloatcCn9EPq7knBhRpjMGXeJANIJMeBZG4igvz7x+3nyAJM2iwCSW9xog==", + "site/node_modules/astro/node_modules/esbuild/node_modules/@esbuild/linux-riscv64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.2.tgz", + "integrity": "sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==", "cpu": [ - "arm64" + "riscv64" ], "license": "MIT", "optional": true, "os": [ - "android" + "linux" ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=18" } }, - "site/node_modules/astro/node_modules/@astrojs/compiler-rs/node_modules/@astrojs/compiler-binding/node_modules/@astrojs/compiler-binding-darwin-arm64": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-darwin-arm64/-/compiler-binding-darwin-arm64-0.4.1.tgz", - "integrity": "sha512-7iwXcU+hB60Y1SvOfnWHNioT72gDsDQKaDipXh2Onwp/TvQMozhbvhy13wJR8Af940a0h6PbddCeJFpj791UDA==", + "site/node_modules/astro/node_modules/esbuild/node_modules/@esbuild/linux-s390x": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.2.tgz", + "integrity": "sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==", "cpu": [ - "arm64" + "s390x" ], "license": "MIT", "optional": true, "os": [ - "darwin" + "linux" ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=18" } }, - "site/node_modules/astro/node_modules/@astrojs/compiler-rs/node_modules/@astrojs/compiler-binding/node_modules/@astrojs/compiler-binding-darwin-x64": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-darwin-x64/-/compiler-binding-darwin-x64-0.4.1.tgz", - "integrity": "sha512-pifjICos49RXhSVKSDu5gDB0/8j0O7DmxSp1DaWW2PyLG5ekwSkcrfOZto5JqhdI7QYMZB3XOiXpsdOXpS4npA==", + "site/node_modules/astro/node_modules/esbuild/node_modules/@esbuild/linux-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.2.tgz", + "integrity": "sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==", "cpu": [ "x64" ], "license": "MIT", "optional": true, "os": [ - "darwin" + "linux" ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=18" } }, - "site/node_modules/astro/node_modules/@astrojs/compiler-rs/node_modules/@astrojs/compiler-binding/node_modules/@astrojs/compiler-binding-linux-arm64-gnu": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-linux-arm64-gnu/-/compiler-binding-linux-arm64-gnu-0.4.1.tgz", - "integrity": "sha512-hsZMlNWc6LqWHh9LlSwTq1/XCY7pxA5rkkKIdZRV8mgbOz9OwLvjEoe5Jry13eIZjMUQO8XnQyzk8o/Pjw2YFA==", + "site/node_modules/astro/node_modules/esbuild/node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.2.tgz", + "integrity": "sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==", "cpu": [ "arm64" ], "license": "MIT", "optional": true, "os": [ - "linux" + "netbsd" ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=18" } }, - "site/node_modules/astro/node_modules/@astrojs/compiler-rs/node_modules/@astrojs/compiler-binding/node_modules/@astrojs/compiler-binding-linux-arm64-musl": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-linux-arm64-musl/-/compiler-binding-linux-arm64-musl-0.4.1.tgz", - "integrity": "sha512-a3EW27f+Z9uf57vYmpLgUriA1y9wDhKz57PT8D8XlFZt2HZEWhUxKuxI1jvKVI9p8okYee11WXEm/FHY1G9yoQ==", + "site/node_modules/astro/node_modules/esbuild/node_modules/@esbuild/netbsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.2.tgz", + "integrity": "sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==", "cpu": [ - "arm64" + "x64" ], "license": "MIT", "optional": true, "os": [ - "linux" + "netbsd" ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=18" } }, - "site/node_modules/astro/node_modules/@astrojs/compiler-rs/node_modules/@astrojs/compiler-binding/node_modules/@astrojs/compiler-binding-linux-x64-gnu": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-linux-x64-gnu/-/compiler-binding-linux-x64-gnu-0.4.1.tgz", - "integrity": "sha512-XruPTKB/SS4DFzeAjQ1ZyM0ieHDjapHkOSnnzRApZ4FXY2YAI7UY3mETjfJiIS/acyZyrnPH5jObv1gATTdUJQ==", + "site/node_modules/astro/node_modules/esbuild/node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.2.tgz", + "integrity": "sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==", "cpu": [ - "x64" + "arm64" ], "license": "MIT", "optional": true, "os": [ - "linux" + "openbsd" ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=18" } }, - "site/node_modules/astro/node_modules/@astrojs/compiler-rs/node_modules/@astrojs/compiler-binding/node_modules/@astrojs/compiler-binding-linux-x64-musl": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-linux-x64-musl/-/compiler-binding-linux-x64-musl-0.4.1.tgz", - "integrity": "sha512-E8j7lGanqNpudtkUbsFaOLJhmwFe4Ecqux7K9hkj4wULIPNZRM2bYZNcMSj8r1oWvaUiwZl8LaaNwv3+14jqhw==", + "site/node_modules/astro/node_modules/esbuild/node_modules/@esbuild/openbsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.2.tgz", + "integrity": "sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==", "cpu": [ "x64" ], "license": "MIT", "optional": true, "os": [ - "linux" + "openbsd" ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=18" } }, - "site/node_modules/astro/node_modules/@astrojs/compiler-rs/node_modules/@astrojs/compiler-binding/node_modules/@astrojs/compiler-binding-wasm32-wasi": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-wasm32-wasi/-/compiler-binding-wasm32-wasi-0.4.1.tgz", - "integrity": "sha512-vNLxIv41ZE+nmPFtw24cRW5ZXG+ZPcAGtgigtjCP8lvcxKI7u2GrXoMsCgEH5fMw8WCEJpwLvsVBg15rJKAkyA==", + "site/node_modules/astro/node_modules/esbuild/node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.2.tgz", + "integrity": "sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==", "cpu": [ - "wasm32" + "arm64" ], "license": "MIT", "optional": true, - "dependencies": { - "@napi-rs/wasm-runtime": "^1.2.4" - }, + "os": [ + "openharmony" + ], "engines": { - "node": ">=14.0.0" - } - }, - "site/node_modules/astro/node_modules/@astrojs/compiler-rs/node_modules/@astrojs/compiler-binding/node_modules/@astrojs/compiler-binding-wasm32-wasi/node_modules/@emnapi/core": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.3.tgz", - "integrity": "sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@emnapi/wasi-threads": "1.2.3", - "tslib": "^2.4.0" - } - }, - "site/node_modules/astro/node_modules/@astrojs/compiler-rs/node_modules/@astrojs/compiler-binding/node_modules/@astrojs/compiler-binding-wasm32-wasi/node_modules/@emnapi/core/node_modules/@emnapi/wasi-threads": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.3.tgz", - "integrity": "sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "site/node_modules/astro/node_modules/@astrojs/compiler-rs/node_modules/@astrojs/compiler-binding/node_modules/@astrojs/compiler-binding-wasm32-wasi/node_modules/@emnapi/core/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD", - "optional": true, - "peer": true - }, - "site/node_modules/astro/node_modules/@astrojs/compiler-rs/node_modules/@astrojs/compiler-binding/node_modules/@astrojs/compiler-binding-wasm32-wasi/node_modules/@emnapi/runtime": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.3.tgz", - "integrity": "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "tslib": "^2.4.0" + "node": ">=18" } }, - "site/node_modules/astro/node_modules/@astrojs/compiler-rs/node_modules/@astrojs/compiler-binding/node_modules/@astrojs/compiler-binding-wasm32-wasi/node_modules/@emnapi/runtime/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD", - "optional": true, - "peer": true - }, - "site/node_modules/astro/node_modules/@astrojs/compiler-rs/node_modules/@astrojs/compiler-binding/node_modules/@astrojs/compiler-binding-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.2.4.tgz", - "integrity": "sha512-AJxoUD2/15ESHbvpcyjU274nsAPLuOtPHCk0vKJM5pj//Fg/B1FXNWjPnXTT9PymCYYiHo4zPj0ZomXBKhoy7g==", + "site/node_modules/astro/node_modules/esbuild/node_modules/@esbuild/sunos-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.2.tgz", + "integrity": "sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==", + "cpu": [ + "x64" + ], "license": "MIT", "optional": true, - "dependencies": { - "@tybys/wasm-util": "^0.10.3" - }, + "os": [ + "sunos" + ], "engines": { - "node": "^20.19.0 || ^22.13.0 || >=23.5.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - }, - "peerDependencies": { - "@emnapi/core": "^1.7.1 || ^2.0.0-alpha.4", - "@emnapi/runtime": "^1.7.1 || ^2.0.0-alpha.4" + "node": ">=18" } }, - "site/node_modules/astro/node_modules/@astrojs/compiler-rs/node_modules/@astrojs/compiler-binding/node_modules/@astrojs/compiler-binding-wasm32-wasi/node_modules/@napi-rs/wasm-runtime/node_modules/@tybys/wasm-util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.4.tgz", - "integrity": "sha512-W3c4gRigFS0T/Ma4qIYF3GDAc5AQdHb1yL5znJT1Zv1YaD9Kitx656wBjvr19qbiosmZT8lWDM5BEMynUqX65A==", + "site/node_modules/astro/node_modules/esbuild/node_modules/@esbuild/win32-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.2.tgz", + "integrity": "sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==", + "cpu": [ + "arm64" + ], "license": "MIT", "optional": true, - "dependencies": { - "tslib": "^2.4.0" + "os": [ + "win32" + ], + "engines": { + "node": ">=18" } }, - "site/node_modules/astro/node_modules/@astrojs/compiler-rs/node_modules/@astrojs/compiler-binding/node_modules/@astrojs/compiler-binding-wasm32-wasi/node_modules/@napi-rs/wasm-runtime/node_modules/@tybys/wasm-util/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD", - "optional": true - }, - "site/node_modules/astro/node_modules/@astrojs/compiler-rs/node_modules/@astrojs/compiler-binding/node_modules/@astrojs/compiler-binding-win32-arm64-msvc": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-win32-arm64-msvc/-/compiler-binding-win32-arm64-msvc-0.4.1.tgz", - "integrity": "sha512-/xTDgRsFDoTh0/+KFXJ74DY4Jqn8CoSHwa8UP5RAblHfnRHkenwfSl4zYDET61O9vXKLk09UzHjjq09yP20/AQ==", + "site/node_modules/astro/node_modules/esbuild/node_modules/@esbuild/win32-ia32": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.2.tgz", + "integrity": "sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==", "cpu": [ - "arm64" + "ia32" ], "license": "MIT", "optional": true, @@ -15690,13 +20252,13 @@ "win32" ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=18" } }, - "site/node_modules/astro/node_modules/@astrojs/compiler-rs/node_modules/@astrojs/compiler-binding/node_modules/@astrojs/compiler-binding-win32-x64-msvc": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-win32-x64-msvc/-/compiler-binding-win32-x64-msvc-0.4.1.tgz", - "integrity": "sha512-0x5J6iHZO0Fjo/CVzoIbXKzWnGESftDbEUQ/oXQ61HhUAFoR7+T1jfToZSNAS+gYyBXHSTpMWYC7lzarbhClcg==", + "site/node_modules/astro/node_modules/esbuild/node_modules/@esbuild/win32-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.2.tgz", + "integrity": "sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==", "cpu": [ "x64" ], @@ -15705,2814 +20267,3298 @@ "os": [ "win32" ], + "engines": { + "node": ">=18" + } + }, + "site/node_modules/astro/node_modules/find-proc": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/find-proc/-/find-proc-0.2.0.tgz", + "integrity": "sha512-a6h2nTrgB3g5Wrn4au9Ux4kMk7IJtyF6oA8uGn+mk3weLZssUtc1cp6meHIzzuW2o1srrBAxzkmXLbqjRkgB6w==", + "license": "MIT", "engines": { "node": "^20.19.0 || >=22.12.0" } }, - "site/node_modules/astro/node_modules/@astrojs/internal-helpers": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.11.0.tgz", - "integrity": "sha512-3rzxJ+xbo0+8YyqOzLziIN32wmsHdCjEVz2sGOpRxJ+Ben/KiLph4ItxBy1abEL+E8fkRzqjg0rfXmaHJGw9JA==", + "site/node_modules/astro/node_modules/flattie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flattie/-/flattie-1.1.1.tgz", + "integrity": "sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==", "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.4", - "@types/mdast": "^4.0.4", - "js-yaml": "^4.3.0", - "picomatch": "^4.0.4", - "retext-smartypants": "^6.2.0", - "shiki": "^4.0.2", - "smol-toml": "^1.6.0", - "unified": "^11.0.5" + "engines": { + "node": ">=8" } }, - "site/node_modules/astro/node_modules/@astrojs/internal-helpers/node_modules/@types/hast": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.5.tgz", - "integrity": "sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==", + "site/node_modules/astro/node_modules/fontace": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/fontace/-/fontace-0.4.1.tgz", + "integrity": "sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw==", "license": "MIT", "dependencies": { - "@types/unist": "*" + "fontkitten": "^1.0.2" } }, - "site/node_modules/astro/node_modules/@astrojs/internal-helpers/node_modules/@types/hast/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" - }, - "site/node_modules/astro/node_modules/@astrojs/internal-helpers/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==", + "site/node_modules/astro/node_modules/fontace/node_modules/fontkitten": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fontkitten/-/fontkitten-1.0.3.tgz", + "integrity": "sha512-Wp1zXWPVUPBmfoa3Cqc9ctaKuzKAV6uLstRqlR56kSjplf5uAce+qeyYym7F+PHbGTk+tCEdkCW6RD7DX/gBZw==", "license": "MIT", "dependencies": { - "@types/unist": "*" + "tiny-inflate": "^1.0.3" + }, + "engines": { + "node": ">=20" } }, - "site/node_modules/astro/node_modules/@astrojs/internal-helpers/node_modules/@types/mdast/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==", + "site/node_modules/astro/node_modules/fontace/node_modules/fontkitten/node_modules/tiny-inflate": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", + "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", "license": "MIT" }, - "site/node_modules/astro/node_modules/@astrojs/internal-helpers/node_modules/retext-smartypants": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/retext-smartypants/-/retext-smartypants-6.2.0.tgz", - "integrity": "sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==", + "site/node_modules/astro/node_modules/get-tsconfig": { + "version": "5.0.0-beta.4", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-5.0.0-beta.4.tgz", + "integrity": "sha512-7nF7C9fIPFEMHgEMEfgIlO9wDdZ8CyHw27rWciFZfHvHDReIiPhsYuzPRXsfvBCqFy1l8RRyyWV7QLM+ZhUJsQ==", "license": "MIT", "dependencies": { - "@types/nlcst": "^2.0.0", - "nlcst-to-string": "^4.0.0", - "unist-util-visit": "^5.0.0" + "resolve-pkg-maps": "^1.0.0" + }, + "engines": { + "node": ">=20.20.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, - "site/node_modules/astro/node_modules/@astrojs/internal-helpers/node_modules/retext-smartypants/node_modules/@types/nlcst": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/nlcst/-/nlcst-2.0.3.tgz", - "integrity": "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==", + "site/node_modules/astro/node_modules/get-tsconfig/node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", "license": "MIT", - "dependencies": { - "@types/unist": "*" + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, - "site/node_modules/astro/node_modules/@astrojs/internal-helpers/node_modules/retext-smartypants/node_modules/@types/nlcst/node_modules/@types/unist": { + "site/node_modules/astro/node_modules/github-slugger": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", + "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==", + "license": "ISC" + }, + "site/node_modules/astro/node_modules/html-escaper": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-3.0.3.tgz", + "integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==", "license": "MIT" }, - "site/node_modules/astro/node_modules/@astrojs/internal-helpers/node_modules/retext-smartypants/node_modules/nlcst-to-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-4.0.0.tgz", - "integrity": "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==", + "site/node_modules/astro/node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "license": "BSD-2-Clause" + }, + "site/node_modules/astro/node_modules/js-yaml": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz", + "integrity": "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], "license": "MIT", "dependencies": { - "@types/nlcst": "^2.0.0" + "argparse": "^2.0.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "site/node_modules/astro/node_modules/@astrojs/internal-helpers/node_modules/retext-smartypants/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==", + "site/node_modules/astro/node_modules/js-yaml/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "site/node_modules/astro/node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "license": "MIT" + }, + "site/node_modules/astro/node_modules/magic-string": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-1.4.1.tgz", + "integrity": "sha512-8lyCu36ErXR0J9uaGKlKQoiLZKmtI63YGLE8G2o9jyRPdr4X47LusSOwgOJOzcVtp81fTAAjxR7BwKz682Jhow==", "license": "MIT", "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "@jridgewell/sourcemap-codec": "^1.6.0" } }, - "site/node_modules/astro/node_modules/@astrojs/internal-helpers/node_modules/retext-smartypants/node_modules/unist-util-visit/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==", + "site/node_modules/astro/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", "license": "MIT" }, - "site/node_modules/astro/node_modules/@astrojs/internal-helpers/node_modules/retext-smartypants/node_modules/unist-util-visit/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==", + "site/node_modules/astro/node_modules/magicast": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.5.tgz", + "integrity": "sha512-UicdXN8zQ3JHlxVq+28afMXPr1z7WNY6+7EJnzTdQWkTAlMLF5fNCCKxJHBQwGaNGR11581EiQmQzx73+MvszA==", "license": "MIT", "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "source-map-js": "^1.2.1" } }, - "site/node_modules/astro/node_modules/@astrojs/internal-helpers/node_modules/retext-smartypants/node_modules/unist-util-visit/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==", + "site/node_modules/astro/node_modules/magicast/node_modules/@babel/parser": { + "version": "7.29.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.9.tgz", + "integrity": "sha512-CjXrNHTnvqBVqHgdBysY3vk2T8tpJHb5/RMeHJBTyVa9xgugCB0CJTx/3oO8RV2QRQP391RWpB7D6hLjm8V9uA==", "license": "MIT", "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" + "@babel/types": "^7.29.8" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" } }, - "site/node_modules/astro/node_modules/@astrojs/internal-helpers/node_modules/unified": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", - "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "site/node_modules/astro/node_modules/magicast/node_modules/@babel/types": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", "license": "MIT", "dependencies": { - "@types/unist": "^3.0.0", - "bail": "^2.0.0", - "devlop": "^1.0.0", - "extend": "^3.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^6.0.0" + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=6.9.0" } }, - "site/node_modules/astro/node_modules/@astrojs/internal-helpers/node_modules/unified/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" + "site/node_modules/astro/node_modules/magicast/node_modules/@babel/types/node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } }, - "site/node_modules/astro/node_modules/@astrojs/internal-helpers/node_modules/unified/node_modules/bail": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", - "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "site/node_modules/astro/node_modules/magicast/node_modules/@babel/types/node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "engines": { + "node": ">=6.9.0" } }, - "site/node_modules/astro/node_modules/@astrojs/internal-helpers/node_modules/unified/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==", + "site/node_modules/astro/node_modules/magicast/node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "site/node_modules/astro/node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", "license": "MIT", - "dependencies": { - "dequal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "engines": { + "node": ">=10" + } + }, + "site/node_modules/astro/node_modules/neotraverse": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/neotraverse/-/neotraverse-1.0.1.tgz", + "integrity": "sha512-WmmLty1YWwJl9yZi77v2dVIV6X2kuYV8YYBI/G3LWGKdGHmHUvL1z7FW0iDvEvGAwNEoc5x1tOOOyDnf5jJw/w==", + "license": "MIT", + "engines": { + "node": ">= 10" } }, - "site/node_modules/astro/node_modules/@astrojs/internal-helpers/node_modules/unified/node_modules/devlop/node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "site/node_modules/astro/node_modules/obug": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.2.1.tgz", + "integrity": "sha512-XrsrhT5sybtKI6wakr2SPOlGZWWYbUXZ7a0jT8/QOeAPau+1X/bSegNe5YR75oJmEZQbKningirmGOEJCIk61Q==", + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], "license": "MIT", "engines": { - "node": ">=6" + "node": ">=12.20.0" } }, - "site/node_modules/astro/node_modules/@astrojs/internal-helpers/node_modules/unified/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" - }, - "site/node_modules/astro/node_modules/@astrojs/internal-helpers/node_modules/unified/node_modules/is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "site/node_modules/astro/node_modules/p-limit": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-7.3.3.tgz", + "integrity": "sha512-SKgVvDU5TNIxQ4r30U75BNLC6a+6GOEjngrk/ysM5+Zu3oJuk1SC5ApzIzY/7PjCEjoVPMWJ0zho/4QUiEB7TQ==", "license": "MIT", + "dependencies": { + "yocto-queue": "^1.2.1" + }, "engines": { - "node": ">=12" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "site/node_modules/astro/node_modules/@astrojs/internal-helpers/node_modules/unified/node_modules/trough": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", - "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "site/node_modules/astro/node_modules/p-limit/node_modules/yocto-queue": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", + "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", "license": "MIT", + "engines": { + "node": ">=12.20" + }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "url": "https://github.com/sponsors/sindresorhus" } }, - "site/node_modules/astro/node_modules/@astrojs/internal-helpers/node_modules/unified/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==", + "site/node_modules/astro/node_modules/p-queue": { + "version": "9.3.3", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-9.3.3.tgz", + "integrity": "sha512-NXAOdnEe5FsZJfT4oK84lE1Y5cFFdWlRuOo5tww8DyNMxyRXwn39fIkUtNLKppcPC+UYU/bXujNCUGDv01y7CA==", "license": "MIT", "dependencies": { - "@types/unist": "^3.0.0", - "vfile-message": "^4.0.0" + "eventemitter3": "^5.0.4", + "p-timeout": "^7.0.0" + }, + "engines": { + "node": ">=20" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/sindresorhus" } }, - "site/node_modules/astro/node_modules/@astrojs/internal-helpers/node_modules/unified/node_modules/vfile/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==", + "site/node_modules/astro/node_modules/p-queue/node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "license": "MIT" + }, + "site/node_modules/astro/node_modules/p-queue/node_modules/p-timeout": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-7.0.2.tgz", + "integrity": "sha512-prbX4Z3YszrFNgH+MW5Zoeq3baXrMtP/MQnFeET90UB/GtGcGDQ5Usg9OCy6ETjTTntOw1SL2z9fMPUppN3Guw==", "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0" + "engines": { + "node": ">=20" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/sindresorhus" } }, - "site/node_modules/astro/node_modules/@astrojs/internal-helpers/node_modules/unified/node_modules/vfile/node_modules/vfile-message/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==", + "site/node_modules/astro/node_modules/package-manager-detector": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.8.0.tgz", + "integrity": "sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A==", + "license": "MIT" + }, + "site/node_modules/astro/node_modules/piccolore": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/piccolore/-/piccolore-0.1.3.tgz", + "integrity": "sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw==", + "license": "ISC" + }, + "site/node_modules/astro/node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" + "engines": { + "node": ">=12" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "site/node_modules/astro/node_modules/@astrojs/markdown-satteri": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@astrojs/markdown-satteri/-/markdown-satteri-0.4.1.tgz", - "integrity": "sha512-EniHbFNa6SQHDih7JnpPos3NWXO6hdt4raBcOosfGmlfc3gP9CI/sESA3VOf1PgJZ7SFfewlZW9Livn0JugEZg==", + "site/node_modules/astro/node_modules/shiki": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-4.4.3.tgz", + "integrity": "sha512-Mb/GvXPHBAXdgGIcnfU5L3ldpn1XcxrGkPHwqgRx17/I2XRfqlFKk2vGkHWINn1kdXvzJZeuO3is6I9KLPFm0g==", "license": "MIT", "dependencies": { - "@astrojs/internal-helpers": "0.11.0", - "@astrojs/prism": "4.0.2", - "github-slugger": "^2.0.0", - "satteri": "^0.10.3" + "@shikijs/core": "4.4.3", + "@shikijs/engine-javascript": "4.4.3", + "@shikijs/engine-oniguruma": "4.4.3", + "@shikijs/langs": "4.4.3", + "@shikijs/themes": "4.4.3", + "@shikijs/types": "4.4.3", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.5" + }, + "engines": { + "node": ">=20" } }, - "site/node_modules/astro/node_modules/@astrojs/markdown-satteri/node_modules/@astrojs/prism": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-4.0.2.tgz", - "integrity": "sha512-KTivpmnz6lDsC6o9H4+DNm2SrE/GHzw8cNAvEJwAvUT+eoaEnn/4NtbDNfRRaxaJHdp15gf+tfHAWiXR4wB3BA==", + "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-4.4.3.tgz", + "integrity": "sha512-QCR4q2ZO/ILJEuwiBMel4wdcTDb1JGwfjKTxPDF6x8ixOaluPrVqIn06C99AcRPhmYlBR56d/Fb+GN58GzExpg==", "license": "MIT", "dependencies": { - "prismjs": "^1.30.0" + "@shikijs/primitive": "4.4.3", + "@shikijs/types": "4.4.3", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.5", + "hast-util-to-html": "^9.0.5" }, "engines": { - "node": ">=22.12.0" + "node": ">=20" } }, - "site/node_modules/astro/node_modules/@astrojs/markdown-satteri/node_modules/@astrojs/prism/node_modules/prismjs": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", - "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core/node_modules/@shikijs/primitive": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@shikijs/primitive/-/primitive-4.4.3.tgz", + "integrity": "sha512-m0wBeLDQDeIxRdUmrCPdQqfuUamDwRL5isCfYbguKD6NiaKpVbsv+3J81DyIKgNW5h4WAIIr8T4EkgQrBBxvaQ==", "license": "MIT", + "dependencies": { + "@shikijs/types": "4.4.3", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.5" + }, "engines": { - "node": ">=6" + "node": ">=20" } }, - "site/node_modules/astro/node_modules/@astrojs/markdown-satteri/node_modules/satteri": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/satteri/-/satteri-0.10.5.tgz", - "integrity": "sha512-Ao1LKpAEa9Wdg0otgbVKViZHEq9ebdXe4DMrp3s9vQAU0HNIuHnFEuMuOcm0ZIXyV0Yzxj91NvhLpvXZJO/5ZQ==", + "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core/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/estree-jsx": "^1.0.5", - "@types/hast": "^3.0.5", - "@types/mdast": "^4.0.4", - "@types/unist": "^3.0.3" + "@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" }, - "optionalDependencies": { - "@bruits/satteri-darwin-arm64": "0.10.5", - "@bruits/satteri-darwin-x64": "0.10.5", - "@bruits/satteri-linux-arm64-gnu": "0.10.5", - "@bruits/satteri-linux-arm64-musl": "0.10.5", - "@bruits/satteri-linux-x64-gnu": "0.10.5", - "@bruits/satteri-linux-x64-musl": "0.10.5", - "@bruits/satteri-wasm32-wasi": "0.10.5", - "@bruits/satteri-win32-arm64-msvc": "0.10.5", - "@bruits/satteri-win32-x64-msvc": "0.10.5" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "site/node_modules/astro/node_modules/@astrojs/markdown-satteri/node_modules/satteri/node_modules/@bruits/satteri-darwin-arm64": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/@bruits/satteri-darwin-arm64/-/satteri-darwin-arm64-0.10.5.tgz", - "integrity": "sha512-27KTVl4TJkVahMy/ohyA7qd4938G5UNneFUz/PsScYfpIhj0IVAS23mpcJXdPF44sa6nva198lmV/cKIb2YPyA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "site/node_modules/astro/node_modules/@astrojs/markdown-satteri/node_modules/satteri/node_modules/@bruits/satteri-darwin-x64": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/@bruits/satteri-darwin-x64/-/satteri-darwin-x64-0.10.5.tgz", - "integrity": "sha512-IjnLe3nKspq6qaeqGgjT7MT8VrTV74yWRlaag7ZdNsI8TDAYZ0iPxMCo+9KQZHUk5EyVB+reBI/PFWL5KuFw9Q==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] + "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core/node_modules/hast-util-to-html/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" }, - "site/node_modules/astro/node_modules/@astrojs/markdown-satteri/node_modules/satteri/node_modules/@bruits/satteri-linux-arm64-gnu": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/@bruits/satteri-linux-arm64-gnu/-/satteri-linux-arm64-gnu-0.10.5.tgz", - "integrity": "sha512-glkYXZCJywjP13v67eAyAMSJdF+ncvEbYvgi/wOtffL9tQ27lr/zsyzUfgs+ovjJ9d8JNQKiXeiArJcX8PJL9w==", - "cpu": [ - "arm64" - ], + "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core/node_modules/hast-util-to-html/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", - "optional": true, - "os": [ - "linux" - ] + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } }, - "site/node_modules/astro/node_modules/@astrojs/markdown-satteri/node_modules/satteri/node_modules/@bruits/satteri-linux-arm64-musl": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/@bruits/satteri-linux-arm64-musl/-/satteri-linux-arm64-musl-0.10.5.tgz", - "integrity": "sha512-yWdgG1g17Nh2QyGVlFUxGRa3FEFwiMcpZEyMNWkbM3deC94cmVc+/i9OuyFpdKuWo3GkgoCtYVOoxk1uCnCZIA==", - "cpu": [ - "arm64" - ], + "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core/node_modules/hast-util-to-html/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", - "optional": true, - "os": [ - "linux" - ] + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } }, - "site/node_modules/astro/node_modules/@astrojs/markdown-satteri/node_modules/satteri/node_modules/@bruits/satteri-linux-x64-gnu": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/@bruits/satteri-linux-x64-gnu/-/satteri-linux-x64-gnu-0.10.5.tgz", - "integrity": "sha512-FVaLoPT1fBgGl0J+AYebyyXJYBachGl8Oyyrf1lye4RTqCB4S0Gwkj1uM9RJyThUOvx5VUmAT1CnNh1SFHA+kw==", - "cpu": [ - "x64" - ], + "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core/node_modules/hast-util-to-html/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", - "optional": true, - "os": [ - "linux" - ] + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, - "site/node_modules/astro/node_modules/@astrojs/markdown-satteri/node_modules/satteri/node_modules/@bruits/satteri-linux-x64-musl": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/@bruits/satteri-linux-x64-musl/-/satteri-linux-x64-musl-0.10.5.tgz", - "integrity": "sha512-EHpVAx2bqW3GINHTKkljtxVfQmVDGWIuwOYOP5YghTj+0PkBa2o8oKPRtQ9Kbsr1Fye8jtUcDjhwj2jMNugZKg==", - "cpu": [ - "x64" - ], + "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core/node_modules/hast-util-to-html/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", - "optional": true, - "os": [ - "linux" - ] + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } }, - "site/node_modules/astro/node_modules/@astrojs/markdown-satteri/node_modules/satteri/node_modules/@bruits/satteri-wasm32-wasi": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/@bruits/satteri-wasm32-wasi/-/satteri-wasm32-wasi-0.10.5.tgz", - "integrity": "sha512-ypz8c/Zmipxp4IoeDa228Gstv6TLzVmNs3yC6wKCoNSOjx1iwpgzu87Y3hTkXFdwChVGU85qeUDuOIarGUZQLw==", - "cpu": [ - "wasm32" - ], + "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core/node_modules/hast-util-to-html/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", - "optional": true, "dependencies": { - "@emnapi/core": "1.11.1", - "@emnapi/runtime": "1.11.1", - "@napi-rs/wasm-runtime": "^1.2.3" + "@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" }, - "engines": { - "node": ">=14.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "site/node_modules/astro/node_modules/@astrojs/markdown-satteri/node_modules/satteri/node_modules/@bruits/satteri-wasm32-wasi/node_modules/@emnapi/core": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz", - "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==", + "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core/node_modules/hast-util-to-html/node_modules/mdast-util-to-hast/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", - "optional": true, "dependencies": { - "@emnapi/wasi-threads": "1.2.2", - "tslib": "^2.4.0" + "@types/unist": "*" } }, - "site/node_modules/astro/node_modules/@astrojs/markdown-satteri/node_modules/satteri/node_modules/@bruits/satteri-wasm32-wasi/node_modules/@emnapi/core/node_modules/@emnapi/wasi-threads": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", - "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==", + "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core/node_modules/hast-util-to-html/node_modules/mdast-util-to-hast/node_modules/@ungap/structured-clone": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.4.0.tgz", + "integrity": "sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ==", + "license": "ISC" + }, + "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core/node_modules/hast-util-to-html/node_modules/mdast-util-to-hast/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", - "optional": true, "dependencies": { - "tslib": "^2.4.0" + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "site/node_modules/astro/node_modules/@astrojs/markdown-satteri/node_modules/satteri/node_modules/@bruits/satteri-wasm32-wasi/node_modules/@emnapi/core/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD", - "optional": true + "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core/node_modules/hast-util-to-html/node_modules/mdast-util-to-hast/node_modules/devlop/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" + } }, - "site/node_modules/astro/node_modules/@astrojs/markdown-satteri/node_modules/satteri/node_modules/@bruits/satteri-wasm32-wasi/node_modules/@emnapi/runtime": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", - "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", + "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core/node_modules/hast-util-to-html/node_modules/mdast-util-to-hast/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", - "optional": true, "dependencies": { - "tslib": "^2.4.0" + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" } }, - "site/node_modules/astro/node_modules/@astrojs/markdown-satteri/node_modules/satteri/node_modules/@bruits/satteri-wasm32-wasi/node_modules/@emnapi/runtime/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD", - "optional": true + "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core/node_modules/hast-util-to-html/node_modules/mdast-util-to-hast/node_modules/micromark-util-sanitize-uri/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" + } }, - "site/node_modules/astro/node_modules/@astrojs/markdown-satteri/node_modules/satteri/node_modules/@bruits/satteri-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.2.4.tgz", - "integrity": "sha512-AJxoUD2/15ESHbvpcyjU274nsAPLuOtPHCk0vKJM5pj//Fg/B1FXNWjPnXTT9PymCYYiHo4zPj0ZomXBKhoy7g==", + "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core/node_modules/hast-util-to-html/node_modules/mdast-util-to-hast/node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-character/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" + }, + "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core/node_modules/hast-util-to-html/node_modules/mdast-util-to-hast/node_modules/micromark-util-sanitize-uri/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" + }, + "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core/node_modules/hast-util-to-html/node_modules/mdast-util-to-hast/node_modules/micromark-util-sanitize-uri/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" + }, + "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core/node_modules/hast-util-to-html/node_modules/mdast-util-to-hast/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" + } + }, + "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core/node_modules/hast-util-to-html/node_modules/mdast-util-to-hast/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", - "optional": true, "dependencies": { - "@tybys/wasm-util": "^0.10.3" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=23.5.0" + "@types/unist": "^3.0.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - }, - "peerDependencies": { - "@emnapi/core": "^1.7.1 || ^2.0.0-alpha.4", - "@emnapi/runtime": "^1.7.1 || ^2.0.0-alpha.4" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "site/node_modules/astro/node_modules/@astrojs/markdown-satteri/node_modules/satteri/node_modules/@bruits/satteri-wasm32-wasi/node_modules/@napi-rs/wasm-runtime/node_modules/@tybys/wasm-util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.4.tgz", - "integrity": "sha512-W3c4gRigFS0T/Ma4qIYF3GDAc5AQdHb1yL5znJT1Zv1YaD9Kitx656wBjvr19qbiosmZT8lWDM5BEMynUqX65A==", + "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core/node_modules/hast-util-to-html/node_modules/mdast-util-to-hast/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", - "optional": true, "dependencies": { - "tslib": "^2.4.0" + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "site/node_modules/astro/node_modules/@astrojs/markdown-satteri/node_modules/satteri/node_modules/@bruits/satteri-wasm32-wasi/node_modules/@napi-rs/wasm-runtime/node_modules/@tybys/wasm-util/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD", - "optional": true - }, - "site/node_modules/astro/node_modules/@astrojs/markdown-satteri/node_modules/satteri/node_modules/@bruits/satteri-win32-arm64-msvc": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/@bruits/satteri-win32-arm64-msvc/-/satteri-win32-arm64-msvc-0.10.5.tgz", - "integrity": "sha512-siTV88nb0LRqNpkL2gXboqCwVdq95sLtzMHS1/3eONV2gLbB3NAK46wmSMvCO/yquBvI2lvaFIfd8P12ecsxBw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "site/node_modules/astro/node_modules/@astrojs/markdown-satteri/node_modules/satteri/node_modules/@bruits/satteri-win32-x64-msvc": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/@bruits/satteri-win32-x64-msvc/-/satteri-win32-x64-msvc-0.10.5.tgz", - "integrity": "sha512-C3IfPvfvMXmlzBxaMPKFS1XiuV9pu2mC7YqkPk7PSvTgPZ8gbdASIpHpztDLvTTQjqZ0z1Ol8tK5X+V6XXC0wQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "site/node_modules/astro/node_modules/@astrojs/markdown-satteri/node_modules/satteri/node_modules/@types/estree-jsx": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", - "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core/node_modules/hast-util-to-html/node_modules/mdast-util-to-hast/node_modules/unist-util-visit/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/estree": "*" + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "site/node_modules/astro/node_modules/@astrojs/markdown-satteri/node_modules/satteri/node_modules/@types/estree-jsx/node_modules/@types/estree": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", - "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", - "license": "MIT" - }, - "site/node_modules/astro/node_modules/@astrojs/markdown-satteri/node_modules/satteri/node_modules/@types/hast": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.5.tgz", - "integrity": "sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==", + "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core/node_modules/hast-util-to-html/node_modules/mdast-util-to-hast/node_modules/unist-util-visit/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", "dependencies": { - "@types/unist": "*" + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "site/node_modules/astro/node_modules/@astrojs/markdown-satteri/node_modules/satteri/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==", + "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core/node_modules/hast-util-to-html/node_modules/mdast-util-to-hast/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": "*" + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "site/node_modules/astro/node_modules/@astrojs/markdown-satteri/node_modules/satteri/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" - }, - "site/node_modules/astro/node_modules/@astrojs/telemetry": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.3.3.tgz", - "integrity": "sha512-C1TLn5sPJr0x4vk56piHWKbnqlEB8BKyte5Y45V02U+D7BGO5eMqZDH5aPjnkXQWJggvmsTXxH03QMZ9NgWLzQ==", + "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core/node_modules/hast-util-to-html/node_modules/mdast-util-to-hast/node_modules/vfile/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": { - "ci-info": "^4.4.0", - "dset": "^3.1.4", - "is-docker": "^4.0.0", - "package-manager-detector": "^1.6.0" + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" }, - "engines": { - "node": "18.20.8 || ^20.3.0 || >=22.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "site/node_modules/astro/node_modules/@astrojs/telemetry/node_modules/is-docker": { + "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core/node_modules/hast-util-to-html/node_modules/mdast-util-to-hast/node_modules/vfile/node_modules/vfile-message/node_modules/unist-util-stringify-position": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-4.0.0.tgz", - "integrity": "sha512-LHE+wROyG/Y/0ZnbktRCoTix2c1RhgWaZraMZ8o1Q7zCh0VSrICJQO5oqIIISrcSBtrXv0o233w1IYwsWCjTzA==", + "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", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=20" + "dependencies": { + "@types/unist": "^3.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "site/node_modules/astro/node_modules/@capsizecss/unpack": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@capsizecss/unpack/-/unpack-4.0.1.tgz", - "integrity": "sha512-CuNiSqg7+e1cO/GjffyMOm5Tt2jUF9CWHHnvQ/UkqvtkGfHdgwEC0wpmq7fkN3gxwpRnrAN0WzO3vREKmNolMQ==", + "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core/node_modules/hast-util-to-html/node_modules/property-information": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.2.0.tgz", + "integrity": "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==", "license": "MIT", - "dependencies": { - "fontkitten": "^1.0.3" - }, - "engines": { - "node": ">=18" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "site/node_modules/astro/node_modules/@capsizecss/unpack/node_modules/fontkitten": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fontkitten/-/fontkitten-1.0.3.tgz", - "integrity": "sha512-Wp1zXWPVUPBmfoa3Cqc9ctaKuzKAV6uLstRqlR56kSjplf5uAce+qeyYym7F+PHbGTk+tCEdkCW6RD7DX/gBZw==", + "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core/node_modules/hast-util-to-html/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" + } + }, + "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core/node_modules/hast-util-to-html/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": { - "tiny-inflate": "^1.0.3" + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" }, - "engines": { - "node": ">=20" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "site/node_modules/astro/node_modules/@capsizecss/unpack/node_modules/fontkitten/node_modules/tiny-inflate": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", - "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", - "license": "MIT" + "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core/node_modules/hast-util-to-html/node_modules/stringify-entities/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" + } }, - "site/node_modules/astro/node_modules/@clack/prompts": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-1.8.1.tgz", - "integrity": "sha512-dlT1m5e/0yUL0kRNcQn7yGLVThkgbB0Ga/1AmfDDC/8ik6AIiSf2QLQO2zPYvefsHP0aFgxO93cVLCCfDp7kzQ==", + "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core/node_modules/hast-util-to-html/node_modules/stringify-entities/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", - "dependencies": { - "@clack/core": "1.5.1", - "fast-string-width": "^3.0.2", - "fast-wrap-ansi": "^0.2.0", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 20.12.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "site/node_modules/astro/node_modules/@clack/prompts/node_modules/@clack/core": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@clack/core/-/core-1.5.1.tgz", - "integrity": "sha512-iHTrHA8MtVuLl2TfZySmcKv1qO2PoyC9Z7pfSDozEuV5vtY3/wcOPKJXlqJ5Oq2Cx5DDGQGAMVx6HZfRRoVEbQ==", + "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core/node_modules/hast-util-to-html/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", - "dependencies": { - "fast-wrap-ansi": "^0.2.0", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 20.12.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "site/node_modules/astro/node_modules/@clack/prompts/node_modules/fast-string-width": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/fast-string-width/-/fast-string-width-3.0.2.tgz", - "integrity": "sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==", + "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/engine-javascript": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-4.4.3.tgz", + "integrity": "sha512-FbOjFJp9VLdo1Wevs10BBtVxiTWwNLqZh5Gkhjgda/ioL15YOgeSl9n+6XMa3qRlPQzfhFNe641SrynFHYG0nQ==", "license": "MIT", "dependencies": { - "fast-string-truncated-width": "^3.0.2" + "@shikijs/types": "4.4.3", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^4.3.6" + }, + "engines": { + "node": ">=20" } }, - "site/node_modules/astro/node_modules/@clack/prompts/node_modules/fast-string-width/node_modules/fast-string-truncated-width": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fast-string-truncated-width/-/fast-string-truncated-width-3.0.3.tgz", - "integrity": "sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==", - "license": "MIT" - }, - "site/node_modules/astro/node_modules/@clack/prompts/node_modules/fast-wrap-ansi": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/fast-wrap-ansi/-/fast-wrap-ansi-0.2.2.tgz", - "integrity": "sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==", + "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/engine-javascript/node_modules/oniguruma-to-es": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.6.tgz", + "integrity": "sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==", "license": "MIT", "dependencies": { - "fast-string-width": "^3.0.2" + "oniguruma-parser": "^0.12.2", + "regex": "^6.1.0", + "regex-recursion": "^6.0.2" } }, - "site/node_modules/astro/node_modules/@clack/prompts/node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "license": "MIT" - }, - "site/node_modules/astro/node_modules/@oslojs/encoding": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@oslojs/encoding/-/encoding-1.1.0.tgz", - "integrity": "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==", + "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/engine-javascript/node_modules/oniguruma-to-es/node_modules/oniguruma-parser": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.2.tgz", + "integrity": "sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==", "license": "MIT" }, - "site/node_modules/astro/node_modules/am-i-vibing": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/am-i-vibing/-/am-i-vibing-0.4.0.tgz", - "integrity": "sha512-MxT4XZL7pzLHpuvhDKdMaQHMGGkJDLluKBLsbstn+8wv9sWcFT6h+0ve9qkml95amVTZtZV83gQe2hY+ojgHLg==", + "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/engine-javascript/node_modules/oniguruma-to-es/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": { - "process-ancestry": "^0.1.0" - }, - "bin": { - "am-i-vibing": "dist/cli.mjs" + "regex-utilities": "^2.3.0" } }, - "site/node_modules/astro/node_modules/am-i-vibing/node_modules/process-ancestry": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/process-ancestry/-/process-ancestry-0.1.0.tgz", - "integrity": "sha512-tGqJW/UnclpYASFcM6Xh8D8l/BMtaQ9+CSG0vlJSJTcdMM4lDRv4c6H0Pdcsfted+bVczdYSfk2fdukg2gQkZg==", + "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/engine-javascript/node_modules/oniguruma-to-es/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", - "engines": { - "node": ">=18.0.0" + "dependencies": { + "regex-utilities": "^2.3.0" } }, - "site/node_modules/astro/node_modules/aria-query": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", - "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", - "license": "Apache-2.0", - "engines": { - "node": ">= 0.4" - } + "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/engine-javascript/node_modules/oniguruma-to-es/node_modules/regex-recursion/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" }, - "site/node_modules/astro/node_modules/axobject-query": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", - "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", - "license": "Apache-2.0", - "engines": { - "node": ">= 0.4" - } + "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/engine-javascript/node_modules/oniguruma-to-es/node_modules/regex/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" }, - "site/node_modules/astro/node_modules/ci-info": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", - "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], + "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/engine-oniguruma": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-4.4.3.tgz", + "integrity": "sha512-EcOQkxdxGQrc1Row/cC2c96/v1dbZqGnEVu1qTuT/MJmp6+cXCvQussowVmCv5Tqr3KuY3c7IbM6HTW3LJ1k9w==", "license": "MIT", + "dependencies": { + "@shikijs/types": "4.4.3", + "@shikijs/vscode-textmate": "^10.0.2" + }, "engines": { - "node": ">=8" + "node": ">=20" } }, - "site/node_modules/astro/node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/langs": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-4.4.3.tgz", + "integrity": "sha512-ePic0yfAJGOF83D5wBHK/00EjK65oahBYxFk5epgq33WRv7X9UuxLEV8PtR0szC0z8dl7INIpIodB99JRFlR+A==", "license": "MIT", + "dependencies": { + "@shikijs/types": "4.4.3" + }, "engines": { - "node": ">=6" - } - }, - "site/node_modules/astro/node_modules/common-ancestor-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-2.0.0.tgz", - "integrity": "sha512-dnN3ibLeoRf2HNC+OlCiNc5d2zxbLJXOtiZUudNFSXZrNSydxcCsSpRzXwfu7BBWCIfHPw+xTayeBvJCP/D8Ng==", - "license": "BlueOak-1.0.0", - "engines": { - "node": ">= 18" + "node": ">=20" } }, - "site/node_modules/astro/node_modules/cookie": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-2.0.1.tgz", - "integrity": "sha512-yuToqVvRrj6pfDXREyQAAv8SkAEk/8GS3jQRTiUMm66TVtBYmqQeoEjL2Lmq8Rpo6271vH76InTChTitEAm65w==", + "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/themes": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-4.4.3.tgz", + "integrity": "sha512-w8UHjeUnIR965KMWJHUPXOc2mNJUnK3vpVLYLvw5IYU2mnTTJ89E24OrJDBNiJDQ0qzb0tc4l7mrIXx5cFeIyw==", "license": "MIT", - "engines": { - "node": ">=22" + "dependencies": { + "@shikijs/types": "4.4.3" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "site/node_modules/astro/node_modules/devalue": { - "version": "5.9.4", - "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.9.4.tgz", - "integrity": "sha512-sPAT4pztbu6586/hrhOnMKS17IJrvg12mXiSPSS3W5qDeN2RGgvZ0diZCm31dBbnevfVmujNO3IM2wrS4Y2Rhg==", - "license": "MIT" - }, - "site/node_modules/astro/node_modules/diff": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-9.0.0.tgz", - "integrity": "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw==", - "license": "BSD-3-Clause", "engines": { - "node": ">=0.3.1" + "node": ">=20" } }, - "site/node_modules/astro/node_modules/dset": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.4.tgz", - "integrity": "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==", + "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/types": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.4.3.tgz", + "integrity": "sha512-UEJxmRR++MAGR6hugn0vgVS2W/6lWAts84FFSrnlH9sP0LNol7E5+NQ792pH8liWUhyMyjhTgSUH3k7iD7tc5g==", "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.5" + }, "engines": { - "node": ">=4" + "node": ">=20" } }, - "site/node_modules/astro/node_modules/es-module-lexer": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.2.tgz", - "integrity": "sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==", + "site/node_modules/astro/node_modules/shiki/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" }, - "site/node_modules/astro/node_modules/esbuild": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.2.tgz", - "integrity": "sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==", - "hasInstallScript": true, + "site/node_modules/astro/node_modules/shiki/node_modules/@types/hast": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.5.tgz", + "integrity": "sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==", "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.28.2", - "@esbuild/android-arm": "0.28.2", - "@esbuild/android-arm64": "0.28.2", - "@esbuild/android-x64": "0.28.2", - "@esbuild/darwin-arm64": "0.28.2", - "@esbuild/darwin-x64": "0.28.2", - "@esbuild/freebsd-arm64": "0.28.2", - "@esbuild/freebsd-x64": "0.28.2", - "@esbuild/linux-arm": "0.28.2", - "@esbuild/linux-arm64": "0.28.2", - "@esbuild/linux-ia32": "0.28.2", - "@esbuild/linux-loong64": "0.28.2", - "@esbuild/linux-mips64el": "0.28.2", - "@esbuild/linux-ppc64": "0.28.2", - "@esbuild/linux-riscv64": "0.28.2", - "@esbuild/linux-s390x": "0.28.2", - "@esbuild/linux-x64": "0.28.2", - "@esbuild/netbsd-arm64": "0.28.2", - "@esbuild/netbsd-x64": "0.28.2", - "@esbuild/openbsd-arm64": "0.28.2", - "@esbuild/openbsd-x64": "0.28.2", - "@esbuild/openharmony-arm64": "0.28.2", - "@esbuild/sunos-x64": "0.28.2", - "@esbuild/win32-arm64": "0.28.2", - "@esbuild/win32-ia32": "0.28.2", - "@esbuild/win32-x64": "0.28.2" + "dependencies": { + "@types/unist": "*" } }, - "site/node_modules/astro/node_modules/esbuild/node_modules/@esbuild/aix-ppc64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz", - "integrity": "sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } + "site/node_modules/astro/node_modules/shiki/node_modules/@types/hast/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" }, - "site/node_modules/astro/node_modules/esbuild/node_modules/@esbuild/android-arm": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.2.tgz", - "integrity": "sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "site/node_modules/astro/node_modules/smol-toml": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.8.0.tgz", + "integrity": "sha512-kCZr2V3ch9i00x8zXRhjUNVcjG9ijES5dDudkXvUVCT5QlJNQWElSJdZqyPemffHoLNUYwOcou0Fy+ojN0uHSQ==", + "license": "BSD-3-Clause", "engines": { - "node": ">=18" + "node": ">= 18" + }, + "funding": { + "url": "https://github.com/sponsors/cyyynthia" } }, - "site/node_modules/astro/node_modules/esbuild/node_modules/@esbuild/android-arm64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.2.tgz", - "integrity": "sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==", - "cpu": [ - "arm64" - ], + "site/node_modules/astro/node_modules/svgo": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.1.0.tgz", + "integrity": "sha512-bkxnTg1kSU0guhIBmibA6UUhrQmPVA1XsQLN+ylCd+UWzbnLkySOcXpyk1mrl05f+pcaCx2eHb+sp6BgMZWX+Q==", "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "commander": "^11.1.0", + "css-select": "^6.0.0", + "css-tree": "^3.0.1", + "css-what": "^7.0.0", + "csso": "^5.0.5", + "picocolors": "^1.1.1", + "sax": "1.6.1" + }, + "bin": { + "svgo": "bin/svgo.js" + }, "engines": { - "node": ">=18" + "node": ">=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" } }, - "site/node_modules/astro/node_modules/esbuild/node_modules/@esbuild/android-x64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.2.tgz", - "integrity": "sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==", - "cpu": [ - "x64" - ], + "site/node_modules/astro/node_modules/svgo/node_modules/commander": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", "license": "MIT", - "optional": true, - "os": [ - "android" - ], "engines": { - "node": ">=18" + "node": ">=16" } }, - "site/node_modules/astro/node_modules/esbuild/node_modules/@esbuild/darwin-arm64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.2.tgz", - "integrity": "sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" + "site/node_modules/astro/node_modules/svgo/node_modules/css-select": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-6.0.0.tgz", + "integrity": "sha512-rZZVSLle8v0+EY8QAkDWrKhpgt6SA5OtHsgBnsj6ZaLb5dmDVOWUDtQitd9ydxxvEjhewNudS6eTVU7uOyzvXw==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^7.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "nth-check": "^2.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" } }, - "site/node_modules/astro/node_modules/esbuild/node_modules/@esbuild/darwin-x64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.2.tgz", - "integrity": "sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "site/node_modules/astro/node_modules/svgo/node_modules/css-select/node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "license": "ISC" + }, + "site/node_modules/astro/node_modules/svgo/node_modules/css-select/node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, "engines": { - "node": ">=18" + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" } }, - "site/node_modules/astro/node_modules/esbuild/node_modules/@esbuild/freebsd-arm64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.2.tgz", - "integrity": "sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" + "site/node_modules/astro/node_modules/svgo/node_modules/css-select/node_modules/domhandler/node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } ], - "engines": { - "node": ">=18" + "license": "BSD-2-Clause" + }, + "site/node_modules/astro/node_modules/svgo/node_modules/css-select/node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" } }, - "site/node_modules/astro/node_modules/esbuild/node_modules/@esbuild/freebsd-x64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.2.tgz", - "integrity": "sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==", - "cpu": [ - "x64" - ], + "site/node_modules/astro/node_modules/svgo/node_modules/css-select/node_modules/domutils/node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, - "site/node_modules/astro/node_modules/esbuild/node_modules/@esbuild/linux-arm": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.2.tgz", - "integrity": "sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "site/node_modules/astro/node_modules/svgo/node_modules/css-select/node_modules/domutils/node_modules/dom-serializer/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", "engines": { - "node": ">=18" + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "site/node_modules/astro/node_modules/esbuild/node_modules/@esbuild/linux-arm64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.2.tgz", - "integrity": "sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" + "site/node_modules/astro/node_modules/svgo/node_modules/css-select/node_modules/domutils/node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } ], - "engines": { - "node": ">=18" + "license": "BSD-2-Clause" + }, + "site/node_modules/astro/node_modules/svgo/node_modules/css-select/node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "site/node_modules/astro/node_modules/esbuild/node_modules/@esbuild/linux-ia32": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.2.tgz", - "integrity": "sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==", - "cpu": [ - "ia32" - ], + "site/node_modules/astro/node_modules/svgo/node_modules/css-tree": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", + "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "mdn-data": "2.27.1", + "source-map-js": "^1.2.1" + }, "engines": { - "node": ">=18" + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" } }, - "site/node_modules/astro/node_modules/esbuild/node_modules/@esbuild/linux-loong64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.2.tgz", - "integrity": "sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==", - "cpu": [ - "loong64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "site/node_modules/astro/node_modules/svgo/node_modules/css-tree/node_modules/mdn-data": { + "version": "2.27.1", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", + "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", + "license": "CC0-1.0" + }, + "site/node_modules/astro/node_modules/svgo/node_modules/css-tree/node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", "engines": { - "node": ">=18" + "node": ">=0.10.0" } }, - "site/node_modules/astro/node_modules/esbuild/node_modules/@esbuild/linux-mips64el": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.2.tgz", - "integrity": "sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==", - "cpu": [ - "mips64el" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "site/node_modules/astro/node_modules/svgo/node_modules/css-what": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-7.0.0.tgz", + "integrity": "sha512-wD5oz5xibMOPHzy13CyGmogB3phdvcDaB5t0W/Nr5Z2O/agcB8YwOz6e2Lsp10pNDzBoDO9nVa3RGs/2BttpHQ==", + "license": "BSD-2-Clause", "engines": { - "node": ">=18" + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" } }, - "site/node_modules/astro/node_modules/esbuild/node_modules/@esbuild/linux-ppc64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.2.tgz", - "integrity": "sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==", - "cpu": [ - "ppc64" - ], + "site/node_modules/astro/node_modules/svgo/node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "css-tree": "~2.2.0" + }, "engines": { - "node": ">=18" + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" } }, - "site/node_modules/astro/node_modules/esbuild/node_modules/@esbuild/linux-riscv64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.2.tgz", - "integrity": "sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==", - "cpu": [ - "riscv64" - ], + "site/node_modules/astro/node_modules/svgo/node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, "engines": { - "node": ">=18" + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" } }, - "site/node_modules/astro/node_modules/esbuild/node_modules/@esbuild/linux-s390x": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.2.tgz", - "integrity": "sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==", - "cpu": [ - "s390x" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "site/node_modules/astro/node_modules/svgo/node_modules/csso/node_modules/css-tree/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "license": "CC0-1.0" + }, + "site/node_modules/astro/node_modules/svgo/node_modules/csso/node_modules/css-tree/node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", "engines": { - "node": ">=18" + "node": ">=0.10.0" } }, - "site/node_modules/astro/node_modules/esbuild/node_modules/@esbuild/linux-x64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.2.tgz", - "integrity": "sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "site/node_modules/astro/node_modules/svgo/node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "site/node_modules/astro/node_modules/svgo/node_modules/sax": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.1.tgz", + "integrity": "sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==", + "license": "BlueOak-1.0.0", "engines": { - "node": ">=18" + "node": ">=11.0.0" } }, - "site/node_modules/astro/node_modules/esbuild/node_modules/@esbuild/netbsd-arm64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.2.tgz", - "integrity": "sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==", - "cpu": [ - "arm64" - ], + "site/node_modules/astro/node_modules/tinyclip": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/tinyclip/-/tinyclip-0.1.15.tgz", + "integrity": "sha512-uo33abH+Ays0xYaDysoBt494Hb3hsEczMpcC0MwFl773pazORx4fmvKhclhR1wonUbB6vvpRsvVMwnhfqeMc+A==", "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], "engines": { - "node": ">=18" + "node": "^16.14.0 || >= 17.3.0" } }, - "site/node_modules/astro/node_modules/esbuild/node_modules/@esbuild/netbsd-x64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.2.tgz", - "integrity": "sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==", - "cpu": [ - "x64" - ], + "site/node_modules/astro/node_modules/tinyexec": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.3.1.tgz", + "integrity": "sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA==", "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], "engines": { "node": ">=18" } }, - "site/node_modules/astro/node_modules/esbuild/node_modules/@esbuild/openbsd-arm64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.2.tgz", - "integrity": "sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==", - "cpu": [ - "arm64" - ], + "site/node_modules/astro/node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, "engines": { - "node": ">=18" + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" } }, - "site/node_modules/astro/node_modules/esbuild/node_modules/@esbuild/openbsd-x64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.2.tgz", - "integrity": "sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==", - "cpu": [ - "x64" - ], + "site/node_modules/astro/node_modules/tinyglobby/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", - "optional": true, - "os": [ - "openbsd" - ], "engines": { - "node": ">=18" + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } } }, - "site/node_modules/astro/node_modules/esbuild/node_modules/@esbuild/openharmony-arm64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.2.tgz", - "integrity": "sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==", - "cpu": [ - "arm64" - ], + "site/node_modules/astro/node_modules/ultrahtml": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ultrahtml/-/ultrahtml-1.7.0.tgz", + "integrity": "sha512-2xRd0VHoAQE4M+vF/DvFFB7pUV0ZxTW1TLi7lHQWnF/Sb5TPeEUV/l+hxcNnGO00ZXGnR0voCMmYRKQf+rvJ2g==", + "license": "MIT" + }, + "site/node_modules/astro/node_modules/unifont": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/unifont/-/unifont-0.7.5.tgz", + "integrity": "sha512-ULe/Cs+ZIsq+dcFofNkhqielCrUJnb5mr+Yc4EBM2VlL+6OZR6+cjtI2mT1bJvRBrVncqHAbLURxmPLcCXzWMg==", "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" + "dependencies": { + "css-tree": "^3.1.0", + "ohash": "^2.0.11", + "undici": "^8.0.0" } }, - "site/node_modules/astro/node_modules/esbuild/node_modules/@esbuild/sunos-x64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.2.tgz", - "integrity": "sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==", - "cpu": [ - "x64" - ], + "site/node_modules/astro/node_modules/unifont/node_modules/css-tree": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", + "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], + "dependencies": { + "mdn-data": "2.27.1", + "source-map-js": "^1.2.1" + }, "engines": { - "node": ">=18" + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" } }, - "site/node_modules/astro/node_modules/esbuild/node_modules/@esbuild/win32-arm64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.2.tgz", - "integrity": "sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "site/node_modules/astro/node_modules/unifont/node_modules/css-tree/node_modules/mdn-data": { + "version": "2.27.1", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", + "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", + "license": "CC0-1.0" + }, + "site/node_modules/astro/node_modules/unifont/node_modules/css-tree/node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", "engines": { - "node": ">=18" + "node": ">=0.10.0" } }, - "site/node_modules/astro/node_modules/esbuild/node_modules/@esbuild/win32-ia32": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.2.tgz", - "integrity": "sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==", - "cpu": [ - "ia32" - ], + "site/node_modules/astro/node_modules/unifont/node_modules/ohash": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.12.tgz", + "integrity": "sha512-65S/5gk9YSsaRjcyf7Nfa6h/d3E8/1gslpXfI4W7Dxn/oap8IKRuNT5VXkLQ1YFKIEg4apRY4Pj6aiwFzrDdmw==", + "license": "MIT" + }, + "site/node_modules/astro/node_modules/unifont/node_modules/undici": { + "version": "8.10.2", + "resolved": "https://registry.npmjs.org/undici/-/undici-8.10.2.tgz", + "integrity": "sha512-/y4/bH9YNU5hi9NIrpOuvGXFcxrj3CMrV+/AYpowAYTpHn8gX/XPFjNy766FPoYY0miQhdW977JFWKGNhBdwyQ==", "license": "MIT", - "optional": true, - "os": [ - "win32" - ], "engines": { - "node": ">=18" + "node": ">=22.19.0" } }, - "site/node_modules/astro/node_modules/esbuild/node_modules/@esbuild/win32-x64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.2.tgz", - "integrity": "sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==", - "cpu": [ - "x64" - ], + "site/node_modules/astro/node_modules/unstorage": { + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.17.5.tgz", + "integrity": "sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg==", "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "anymatch": "^3.1.3", + "chokidar": "^5.0.0", + "destr": "^2.0.5", + "h3": "^1.15.10", + "lru-cache": "^11.2.7", + "node-fetch-native": "^1.6.7", + "ofetch": "^1.5.1", + "ufo": "^1.6.3" + }, + "peerDependencies": { + "@azure/app-configuration": "^1.8.0", + "@azure/cosmos": "^4.2.0", + "@azure/data-tables": "^13.3.0", + "@azure/identity": "^4.6.0", + "@azure/keyvault-secrets": "^4.9.0", + "@azure/storage-blob": "^12.26.0", + "@capacitor/preferences": "^6 || ^7 || ^8", + "@deno/kv": ">=0.9.0", + "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", + "@planetscale/database": "^1.19.0", + "@upstash/redis": "^1.34.3", + "@vercel/blob": ">=0.27.1", + "@vercel/functions": "^2.2.12 || ^3.0.0", + "@vercel/kv": "^1 || ^2 || ^3", + "aws4fetch": "^1.0.20", + "db0": ">=0.2.1", + "idb-keyval": "^6.2.1", + "ioredis": "^5.4.2", + "uploadthing": "^7.4.4" + }, + "peerDependenciesMeta": { + "@azure/app-configuration": { + "optional": true + }, + "@azure/cosmos": { + "optional": true + }, + "@azure/data-tables": { + "optional": true + }, + "@azure/identity": { + "optional": true + }, + "@azure/keyvault-secrets": { + "optional": true + }, + "@azure/storage-blob": { + "optional": true + }, + "@capacitor/preferences": { + "optional": true + }, + "@deno/kv": { + "optional": true + }, + "@netlify/blobs": { + "optional": true + }, + "@planetscale/database": { + "optional": true + }, + "@upstash/redis": { + "optional": true + }, + "@vercel/blob": { + "optional": true + }, + "@vercel/functions": { + "optional": true + }, + "@vercel/kv": { + "optional": true + }, + "aws4fetch": { + "optional": true + }, + "db0": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "ioredis": { + "optional": true + }, + "uploadthing": { + "optional": true + } + } + }, + "site/node_modules/astro/node_modules/unstorage/node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, "engines": { - "node": ">=18" + "node": ">= 8" } }, - "site/node_modules/astro/node_modules/find-proc": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/find-proc/-/find-proc-0.2.0.tgz", - "integrity": "sha512-a6h2nTrgB3g5Wrn4au9Ux4kMk7IJtyF6oA8uGn+mk3weLZssUtc1cp6meHIzzuW2o1srrBAxzkmXLbqjRkgB6w==", + "site/node_modules/astro/node_modules/unstorage/node_modules/anymatch/node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "license": "MIT", "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=0.10.0" } }, - "site/node_modules/astro/node_modules/flattie": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flattie/-/flattie-1.1.1.tgz", - "integrity": "sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==", + "site/node_modules/astro/node_modules/unstorage/node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "license": "MIT", "engines": { - "node": ">=8" + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "site/node_modules/astro/node_modules/fontace": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/fontace/-/fontace-0.4.1.tgz", - "integrity": "sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw==", + "site/node_modules/astro/node_modules/unstorage/node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", "license": "MIT", "dependencies": { - "fontkitten": "^1.0.2" + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "site/node_modules/astro/node_modules/fontace/node_modules/fontkitten": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fontkitten/-/fontkitten-1.0.3.tgz", - "integrity": "sha512-Wp1zXWPVUPBmfoa3Cqc9ctaKuzKAV6uLstRqlR56kSjplf5uAce+qeyYym7F+PHbGTk+tCEdkCW6RD7DX/gBZw==", + "site/node_modules/astro/node_modules/unstorage/node_modules/chokidar/node_modules/readdirp": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.1.1.tgz", + "integrity": "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==", "license": "MIT", - "dependencies": { - "tiny-inflate": "^1.0.3" - }, "engines": { - "node": ">=20" + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, - "site/node_modules/astro/node_modules/fontace/node_modules/fontkitten/node_modules/tiny-inflate": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", - "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", + "site/node_modules/astro/node_modules/unstorage/node_modules/destr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", + "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==", + "license": "MIT" + }, + "site/node_modules/astro/node_modules/unstorage/node_modules/h3": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.11.tgz", + "integrity": "sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==", + "license": "MIT", + "dependencies": { + "cookie-es": "^1.2.3", + "crossws": "^0.3.5", + "defu": "^6.1.6", + "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" + } + }, + "site/node_modules/astro/node_modules/unstorage/node_modules/h3/node_modules/cookie-es": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.2.3.tgz", + "integrity": "sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==", "license": "MIT" }, - "site/node_modules/astro/node_modules/get-tsconfig": { - "version": "5.0.0-beta.4", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-5.0.0-beta.4.tgz", - "integrity": "sha512-7nF7C9fIPFEMHgEMEfgIlO9wDdZ8CyHw27rWciFZfHvHDReIiPhsYuzPRXsfvBCqFy1l8RRyyWV7QLM+ZhUJsQ==", + "site/node_modules/astro/node_modules/unstorage/node_modules/h3/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==", "license": "MIT", "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "engines": { - "node": ">=20.20.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + "uncrypto": "^0.1.3" } }, - "site/node_modules/astro/node_modules/get-tsconfig/node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "site/node_modules/astro/node_modules/unstorage/node_modules/h3/node_modules/defu": { + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz", + "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==", + "license": "MIT" + }, + "site/node_modules/astro/node_modules/unstorage/node_modules/h3/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==", "license": "MIT", "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + "url": "https://github.com/sponsors/brc-dd" } }, - "site/node_modules/astro/node_modules/github-slugger": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", - "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==", - "license": "ISC" + "site/node_modules/astro/node_modules/unstorage/node_modules/h3/node_modules/node-mock-http": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/node-mock-http/-/node-mock-http-1.0.5.tgz", + "integrity": "sha512-KQyt/wLjG3TAc7DOUhpqWzgd4ERxR80JOlTK5VE5R1S12IaPVN5qkj4klBce9HPG1Njuup4Sb5bljaT34lIyjw==", + "license": "MIT" }, - "site/node_modules/astro/node_modules/html-escaper": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-3.0.3.tgz", - "integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==", + "site/node_modules/astro/node_modules/unstorage/node_modules/h3/node_modules/radix3": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz", + "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==", "license": "MIT" }, - "site/node_modules/astro/node_modules/http-cache-semantics": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", - "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", - "license": "BSD-2-Clause" + "site/node_modules/astro/node_modules/unstorage/node_modules/h3/node_modules/uncrypto": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/uncrypto/-/uncrypto-0.1.3.tgz", + "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==", + "license": "MIT" }, - "site/node_modules/astro/node_modules/js-yaml": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz", - "integrity": "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/puzrin" - }, - { - "type": "github", - "url": "https://github.com/sponsors/nodeca" - } - ], - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "site/node_modules/astro/node_modules/unstorage/node_modules/lru-cache": { + "version": "11.5.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.3.tgz", + "integrity": "sha512-U4N8FgzmWxc8k1VH8Kr6lQg18U7Fjvby6wXHVRX/ZZ7IwWbRMgrRbP0Wrb5q5NVinryp4SQampHKdvtecItxUg==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" } }, - "site/node_modules/astro/node_modules/js-yaml/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" - }, - "site/node_modules/astro/node_modules/jsonc-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", - "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "site/node_modules/astro/node_modules/unstorage/node_modules/node-fetch-native": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz", + "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==", "license": "MIT" }, - "site/node_modules/astro/node_modules/magic-string": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-1.4.1.tgz", - "integrity": "sha512-8lyCu36ErXR0J9uaGKlKQoiLZKmtI63YGLE8G2o9jyRPdr4X47LusSOwgOJOzcVtp81fTAAjxR7BwKz682Jhow==", + "site/node_modules/astro/node_modules/unstorage/node_modules/ofetch": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.5.1.tgz", + "integrity": "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==", "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.6.0" + "destr": "^2.0.5", + "node-fetch-native": "^1.6.7", + "ufo": "^1.6.1" } }, - "site/node_modules/astro/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", - "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", + "site/node_modules/astro/node_modules/unstorage/node_modules/ufo": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.4.tgz", + "integrity": "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==", "license": "MIT" }, - "site/node_modules/astro/node_modules/magicast": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.5.tgz", - "integrity": "sha512-UicdXN8zQ3JHlxVq+28afMXPr1z7WNY6+7EJnzTdQWkTAlMLF5fNCCKxJHBQwGaNGR11581EiQmQzx73+MvszA==", + "site/node_modules/astro/node_modules/verkit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/verkit/-/verkit-0.4.1.tgz", + "integrity": "sha512-mMVzj0TXExtVdlDEq+Mzp0eyOuyznNpFobNM3uAqe3HVm/Ps2c+u17BligMkZjZCA6EiXpoon8iRTer3iu40SQ==", "license": "MIT", - "dependencies": { - "@babel/parser": "^7.29.7", - "@babel/types": "^7.29.7", - "source-map-js": "^1.2.1" + "engines": { + "node": ">=18.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" } }, - "site/node_modules/astro/node_modules/magicast/node_modules/@babel/parser": { - "version": "7.29.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.9.tgz", - "integrity": "sha512-CjXrNHTnvqBVqHgdBysY3vk2T8tpJHb5/RMeHJBTyVa9xgugCB0CJTx/3oO8RV2QRQP391RWpB7D6hLjm8V9uA==", + "site/node_modules/astro/node_modules/vite": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.3.0.tgz", + "integrity": "sha512-lhZBVvEHefgE+HQZC9O7EBJgCU/nVzFNl7vkS4RE0APtWLP02/8QVIkQtzBxPquh7lq5/78NHipTj7ODQ6XuyQ==", "license": "MIT", "dependencies": { - "@babel/types": "^7.29.8" + "lightningcss": "^1.33.0", + "picomatch": "^4.0.7", + "postcss": "^8.5.28", + "rolldown": "~1.2.6", + "tinyglobby": "^0.2.17" }, "bin": { - "parser": "bin/babel-parser.js" + "vite": "bin/vite.js" }, "engines": { - "node": ">=6.0.0" + "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", + "@vitejs/devtools": "^0.7.1", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.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 + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "site/node_modules/astro/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", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "site/node_modules/astro/node_modules/vite/node_modules/lightningcss": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", + "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", + "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.33.0", + "lightningcss-darwin-arm64": "1.33.0", + "lightningcss-darwin-x64": "1.33.0", + "lightningcss-freebsd-x64": "1.33.0", + "lightningcss-linux-arm-gnueabihf": "1.33.0", + "lightningcss-linux-arm64-gnu": "1.33.0", + "lightningcss-linux-arm64-musl": "1.33.0", + "lightningcss-linux-x64-gnu": "1.33.0", + "lightningcss-linux-x64-musl": "1.33.0", + "lightningcss-win32-arm64-msvc": "1.33.0", + "lightningcss-win32-x64-msvc": "1.33.0" } }, - "site/node_modules/astro/node_modules/magicast/node_modules/@babel/types": { - "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", - "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.29.7", - "@babel/helper-validator-identifier": "^7.29.7" - }, + "site/node_modules/astro/node_modules/vite/node_modules/lightningcss/node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", "engines": { - "node": ">=6.9.0" + "node": ">=8" } }, - "site/node_modules/astro/node_modules/magicast/node_modules/@babel/types/node_modules/@babel/helper-string-parser": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", - "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", - "license": "MIT", + "site/node_modules/astro/node_modules/vite/node_modules/lightningcss/node_modules/lightningcss-android-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", + "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=6.9.0" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "site/node_modules/astro/node_modules/magicast/node_modules/@babel/types/node_modules/@babel/helper-validator-identifier": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", - "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", - "license": "MIT", + "site/node_modules/astro/node_modules/vite/node_modules/lightningcss/node_modules/lightningcss-darwin-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", + "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=6.9.0" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "site/node_modules/astro/node_modules/magicast/node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "license": "BSD-3-Clause", + "site/node_modules/astro/node_modules/vite/node_modules/lightningcss/node_modules/lightningcss-darwin-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", + "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=0.10.0" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "site/node_modules/astro/node_modules/mrmime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", - "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", - "license": "MIT", + "site/node_modules/astro/node_modules/vite/node_modules/lightningcss/node_modules/lightningcss-freebsd-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", + "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=10" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "site/node_modules/astro/node_modules/neotraverse": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/neotraverse/-/neotraverse-1.0.1.tgz", - "integrity": "sha512-WmmLty1YWwJl9yZi77v2dVIV6X2kuYV8YYBI/G3LWGKdGHmHUvL1z7FW0iDvEvGAwNEoc5x1tOOOyDnf5jJw/w==", - "license": "MIT", + "site/node_modules/astro/node_modules/vite/node_modules/lightningcss/node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", + "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 10" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "site/node_modules/astro/node_modules/obug": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/obug/-/obug-2.2.1.tgz", - "integrity": "sha512-XrsrhT5sybtKI6wakr2SPOlGZWWYbUXZ7a0jT8/QOeAPau+1X/bSegNe5YR75oJmEZQbKningirmGOEJCIk61Q==", - "funding": [ - "https://github.com/sponsors/sxzz", - "https://opencollective.com/debug" + "site/node_modules/astro/node_modules/vite/node_modules/lightningcss/node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", + "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" ], - "license": "MIT", "engines": { - "node": ">=12.20.0" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "site/node_modules/astro/node_modules/p-limit": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-7.3.3.tgz", - "integrity": "sha512-SKgVvDU5TNIxQ4r30U75BNLC6a+6GOEjngrk/ysM5+Zu3oJuk1SC5ApzIzY/7PjCEjoVPMWJ0zho/4QUiEB7TQ==", - "license": "MIT", - "dependencies": { - "yocto-queue": "^1.2.1" - }, + "site/node_modules/astro/node_modules/vite/node_modules/lightningcss/node_modules/lightningcss-linux-arm64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", + "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=20" + "node": ">= 12.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "site/node_modules/astro/node_modules/p-limit/node_modules/yocto-queue": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", - "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", - "license": "MIT", + "site/node_modules/astro/node_modules/vite/node_modules/lightningcss/node_modules/lightningcss-linux-x64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", + "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=12.20" + "node": ">= 12.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "site/node_modules/astro/node_modules/p-queue": { - "version": "9.3.3", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-9.3.3.tgz", - "integrity": "sha512-NXAOdnEe5FsZJfT4oK84lE1Y5cFFdWlRuOo5tww8DyNMxyRXwn39fIkUtNLKppcPC+UYU/bXujNCUGDv01y7CA==", - "license": "MIT", - "dependencies": { - "eventemitter3": "^5.0.4", - "p-timeout": "^7.0.0" - }, + "site/node_modules/astro/node_modules/vite/node_modules/lightningcss/node_modules/lightningcss-linux-x64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", + "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=20" + "node": ">= 12.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "site/node_modules/astro/node_modules/p-queue/node_modules/eventemitter3": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", - "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", - "license": "MIT" - }, - "site/node_modules/astro/node_modules/p-queue/node_modules/p-timeout": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-7.0.2.tgz", - "integrity": "sha512-prbX4Z3YszrFNgH+MW5Zoeq3baXrMtP/MQnFeET90UB/GtGcGDQ5Usg9OCy6ETjTTntOw1SL2z9fMPUppN3Guw==", - "license": "MIT", + "site/node_modules/astro/node_modules/vite/node_modules/lightningcss/node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", + "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=20" + "node": ">= 12.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "site/node_modules/astro/node_modules/package-manager-detector": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.8.0.tgz", - "integrity": "sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A==", - "license": "MIT" - }, - "site/node_modules/astro/node_modules/piccolore": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/piccolore/-/piccolore-0.1.3.tgz", - "integrity": "sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw==", - "license": "ISC" - }, - "site/node_modules/astro/node_modules/picomatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", - "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", - "license": "MIT", + "site/node_modules/astro/node_modules/vite/node_modules/lightningcss/node_modules/lightningcss-win32-x64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", + "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=12" + "node": ">= 12.0.0" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "site/node_modules/astro/node_modules/shiki": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-4.4.3.tgz", - "integrity": "sha512-Mb/GvXPHBAXdgGIcnfU5L3ldpn1XcxrGkPHwqgRx17/I2XRfqlFKk2vGkHWINn1kdXvzJZeuO3is6I9KLPFm0g==", + "site/node_modules/astro/node_modules/vite/node_modules/postcss": { + "version": "8.5.28", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.28.tgz", + "integrity": "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", "dependencies": { - "@shikijs/core": "4.4.3", - "@shikijs/engine-javascript": "4.4.3", - "@shikijs/engine-oniguruma": "4.4.3", - "@shikijs/langs": "4.4.3", - "@shikijs/themes": "4.4.3", - "@shikijs/types": "4.4.3", - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.5" + "nanoid": "^3.3.18", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { - "node": ">=20" + "node": "^10 || ^12 || >=14" } }, - "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-4.4.3.tgz", - "integrity": "sha512-QCR4q2ZO/ILJEuwiBMel4wdcTDb1JGwfjKTxPDF6x8ixOaluPrVqIn06C99AcRPhmYlBR56d/Fb+GN58GzExpg==", + "site/node_modules/astro/node_modules/vite/node_modules/postcss/node_modules/nanoid": { + "version": "3.3.19", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.19.tgz", + "integrity": "sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", - "dependencies": { - "@shikijs/primitive": "4.4.3", - "@shikijs/types": "4.4.3", - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.5", - "hast-util-to-html": "^9.0.5" + "bin": { + "nanoid": "bin/nanoid.cjs" }, "engines": { - "node": ">=20" + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core/node_modules/@shikijs/primitive": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/@shikijs/primitive/-/primitive-4.4.3.tgz", - "integrity": "sha512-m0wBeLDQDeIxRdUmrCPdQqfuUamDwRL5isCfYbguKD6NiaKpVbsv+3J81DyIKgNW5h4WAIIr8T4EkgQrBBxvaQ==", - "license": "MIT", - "dependencies": { - "@shikijs/types": "4.4.3", - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.5" - }, + "site/node_modules/astro/node_modules/vite/node_modules/postcss/node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "site/node_modules/astro/node_modules/vite/node_modules/postcss/node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", "engines": { - "node": ">=20" + "node": ">=0.10.0" } }, - "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core/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==", + "site/node_modules/astro/node_modules/vite/node_modules/rolldown": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.9.tgz", + "integrity": "sha512-hx/Pv0N1haXRb11qkfnK5MXB/iqr7i0yjWQqmO9uHqZpBgQSqzc8UsSnEpalsh+j1I8qQ2CkXAkJC8Br3dKSlg==", "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" + "@oxc-project/types": "=0.150.0", + "@rolldown/pluginutils": "^1.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core/node_modules/hast-util-to-html/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" - }, - "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core/node_modules/hast-util-to-html/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" - } - }, - "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core/node_modules/hast-util-to-html/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" + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm-eabi": "1.2.9", + "@rolldown/binding-android-arm64": "1.2.9", + "@rolldown/binding-darwin-arm64": "1.2.9", + "@rolldown/binding-darwin-x64": "1.2.9", + "@rolldown/binding-freebsd-x64": "1.2.9", + "@rolldown/binding-linux-arm-gnueabihf": "1.2.9", + "@rolldown/binding-linux-arm64-gnu": "1.2.9", + "@rolldown/binding-linux-arm64-musl": "1.2.9", + "@rolldown/binding-linux-ppc64-gnu": "1.2.9", + "@rolldown/binding-linux-s390x-gnu": "1.2.9", + "@rolldown/binding-linux-x64-gnu": "1.2.9", + "@rolldown/binding-linux-x64-musl": "1.2.9", + "@rolldown/binding-openharmony-arm64": "1.2.9", + "@rolldown/binding-win32-arm64-msvc": "1.2.9", + "@rolldown/binding-win32-x64-msvc": "1.2.9" } }, - "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core/node_modules/hast-util-to-html/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==", + "site/node_modules/astro/node_modules/vite/node_modules/rolldown/node_modules/@oxc-project/types": { + "version": "0.150.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.150.0.tgz", + "integrity": "sha512-rDS5/31E9HfPl/CIzGrn0DOlvBbXFseQ5URJ9sYMfstbKLD/c6Gm9vmRzRGDdAXyOIL4zmO37lc9RIwYqVruZw==", "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/oxc-project" } }, - "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core/node_modules/hast-util-to-html/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==", + "site/node_modules/astro/node_modules/vite/node_modules/rolldown/node_modules/@rolldown/binding-android-arm-eabi": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.9.tgz", + "integrity": "sha512-tNISae1QEf/vkb3xkRcjV5SEdzPE97We5IVaa2Z8jSszQPZ8U60B/YCYpw4QI7VidYsBtKavczXf+DyDs9WGxw==", + "cpu": [ + "arm" + ], "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core/node_modules/hast-util-to-html/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==", + "site/node_modules/astro/node_modules/vite/node_modules/rolldown/node_modules/@rolldown/binding-android-arm64": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.9.tgz", + "integrity": "sha512-YC8YsI30o606GTZi0VyzYlsDKFP8W61i/QzayHDkLbNEz/IShqAmTa+hsJRj13xTHA0H+6fk4b2UmGn+Q/cMlg==", + "cpu": [ + "arm64" + ], "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" + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core/node_modules/hast-util-to-html/node_modules/mdast-util-to-hast/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==", + "site/node_modules/astro/node_modules/vite/node_modules/rolldown/node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.9.tgz", + "integrity": "sha512-IwhlH3qK5urrY8hZiEgGkHKEFN901p/p2bjxCxJlr4GyNnF7wYpUvK+Y43uaRYuC4hpfjzbR3SJC3arX1jGvmw==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "@types/unist": "*" + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core/node_modules/hast-util-to-html/node_modules/mdast-util-to-hast/node_modules/@ungap/structured-clone": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.4.0.tgz", - "integrity": "sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ==", - "license": "ISC" - }, - "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core/node_modules/hast-util-to-html/node_modules/mdast-util-to-hast/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==", + "site/node_modules/astro/node_modules/vite/node_modules/rolldown/node_modules/@rolldown/binding-darwin-x64": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.9.tgz", + "integrity": "sha512-XxpJfVzFh+jilRxIXUqcfYAYcunIc/XEzIizsOL1fcJee5Sf7H3mH8WlLmfHfluz5amqR88QQo9izKtmMlavAw==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "dequal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core/node_modules/hast-util-to-html/node_modules/mdast-util-to-hast/node_modules/devlop/node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "site/node_modules/astro/node_modules/vite/node_modules/rolldown/node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.9.tgz", + "integrity": "sha512-kSfvhmgeWyfkbT3p/1s5vSgboogoah2zkm9fX2zjg2hHxSV7T4KhMWRUUaRk4OXNqoD3QAUeRqLcs1aZOK4U1g==", + "cpu": [ + "x64" + ], "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=6" + "node": "^20.19.0 || >=22.12.0" } }, - "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core/node_modules/hast-util-to-html/node_modules/mdast-util-to-hast/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" - } + "site/node_modules/astro/node_modules/vite/node_modules/rolldown/node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.9.tgz", + "integrity": "sha512-1RVzG17pxqbTfYLC352JlLt6kKLG+6Hr30n8DlIJqsnV5luUDd2Qdx9Ayw1Cabfyb1K9k0jXEZ7evxkRoT+uiw==", + "cpu": [ + "arm" ], "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-symbol": "^2.0.0" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core/node_modules/hast-util-to-html/node_modules/mdast-util-to-hast/node_modules/micromark-util-sanitize-uri/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" - } + "site/node_modules/astro/node_modules/vite/node_modules/rolldown/node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.9.tgz", + "integrity": "sha512-BXqPvZ2drqVD+/Z8UpKwcs4Mp7grM+eGFku4CAEKrEtcbAsUpzREphK1sogCRZGreVPiMkiiBtw0n3TPteuqvw==", + "cpu": [ + "arm64" ], "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core/node_modules/hast-util-to-html/node_modules/mdast-util-to-hast/node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-character/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" - } + "site/node_modules/astro/node_modules/vite/node_modules/rolldown/node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.9.tgz", + "integrity": "sha512-11vWvo8YDwLzukt27J3aYDWU+gg2P7J+ZOmiJ0hkF5BXZDW7pVya7r40MXDy6ya0i9KamoENSVKIugvJNgFXIA==", + "cpu": [ + "arm64" ], - "license": "MIT" - }, - "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core/node_modules/hast-util-to-html/node_modules/mdast-util-to-hast/node_modules/micromark-util-sanitize-uri/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", + "optional": true, + "os": [ + "linux" ], - "license": "MIT" + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core/node_modules/hast-util-to-html/node_modules/mdast-util-to-hast/node_modules/micromark-util-sanitize-uri/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" - } + "site/node_modules/astro/node_modules/vite/node_modules/rolldown/node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.9.tgz", + "integrity": "sha512-a1tijMkdwsIARtc0F39ApURROkf3NwqinI6TOiSSWCTR7dT96dffNvMUtDHnq64wKNTIZOIlzKrFvvFUznJiyw==", + "cpu": [ + "ppc64" ], - "license": "MIT" - }, - "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core/node_modules/hast-util-to-html/node_modules/mdast-util-to-hast/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" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core/node_modules/hast-util-to-html/node_modules/mdast-util-to-hast/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==", + "site/node_modules/astro/node_modules/vite/node_modules/rolldown/node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.9.tgz", + "integrity": "sha512-x6SQNdAvv4c3hWqTMaWuawzMX9myaCs/yEmlGsxJzkdClnHW7FbrjQuSiRDhuSYzEYoEMhsaJy9qHG/XNemJPQ==", + "cpu": [ + "s390x" + ], "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core/node_modules/hast-util-to-html/node_modules/mdast-util-to-hast/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==", + "site/node_modules/astro/node_modules/vite/node_modules/rolldown/node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.9.tgz", + "integrity": "sha512-9s0AZ8BFK5/n7B/TBoa2yJE3gI3KURrbXcPBlsAsvjU4VeJKgE90y1YtNxyEUIcHPQkg6/yfF3qihUrcM/Kf0Q==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } - }, - "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core/node_modules/hast-util-to-html/node_modules/mdast-util-to-hast/node_modules/unist-util-visit/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==", + }, + "site/node_modules/astro/node_modules/vite/node_modules/rolldown/node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.9.tgz", + "integrity": "sha512-P7VWAmV+WdJluH7ovnRGoiv2i8To7GAZ+kGzfGup635cyL7SyYl3lSUaA3Gp5THf0n/Co5EyEqb2zbqq+nMOHQ==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core/node_modules/hast-util-to-html/node_modules/mdast-util-to-hast/node_modules/unist-util-visit/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==", + "site/node_modules/astro/node_modules/vite/node_modules/rolldown/node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.9.tgz", + "integrity": "sha512-1qixtsE4BK8h+yS3BfmZ09UhA7O/N4IACva6YBr7EBvCJraByTuRcgOTaiA62Tm0vey3UcKXLOaoGHtYmNGEVg==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core/node_modules/hast-util-to-html/node_modules/mdast-util-to-hast/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==", + "site/node_modules/astro/node_modules/vite/node_modules/rolldown/node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.9.tgz", + "integrity": "sha512-ok8IQjcEPs1AKZfuEUznVBrJw+gK4soq+bx8b1X2XoMqVClarc1q5JDmVtWXY1xfr6ZuHTAsPXHTgTrqKTZeww==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core/node_modules/hast-util-to-html/node_modules/mdast-util-to-hast/node_modules/vfile/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==", + "site/node_modules/astro/node_modules/vite/node_modules/rolldown/node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.9.tgz", + "integrity": "sha512-Ip2mXoU0hM0boq3Rf+ekuT653OROSo6aSYcPT1VHE4q52KvyxgFkQgrgb/IEsxOuvQ2fZZbs8khJAyCEPM24/g==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core/node_modules/hast-util-to-html/node_modules/mdast-util-to-hast/node_modules/vfile/node_modules/vfile-message/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==", + "site/node_modules/astro/node_modules/vite/node_modules/rolldown/node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "license": "MIT" + }, + "site/node_modules/astro/node_modules/vitefu": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.3.tgz", + "integrity": "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==", "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" + "workspaces": [ + "tests/deps/*", + "tests/projects/*", + "tests/projects/workspace/packages/*" + ], + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "peerDependenciesMeta": { + "vite": { + "optional": true + } } }, - "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core/node_modules/hast-util-to-html/node_modules/property-information": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.2.0.tgz", - "integrity": "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "site/node_modules/astro/node_modules/xxhash-wasm": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-1.1.0.tgz", + "integrity": "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==", + "license": "MIT" + }, + "site/node_modules/astro/node_modules/yargs-parser": { + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", + "license": "ISC", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" } }, - "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core/node_modules/hast-util-to-html/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==", + "site/node_modules/astro/node_modules/zod": { + "version": "4.6.5", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.6.5.tgz", + "integrity": "sha512-v5l/aFXZQeai4awLbOpSoHecE9UiMrnfx75tEXLjNonXVARxQ5mOeipTjROUchszUNCqnE+hqAMujRsRHsut2Q==", "license": "MIT", "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "url": "https://github.com/sponsors/colinhacks" } }, - "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core/node_modules/hast-util-to-html/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", + "site/node_modules/sharp": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.35.4.tgz", + "integrity": "sha512-n++8XWcj+jCOr2IOl7h8LbKnGBDY4aPbmprMONBNFdn0ImXqpGVv5zliDs0V9HbmbCQLpbuo2ej9rAoOQTvMDA==", + "license": "Apache-2.0", "dependencies": { - "character-entities-html4": "^2.0.0", - "character-entities-legacy": "^3.0.0" + "@img/colour": "^1.1.0", + "detect-libc": "^2.1.2", + "semver": "^7.8.5" + }, + "engines": { + "node": ">=20.9.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.35.4", + "@img/sharp-darwin-x64": "0.35.4", + "@img/sharp-freebsd-wasm32": "0.35.4", + "@img/sharp-libvips-darwin-arm64": "1.3.3", + "@img/sharp-libvips-darwin-x64": "1.3.3", + "@img/sharp-libvips-linux-arm": "1.3.3", + "@img/sharp-libvips-linux-arm64": "1.3.3", + "@img/sharp-libvips-linux-ppc64": "1.3.3", + "@img/sharp-libvips-linux-riscv64": "1.3.3", + "@img/sharp-libvips-linux-s390x": "1.3.3", + "@img/sharp-libvips-linux-x64": "1.3.3", + "@img/sharp-libvips-linuxmusl-arm64": "1.3.3", + "@img/sharp-libvips-linuxmusl-x64": "1.3.3", + "@img/sharp-linux-arm": "0.35.4", + "@img/sharp-linux-arm64": "0.35.4", + "@img/sharp-linux-ppc64": "0.35.4", + "@img/sharp-linux-riscv64": "0.35.4", + "@img/sharp-linux-s390x": "0.35.4", + "@img/sharp-linux-x64": "0.35.4", + "@img/sharp-linuxmusl-arm64": "0.35.4", + "@img/sharp-linuxmusl-x64": "0.35.4", + "@img/sharp-webcontainers-wasm32": "0.35.4", + "@img/sharp-win32-arm64": "0.35.4", + "@img/sharp-win32-ia32": "0.35.4", + "@img/sharp-win32-x64": "0.35.4" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core/node_modules/hast-util-to-html/node_modules/stringify-entities/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==", + "site/node_modules/sharp/node_modules/@img/colour": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", + "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "site/node_modules/sharp/node_modules/@img/sharp-darwin-arm64": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.35.4.tgz", + "integrity": "sha512-Uhfl4V4lhP2nbUVF9+hyH1+luj86f1gUFeo8ALYxFoULoU+G87D43BfeMP8XHsk9boxAnCY/bf2EHwhA7MuGsA==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=20.9.0" + }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.3.3" } }, - "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core/node_modules/hast-util-to-html/node_modules/stringify-entities/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", + "site/node_modules/sharp/node_modules/@img/sharp-darwin-x64": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.35.4.tgz", + "integrity": "sha512-hWniXY3bG5qKpkKrAwPe4y+VTPmf086YQAnkxWh7uA1YrlRouWGa0M0Mxj3ZjnXFkv7/TD1bTy9lGUK26vRvWw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=20.9.0" + }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.3.3" } }, - "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/core/node_modules/hast-util-to-html/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", + "site/node_modules/sharp/node_modules/@img/sharp-freebsd-wasm32": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-freebsd-wasm32/-/sharp-freebsd-wasm32-0.35.4.tgz", + "integrity": "sha512-lIsKw/BU+kjB4eZjxrYrZmwOJYi3Ajrv66iAlBmUPyKc3HpnloevB1g3wxGD9P/5BbQ1brBGl65VRRrCvQDEqA==", + "license": "Apache-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "dependencies": { + "@img/sharp-wasm32": "0.35.4" + }, + "engines": { + "node": ">=20.9.0" + }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "url": "https://opencollective.com/libvips" } }, - "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/engine-javascript": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-4.4.3.tgz", - "integrity": "sha512-FbOjFJp9VLdo1Wevs10BBtVxiTWwNLqZh5Gkhjgda/ioL15YOgeSl9n+6XMa3qRlPQzfhFNe641SrynFHYG0nQ==", - "license": "MIT", + "site/node_modules/sharp/node_modules/@img/sharp-freebsd-wasm32/node_modules/@img/sharp-wasm32": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.35.4.tgz", + "integrity": "sha512-zQnl4Kwp7Q6NHsENtU2T/00Zi+w3AQNwz3+UaTyVBy2FpXrzXzGjndpK61onhZjRtRpQXxCTeqw19bVyXOh7jA==", + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, "dependencies": { - "@shikijs/types": "4.4.3", - "@shikijs/vscode-textmate": "^10.0.2", - "oniguruma-to-es": "^4.3.6" + "@emnapi/runtime": "^1.11.3" }, "engines": { - "node": ">=20" + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" } }, - "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/engine-javascript/node_modules/oniguruma-to-es": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.6.tgz", - "integrity": "sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==", + "site/node_modules/sharp/node_modules/@img/sharp-freebsd-wasm32/node_modules/@img/sharp-wasm32/node_modules/@emnapi/runtime": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.3.tgz", + "integrity": "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==", "license": "MIT", + "optional": true, "dependencies": { - "oniguruma-parser": "^0.12.2", - "regex": "^6.1.0", - "regex-recursion": "^6.0.2" + "tslib": "^2.4.0" } }, - "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/engine-javascript/node_modules/oniguruma-to-es/node_modules/oniguruma-parser": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.2.tgz", - "integrity": "sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==", - "license": "MIT" + "site/node_modules/sharp/node_modules/@img/sharp-freebsd-wasm32/node_modules/@img/sharp-wasm32/node_modules/@emnapi/runtime/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD", + "optional": true }, - "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/engine-javascript/node_modules/oniguruma-to-es/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" + "site/node_modules/sharp/node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.3.3.tgz", + "integrity": "sha512-suTBPTDGrI9WodccaDdwZItTSaBYASlBk1NSfElSHrUfzu3szG6lvIF58+WiFvnfzuK8ZBFS5zE00PxqxnRiPg==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" } }, - "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/engine-javascript/node_modules/oniguruma-to-es/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" + "site/node_modules/sharp/node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.3.3.tgz", + "integrity": "sha512-FVJZ5mITMobmXIz/hPDTw0EintTW5H3WfrxwLqEqjiIihlu+hVRyGrFQ60xl0Lxn7Bt3zdpevPaQi0HEzqz9fw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" } }, - "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/engine-javascript/node_modules/oniguruma-to-es/node_modules/regex-recursion/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" + "site/node_modules/sharp/node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.3.3.tgz", + "integrity": "sha512-3rbU4vqXXc3hY/OiXdl52xZvT0F1yEngWfvqudtPJg/KkyiaQw2DRsFrNzpmLvfavbwOq3qXn36GP8obHRULQA==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } }, - "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/engine-javascript/node_modules/oniguruma-to-es/node_modules/regex/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" + "site/node_modules/sharp/node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.3.3.tgz", + "integrity": "sha512-0DaL0A6Xu6sQSQFwe4iVCrKWU2cCTItnRsYsCdxAMm9NF6twAA9BKnoqy4hqz4+azQ0JHuA26qiUKsf1XJ/v5A==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } }, - "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/engine-oniguruma": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-4.4.3.tgz", - "integrity": "sha512-EcOQkxdxGQrc1Row/cC2c96/v1dbZqGnEVu1qTuT/MJmp6+cXCvQussowVmCv5Tqr3KuY3c7IbM6HTW3LJ1k9w==", - "license": "MIT", - "dependencies": { - "@shikijs/types": "4.4.3", - "@shikijs/vscode-textmate": "^10.0.2" - }, - "engines": { - "node": ">=20" + "site/node_modules/sharp/node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.3.3.tgz", + "integrity": "sha512-cdn1OvUBwsXhbC0zSzJnNzf5MZ/mTrobawDvNXBTxe8VtqKAm0sRuEY2Evzovb/w9JMk4TvRxqt1mekSuJz64w==", + "cpu": [ + "ppc64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" } }, - "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/langs": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-4.4.3.tgz", - "integrity": "sha512-ePic0yfAJGOF83D5wBHK/00EjK65oahBYxFk5epgq33WRv7X9UuxLEV8PtR0szC0z8dl7INIpIodB99JRFlR+A==", - "license": "MIT", - "dependencies": { - "@shikijs/types": "4.4.3" - }, - "engines": { - "node": ">=20" + "site/node_modules/sharp/node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.3.3.tgz", + "integrity": "sha512-HjPVx7yKz+0lqdhDlTw1tt90wamBoxhiXpvl1XZpJLiHH4RCJ5yDTqH+VlYPv2fwFs89JFw4c1IexYOcQUi4IQ==", + "cpu": [ + "riscv64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" } }, - "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/themes": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-4.4.3.tgz", - "integrity": "sha512-w8UHjeUnIR965KMWJHUPXOc2mNJUnK3vpVLYLvw5IYU2mnTTJ89E24OrJDBNiJDQ0qzb0tc4l7mrIXx5cFeIyw==", - "license": "MIT", - "dependencies": { - "@shikijs/types": "4.4.3" - }, - "engines": { - "node": ">=20" + "site/node_modules/sharp/node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.3.3.tgz", + "integrity": "sha512-neWLh+3yCNThxnfy3c4BbVBeGgt9aftno+XbT56iK28RgeDs3UOFWviLWlUu0bArYVYJaFDK+RRohbicUNCm8Q==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" } }, - "site/node_modules/astro/node_modules/shiki/node_modules/@shikijs/types": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.4.3.tgz", - "integrity": "sha512-UEJxmRR++MAGR6hugn0vgVS2W/6lWAts84FFSrnlH9sP0LNol7E5+NQ792pH8liWUhyMyjhTgSUH3k7iD7tc5g==", - "license": "MIT", - "dependencies": { - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.5" - }, - "engines": { - "node": ">=20" + "site/node_modules/sharp/node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.3.3.tgz", + "integrity": "sha512-4vKmvAst9nrowcqquKFAyZJUDolUaIp8uRiN0mWFguJ1IplC9/pitXtlnnlU4aa/eJw3J7i67V+pwUL+wZGdsA==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" } }, - "site/node_modules/astro/node_modules/shiki/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" - }, - "site/node_modules/astro/node_modules/shiki/node_modules/@types/hast": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.5.tgz", - "integrity": "sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==", - "license": "MIT", - "dependencies": { - "@types/unist": "*" + "site/node_modules/sharp/node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.3.3.tgz", + "integrity": "sha512-Y9kQaLMuNoB0bPYOOdcZMaseNrFpPodIWWMrx+CZyydf2xn68j9WYc6sWWRrDwNkzCQjKYfc68L7jKjGlHMibw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" } }, - "site/node_modules/astro/node_modules/shiki/node_modules/@types/hast/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" + "site/node_modules/sharp/node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.3.3.tgz", + "integrity": "sha512-fj8Mv0HHfD1Rr+4I68+3agJynxDWtBFgicTbSOb9Bke6pIwzGcJ+RX/yHjmiEGFMCavY/dxvem7MyNaJF+wDiw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } }, - "site/node_modules/astro/node_modules/smol-toml": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.8.0.tgz", - "integrity": "sha512-kCZr2V3ch9i00x8zXRhjUNVcjG9ijES5dDudkXvUVCT5QlJNQWElSJdZqyPemffHoLNUYwOcou0Fy+ojN0uHSQ==", - "license": "BSD-3-Clause", + "site/node_modules/sharp/node_modules/@img/sharp-linux-arm": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.35.4.tgz", + "integrity": "sha512-7OAS8gI0EReKGVN2HssHlM6umJgxF5VI3xN0p9FA91p/YO+ou5hiNghLdZ5BEHztwaaK5+bLKRf8x/o2L2nk9A==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 18" + "node": ">=20.9.0" }, "funding": { - "url": "https://github.com/sponsors/cyyynthia" + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.3.3" } }, - "site/node_modules/astro/node_modules/svgo": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.1.0.tgz", - "integrity": "sha512-bkxnTg1kSU0guhIBmibA6UUhrQmPVA1XsQLN+ylCd+UWzbnLkySOcXpyk1mrl05f+pcaCx2eHb+sp6BgMZWX+Q==", - "license": "MIT", - "dependencies": { - "commander": "^11.1.0", - "css-select": "^6.0.0", - "css-tree": "^3.0.1", - "css-what": "^7.0.0", - "csso": "^5.0.5", - "picocolors": "^1.1.1", - "sax": "1.6.1" - }, - "bin": { - "svgo": "bin/svgo.js" - }, + "site/node_modules/sharp/node_modules/@img/sharp-linux-arm64": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.35.4.tgz", + "integrity": "sha512-De4jpEnAU8Hd5oT0j1G3uL4ZvTuipVMn7YC6vPaJhy6/7EwEae0SVAoBrUMYQbkLGDm85taVWwuPc1a44LTzCQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=16" + "node": ">=20.9.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/svgo" + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.3.3" } }, - "site/node_modules/astro/node_modules/svgo/node_modules/commander": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", - "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", - "license": "MIT", + "site/node_modules/sharp/node_modules/@img/sharp-linux-ppc64": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.35.4.tgz", + "integrity": "sha512-2oYZJeIl4kCcMGk4ouZVjnkCtFrpQFlNEtJ6GbxzhHQchwH0NH/qEb9ykmOl29dqwMq+JhFdZn+1ak2FKhI9fQ==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=16" + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.3.3" } }, - "site/node_modules/astro/node_modules/svgo/node_modules/css-select": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-6.0.0.tgz", - "integrity": "sha512-rZZVSLle8v0+EY8QAkDWrKhpgt6SA5OtHsgBnsj6ZaLb5dmDVOWUDtQitd9ydxxvEjhewNudS6eTVU7uOyzvXw==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^7.0.0", - "domhandler": "^5.0.3", - "domutils": "^3.2.2", - "nth-check": "^2.1.1" + "site/node_modules/sharp/node_modules/@img/sharp-linux-riscv64": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.35.4.tgz", + "integrity": "sha512-cPbNChoRURAWdebDIHSenxRpgEdy7JkPydSnUxRm9VvKD7m0/xVaR/8Fzlu81pk5nHEvHH87UZUA7cTtwnbJSA==", + "cpu": [ + "riscv64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" }, "funding": { - "url": "https://github.com/sponsors/fb55" + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.3.3" } }, - "site/node_modules/astro/node_modules/svgo/node_modules/css-select/node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "license": "ISC" - }, - "site/node_modules/astro/node_modules/svgo/node_modules/css-select/node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.3.0" - }, + "site/node_modules/sharp/node_modules/@img/sharp-linux-s390x": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.35.4.tgz", + "integrity": "sha512-RY0JFY8Fd6RonCBtHz+DvadaPkXDSI1AUn6yWL9TipqkZ1vY8w8evqdgyDFnkm4/K1ve1TvZiaePP5oSd4+WVQ==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 4" + "node": ">=20.9.0" }, "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.3.3" } }, - "site/node_modules/astro/node_modules/svgo/node_modules/css-select/node_modules/domhandler/node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } + "site/node_modules/sharp/node_modules/@img/sharp-linux-x64": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.35.4.tgz", + "integrity": "sha512-9qvvEAuk8k89TfWUoX2htWjbAMX8p+NxCppjpcg5k6xMsjhBQPTsoIh36h9Qde4WRuGpJeYnOjdosDn/cnv+OA==", + "cpu": [ + "x64" ], - "license": "BSD-2-Clause" - }, - "site/node_modules/astro/node_modules/svgo/node_modules/css-select/node_modules/domutils": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", - "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" }, "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.3.3" } }, - "site/node_modules/astro/node_modules/svgo/node_modules/css-select/node_modules/domutils/node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" + "site/node_modules/sharp/node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.35.4.tgz", + "integrity": "sha512-KB5jxpfWQTr0nc3xdHtWChdbifHrBGsd2SM62Eyxrl8afikm+f5qGBU75SJIZBT/S1MC8XyacdlXBMSWq6OURA==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" }, "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.3.3" } }, - "site/node_modules/astro/node_modules/svgo/node_modules/css-select/node_modules/domutils/node_modules/dom-serializer/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "license": "BSD-2-Clause", + "site/node_modules/sharp/node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.35.4.tgz", + "integrity": "sha512-f+eZJZIQNEEd26RPSW+76chwOf1XtA2Y/O+5ocVyLliHkeih3e+jhLVBdNTd2rS3IbNXK8+ug93Vf5ZXtF5Lxg==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.12" + "node": ">=20.9.0" }, "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.3.3" } }, - "site/node_modules/astro/node_modules/svgo/node_modules/css-select/node_modules/domutils/node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } + "site/node_modules/sharp/node_modules/@img/sharp-webcontainers-wasm32": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-webcontainers-wasm32/-/sharp-webcontainers-wasm32-0.35.4.tgz", + "integrity": "sha512-ESfNkywmCfPNyaZjxooddJQiQ+l/nTpGEOGthxiLnIHXC/CmcBixnfwUleX9mCz9ovrUUvKMap/pm8RYbzfwaA==", + "cpu": [ + "wasm32" ], - "license": "BSD-2-Clause" - }, - "site/node_modules/astro/node_modules/svgo/node_modules/css-select/node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "license": "BSD-2-Clause", + "license": "Apache-2.0", + "optional": true, "dependencies": { - "boolbase": "^1.0.0" + "@img/sharp-wasm32": "0.35.4" + }, + "engines": { + "node": ">=20.9.0" }, "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" + "url": "https://opencollective.com/libvips" } }, - "site/node_modules/astro/node_modules/svgo/node_modules/css-tree": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", - "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", - "license": "MIT", + "site/node_modules/sharp/node_modules/@img/sharp-webcontainers-wasm32/node_modules/@img/sharp-wasm32": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.35.4.tgz", + "integrity": "sha512-zQnl4Kwp7Q6NHsENtU2T/00Zi+w3AQNwz3+UaTyVBy2FpXrzXzGjndpK61onhZjRtRpQXxCTeqw19bVyXOh7jA==", + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, "dependencies": { - "mdn-data": "2.27.1", - "source-map-js": "^1.2.1" + "@emnapi/runtime": "^1.11.3" }, "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" } }, - "site/node_modules/astro/node_modules/svgo/node_modules/css-tree/node_modules/mdn-data": { - "version": "2.27.1", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", - "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", - "license": "CC0-1.0" + "site/node_modules/sharp/node_modules/@img/sharp-webcontainers-wasm32/node_modules/@img/sharp-wasm32/node_modules/@emnapi/runtime": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.3.tgz", + "integrity": "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } }, - "site/node_modules/astro/node_modules/svgo/node_modules/css-tree/node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "license": "BSD-3-Clause", + "site/node_modules/sharp/node_modules/@img/sharp-webcontainers-wasm32/node_modules/@img/sharp-wasm32/node_modules/@emnapi/runtime/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD", + "optional": true + }, + "site/node_modules/sharp/node_modules/@img/sharp-win32-arm64": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.35.4.tgz", + "integrity": "sha512-iNdlBX9gLVvqe2I3uIJSIKTq6wckP/DYxZtcqxm09x5Gi24DnFBmPAWZmr60ZyYMG0xlzo6goG3670ar+RXvRw==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=0.10.0" + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" } }, - "site/node_modules/astro/node_modules/svgo/node_modules/css-what": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-7.0.0.tgz", - "integrity": "sha512-wD5oz5xibMOPHzy13CyGmogB3phdvcDaB5t0W/Nr5Z2O/agcB8YwOz6e2Lsp10pNDzBoDO9nVa3RGs/2BttpHQ==", - "license": "BSD-2-Clause", + "site/node_modules/sharp/node_modules/@img/sharp-win32-ia32": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.35.4.tgz", + "integrity": "sha512-kqRsbaa5CS6KHlpxnN7WhE6vAAugXyZButpRdvDWetlv6Qv4N9WTcrWzF7tXfB9T7MsoadqdI8hmwLq6UlLvtw==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 6" + "node": "^20.9.0" }, "funding": { - "url": "https://github.com/sponsors/fb55" + "url": "https://opencollective.com/libvips" } }, - "site/node_modules/astro/node_modules/svgo/node_modules/csso": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", - "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", - "license": "MIT", - "dependencies": { - "css-tree": "~2.2.0" - }, + "site/node_modules/sharp/node_modules/@img/sharp-win32-x64": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.35.4.tgz", + "integrity": "sha512-XtmnYhBcrORsJ4XJngyzr/EWP0hRZLAZRFaApdKuviyqF78+ylxh2y06ZmtULAMOnObJ3ucpN0AcwSWnMowTRg==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" } }, - "site/node_modules/astro/node_modules/svgo/node_modules/csso/node_modules/css-tree": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", - "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", - "license": "MIT", - "dependencies": { - "mdn-data": "2.0.28", - "source-map-js": "^1.0.1" - }, + "site/node_modules/sharp/node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" + "node": ">=8" } }, - "site/node_modules/astro/node_modules/svgo/node_modules/csso/node_modules/css-tree/node_modules/mdn-data": { - "version": "2.0.28", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", - "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", - "license": "CC0-1.0" - }, - "site/node_modules/astro/node_modules/svgo/node_modules/csso/node_modules/css-tree/node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "license": "BSD-3-Clause", + "site/node_modules/sharp/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "site/node_modules/astro/node_modules/svgo/node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "site/node_modules/astro/node_modules/svgo/node_modules/sax": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.1.tgz", - "integrity": "sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==", - "license": "BlueOak-1.0.0", + "site/node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, "engines": { - "node": ">=11.0.0" + "node": ">=14.17" } }, - "site/node_modules/astro/node_modules/tinyclip": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/tinyclip/-/tinyclip-0.1.15.tgz", - "integrity": "sha512-uo33abH+Ays0xYaDysoBt494Hb3hsEczMpcC0MwFl773pazORx4fmvKhclhR1wonUbB6vvpRsvVMwnhfqeMc+A==", - "license": "MIT", - "engines": { - "node": "^16.14.0 || >= 17.3.0" + "tests/collaboration": { + "name": "@conn/collaboration-tests", + "dependencies": { + "@conn/ui": "*" + }, + "devDependencies": { + "@sveltejs/vite-plugin-svelte": "^5.1.1", + "playwright": "1.63.0", + "svelte": "^5.57.0", + "vite": "^6.0.0" } }, - "site/node_modules/astro/node_modules/tinyexec": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.3.1.tgz", - "integrity": "sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA==", + "tests/collaboration/node_modules/@sveltejs/vite-plugin-svelte": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-5.1.1.tgz", + "integrity": "sha512-Y1Cs7hhTc+a5E9Va/xwKlAJoariQyHY+5zBgCZg4PFWNYQ1nMN9sjK1zhw1gK69DuqVP++sht/1GZg1aRwmAXQ==", + "dev": true, "license": "MIT", + "dependencies": { + "@sveltejs/vite-plugin-svelte-inspector": "^4.0.1", + "debug": "^4.4.1", + "deepmerge": "^4.3.1", + "kleur": "^4.1.5", + "magic-string": "^0.30.17", + "vitefu": "^1.0.6" + }, "engines": { - "node": ">=18" + "node": "^18.0.0 || ^20.0.0 || >=22" + }, + "peerDependencies": { + "svelte": "^5.0.0", + "vite": "^6.0.0" } }, - "site/node_modules/astro/node_modules/tinyglobby": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", - "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "tests/collaboration/node_modules/@sveltejs/vite-plugin-svelte/node_modules/@sveltejs/vite-plugin-svelte-inspector": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-4.0.1.tgz", + "integrity": "sha512-J/Nmb2Q2y7mck2hyCX4ckVHcR5tu2J+MtBEQqpDrrgELZ2uvraQcK/ioCV61AqkdXFgriksOKIceDcQmqnGhVw==", + "dev": true, "license": "MIT", "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.4" + "debug": "^4.3.7" }, "engines": { - "node": ">=12.0.0" + "node": "^18.0.0 || ^20.0.0 || >=22" }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" + "peerDependencies": { + "@sveltejs/vite-plugin-svelte": "^5.0.0", + "svelte": "^5.0.0", + "vite": "^6.0.0" } }, - "site/node_modules/astro/node_modules/tinyglobby/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "tests/collaboration/node_modules/@sveltejs/vite-plugin-svelte/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, "license": "MIT", - "engines": { - "node": ">=12.0.0" + "dependencies": { + "ms": "^2.1.3" }, - "peerDependencies": { - "picomatch": "^3 || ^4" + "engines": { + "node": ">=6.0" }, "peerDependenciesMeta": { - "picomatch": { + "supports-color": { "optional": true } } }, - "site/node_modules/astro/node_modules/ultrahtml": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/ultrahtml/-/ultrahtml-1.7.0.tgz", - "integrity": "sha512-2xRd0VHoAQE4M+vF/DvFFB7pUV0ZxTW1TLi7lHQWnF/Sb5TPeEUV/l+hxcNnGO00ZXGnR0voCMmYRKQf+rvJ2g==", + "tests/collaboration/node_modules/@sveltejs/vite-plugin-svelte/node_modules/debug/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, "license": "MIT" }, - "site/node_modules/astro/node_modules/unifont": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/unifont/-/unifont-0.7.5.tgz", - "integrity": "sha512-ULe/Cs+ZIsq+dcFofNkhqielCrUJnb5mr+Yc4EBM2VlL+6OZR6+cjtI2mT1bJvRBrVncqHAbLURxmPLcCXzWMg==", + "tests/collaboration/node_modules/@sveltejs/vite-plugin-svelte/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==", + "dev": true, "license": "MIT", - "dependencies": { - "css-tree": "^3.1.0", - "ohash": "^2.0.11", - "undici": "^8.0.0" + "engines": { + "node": ">=0.10.0" } }, - "site/node_modules/astro/node_modules/unifont/node_modules/css-tree": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", - "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", + "tests/collaboration/node_modules/@sveltejs/vite-plugin-svelte/node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, "license": "MIT", - "dependencies": { - "mdn-data": "2.27.1", - "source-map-js": "^1.2.1" - }, "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + "node": ">=6" } }, - "site/node_modules/astro/node_modules/unifont/node_modules/css-tree/node_modules/mdn-data": { - "version": "2.27.1", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", - "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", - "license": "CC0-1.0" - }, - "site/node_modules/astro/node_modules/unifont/node_modules/css-tree/node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" + "tests/collaboration/node_modules/@sveltejs/vite-plugin-svelte/node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" } }, - "site/node_modules/astro/node_modules/unifont/node_modules/ohash": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.12.tgz", - "integrity": "sha512-65S/5gk9YSsaRjcyf7Nfa6h/d3E8/1gslpXfI4W7Dxn/oap8IKRuNT5VXkLQ1YFKIEg4apRY4Pj6aiwFzrDdmw==", + "tests/collaboration/node_modules/@sveltejs/vite-plugin-svelte/node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", + "dev": true, "license": "MIT" }, - "site/node_modules/astro/node_modules/unifont/node_modules/undici": { - "version": "8.10.2", - "resolved": "https://registry.npmjs.org/undici/-/undici-8.10.2.tgz", - "integrity": "sha512-/y4/bH9YNU5hi9NIrpOuvGXFcxrj3CMrV+/AYpowAYTpHn8gX/XPFjNy766FPoYY0miQhdW977JFWKGNhBdwyQ==", - "license": "MIT", - "engines": { - "node": ">=22.19.0" - } - }, - "site/node_modules/astro/node_modules/unstorage": { - "version": "1.17.5", - "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.17.5.tgz", - "integrity": "sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg==", + "tests/collaboration/node_modules/@sveltejs/vite-plugin-svelte/node_modules/vitefu": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.3.tgz", + "integrity": "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==", + "dev": true, "license": "MIT", - "dependencies": { - "anymatch": "^3.1.3", - "chokidar": "^5.0.0", - "destr": "^2.0.5", - "h3": "^1.15.10", - "lru-cache": "^11.2.7", - "node-fetch-native": "^1.6.7", - "ofetch": "^1.5.1", - "ufo": "^1.6.3" - }, + "workspaces": [ + "tests/deps/*", + "tests/projects/*", + "tests/projects/workspace/packages/*" + ], "peerDependencies": { - "@azure/app-configuration": "^1.8.0", - "@azure/cosmos": "^4.2.0", - "@azure/data-tables": "^13.3.0", - "@azure/identity": "^4.6.0", - "@azure/keyvault-secrets": "^4.9.0", - "@azure/storage-blob": "^12.26.0", - "@capacitor/preferences": "^6 || ^7 || ^8", - "@deno/kv": ">=0.9.0", - "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", - "@planetscale/database": "^1.19.0", - "@upstash/redis": "^1.34.3", - "@vercel/blob": ">=0.27.1", - "@vercel/functions": "^2.2.12 || ^3.0.0", - "@vercel/kv": "^1 || ^2 || ^3", - "aws4fetch": "^1.0.20", - "db0": ">=0.2.1", - "idb-keyval": "^6.2.1", - "ioredis": "^5.4.2", - "uploadthing": "^7.4.4" + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { - "@azure/app-configuration": { - "optional": true - }, - "@azure/cosmos": { - "optional": true - }, - "@azure/data-tables": { - "optional": true - }, - "@azure/identity": { - "optional": true - }, - "@azure/keyvault-secrets": { - "optional": true - }, - "@azure/storage-blob": { - "optional": true - }, - "@capacitor/preferences": { - "optional": true - }, - "@deno/kv": { - "optional": true - }, - "@netlify/blobs": { - "optional": true - }, - "@planetscale/database": { - "optional": true - }, - "@upstash/redis": { - "optional": true - }, - "@vercel/blob": { - "optional": true - }, - "@vercel/functions": { - "optional": true - }, - "@vercel/kv": { - "optional": true - }, - "aws4fetch": { - "optional": true - }, - "db0": { - "optional": true - }, - "idb-keyval": { - "optional": true - }, - "ioredis": { - "optional": true - }, - "uploadthing": { + "vite": { "optional": true } } }, - "site/node_modules/astro/node_modules/unstorage/node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "license": "ISC", + "tests/collaboration/node_modules/playwright": { + "version": "1.63.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.63.0.tgz", + "integrity": "sha512-+7ziBLidS4NaNCdt57SUDT+wYmmd5fmiQejUic/kb+YsYSCPyOOE9sebzMjNmQrsnNpDJqd4WHvV/8lfKfUDUg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.63.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=20" + } + }, + "tests/collaboration/node_modules/playwright/node_modules/playwright-core": { + "version": "1.63.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.63.0.tgz", + "integrity": "sha512-rYCsBF/M5HjUch52bbtVONEFjv6Xu8sm8h72dNlR5bzIE1fvC/bxgspzkjSfU+MweEMmPM8KJebG6nnyxo5mCg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=20" + } + }, + "tests/collaboration/node_modules/svelte": { + "version": "5.57.1", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.57.1.tgz", + "integrity": "sha512-Uqj49lWKB+iSSnneuwiYYJ7MZgkB+eXr0LXBhv4uDuAkXqnWmq65Sxflfvp0Lc6MdKjMUxGaeOKWJqz5SNiVIA==", + "dev": true, + "license": "MIT", "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "@jridgewell/remapping": "^2.3.5", + "@jridgewell/sourcemap-codec": "^1.6.0", + "@sveltejs/acorn-typescript": "^1.0.13", + "@types/estree": "^1.0.9", + "acorn": "^8.18.0", + "aria-query": "5.3.1", + "axobject-query": "^4.1.0", + "clsx": "^2.1.1", + "devalue": "^5.9.2", + "esm-env": "^1.2.1", + "esrap": "^2.3.6", + "is-reference": "^3.0.3", + "locate-character": "^3.0.0", + "magic-string": "^0.30.11", + "zimmerframe": "^1.1.2" }, "engines": { - "node": ">= 8" + "node": ">=18" } }, - "site/node_modules/astro/node_modules/unstorage/node_modules/anymatch/node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "tests/collaboration/node_modules/svelte/node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, "license": "MIT", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" } }, - "site/node_modules/astro/node_modules/unstorage/node_modules/anymatch/node_modules/picomatch": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "tests/collaboration/node_modules/svelte/node_modules/@jridgewell/remapping/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" } }, - "site/node_modules/astro/node_modules/unstorage/node_modules/chokidar": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", - "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "tests/collaboration/node_modules/svelte/node_modules/@jridgewell/remapping/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, "license": "MIT", "dependencies": { - "readdirp": "^5.0.0" - }, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "site/node_modules/astro/node_modules/unstorage/node_modules/chokidar/node_modules/readdirp": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.1.1.tgz", - "integrity": "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==", + "tests/collaboration/node_modules/svelte/node_modules/@jridgewell/remapping/node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, "license": "MIT", "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" + "node": ">=6.0.0" } }, - "site/node_modules/astro/node_modules/unstorage/node_modules/destr": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", - "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==", + "tests/collaboration/node_modules/svelte/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", + "dev": true, "license": "MIT" }, - "site/node_modules/astro/node_modules/unstorage/node_modules/h3": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.11.tgz", - "integrity": "sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==", + "tests/collaboration/node_modules/svelte/node_modules/@sveltejs/acorn-typescript": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.13.tgz", + "integrity": "sha512-wgKggnhZVL9Bfx1OaKKTrYY9BFRk6C8UAkQNUcIv1+llzYrIqy+RZm5HPKzn0NpEBvTVhTqB4kQyllZywsRBRQ==", + "dev": true, "license": "MIT", - "dependencies": { - "cookie-es": "^1.2.3", - "crossws": "^0.3.5", - "defu": "^6.1.6", - "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" + "peerDependencies": { + "acorn": "^8.9.0" } }, - "site/node_modules/astro/node_modules/unstorage/node_modules/h3/node_modules/cookie-es": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.2.3.tgz", - "integrity": "sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==", + "tests/collaboration/node_modules/svelte/node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, "license": "MIT" }, - "site/node_modules/astro/node_modules/unstorage/node_modules/h3/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==", + "tests/collaboration/node_modules/svelte/node_modules/acorn": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", + "dev": true, "license": "MIT", - "dependencies": { - "uncrypto": "^0.1.3" + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" } }, - "site/node_modules/astro/node_modules/unstorage/node_modules/h3/node_modules/defu": { - "version": "6.1.7", - "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz", - "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==", - "license": "MIT" + "tests/collaboration/node_modules/svelte/node_modules/aria-query": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.1.tgz", + "integrity": "sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } }, - "site/node_modules/astro/node_modules/unstorage/node_modules/h3/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==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/brc-dd" + "tests/collaboration/node_modules/svelte/node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" } }, - "site/node_modules/astro/node_modules/unstorage/node_modules/h3/node_modules/node-mock-http": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/node-mock-http/-/node-mock-http-1.0.5.tgz", - "integrity": "sha512-KQyt/wLjG3TAc7DOUhpqWzgd4ERxR80JOlTK5VE5R1S12IaPVN5qkj4klBce9HPG1Njuup4Sb5bljaT34lIyjw==", - "license": "MIT" + "tests/collaboration/node_modules/svelte/node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } }, - "site/node_modules/astro/node_modules/unstorage/node_modules/h3/node_modules/radix3": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz", - "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==", + "tests/collaboration/node_modules/svelte/node_modules/devalue": { + "version": "5.9.4", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.9.4.tgz", + "integrity": "sha512-sPAT4pztbu6586/hrhOnMKS17IJrvg12mXiSPSS3W5qDeN2RGgvZ0diZCm31dBbnevfVmujNO3IM2wrS4Y2Rhg==", + "dev": true, "license": "MIT" }, - "site/node_modules/astro/node_modules/unstorage/node_modules/h3/node_modules/uncrypto": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/uncrypto/-/uncrypto-0.1.3.tgz", - "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==", + "tests/collaboration/node_modules/svelte/node_modules/esm-env": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz", + "integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==", + "dev": true, "license": "MIT" }, - "site/node_modules/astro/node_modules/unstorage/node_modules/lru-cache": { - "version": "11.5.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.3.tgz", - "integrity": "sha512-U4N8FgzmWxc8k1VH8Kr6lQg18U7Fjvby6wXHVRX/ZZ7IwWbRMgrRbP0Wrb5q5NVinryp4SQampHKdvtecItxUg==", - "license": "BlueOak-1.0.0", - "engines": { - "node": "20 || >=22" + "tests/collaboration/node_modules/svelte/node_modules/esrap": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/esrap/-/esrap-2.3.8.tgz", + "integrity": "sha512-0yrRvyjiH1EWLIEPb0i26mEnOYsXgIjG77muq3LMJH/dpmp+ctFEEHF8jjGBQAdhwgrKfN74CohbJTMFIaJcMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "peerDependencies": { + "@typescript-eslint/types": "^8.2.0" + }, + "peerDependenciesMeta": { + "@typescript-eslint/types": { + "optional": true + } } }, - "site/node_modules/astro/node_modules/unstorage/node_modules/node-fetch-native": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz", - "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==", - "license": "MIT" - }, - "site/node_modules/astro/node_modules/unstorage/node_modules/ofetch": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.5.1.tgz", - "integrity": "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==", + "tests/collaboration/node_modules/svelte/node_modules/is-reference": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz", + "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==", + "dev": true, "license": "MIT", "dependencies": { - "destr": "^2.0.5", - "node-fetch-native": "^1.6.7", - "ufo": "^1.6.1" + "@types/estree": "^1.0.6" } }, - "site/node_modules/astro/node_modules/unstorage/node_modules/ufo": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.4.tgz", - "integrity": "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==", + "tests/collaboration/node_modules/svelte/node_modules/locate-character": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", + "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", + "dev": true, "license": "MIT" }, - "site/node_modules/astro/node_modules/verkit": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/verkit/-/verkit-0.4.1.tgz", - "integrity": "sha512-mMVzj0TXExtVdlDEq+Mzp0eyOuyznNpFobNM3uAqe3HVm/Ps2c+u17BligMkZjZCA6EiXpoon8iRTer3iu40SQ==", + "tests/collaboration/node_modules/svelte/node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, "license": "MIT", - "engines": { - "node": ">=18.12.0" - }, - "funding": { - "url": "https://github.com/sponsors/sxzz" + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" } }, - "site/node_modules/astro/node_modules/vite": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.3.0.tgz", - "integrity": "sha512-lhZBVvEHefgE+HQZC9O7EBJgCU/nVzFNl7vkS4RE0APtWLP02/8QVIkQtzBxPquh7lq5/78NHipTj7ODQ6XuyQ==", + "tests/collaboration/node_modules/svelte/node_modules/zimmerframe": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.5.tgz", + "integrity": "sha512-msJxIvYDYcoNL+PJsu+7qmpDWsYmAxTY+2TNYXXF0hzBzBk0BMecOqDOG/EckUoKCuKwObfbugIl8QpqHDXeFA==", + "dev": true, + "license": "MIT" + }, + "tests/collaboration/node_modules/vite": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.3.tgz", + "integrity": "sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A==", + "dev": true, "license": "MIT", "dependencies": { - "lightningcss": "^1.33.0", - "picomatch": "^4.0.7", - "postcss": "^8.5.28", - "rolldown": "~1.2.6", - "tinyglobby": "^0.2.17" + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" @@ -18521,15 +23567,14 @@ "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "@vitejs/devtools": "^0.7.1", - "esbuild": "^0.27.0 || ^0.28.0", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", - "less": "^4.0.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" @@ -18538,18 +23583,15 @@ "@types/node": { "optional": true }, - "@vitejs/devtools": { - "optional": true - }, - "esbuild": { - "optional": true - }, "jiti": { "optional": true }, "less": { "optional": true }, + "lightningcss": { + "optional": true + }, "sass": { "optional": true }, @@ -18573,1302 +23615,1078 @@ } } }, - "site/node_modules/astro/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==", + "tests/collaboration/node_modules/vite/node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, "hasInstallScript": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "site/node_modules/astro/node_modules/vite/node_modules/lightningcss": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", - "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", - "license": "MPL-2.0", - "dependencies": { - "detect-libc": "^2.0.3" + "bin": { + "esbuild": "bin/esbuild" }, "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=18" }, "optionalDependencies": { - "lightningcss-android-arm64": "1.33.0", - "lightningcss-darwin-arm64": "1.33.0", - "lightningcss-darwin-x64": "1.33.0", - "lightningcss-freebsd-x64": "1.33.0", - "lightningcss-linux-arm-gnueabihf": "1.33.0", - "lightningcss-linux-arm64-gnu": "1.33.0", - "lightningcss-linux-arm64-musl": "1.33.0", - "lightningcss-linux-x64-gnu": "1.33.0", - "lightningcss-linux-x64-musl": "1.33.0", - "lightningcss-win32-arm64-msvc": "1.33.0", - "lightningcss-win32-x64-msvc": "1.33.0" - } - }, - "site/node_modules/astro/node_modules/vite/node_modules/lightningcss/node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "site/node_modules/astro/node_modules/vite/node_modules/lightningcss/node_modules/lightningcss-android-arm64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", - "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "site/node_modules/astro/node_modules/vite/node_modules/lightningcss/node_modules/lightningcss-darwin-arm64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", - "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "site/node_modules/astro/node_modules/vite/node_modules/lightningcss/node_modules/lightningcss-darwin-x64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", - "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "site/node_modules/astro/node_modules/vite/node_modules/lightningcss/node_modules/lightningcss-freebsd-x64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", - "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "site/node_modules/astro/node_modules/vite/node_modules/lightningcss/node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", - "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", - "cpu": [ - "arm" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "site/node_modules/astro/node_modules/vite/node_modules/lightningcss/node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", - "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "site/node_modules/astro/node_modules/vite/node_modules/lightningcss/node_modules/lightningcss-linux-arm64-musl": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", - "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" } }, - "site/node_modules/astro/node_modules/vite/node_modules/lightningcss/node_modules/lightningcss-linux-x64-gnu": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", - "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", + "tests/collaboration/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", "cpu": [ - "x64" + "ppc64" ], - "license": "MPL-2.0", + "dev": true, + "license": "MIT", "optional": true, "os": [ - "linux" + "aix" ], "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=18" } }, - "site/node_modules/astro/node_modules/vite/node_modules/lightningcss/node_modules/lightningcss-linux-x64-musl": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", - "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", + "tests/collaboration/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", "cpu": [ - "x64" + "arm" ], - "license": "MPL-2.0", + "dev": true, + "license": "MIT", "optional": true, "os": [ - "linux" + "android" ], "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=18" } }, - "site/node_modules/astro/node_modules/vite/node_modules/lightningcss/node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", - "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", + "tests/collaboration/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", "cpu": [ "arm64" ], - "license": "MPL-2.0", + "dev": true, + "license": "MIT", "optional": true, "os": [ - "win32" + "android" ], "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=18" } }, - "site/node_modules/astro/node_modules/vite/node_modules/lightningcss/node_modules/lightningcss-win32-x64-msvc": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", - "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", + "tests/collaboration/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", "cpu": [ "x64" ], - "license": "MPL-2.0", + "dev": true, + "license": "MIT", "optional": true, "os": [ - "win32" + "android" ], "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=18" } }, - "site/node_modules/astro/node_modules/vite/node_modules/postcss": { - "version": "8.5.28", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.28.tgz", - "integrity": "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } + "tests/collaboration/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" ], + "dev": true, "license": "MIT", - "dependencies": { - "nanoid": "^3.3.18", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "site/node_modules/astro/node_modules/vite/node_modules/postcss/node_modules/nanoid": { - "version": "3.3.19", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.19.tgz", - "integrity": "sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } + "optional": true, + "os": [ + "darwin" ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "site/node_modules/astro/node_modules/vite/node_modules/postcss/node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "site/node_modules/astro/node_modules/vite/node_modules/postcss/node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" + "node": ">=18" } }, - "site/node_modules/astro/node_modules/vite/node_modules/rolldown": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.9.tgz", - "integrity": "sha512-hx/Pv0N1haXRb11qkfnK5MXB/iqr7i0yjWQqmO9uHqZpBgQSqzc8UsSnEpalsh+j1I8qQ2CkXAkJC8Br3dKSlg==", + "tests/collaboration/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@oxc-project/types": "=0.150.0", - "@rolldown/pluginutils": "^1.0.0" - }, - "bin": { - "rolldown": "bin/cli.mjs" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "optionalDependencies": { - "@rolldown/binding-android-arm-eabi": "1.2.9", - "@rolldown/binding-android-arm64": "1.2.9", - "@rolldown/binding-darwin-arm64": "1.2.9", - "@rolldown/binding-darwin-x64": "1.2.9", - "@rolldown/binding-freebsd-x64": "1.2.9", - "@rolldown/binding-linux-arm-gnueabihf": "1.2.9", - "@rolldown/binding-linux-arm64-gnu": "1.2.9", - "@rolldown/binding-linux-arm64-musl": "1.2.9", - "@rolldown/binding-linux-ppc64-gnu": "1.2.9", - "@rolldown/binding-linux-s390x-gnu": "1.2.9", - "@rolldown/binding-linux-x64-gnu": "1.2.9", - "@rolldown/binding-linux-x64-musl": "1.2.9", - "@rolldown/binding-openharmony-arm64": "1.2.9", - "@rolldown/binding-win32-arm64-msvc": "1.2.9", - "@rolldown/binding-win32-x64-msvc": "1.2.9" - } - }, - "site/node_modules/astro/node_modules/vite/node_modules/rolldown/node_modules/@oxc-project/types": { - "version": "0.150.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.150.0.tgz", - "integrity": "sha512-rDS5/31E9HfPl/CIzGrn0DOlvBbXFseQ5URJ9sYMfstbKLD/c6Gm9vmRzRGDdAXyOIL4zmO37lc9RIwYqVruZw==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/oxc-project" + "node": ">=18" } }, - "site/node_modules/astro/node_modules/vite/node_modules/rolldown/node_modules/@rolldown/binding-android-arm-eabi": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.9.tgz", - "integrity": "sha512-tNISae1QEf/vkb3xkRcjV5SEdzPE97We5IVaa2Z8jSszQPZ8U60B/YCYpw4QI7VidYsBtKavczXf+DyDs9WGxw==", + "tests/collaboration/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", "cpu": [ - "arm" + "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ - "android" + "freebsd" ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=18" } }, - "site/node_modules/astro/node_modules/vite/node_modules/rolldown/node_modules/@rolldown/binding-android-arm64": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.9.tgz", - "integrity": "sha512-YC8YsI30o606GTZi0VyzYlsDKFP8W61i/QzayHDkLbNEz/IShqAmTa+hsJRj13xTHA0H+6fk4b2UmGn+Q/cMlg==", + "tests/collaboration/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", "cpu": [ - "arm64" + "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ - "android" + "freebsd" ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=18" } }, - "site/node_modules/astro/node_modules/vite/node_modules/rolldown/node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.9.tgz", - "integrity": "sha512-IwhlH3qK5urrY8hZiEgGkHKEFN901p/p2bjxCxJlr4GyNnF7wYpUvK+Y43uaRYuC4hpfjzbR3SJC3arX1jGvmw==", + "tests/collaboration/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", "cpu": [ - "arm64" + "arm" ], + "dev": true, "license": "MIT", "optional": true, "os": [ - "darwin" + "linux" ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=18" } }, - "site/node_modules/astro/node_modules/vite/node_modules/rolldown/node_modules/@rolldown/binding-darwin-x64": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.9.tgz", - "integrity": "sha512-XxpJfVzFh+jilRxIXUqcfYAYcunIc/XEzIizsOL1fcJee5Sf7H3mH8WlLmfHfluz5amqR88QQo9izKtmMlavAw==", + "tests/collaboration/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", "cpu": [ - "x64" + "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ - "darwin" + "linux" ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=18" } - }, - "site/node_modules/astro/node_modules/vite/node_modules/rolldown/node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.9.tgz", - "integrity": "sha512-kSfvhmgeWyfkbT3p/1s5vSgboogoah2zkm9fX2zjg2hHxSV7T4KhMWRUUaRk4OXNqoD3QAUeRqLcs1aZOK4U1g==", + }, + "tests/collaboration/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", "cpu": [ - "x64" + "ia32" ], + "dev": true, "license": "MIT", "optional": true, "os": [ - "freebsd" + "linux" ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=18" } }, - "site/node_modules/astro/node_modules/vite/node_modules/rolldown/node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.9.tgz", - "integrity": "sha512-1RVzG17pxqbTfYLC352JlLt6kKLG+6Hr30n8DlIJqsnV5luUDd2Qdx9Ayw1Cabfyb1K9k0jXEZ7evxkRoT+uiw==", + "tests/collaboration/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", "cpu": [ - "arm" + "loong64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=18" } }, - "site/node_modules/astro/node_modules/vite/node_modules/rolldown/node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.9.tgz", - "integrity": "sha512-BXqPvZ2drqVD+/Z8UpKwcs4Mp7grM+eGFku4CAEKrEtcbAsUpzREphK1sogCRZGreVPiMkiiBtw0n3TPteuqvw==", + "tests/collaboration/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", "cpu": [ - "arm64" + "mips64el" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=18" } }, - "site/node_modules/astro/node_modules/vite/node_modules/rolldown/node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.9.tgz", - "integrity": "sha512-11vWvo8YDwLzukt27J3aYDWU+gg2P7J+ZOmiJ0hkF5BXZDW7pVya7r40MXDy6ya0i9KamoENSVKIugvJNgFXIA==", + "tests/collaboration/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", "cpu": [ - "arm64" + "ppc64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=18" } }, - "site/node_modules/astro/node_modules/vite/node_modules/rolldown/node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.9.tgz", - "integrity": "sha512-a1tijMkdwsIARtc0F39ApURROkf3NwqinI6TOiSSWCTR7dT96dffNvMUtDHnq64wKNTIZOIlzKrFvvFUznJiyw==", + "tests/collaboration/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", "cpu": [ - "ppc64" + "riscv64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=18" } }, - "site/node_modules/astro/node_modules/vite/node_modules/rolldown/node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.9.tgz", - "integrity": "sha512-x6SQNdAvv4c3hWqTMaWuawzMX9myaCs/yEmlGsxJzkdClnHW7FbrjQuSiRDhuSYzEYoEMhsaJy9qHG/XNemJPQ==", + "tests/collaboration/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", "cpu": [ "s390x" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=18" } }, - "site/node_modules/astro/node_modules/vite/node_modules/rolldown/node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.9.tgz", - "integrity": "sha512-9s0AZ8BFK5/n7B/TBoa2yJE3gI3KURrbXcPBlsAsvjU4VeJKgE90y1YtNxyEUIcHPQkg6/yfF3qihUrcM/Kf0Q==", + "tests/collaboration/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=18" } }, - "site/node_modules/astro/node_modules/vite/node_modules/rolldown/node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.9.tgz", - "integrity": "sha512-P7VWAmV+WdJluH7ovnRGoiv2i8To7GAZ+kGzfGup635cyL7SyYl3lSUaA3Gp5THf0n/Co5EyEqb2zbqq+nMOHQ==", + "tests/collaboration/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", "cpu": [ - "x64" + "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ - "linux" + "netbsd" ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=18" } }, - "site/node_modules/astro/node_modules/vite/node_modules/rolldown/node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.9.tgz", - "integrity": "sha512-1qixtsE4BK8h+yS3BfmZ09UhA7O/N4IACva6YBr7EBvCJraByTuRcgOTaiA62Tm0vey3UcKXLOaoGHtYmNGEVg==", + "tests/collaboration/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", "cpu": [ - "arm64" + "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ - "openharmony" + "netbsd" ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=18" } }, - "site/node_modules/astro/node_modules/vite/node_modules/rolldown/node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.9.tgz", - "integrity": "sha512-ok8IQjcEPs1AKZfuEUznVBrJw+gK4soq+bx8b1X2XoMqVClarc1q5JDmVtWXY1xfr6ZuHTAsPXHTgTrqKTZeww==", + "tests/collaboration/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ - "win32" + "openbsd" ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=18" } }, - "site/node_modules/astro/node_modules/vite/node_modules/rolldown/node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.9.tgz", - "integrity": "sha512-Ip2mXoU0hM0boq3Rf+ekuT653OROSo6aSYcPT1VHE4q52KvyxgFkQgrgb/IEsxOuvQ2fZZbs8khJAyCEPM24/g==", + "tests/collaboration/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ - "win32" + "openbsd" ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=18" } }, - "site/node_modules/astro/node_modules/vite/node_modules/rolldown/node_modules/@rolldown/pluginutils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", - "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", - "license": "MIT" - }, - "site/node_modules/astro/node_modules/vitefu": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.3.tgz", - "integrity": "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==", + "tests/collaboration/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "workspaces": [ - "tests/deps/*", - "tests/projects/*", - "tests/projects/workspace/packages/*" + "optional": true, + "os": [ + "openharmony" ], - "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "vite": { - "optional": true - } - } - }, - "site/node_modules/astro/node_modules/xxhash-wasm": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-1.1.0.tgz", - "integrity": "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==", - "license": "MIT" - }, - "site/node_modules/astro/node_modules/yargs-parser": { - "version": "22.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", - "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", - "license": "ISC", "engines": { - "node": "^20.19.0 || ^22.12.0 || >=23" + "node": ">=18" } }, - "site/node_modules/astro/node_modules/zod": { - "version": "4.6.5", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.6.5.tgz", - "integrity": "sha512-v5l/aFXZQeai4awLbOpSoHecE9UiMrnfx75tEXLjNonXVARxQ5mOeipTjROUchszUNCqnE+hqAMujRsRHsut2Q==", + "tests/collaboration/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "site/node_modules/sharp": { - "version": "0.35.4", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.35.4.tgz", - "integrity": "sha512-n++8XWcj+jCOr2IOl7h8LbKnGBDY4aPbmprMONBNFdn0ImXqpGVv5zliDs0V9HbmbCQLpbuo2ej9rAoOQTvMDA==", - "license": "Apache-2.0", - "dependencies": { - "@img/colour": "^1.1.0", - "detect-libc": "^2.1.2", - "semver": "^7.8.5" - }, + "optional": true, + "os": [ + "sunos" + ], "engines": { - "node": ">=20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.35.4", - "@img/sharp-darwin-x64": "0.35.4", - "@img/sharp-freebsd-wasm32": "0.35.4", - "@img/sharp-libvips-darwin-arm64": "1.3.3", - "@img/sharp-libvips-darwin-x64": "1.3.3", - "@img/sharp-libvips-linux-arm": "1.3.3", - "@img/sharp-libvips-linux-arm64": "1.3.3", - "@img/sharp-libvips-linux-ppc64": "1.3.3", - "@img/sharp-libvips-linux-riscv64": "1.3.3", - "@img/sharp-libvips-linux-s390x": "1.3.3", - "@img/sharp-libvips-linux-x64": "1.3.3", - "@img/sharp-libvips-linuxmusl-arm64": "1.3.3", - "@img/sharp-libvips-linuxmusl-x64": "1.3.3", - "@img/sharp-linux-arm": "0.35.4", - "@img/sharp-linux-arm64": "0.35.4", - "@img/sharp-linux-ppc64": "0.35.4", - "@img/sharp-linux-riscv64": "0.35.4", - "@img/sharp-linux-s390x": "0.35.4", - "@img/sharp-linux-x64": "0.35.4", - "@img/sharp-linuxmusl-arm64": "0.35.4", - "@img/sharp-linuxmusl-x64": "0.35.4", - "@img/sharp-webcontainers-wasm32": "0.35.4", - "@img/sharp-win32-arm64": "0.35.4", - "@img/sharp-win32-ia32": "0.35.4", - "@img/sharp-win32-x64": "0.35.4" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "node": ">=18" } }, - "site/node_modules/sharp/node_modules/@img/colour": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", - "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", + "tests/collaboration/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { "node": ">=18" } }, - "site/node_modules/sharp/node_modules/@img/sharp-darwin-arm64": { - "version": "0.35.4", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.35.4.tgz", - "integrity": "sha512-Uhfl4V4lhP2nbUVF9+hyH1+luj86f1gUFeo8ALYxFoULoU+G87D43BfeMP8XHsk9boxAnCY/bf2EHwhA7MuGsA==", + "tests/collaboration/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", "cpu": [ - "arm64" + "ia32" ], - "license": "Apache-2.0", + "dev": true, + "license": "MIT", "optional": true, "os": [ - "darwin" + "win32" ], "engines": { - "node": ">=20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.3.3" + "node": ">=18" } }, - "site/node_modules/sharp/node_modules/@img/sharp-darwin-x64": { - "version": "0.35.4", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.35.4.tgz", - "integrity": "sha512-hWniXY3bG5qKpkKrAwPe4y+VTPmf086YQAnkxWh7uA1YrlRouWGa0M0Mxj3ZjnXFkv7/TD1bTy9lGUK26vRvWw==", + "tests/collaboration/node_modules/vite/node_modules/esbuild/node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", "cpu": [ "x64" ], - "license": "Apache-2.0", + "dev": true, + "license": "MIT", "optional": true, "os": [ - "darwin" + "win32" ], "engines": { - "node": ">=20.9.0" + "node": ">=18" + } + }, + "tests/collaboration/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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" }, - "funding": { - "url": "https://opencollective.com/libvips" + "peerDependencies": { + "picomatch": "^3 || ^4" }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.3.3" + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } } }, - "site/node_modules/sharp/node_modules/@img/sharp-freebsd-wasm32": { - "version": "0.35.4", - "resolved": "https://registry.npmjs.org/@img/sharp-freebsd-wasm32/-/sharp-freebsd-wasm32-0.35.4.tgz", - "integrity": "sha512-lIsKw/BU+kjB4eZjxrYrZmwOJYi3Ajrv66iAlBmUPyKc3HpnloevB1g3wxGD9P/5BbQ1brBGl65VRRrCvQDEqA==", - "license": "Apache-2.0", + "tests/collaboration/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": [ - "freebsd" + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "tests/collaboration/node_modules/vite/node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "tests/collaboration/node_modules/vite/node_modules/postcss": { + "version": "8.5.28", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.28.tgz", + "integrity": "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } ], + "license": "MIT", "dependencies": { - "@img/sharp-wasm32": "0.35.4" + "nanoid": "^3.3.18", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { - "node": ">=20.9.0" + "node": "^10 || ^12 || >=14" + } + }, + "tests/collaboration/node_modules/vite/node_modules/postcss/node_modules/nanoid": { + "version": "3.3.19", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.19.tgz", + "integrity": "sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" }, - "funding": { - "url": "https://opencollective.com/libvips" + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "site/node_modules/sharp/node_modules/@img/sharp-freebsd-wasm32/node_modules/@img/sharp-wasm32": { - "version": "0.35.4", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.35.4.tgz", - "integrity": "sha512-zQnl4Kwp7Q6NHsENtU2T/00Zi+w3AQNwz3+UaTyVBy2FpXrzXzGjndpK61onhZjRtRpQXxCTeqw19bVyXOh7jA==", - "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", - "optional": true, + "tests/collaboration/node_modules/vite/node_modules/postcss/node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "tests/collaboration/node_modules/vite/node_modules/postcss/node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "tests/collaboration/node_modules/vite/node_modules/rollup": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.63.4.tgz", + "integrity": "sha512-4U0liVayNIoLp3GFl1FcI8561WepLnZ1rqfraGh7S9B3Ur5F9S283y8Futii7RUU2C/97tOBmBy7nYvhoiOpbQ==", + "dev": true, + "license": "MIT", "dependencies": { - "@emnapi/runtime": "^1.11.3" + "@types/estree": "1.0.9" + }, + "bin": { + "rollup": "dist/bin/rollup" }, "engines": { - "node": ">=20.9.0" + "node": ">=18.0.0", + "npm": ">=8.0.0" }, - "funding": { - "url": "https://opencollective.com/libvips" + "optionalDependencies": { + "@napi-rs/lzma-linux-x64-gnu": "1.5.1", + "@rollup/rollup-android-arm-eabi": "4.63.4", + "@rollup/rollup-android-arm64": "4.63.4", + "@rollup/rollup-darwin-arm64": "4.63.4", + "@rollup/rollup-darwin-x64": "4.63.4", + "@rollup/rollup-freebsd-arm64": "4.63.4", + "@rollup/rollup-freebsd-x64": "4.63.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.63.4", + "@rollup/rollup-linux-arm-musleabihf": "4.63.4", + "@rollup/rollup-linux-arm64-gnu": "4.63.4", + "@rollup/rollup-linux-arm64-musl": "4.63.4", + "@rollup/rollup-linux-loong64-gnu": "4.63.4", + "@rollup/rollup-linux-loong64-musl": "4.63.4", + "@rollup/rollup-linux-ppc64-gnu": "4.63.4", + "@rollup/rollup-linux-ppc64-musl": "4.63.4", + "@rollup/rollup-linux-riscv64-gnu": "4.63.4", + "@rollup/rollup-linux-riscv64-musl": "4.63.4", + "@rollup/rollup-linux-s390x-gnu": "4.63.4", + "@rollup/rollup-linux-x64-gnu": "4.63.4", + "@rollup/rollup-linux-x64-musl": "4.63.4", + "@rollup/rollup-openbsd-x64": "4.63.4", + "@rollup/rollup-openharmony-arm64": "4.63.4", + "@rollup/rollup-win32-arm64-msvc": "4.63.4", + "@rollup/rollup-win32-ia32-msvc": "4.63.4", + "@rollup/rollup-win32-x64-gnu": "4.63.4", + "@rollup/rollup-win32-x64-msvc": "4.63.4", + "fsevents": "~2.3.2" } }, - "site/node_modules/sharp/node_modules/@img/sharp-freebsd-wasm32/node_modules/@img/sharp-wasm32/node_modules/@emnapi/runtime": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.3.tgz", - "integrity": "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==", + "tests/collaboration/node_modules/vite/node_modules/rollup/node_modules/@napi-rs/lzma-linux-x64-gnu": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz", + "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, - "dependencies": { - "tslib": "^2.4.0" + "os": [ + "linux" + ], + "engines": { + "node": "^22.20 || ^24.12 || >=25" } }, - "site/node_modules/sharp/node_modules/@img/sharp-freebsd-wasm32/node_modules/@img/sharp-wasm32/node_modules/@emnapi/runtime/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD", - "optional": true + "tests/collaboration/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.63.4.tgz", + "integrity": "sha512-I+BSHzTAhKN2n7ZwGZsegGcZjDpLqFOMAtJz/u6uFGe0pUFbq56dEHjqJV/ZUdRJtNXNxA+hREUatZBvMR3Oiw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] }, - "site/node_modules/sharp/node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.3.3.tgz", - "integrity": "sha512-suTBPTDGrI9WodccaDdwZItTSaBYASlBk1NSfElSHrUfzu3szG6lvIF58+WiFvnfzuK8ZBFS5zE00PxqxnRiPg==", + "tests/collaboration/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-android-arm64": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.63.4.tgz", + "integrity": "sha512-pu3BdjS2LtEzRu2elmGzS3fIeWSZy4BMDIaLNwjorO76+k2d0LMluijhsDx3KQyQBQ/lLUZCQA9/s6csvUfuhw==", "cpu": [ "arm64" ], - "license": "LGPL-3.0-or-later", + "dev": true, + "license": "MIT", "optional": true, "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } + "android" + ] }, - "site/node_modules/sharp/node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.3.3.tgz", - "integrity": "sha512-FVJZ5mITMobmXIz/hPDTw0EintTW5H3WfrxwLqEqjiIihlu+hVRyGrFQ60xl0Lxn7Bt3zdpevPaQi0HEzqz9fw==", + "tests/collaboration/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.63.4.tgz", + "integrity": "sha512-xfSrj9MHnWK9GaSqT9U0ImHtH/N8WZlHLx4cZHiuLcqs640hvZ3hLPd5UR2AZS57FaE8HrRUSpltbZdWRxHiDA==", "cpu": [ - "x64" + "arm64" ], - "license": "LGPL-3.0-or-later", + "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } + ] }, - "site/node_modules/sharp/node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.3.3.tgz", - "integrity": "sha512-3rbU4vqXXc3hY/OiXdl52xZvT0F1yEngWfvqudtPJg/KkyiaQw2DRsFrNzpmLvfavbwOq3qXn36GP8obHRULQA==", + "tests/collaboration/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-darwin-x64": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.63.4.tgz", + "integrity": "sha512-bqU99PLJb/dqb3S0GIMdeuyAEETSUgZBoqXYd3Sd+WCsV+MmPhnN6JrotWyir31+QgH7EvvE5/mwGJlEoci8Fw==", "cpu": [ - "arm" + "x64" ], - "license": "LGPL-3.0-or-later", + "dev": true, + "license": "MIT", "optional": true, "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } + "darwin" + ] }, - "site/node_modules/sharp/node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.3.3.tgz", - "integrity": "sha512-0DaL0A6Xu6sQSQFwe4iVCrKWU2cCTItnRsYsCdxAMm9NF6twAA9BKnoqy4hqz4+azQ0JHuA26qiUKsf1XJ/v5A==", + "tests/collaboration/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.63.4.tgz", + "integrity": "sha512-JinsFZ5G40oXQb+sUuiA5x689vhr6dDYK0H0NL+rwKdL6CqnmYN8PE4ZwfRSoIjrCxqTQG/SLfTtSvHeGxoVlw==", "cpu": [ "arm64" ], - "license": "LGPL-3.0-or-later", + "dev": true, + "license": "MIT", "optional": true, "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } + "freebsd" + ] }, - "site/node_modules/sharp/node_modules/@img/sharp-libvips-linux-ppc64": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.3.3.tgz", - "integrity": "sha512-cdn1OvUBwsXhbC0zSzJnNzf5MZ/mTrobawDvNXBTxe8VtqKAm0sRuEY2Evzovb/w9JMk4TvRxqt1mekSuJz64w==", + "tests/collaboration/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.63.4.tgz", + "integrity": "sha512-GAdA4UxpiNm27cLHr2GqXBpAD0x9FqwYBY7/YSP0Ss0/PNi4k8gbviqpIpYbVSRBaS2ZcegXEzgTQMbRNCwxCw==", "cpu": [ - "ppc64" + "x64" ], - "license": "LGPL-3.0-or-later", + "dev": true, + "license": "MIT", "optional": true, "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } + "freebsd" + ] }, - "site/node_modules/sharp/node_modules/@img/sharp-libvips-linux-riscv64": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.3.3.tgz", - "integrity": "sha512-HjPVx7yKz+0lqdhDlTw1tt90wamBoxhiXpvl1XZpJLiHH4RCJ5yDTqH+VlYPv2fwFs89JFw4c1IexYOcQUi4IQ==", + "tests/collaboration/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.63.4.tgz", + "integrity": "sha512-qDd6NoA1znaLjp4jR5U/KWCdLAKDJNB8W9ChbbDaKbo0xA+Atln5HK6LFCZ4oJQpemtRZA288DCirFRjrspptw==", "cpu": [ - "riscv64" + "arm" ], - "license": "LGPL-3.0-or-later", + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", "optional": true, "os": [ "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } + ] }, - "site/node_modules/sharp/node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.3.3.tgz", - "integrity": "sha512-neWLh+3yCNThxnfy3c4BbVBeGgt9aftno+XbT56iK28RgeDs3UOFWviLWlUu0bArYVYJaFDK+RRohbicUNCm8Q==", + "tests/collaboration/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.63.4.tgz", + "integrity": "sha512-WtB5Tz5KTNINb8ZA+8sQ7bmjuS1JrRT7YverYIhUGdWWDlpzVWmIwuZE+jidkEXUn1l0zrEkaIMa8dHF3NGcsA==", "cpu": [ - "s390x" + "arm" ], - "license": "LGPL-3.0-or-later", + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", "optional": true, "os": [ "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } + ] }, - "site/node_modules/sharp/node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.3.3.tgz", - "integrity": "sha512-4vKmvAst9nrowcqquKFAyZJUDolUaIp8uRiN0mWFguJ1IplC9/pitXtlnnlU4aa/eJw3J7i67V+pwUL+wZGdsA==", + "tests/collaboration/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.63.4.tgz", + "integrity": "sha512-VcQ3L1tjnkKzWjryAVaFhHEWcqOfICX9uxVVoDzm2t0DpgKRHd2zOpVrJc0xsWeBZcBFyYROCIBdyR/fS174pg==", "cpu": [ - "x64" + "arm64" ], - "license": "LGPL-3.0-or-later", + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", "optional": true, "os": [ "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } + ] }, - "site/node_modules/sharp/node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.3.3.tgz", - "integrity": "sha512-Y9kQaLMuNoB0bPYOOdcZMaseNrFpPodIWWMrx+CZyydf2xn68j9WYc6sWWRrDwNkzCQjKYfc68L7jKjGlHMibw==", + "tests/collaboration/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.63.4.tgz", + "integrity": "sha512-6+ZQX6P5s0cMDN2Ypb8Lbm2+/sZYmZjdaYny992ujUU9UKi/4CWoJWsl1pNvjWJHNHGK51m+jKGLlh1ylb2ifQ==", "cpu": [ "arm64" ], - "license": "LGPL-3.0-or-later", + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", "optional": true, "os": [ "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } + ] }, - "site/node_modules/sharp/node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.3.3.tgz", - "integrity": "sha512-fj8Mv0HHfD1Rr+4I68+3agJynxDWtBFgicTbSOb9Bke6pIwzGcJ+RX/yHjmiEGFMCavY/dxvem7MyNaJF+wDiw==", + "tests/collaboration/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.63.4.tgz", + "integrity": "sha512-D72ZnvkFkBXOfzMMQLcwfPLyGkKb7HZ9/mf97B7v6/P5Lbv4oFOtSY/uHbS8lH6uKUOxoKiuokdb50XZSzzbJw==", "cpu": [ - "x64" + "loong64" ], - "license": "LGPL-3.0-or-later", + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", "optional": true, "os": [ "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } + ] }, - "site/node_modules/sharp/node_modules/@img/sharp-linux-arm": { - "version": "0.35.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.35.4.tgz", - "integrity": "sha512-7OAS8gI0EReKGVN2HssHlM6umJgxF5VI3xN0p9FA91p/YO+ou5hiNghLdZ5BEHztwaaK5+bLKRf8x/o2L2nk9A==", + "tests/collaboration/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.63.4.tgz", + "integrity": "sha512-piU6BxeqA3O9KSu3kRCIQQtNqFFaTu21SEV4FwaRZowpnj3bLaWPZHw+xFqCs0XlJ+aOH3PTRWGoglH+mKA/OA==", "cpu": [ - "arm" + "loong64" ], - "license": "Apache-2.0", + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", "optional": true, "os": [ "linux" - ], - "engines": { - "node": ">=20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.3.3" - } + ] }, - "site/node_modules/sharp/node_modules/@img/sharp-linux-arm64": { - "version": "0.35.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.35.4.tgz", - "integrity": "sha512-De4jpEnAU8Hd5oT0j1G3uL4ZvTuipVMn7YC6vPaJhy6/7EwEae0SVAoBrUMYQbkLGDm85taVWwuPc1a44LTzCQ==", + "tests/collaboration/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.63.4.tgz", + "integrity": "sha512-/5PGpHwqt2EEEOUs1XwzubE/ucr0dWDQ+to3zqi4Ds7EWpwtQ79wXc4JBoxqj/OwpawTsKWzJxHfSuBOq3DrWA==", "cpu": [ - "arm64" + "ppc64" ], - "license": "Apache-2.0", + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", "optional": true, "os": [ "linux" - ], - "engines": { - "node": ">=20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.3.3" - } + ] }, - "site/node_modules/sharp/node_modules/@img/sharp-linux-ppc64": { - "version": "0.35.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.35.4.tgz", - "integrity": "sha512-2oYZJeIl4kCcMGk4ouZVjnkCtFrpQFlNEtJ6GbxzhHQchwH0NH/qEb9ykmOl29dqwMq+JhFdZn+1ak2FKhI9fQ==", + "tests/collaboration/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.63.4.tgz", + "integrity": "sha512-cX3beZDLWt7G2oJF+nhChiT+qtaihs+S2xi7ziGmVB+2pwPng6D0Ed0HmElQOgv2UsUmSJJLGwpBao/3TDx3VA==", "cpu": [ "ppc64" ], - "license": "Apache-2.0", + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", "optional": true, "os": [ "linux" - ], - "engines": { - "node": ">=20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-ppc64": "1.3.3" - } + ] }, - "site/node_modules/sharp/node_modules/@img/sharp-linux-riscv64": { - "version": "0.35.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.35.4.tgz", - "integrity": "sha512-cPbNChoRURAWdebDIHSenxRpgEdy7JkPydSnUxRm9VvKD7m0/xVaR/8Fzlu81pk5nHEvHH87UZUA7cTtwnbJSA==", + "tests/collaboration/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.63.4.tgz", + "integrity": "sha512-1uz2mGWHyptR7DgHHrlbdRAjXK7v7elGZ9lMja910/RP+ZYbX6xAmCiU9UZSX4hqmgtHMv6lr5l3kq1HIOpcag==", "cpu": [ "riscv64" ], - "license": "Apache-2.0", + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", "optional": true, "os": [ "linux" + ] + }, + "tests/collaboration/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.63.4.tgz", + "integrity": "sha512-nLS8topojxyz7SRpKR2IODRpQ0XPZ+xaOXvT3+hqK/Uy8Lo5HFgkkIBiIrCu5tL5YqzTvgovGw55PwpahTAGig==", + "cpu": [ + "riscv64" ], - "engines": { - "node": ">=20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-riscv64": "1.3.3" - } + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "site/node_modules/sharp/node_modules/@img/sharp-linux-s390x": { - "version": "0.35.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.35.4.tgz", - "integrity": "sha512-RY0JFY8Fd6RonCBtHz+DvadaPkXDSI1AUn6yWL9TipqkZ1vY8w8evqdgyDFnkm4/K1ve1TvZiaePP5oSd4+WVQ==", + "tests/collaboration/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.63.4.tgz", + "integrity": "sha512-gs7DRKotr3l3q+jGPQBjH0ng1FjlEDm5ueQrkw5JtQvtLyEIcLASqAEaor56BhkKRzk+IcQzrcanBdb/bBQn8g==", "cpu": [ "s390x" ], - "license": "Apache-2.0", + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", "optional": true, "os": [ "linux" - ], - "engines": { - "node": ">=20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.3.3" - } + ] }, - "site/node_modules/sharp/node_modules/@img/sharp-linux-x64": { - "version": "0.35.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.35.4.tgz", - "integrity": "sha512-9qvvEAuk8k89TfWUoX2htWjbAMX8p+NxCppjpcg5k6xMsjhBQPTsoIh36h9Qde4WRuGpJeYnOjdosDn/cnv+OA==", + "tests/collaboration/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.63.4.tgz", + "integrity": "sha512-791ET7W17NnScOZM7h4dX5hYspxE28htPFsb1awY/NRR8+PRNkS53e475rDdxXXDrP+kwnCcNWg9CX5ztn/Aqw==", "cpu": [ "x64" ], - "license": "Apache-2.0", + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", "optional": true, "os": [ "linux" - ], - "engines": { - "node": ">=20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.3.3" - } + ] }, - "site/node_modules/sharp/node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.35.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.35.4.tgz", - "integrity": "sha512-KB5jxpfWQTr0nc3xdHtWChdbifHrBGsd2SM62Eyxrl8afikm+f5qGBU75SJIZBT/S1MC8XyacdlXBMSWq6OURA==", + "tests/collaboration/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.63.4.tgz", + "integrity": "sha512-iwZQRcmj7g88g3tzefIrQY7qvmuA/cfYwhrDtTBhsmukO4U2huVO5W+86XacUMRvdSFVAc6kZUZy21JaRwiB9w==", "cpu": [ - "arm64" + "x64" ], - "license": "Apache-2.0", + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", "optional": true, "os": [ "linux" - ], - "engines": { - "node": ">=20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.3.3" - } + ] }, - "site/node_modules/sharp/node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.35.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.35.4.tgz", - "integrity": "sha512-f+eZJZIQNEEd26RPSW+76chwOf1XtA2Y/O+5ocVyLliHkeih3e+jhLVBdNTd2rS3IbNXK8+ug93Vf5ZXtF5Lxg==", + "tests/collaboration/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.63.4.tgz", + "integrity": "sha512-dVHFp9gRWrdTpnqQuGfCwd7hOQDatK1VCP2iWhLY/cGrOQs/ucFzJ6A5SRqbXX12ZDI8EUuejSM5kwg+ja7Png==", "cpu": [ "x64" ], - "license": "Apache-2.0", + "dev": true, + "license": "MIT", "optional": true, "os": [ - "linux" - ], - "engines": { - "node": ">=20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.3.3" - } + "openbsd" + ] }, - "site/node_modules/sharp/node_modules/@img/sharp-webcontainers-wasm32": { - "version": "0.35.4", - "resolved": "https://registry.npmjs.org/@img/sharp-webcontainers-wasm32/-/sharp-webcontainers-wasm32-0.35.4.tgz", - "integrity": "sha512-ESfNkywmCfPNyaZjxooddJQiQ+l/nTpGEOGthxiLnIHXC/CmcBixnfwUleX9mCz9ovrUUvKMap/pm8RYbzfwaA==", + "tests/collaboration/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.63.4.tgz", + "integrity": "sha512-t3NlauOW6gxZVVFcBEnO62Cb4wbyDFL416gTg1uFI/2tgqYQlf69FbSE115Ajre9I+c26Lk4mcmdFUsS/DGifQ==", "cpu": [ - "wasm32" + "arm64" ], - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@img/sharp-wasm32": "0.35.4" - }, - "engines": { - "node": ">=20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "site/node_modules/sharp/node_modules/@img/sharp-webcontainers-wasm32/node_modules/@img/sharp-wasm32": { - "version": "0.35.4", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.35.4.tgz", - "integrity": "sha512-zQnl4Kwp7Q6NHsENtU2T/00Zi+w3AQNwz3+UaTyVBy2FpXrzXzGjndpK61onhZjRtRpQXxCTeqw19bVyXOh7jA==", - "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", - "optional": true, - "dependencies": { - "@emnapi/runtime": "^1.11.3" - }, - "engines": { - "node": ">=20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "site/node_modules/sharp/node_modules/@img/sharp-webcontainers-wasm32/node_modules/@img/sharp-wasm32/node_modules/@emnapi/runtime": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.3.tgz", - "integrity": "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==", + "dev": true, "license": "MIT", "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "site/node_modules/sharp/node_modules/@img/sharp-webcontainers-wasm32/node_modules/@img/sharp-wasm32/node_modules/@emnapi/runtime/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD", - "optional": true + "os": [ + "openharmony" + ] }, - "site/node_modules/sharp/node_modules/@img/sharp-win32-arm64": { - "version": "0.35.4", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.35.4.tgz", - "integrity": "sha512-iNdlBX9gLVvqe2I3uIJSIKTq6wckP/DYxZtcqxm09x5Gi24DnFBmPAWZmr60ZyYMG0xlzo6goG3670ar+RXvRw==", + "tests/collaboration/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.63.4.tgz", + "integrity": "sha512-xWuIaSye5FWZF8+UYtVEcHtRJDN5kN9Kfgxx3Kq8XIov9KSKbc1fiqQCm90SKrgQbUXZelbnUhnlUJmfSE7P9A==", "cpu": [ "arm64" ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", + "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" - ], - "engines": { - "node": ">=20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } + ] }, - "site/node_modules/sharp/node_modules/@img/sharp-win32-ia32": { - "version": "0.35.4", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.35.4.tgz", - "integrity": "sha512-kqRsbaa5CS6KHlpxnN7WhE6vAAugXyZButpRdvDWetlv6Qv4N9WTcrWzF7tXfB9T7MsoadqdI8hmwLq6UlLvtw==", + "tests/collaboration/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.63.4.tgz", + "integrity": "sha512-9ALJJUOg/ZflMJepVo2PlgsGxSaxN7SQ4Z8GoZfVlarWr6r3rkHUNsd/zAio7p4YMtChSMXPionxej4Hkf6CXQ==", "cpu": [ "ia32" ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", + "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" - ], - "engines": { - "node": "^20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } + ] }, - "site/node_modules/sharp/node_modules/@img/sharp-win32-x64": { - "version": "0.35.4", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.35.4.tgz", - "integrity": "sha512-XtmnYhBcrORsJ4XJngyzr/EWP0hRZLAZRFaApdKuviyqF78+ylxh2y06ZmtULAMOnObJ3ucpN0AcwSWnMowTRg==", + "tests/collaboration/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.63.4.tgz", + "integrity": "sha512-blj9z5qx/Pv4WU0W1NMFDB97e0JH5ed+aZGywW8WCvp/NhWX/4PFAq5uu6Q0AebNn+Vo6KzUYDT++JzTT5ojlQ==", "cpu": [ "x64" ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", + "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" + ] + }, + "tests/collaboration/node_modules/vite/node_modules/rollup/node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.63.4.tgz", + "integrity": "sha512-Erx822VRBwLa124shbj+wNXe//BOgMEctDV0m1aqTQdNO1S69DgNUCFKC1RCeZfixs1J31l6igk1ziyXErbigQ==", + "cpu": [ + "x64" ], - "engines": { - "node": ">=20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, - "site/node_modules/sharp/node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } + "tests/collaboration/node_modules/vite/node_modules/rollup/node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" }, - "site/node_modules/sharp/node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "tests/collaboration/node_modules/vite/node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" }, "engines": { - "node": ">=10" - } - }, - "site/node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "devOptional": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "node": ">=12.0.0" }, - "engines": { - "node": ">=14.17" + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" } } } diff --git a/package.json b/package.json index 57bb39a..bd842eb 100644 --- a/package.json +++ b/package.json @@ -3,11 +3,20 @@ "private": true, "workspaces": [ "frontends/tauri", + "frontends/web", "site", "media/demo", - "packages/*" + "packages/*", + "tests/collaboration" ], "engines": { "node": ">=24" + }, + "scripts": { + "dev:web": "npm run dev -w @conn/web", + "build:web": "npm run build -w @conn/web", + "test:ui": "npm test -w @conn/ui", + "test:collaboration": "npm test -w @conn/collaboration-tests", + "package:web": "node scripts/package-web.mjs" } } diff --git a/packages/themes/README.md b/packages/themes/README.md index 769fa04..4eb243a 100644 --- a/packages/themes/README.md +++ b/packages/themes/README.md @@ -5,5 +5,5 @@ foreground, cursor, selection and the 16 ANSI colors). The native extension regi with `include_str!`, and the Svelte UI imports the same file, so the two can no longer drift. Interface colors that are not part of a terminal palette (surfaces, muted text, status colors) stay -in `frontends/tauri/src/lib/themes.ts`: themes installed by users supply a palette only, and Conn +in `packages/ui/src/lib/themes.ts`: themes installed by users supply a palette only, and Conn keeps control of the colors that carry approval and warning meaning. diff --git a/packages/ui/package.json b/packages/ui/package.json new file mode 100644 index 0000000..97e2dd1 --- /dev/null +++ b/packages/ui/package.json @@ -0,0 +1,37 @@ +{ + "name": "@conn/ui", + "version": "0.8.7", + "private": true, + "type": "module", + "exports": { + ".": "./src/index.ts", + "./runtime": "./src/runtime/ports.ts", + "./styles.css": "./src/styles/app.css" + }, + "scripts": { + "check": "svelte-check --threshold error", + "test": "node --test tests/*/*.test.ts", + "test:screen": "node scripts/screen-parity-test.mjs", + "test:checkpoint": "node scripts/checkpoint-parity-test.mjs", + "test:app-lifetime": "node scripts/app-lifetime-test.mjs" + }, + "dependencies": { + "@conn/brand": "*", + "@conn/themes": "*", + "@xterm/addon-fit": "^0.11.0", + "@xterm/addon-unicode11": "0.9.0", + "@xterm/xterm": "^6.0.0" + }, + "peerDependencies": { + "svelte": "^5.57.0" + }, + "devDependencies": { + "@sveltejs/vite-plugin-svelte": "^5.1.1", + "@tsconfig/svelte": "^5.0.8", + "svelte": "^5.57.0", + "svelte-check": "^4.7.6", + "typescript": "^5.6.0", + "vite": "^6.0.0", + "playwright": "1.63.0" + } +} diff --git a/packages/ui/scripts/app-lifetime-test.mjs b/packages/ui/scripts/app-lifetime-test.mjs new file mode 100644 index 0000000..0f2dd4d --- /dev/null +++ b/packages/ui/scripts/app-lifetime-test.mjs @@ -0,0 +1,127 @@ +// Two real ConnApp mounts with isolated host ports. No live user runtime is touched. +import assert from 'node:assert/strict'; +import { mkdtempSync, writeFileSync } from 'node:fs'; +import { tmpdir } from 'node:os'; +import { dirname, join, resolve } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { createServer } from 'vite'; +import { svelte } from '@sveltejs/vite-plugin-svelte'; +import { chromium } from 'playwright'; +import { testWebBootstrap } from '../tests/app-lifetime/web-flow.mjs'; + +const root=resolve(dirname(fileURLToPath(import.meta.url)),'..'); +const output=process.env.CONN_APP_LIFETIME_OUTPUT??mkdtempSync(join(tmpdir(),'conn-app-lifetime-')); +const server=await createServer({configFile:false,root,plugins:[svelte()],resolve:{alias:[{find:/^@tauri-apps\/api\/(core|event|window|webviewWindow)$/,replacement:join(root,'tests/app-lifetime/native-host.ts')}]},server:{host:'127.0.0.1',port:Number(process.env.CONN_APP_LIFETIME_PORT??1491),strictPort:true},logLevel:'error'}); +let browser, page; +try { + await server.listen(); + browser=await chromium.launch(); + page=await browser.newPage({viewport:{width:1200,height:850},reducedMotion:'reduce'}); + const errors=[];page.on('pageerror',error=>errors.push(error.message)); + await page.goto(`${server.resolvedUrls.local[0]}tests/app-lifetime/`); + await page.addStyleTag({content:'html,body{overflow:auto!important}#one,#two{position:relative;display:block}'}); + const one=page.locator('#one'),two=page.locator('#two'); + await one.locator('.app[data-runtime-online="true"]').waitFor(); + await two.locator('.app[data-runtime-online="true"]').waitFor(); + const first=one.locator('.decision-card .primary'),second=two.locator('.decision-card .primary'); + await first.waitFor();await second.waitFor(); + assert.equal(await first.innerText(),'Allow shared screen access');assert.equal(await second.innerText(),'Allow shared screen access'); + await first.click(); + await one.locator('.decision-card[aria-busy="true"]').waitFor(); + assert.equal(await first.isDisabled(),true);assert.equal(await second.isEnabled(),true,'same request ID in another mount stays actionable'); + await second.click();await two.locator('.decision-card [role="alert"]').waitFor(); + assert.equal(await one.locator('.decision-card [role="alert"]').count(),0,'request errors belong to their own app'); + assert.equal(await first.isDisabled(),true);assert.equal(await second.isEnabled(),true); + await second.click();await second.waitFor({state:'detached'}); + assert.equal(await first.isDisabled(),true,'other app resolution cannot finish a pending decision'); + + await one.locator('.app-menu .trigger').click(); + await one.getByRole('menuitem',{name:/^Settings/}).click(); + await one.locator('.category-list').getByRole('button',{name:'Appearance',exact:true}).click(); + await one.getByRole('button',{name:'한국어',exact:true}).click(); + assert.equal(await one.locator('.decision-card .primary').innerText(),'공유 화면 접근 허용'); + assert.equal(await two.locator('.sheet').count(),0,'opening settings affects only the target root'); + assert.equal(await page.evaluate(()=>window.appLifetime.inspect('one').saved['ss:lang']),'ko'); + assert.equal(await page.evaluate(()=>window.appLifetime.inspect('two').saved['ss:lang']),'en'); + await one.locator('.sheet header .btn.ghost').click(); + await two.locator('.app-menu .trigger').click(); + await two.getByRole('menuitem',{name:/^Check for Updates/}).click(); + await two.getByRole('button',{name:'View releases',exact:true}).click(); + assert.equal((await page.evaluate(()=>window.appLifetime.inspect('two').links)).length,1,'release link goes to its own host port'); + assert.equal((await page.evaluate(()=>window.appLifetime.inspect('one').links)).length,0); + assert.equal((await page.evaluate(()=>window.appLifetime.inspect('two').calls)).includes('open_release'),false,'web host link never invokes server-side opening'); + await two.locator('dialog header button').click(); + await page.screenshot({path:join(output,'isolated-apps.png'),fullPage:true}); + + await page.evaluate(()=>window.appLifetime.unmount('one')); + await one.locator('.app').waitFor({state:'detached'}); + const before=await page.evaluate(()=>({old:window.appLifetime.retired()[0],live:window.appLifetime.inspect('two')})); + assert.equal(before.old.disposed,true);assert.equal(before.old.listeners,0); + await page.waitForTimeout(5600); + const after=await page.evaluate(()=>({old:window.appLifetime.retired()[0],live:window.appLifetime.inspect('two')})); + assert.deepEqual(after.old.calls,before.old.calls,'unmounted app stops all polling'); + assert.ok(after.live.calls.length>before.live.calls.length,'surviving app keeps its own polling'); + await page.evaluate(()=>{window.appLifetime.mount('one','en');window.appLifetime.releaseRetired();}); + await one.locator('.app[data-runtime-online="true"]').waitFor(); + const fresh=one.locator('.decision-card .primary');await fresh.waitFor(); + assert.equal(await fresh.innerText(),'Allow shared screen access');assert.equal(await fresh.isEnabled(),true,'remount gets a fresh request map even before old pending work finishes'); + assert.equal(await page.getByText('late-event',{exact:true}).count(),0,'late events from a retired host never reach a new mount'); + assert.deepEqual(errors,[]); + await page.evaluate(async()=>{await window.appLifetime.unmount('one');await window.appLifetime.unmount('two');}); + const retired=await page.evaluate(()=>window.appLifetime.retired()); + assert.ok(retired.every(app=>app.disposed&&app.listeners===0)); + assert.equal(await page.evaluate(()=>window.appLifetime.translate('ko','host.connect')),'Conn에 연결'); + assert.equal(await page.evaluate(()=>window.appLifetime.translate('en','tab.n',{n:3})),'tab 3'); + assert.equal(await page.evaluate(()=>window.appLifetime.translate('en','missing.key')),'missing.key'); + await page.evaluate(()=>{window.appLifetime.mount('two','en');window.appLifetime.uncertain('two');}); + await two.locator('.app[data-runtime-online="true"]').waitFor(); + await two.locator('.decision-card .primary').click(); + await two.locator('.decision-card [role="alert"]').filter({hasText:'Check the terminal and current request state before trying again.'}).waitFor(); + await two.locator('.app-menu .trigger').click(); + await two.getByRole('menuitem',{name:/^Settings/}).click(); + await two.locator('.category-list').getByRole('button',{name:'Appearance',exact:true}).click(); + await two.getByRole('button',{name:'한국어',exact:true}).click(); + await two.locator('.sheet header .btn.ghost').click(); + await two.locator('.decision-card [role="alert"]').filter({hasText:'다시 시도하기 전에 터미널과 현재 요청 상태를 확인하세요.'}).waitFor(); + await page.screenshot({path:join(output,'uncertain-request-ko.png'),fullPage:true}); + await page.evaluate(()=>window.appLifetime.unmount('two')); + await page.goto(`${server.resolvedUrls.local[0]}tests/app-lifetime/native.html`); + await page.getByRole('alert').filter({hasText:'Synthetic owner attachment failure'}).waitFor(); + assert.equal(await page.locator('input[type="password"]').count(),0,'native connection never asks for a server code'); + assert.equal((await page.evaluate(()=>window.nativeLifetime.inspect())).attachments,1); + await page.getByRole('button',{name:'Reconnect',exact:true}).click(); + await page.locator('.app[data-runtime-online="true"]').waitFor(); + assert.equal((await page.evaluate(()=>window.nativeLifetime.inspect())).attachments,2); + await page.evaluate(()=>window.nativeLifetime.fenceNext()); + await page.getByRole('alert').filter({hasText:'This window’s connection changed.'}).waitFor(); + await page.waitForFunction(()=>window.nativeLifetime.inspect().listeners===0); + await page.waitForTimeout(1200); + assert.equal((await page.evaluate(()=>window.nativeLifetime.inspect())).attachments,2,'a fenced native view never takes ownership automatically'); + await page.screenshot({path:join(output,'native-reconnect.png'),fullPage:true}); + await page.getByRole('button',{name:'Reconnect',exact:true}).click(); + await page.locator('.app[data-runtime-online="true"]').waitFor(); + assert.equal((await page.evaluate(()=>window.nativeLifetime.inspect())).attachments,3); + await page.evaluate(()=>window.nativeLifetime.unmount()); + assert.equal((await page.evaluate(()=>window.nativeLifetime.inspect())).listeners,0); + assert.deepEqual(errors,[]); + await testWebBootstrap(browser,server.resolvedUrls.local[0],output); + const checks = [ + 'two actual ConnApp roots', 'same-ID busy and retry isolation', 'language and settings isolation', + 'links use own host port', 'unmount polling/listener cleanup', 'late response/event fencing', 'fresh state on remount', + 'pure translations share EN/KO dictionary', 'uncertain decision tells user to check terminal/state in EN and KO', + 'native attachment failure shown in shared UI', 'native fenced view stops without automatic takeover', + 'native explicit retry uses fresh attachment and metadata', 'initial code-required visit has no error', + 'English default matches bootstrap/app despite Korean browser locale', 'saved Korean preference matches bootstrap/app', + 'web reauthentication after connection shows error', 'web fenced view requires explicit takeover', + 'ordered input failure fences queued suffix and requires explicit cookie reconnect', + 'fresh checkpoint accepts new input without replaying old input', + 'failed reconnect checkpoint presents explicit recovery instead of a locked terminal', + 'socket close preceding lost-input rejection still requires explicit recovery', + ]; + writeFileSync(join(output,'result.json'),JSON.stringify({status:'passed',scope:'Actual product UI with minimal host/IPC fixtures; no native OS, PTY, or MCP execution.',checks,errors},null,2)); + console.log(`PASS app mount/language/request/host-link/disposal isolation. Evidence: ${output}`); +} catch (error) { + await page?.screenshot({path:join(output,'failure.png'),fullPage:true}).catch(()=>{}); + console.error(`App lifetime evidence: ${output}`); + throw error; +} finally { await browser?.close();await server.close(); } diff --git a/packages/ui/scripts/checkpoint-parity-test.mjs b/packages/ui/scripts/checkpoint-parity-test.mjs new file mode 100644 index 0000000..ebb8886 --- /dev/null +++ b/packages/ui/scripts/checkpoint-parity-test.mjs @@ -0,0 +1,107 @@ +// Restore real conn-core owner checkpoints into the production xterm renderer. +// Fixtures cover every byte split, including incomplete UTF-8 and VT sequences. +import {strict as assert} from 'node:assert'; +import {spawnSync} from 'node:child_process'; +import {mkdtempSync, readFileSync, rmSync, writeFileSync} from 'node:fs'; +import {createRequire} from 'node:module'; +import {tmpdir} from 'node:os'; +import {join} from 'node:path'; +import {fileURLToPath} from 'node:url'; +import {chromium} from 'playwright'; + +const require = createRequire(import.meta.url); +const root = fileURLToPath(new URL('../../../', import.meta.url)); +const temporary = mkdtempSync(join(tmpdir(), 'conn-checkpoint-parity-')); +const fixturesPath = join(temporary, 'fixtures.json'); +let browser; +let failed = false; +try { + const generated = spawnSync('cargo', [ + 'test', '--locked', '-p', 'conn-core', '--test', 'renderer_checkpoint', + 'checkpoint_preserves_output_state_and_following_bytes_at_every_split', '--', '--exact', + ], { + cwd: root, + env: {...process.env, CONN_CHECKPOINT_FIXTURES: fixturesPath}, + stdio: 'inherit', + }); + if (generated.error) throw generated.error; + assert.equal(generated.status, 0, 'conn-core checkpoint fixture generation failed'); + const fixtures = JSON.parse(readFileSync(fixturesPath, 'utf8')); + assert.ok(fixtures.length > 0, 'checkpoint fixtures must not be empty'); + browser = await chromium.launch({headless: true}); + const page = await browser.newPage(); + await page.setContent('
'); + await page.addScriptTag({path: require.resolve('@xterm/xterm')}); + await page.addScriptTag({path: require.resolve('@xterm/addon-unicode11')}); + const result = await page.evaluate(async fixtures => { + const failures = []; + let checked = 0; + function snapshot(term) { + const buffer = term.buffer.active; + return { + type: buffer.type, x: buffer.cursorX, y: buffer.cursorY, + baseY: buffer.baseY, length: buffer.length, modes: term.modes, + lines: Array.from({length: buffer.length}, (_, y) => { + const line = buffer.getLine(y); + return {wrap: line.isWrapped, cells: Array.from({length: term.cols}, (_, x) => { + const cell = line.getCell(x); + return [ + cell.getChars(), cell.getWidth(), cell.getFgColorMode(), cell.getFgColor(), + cell.getBgColorMode(), cell.getBgColor(), cell.isBold(), cell.isItalic(), + cell.isUnderline(), cell.isInverse(), cell.isInvisible(), cell.isDim(), + cell.isBlink(), cell.isStrikethrough(), + ]; + })}; + }), + }; + } + const write = (term, bytes) => new Promise(resolve => term.write(Uint8Array.from(bytes), resolve)); + const tail = Array.from(new TextEncoder().encode('\x1b8Z\nlast')); + for (const fixture of fixtures) { + const options = {cols: fixture.cols, rows: fixture.rows, scrollback: 5000, allowProposedApi: true}; + const original = new Terminal(options); + const restored = new Terminal(options); + try { + for (const term of [original, restored]) { + term.loadAddon(new Unicode11Addon.Unicode11Addon()); + term.unicode.activeVersion = '11'; + } + original.open(document.getElementById('original')); + restored.open(document.getElementById('restored')); + await write(original, fixture.before); + await write(restored, fixture.checkpoint); + for (const [stage, bytes] of [ + ['initial', null], ['continuation', fixture.after], ['saved-cursor', tail], ['resized', []], + ]) { + if (stage === 'resized') { original.resize(26, 8); restored.resize(26, 8); } + if (bytes) { await write(original, bytes); await write(restored, bytes); } + const expected = snapshot(original); + const actual = snapshot(restored); + if (JSON.stringify(expected) !== JSON.stringify(actual)) { + failures.push({fixture: fixture.fixture, split: fixture.split, stage, expected, actual}); + break; + } + } + } finally { + original.dispose(); + restored.dispose(); + } + checked++; + if (failures.length >= 10) break; + } + return {checked, total: fixtures.length, failures}; + }, fixtures); + if (result.failures.length) { + const output = join(temporary, 'results.json'); + writeFileSync(output, JSON.stringify(result, null, 2)); + throw new Error(`Checkpoint parity failed: ${JSON.stringify(result.failures.map(({fixture, split, stage}) => ({fixture, split, stage})))}. Details: ${output}`); + } + console.log(`PASS ${result.checked}/${result.total} owner checkpoint/xterm cases (grid, history, cursor, styles, modes, continuation, resize)`); +} catch (error) { + failed = true; + throw error; +} finally { + await browser?.close(); + // Keep failed fixtures/results for diagnosis; successful runs leave no artifacts. + if (!failed) rmSync(temporary, {recursive: true, force: true}); +} diff --git a/frontends/tauri/scripts/screen-parity-test.mjs b/packages/ui/scripts/screen-parity-test.mjs similarity index 100% rename from frontends/tauri/scripts/screen-parity-test.mjs rename to packages/ui/scripts/screen-parity-test.mjs diff --git a/frontends/tauri/src/App.svelte b/packages/ui/src/ConnApp.svelte similarity index 81% rename from frontends/tauri/src/App.svelte rename to packages/ui/src/ConnApp.svelte index b63845f..554cbf6 100644 --- a/frontends/tauri/src/App.svelte +++ b/packages/ui/src/ConnApp.svelte @@ -1,17 +1,22 @@ {#if r} {#key r.connId} - +

{t('admission.desc')}

{#if st.admissions.length > 1}{t('admission.more', { n: st.admissions.length - 1 })}{/if} {#snippet actions()} diff --git a/frontends/tauri/src/components/AgentConnections.svelte b/packages/ui/src/components/AgentConnections.svelte similarity index 97% rename from frontends/tauri/src/components/AgentConnections.svelte rename to packages/ui/src/components/AgentConnections.svelte index c514bcd..55e0bcb 100644 --- a/frontends/tauri/src/components/AgentConnections.svelte +++ b/packages/ui/src/components/AgentConnections.svelte @@ -1,7 +1,9 @@ +{#if r} +
+

{t('ctl.scope')}

+ {#if r.reason}

{r.reason}

{/if} + + {#if action.error}{/if} +
+ + +
+
{t('ctl.options')} +

{t('ctl.copilot_hint')}

+ +
+
+{/if} + diff --git a/frontends/tauri/src/components/DecisionCard.svelte b/packages/ui/src/components/DecisionCard.svelte similarity index 67% rename from frontends/tauri/src/components/DecisionCard.svelte rename to packages/ui/src/components/DecisionCard.svelte index dab62d9..97d7952 100644 --- a/frontends/tauri/src/components/DecisionCard.svelte +++ b/packages/ui/src/components/DecisionCard.svelte @@ -1,12 +1,15 @@ -
+
{agent}{label}
{@render children?.()}
diff --git a/frontends/tauri/src/components/Island.svelte b/packages/ui/src/components/Island.svelte similarity index 68% rename from frontends/tauri/src/components/Island.svelte rename to packages/ui/src/components/Island.svelte index de45267..8ad3f5c 100644 --- a/frontends/tauri/src/components/Island.svelte +++ b/packages/ui/src/components/Island.svelte @@ -1,14 +1,30 @@ @@ -35,6 +36,7 @@ diff --git a/frontends/tauri/src/components/TerminalPreparation.svelte b/packages/ui/src/components/TerminalPreparation.svelte similarity index 92% rename from frontends/tauri/src/components/TerminalPreparation.svelte rename to packages/ui/src/components/TerminalPreparation.svelte index 98b4d81..6b4b29a 100644 --- a/frontends/tauri/src/components/TerminalPreparation.svelte +++ b/packages/ui/src/components/TerminalPreparation.svelte @@ -1,10 +1,10 @@ diff --git a/frontends/tauri/src/components/Toasts.svelte b/packages/ui/src/components/Toasts.svelte similarity index 90% rename from frontends/tauri/src/components/Toasts.svelte rename to packages/ui/src/components/Toasts.svelte index 205ee07..8202737 100644 --- a/frontends/tauri/src/components/Toasts.svelte +++ b/packages/ui/src/components/Toasts.svelte @@ -1,6 +1,9 @@
diff --git a/frontends/tauri/src/components/UpdateDialog.svelte b/packages/ui/src/components/UpdateDialog.svelte similarity index 87% rename from frontends/tauri/src/components/UpdateDialog.svelte rename to packages/ui/src/components/UpdateDialog.svelte index d6d4214..8f6339a 100644 --- a/frontends/tauri/src/components/UpdateDialog.svelte +++ b/packages/ui/src/components/UpdateDialog.svelte @@ -1,16 +1,17 @@ @@ -20,6 +21,7 @@
{#if confirm}

{t('update.restartTitle')}

{t('update.restartWarning')}

+ {:else if s.phase === 'unsupported'}

{t('update.hostManaged')}

{updateCapability.reason || t('update.hostManagedHint')}

{:else if s.phase === 'checking'}

{t('update.loading')}

{:else if s.phase === 'error'}

{t('update.failed')}

{t('update.unchanged')}

{t('s.diag.details')}

{s.error}

{:else if s.phase === 'downloading'}

{t('update.downloading', { progress: progress === undefined ? '…' : `${progress}%` })}

@@ -30,7 +32,7 @@ {:else}

{t('update.latest')}

{t('update.channel')}

{/if} {#if s.notes && !confirm}
{t('update.notes')}
{s.notes}
{/if}
- {#if !confirm} + {#if !confirm && updateCapability.supported}
{t('update.preferences')} @@ -42,7 +44,7 @@ {:else} - + {#if s.phase === 'ready'} {:else if s.supported && s.version && s.phase !== 'error'} {:else}{/if} diff --git a/packages/ui/src/index.ts b/packages/ui/src/index.ts new file mode 100644 index 0000000..9e5ca5e --- /dev/null +++ b/packages/ui/src/index.ts @@ -0,0 +1,4 @@ +export { default as ConnApp } from './ConnApp.svelte'; +export { default as HostConnection } from './components/HostConnection.svelte'; +export { translate, initialLanguage, type Lang } from './lib/i18n.svelte'; +export type { ConnPorts, ConnTransport, UpdateStatus } from './runtime/ports'; diff --git a/packages/ui/src/lib/bridge.ts b/packages/ui/src/lib/bridge.ts new file mode 100644 index 0000000..3cc7518 --- /dev/null +++ b/packages/ui/src/lib/bridge.ts @@ -0,0 +1,44 @@ +import type { ConnClient } from '../runtime/client'; +import type { createStore } from './store.svelte'; +import type { createI18n } from './i18n.svelte'; +import type { AdmissionChange } from "./collaboration/contracts"; +import type { SessionEvent } from "./collaboration/events"; + +export type Pacing = { minWriteIntervalMs: number; enterGraceMs: number; leaseTtlSecs: number; approvalTtlSecs: number }; +export type Mode = "observe" | "copilot" | "autopilot"; +export type Ev = SessionEvent; +export const TOOLS = ["snapshot", "request_control", "type", "send_key", "interrupt", "release_control", "check_approval", "request_attention", "open_tab", "switch_tab"]; +/** i18n key and affordance mask (`null` = every tool), shared by the palette and settings. */ +export const TOOL_PRESETS: [string, string[] | null][] = [ + ["s.preset.observe", ["snapshot", "request_attention", "check_approval", "switch_tab"]], + ["s.preset.notabs", TOOLS.filter((a) => a !== "open_tab")], + ["s.preset.all", null], +]; + +export type OutputFrame = { epoch: number; streamSeq: number; reset?: boolean; session: string; data: string; outputSeq: number; generation: number; size: { rows: number; cols: number } }; +export const b64ToBytes = (s: string) => Uint8Array.from(atob(s), (c) => c.charCodeAt(0)); + +export function createBridge(client: ConnClient, store: ReturnType, language: ReturnType) { + const {invoke, listen} = client; + const {st, toast} = store; + const {t} = language; + /** Invoke a command against the active tab unless `session` is given. */ + const cmd = (name: string, args: Record = {}) => + invoke(name, { session: st.active, ...args }); + /** A rejected mode change must remain visible and must not permit a following grant. */ + async function changeMode(mode: Mode, session = st.active): Promise { + try { await cmd("set_mode", { mode, session }); return true; } + catch (e) { + const message = String(e); + toast(message.includes("input_pending") || message.includes("shell input is pending") ? t("mode.input_pending") : message, "warn"); + return false; + } + } + const log = (msg: string) => invoke("log", { msg }).catch(() => {}); + const onEvent = (h: (ev: Ev) => void) => listen("ss:event", (e) => h(e.payload)); + const onAdmission = (h: (p: AdmissionChange) => void) => listen("ss:admission", (e) => h(e.payload)); + const onTabOpened = (h: (p: { session: string; agentId: string; reason?: string | null; focus?: boolean }) => void) => listen<{ session: string; agentId: string; reason?: string | null; focus?: boolean }>("ss:tab_opened", (e) => h(e.payload)); + const onOutput = (h: (p: OutputFrame) => void) => listen("ss:output", (e) => h(e.payload)); + + return { cmd, changeMode, log, onEvent, onAdmission, onTabOpened, onOutput }; +} diff --git a/frontends/tauri/src/lib/collaboration/activity.ts b/packages/ui/src/lib/collaboration/activity.ts similarity index 100% rename from frontends/tauri/src/lib/collaboration/activity.ts rename to packages/ui/src/lib/collaboration/activity.ts diff --git a/frontends/tauri/src/lib/collaboration/admissions.ts b/packages/ui/src/lib/collaboration/admissions.ts similarity index 100% rename from frontends/tauri/src/lib/collaboration/admissions.ts rename to packages/ui/src/lib/collaboration/admissions.ts diff --git a/packages/ui/src/lib/collaboration/api.ts b/packages/ui/src/lib/collaboration/api.ts new file mode 100644 index 0000000..91049a9 --- /dev/null +++ b/packages/ui/src/lib/collaboration/api.ts @@ -0,0 +1,25 @@ +import type { ConnClient } from '../../runtime/client'; +import type { AdmissionSnapshot, SharingSnapshot, SharingStatus, DecisionTarget } from './contracts'; +export function failureKey(error: unknown): string { + const message = String(error); + const code = typeof error === 'object' && error !== null && 'code' in error ? String(error.code) : ''; + if (['outcome_unknown', 'outcome_pending'].includes(code) || /outcome_(unknown|pending)/.test(message)) return 'decision.outcomeUnknown'; + if (message.includes('review_context_changed')) return 'decision.contextChanged'; + if (message.includes('review_scope_unavailable')) return 'decision.scopeUnavailable'; + if (message.includes('sharing_changed')) return 'sharing.changed'; + if (message.includes('history_unavailable')) return 'sharing.historyUnavailable'; + if (message.includes('input_pending') || message.includes('shell input is pending')) return 'sharing.pendingInput'; + if (message.includes('connection_gone') || message.includes('disconnected')) return 'sharing.connectionGone'; + return 'decision.failed'; +} + +export function createCollaborationApi(client: ConnClient) { + const {invoke} = client; + const admissionSnapshot = () => invoke('admission_snapshot'); + const decideAdmission = (connId: number, allow: boolean) => invoke('decide_admission', { connId, allow }); + const sharingSnapshot = (session: string) => invoke('sharing_state', { session }); + const setSharing = (session: string, shared: boolean, connectionIds: number[], expectedRevision: number) => invoke('set_sharing', { session, shared, connectionIds, expectedRevision }); + const decideControl = (target: DecisionTarget, grant: boolean) => invoke('decide_control', { ...target, grant }); + + return { admissionSnapshot, decideAdmission, sharingSnapshot, setSharing, decideControl }; +} diff --git a/packages/ui/src/lib/collaboration/attention.ts b/packages/ui/src/lib/collaboration/attention.ts new file mode 100644 index 0000000..dbf7863 --- /dev/null +++ b/packages/ui/src/lib/collaboration/attention.ts @@ -0,0 +1,20 @@ +import type { ConnPorts } from '../../runtime/ports'; +import type { Lifetime } from '../../runtime/lifetime'; +/** Inactivity changes delivery only, never session access. Dedupe belongs to the mounted app. */ +export function createAttention(host: ConnPorts['attention'], lifetime: Lifetime) { + let previous = new Set(); + let lastSignal = 0; + let revision = 0; + lifetime.own(() => { revision++; previous.clear(); void host.request(false).catch(() => {}); }); + async function signalPending(keys: string[]) { + if (lifetime.disposed) return; + const current = ++revision; + const next = new Set(keys), fresh = keys.some(key => !previous.has(key)); previous = next; + document.title = keys.length ? `(${keys.length}) Conn` : 'Conn'; + if (!keys.length) { await host.request(false); return; } + if (!fresh || Date.now() - lastSignal < 10000 || await host.isFocused() || current !== revision || lifetime.disposed) return; + lastSignal = Date.now(); + await host.request(true); + } + return { signalPending }; +} diff --git a/frontends/tauri/src/lib/collaboration/contracts.ts b/packages/ui/src/lib/collaboration/contracts.ts similarity index 100% rename from frontends/tauri/src/lib/collaboration/contracts.ts rename to packages/ui/src/lib/collaboration/contracts.ts diff --git a/packages/ui/src/lib/collaboration/control.svelte.ts b/packages/ui/src/lib/collaboration/control.svelte.ts new file mode 100644 index 0000000..6c0b8e0 --- /dev/null +++ b/packages/ui/src/lib/collaboration/control.svelte.ts @@ -0,0 +1,18 @@ +import type { ConnClient } from '../../runtime/client'; +import type { createCollaborationApi } from './api'; +import type { createRequestActions } from './decision.svelte'; +import type { DecisionTarget } from './contracts'; + +export function createControl(client: ConnClient, api: ReturnType, actions: ReturnType) { + const {invoke} = client; const {decideControl} = api; const {requestAction} = actions; + const controlAction = (target: DecisionTarget) => requestAction(`control:${target.session}:${target.requestId}`); + function resolveControl(target: DecisionTarget, decision: 'grant' | 'copilot' | 'deny') { + return controlAction(target).run(async () => { + if (decision === 'copilot') await invoke('set_mode', { session: target.session, mode: 'copilot' }); + await decideControl(target, decision !== 'deny'); + }); + } + + + return { controlAction, resolveControl }; +} diff --git a/packages/ui/src/lib/collaboration/decision.svelte.ts b/packages/ui/src/lib/collaboration/decision.svelte.ts new file mode 100644 index 0000000..129c1f3 --- /dev/null +++ b/packages/ui/src/lib/collaboration/decision.svelte.ts @@ -0,0 +1,30 @@ +/** A decision stays retryable after failure. Never hide a request in finally. */ +export function decision() { + let busy = $state(false); + let error = $state(null); + return { + get busy() { return busy; }, get error() { return error; }, + async run(action: () => Promise) { + if (busy) return false; + busy = true; error = null; + try { await action(); return true; } + catch (cause) { error = cause; return false; } + finally { busy = false; } + }, + }; +} + +export function createRequestActions() { + // Keyboard and card buttons share progress/error state for the same request. + const actions = new Map>(); + function requestAction(key: string) { + let action = actions.get(key); + if (!action) { + for (const [id, old] of actions) if (actions.size >= 128 && !old.busy) actions.delete(id); + action = decision(); actions.set(key, action); + } + return action; + } + + return { requestAction, forgetSession(session: string) { for (const key of actions.keys()) if (key.startsWith(`control:${session}:`) || key.startsWith(`approval:${session}:`)) actions.delete(key); }, dispose() { actions.clear(); } }; +} diff --git a/frontends/tauri/src/lib/collaboration/events.ts b/packages/ui/src/lib/collaboration/events.ts similarity index 93% rename from frontends/tauri/src/lib/collaboration/events.ts rename to packages/ui/src/lib/collaboration/events.ts index d963ae1..a03711d 100644 --- a/frontends/tauri/src/lib/collaboration/events.ts +++ b/packages/ui/src/lib/collaboration/events.ts @@ -2,7 +2,8 @@ import type { Mode, Pacing } from '../bridge'; import type { Analysis } from '../store.svelte'; import type { OriginalRequest } from '../timeline'; -export type Approval = { id: string; agentId: string; cmd: string; label: string; intent?: string | null; analysis?: Analysis | null }; +export type ReviewContext = { reason: "command_policy" | "unverified_shell"; allowSession: boolean; remote: boolean }; +export type Approval = { id: string; agentId: string; cmd: string; label: string; review?: ReviewContext; intent?: string | null; analysis?: Analysis | null }; export type ControlRequest = { requestId: string; agentId: string; reason?: string | null; originalRequest?: OriginalRequest | null }; export type Proposal = { proposalId: string; agentId: string; text: string; state: 'drafting' | 'ready' | 'executed' | 'rejected' | 'denied'; intent?: string | null }; type Resolution = 'pending' | 'granted' | 'denied' | 'expired'; diff --git a/frontends/tauri/src/lib/collaboration/reconcile.ts b/packages/ui/src/lib/collaboration/reconcile.ts similarity index 78% rename from frontends/tauri/src/lib/collaboration/reconcile.ts rename to packages/ui/src/lib/collaboration/reconcile.ts index eb40d5a..8dab7dc 100644 --- a/frontends/tauri/src/lib/collaboration/reconcile.ts +++ b/packages/ui/src/lib/collaboration/reconcile.ts @@ -1,6 +1,8 @@ /** A read started before an event cannot overwrite that event's state. */ export class Reconciler { private disposed = false; + private generation = 0; + reset() { this.generation++; this.versions.clear(); this.reads.clear(); } dispose() { this.disposed = true; } private versions = new Map(); private reads = new Map>(); @@ -10,15 +12,16 @@ export class Reconciler { changed(id: string) { this.versions.set(id, (this.versions.get(id) ?? 0) + 1); } sync(id: string): Promise { if (this.reads.has(id)) return this.reads.get(id)!; + const generation = this.generation; const work = (async () => { // Bounded retries under a busy output stream; the next poll reconciles again. for (let attempt = 0; attempt < 3; attempt++) { const version = this.versions.get(id) ?? 0; const snapshot = await this.read(id); - if (this.disposed) return; + if (this.disposed || generation !== this.generation) return; if ((this.versions.get(id) ?? 0) === version) { this.apply(id, snapshot); return; } } - })().finally(() => this.reads.delete(id)); + })().finally(() => { if (generation === this.generation) this.reads.delete(id); }); this.reads.set(id, work); return work; } } diff --git a/packages/ui/src/lib/collaboration/review.svelte.ts b/packages/ui/src/lib/collaboration/review.svelte.ts new file mode 100644 index 0000000..eb35b40 --- /dev/null +++ b/packages/ui/src/lib/collaboration/review.svelte.ts @@ -0,0 +1,12 @@ +import type { ConnClient } from '../../runtime/client'; +import type { createRequestActions } from './decision.svelte'; +export function createReview(client: ConnClient, actions: ReturnType) { + const {invoke} = client; const {requestAction} = actions; + const reviewAction = (session: string, approvalId: string) => requestAction(`approval:${session}:${approvalId}`); + function resolveReview(session: string, approvalId: string, decision: string) { + return reviewAction(session, approvalId).run(() => invoke('approve', { session, approvalId, decision })); + } + + + return { reviewAction, resolveReview }; +} diff --git a/frontends/tauri/src/lib/collaboration/session.ts b/packages/ui/src/lib/collaboration/session.ts similarity index 98% rename from frontends/tauri/src/lib/collaboration/session.ts rename to packages/ui/src/lib/collaboration/session.ts index 5c5ed6f..8e2777f 100644 --- a/frontends/tauri/src/lib/collaboration/session.ts +++ b/packages/ui/src/lib/collaboration/session.ts @@ -14,7 +14,7 @@ export type SessionSnapshot = { proposal: Proposal | null; controlRequests: ControlRequest[]; }; -const approvalState = (a: Approval, at = Date.now()): NonNullable => ({ id: a.id, agentId: a.agentId, cmd: a.cmd, label: a.label, at, intent: a.intent ?? undefined, analysis: a.analysis ?? undefined }); +const approvalState = (a: Approval, at = Date.now()): NonNullable => ({ id: a.id, agentId: a.agentId, cmd: a.cmd, label: a.label, review: a.review, at, intent: a.intent ?? undefined, analysis: a.analysis ?? undefined }); const proposalState = (p: Proposal): NonNullable => ({ id: p.proposalId, agentId: p.agentId, text: p.text, ready: p.state === 'ready', intent: p.intent ?? undefined }); const controlState = (c: ControlRequest): NonNullable => ({ id: c.requestId, agentId: c.agentId, reason: c.reason ?? undefined, originalRequest: c.originalRequest ?? undefined }); function clearDecisions(t: TabState) { diff --git a/frontends/tauri/src/lib/connMark.ts b/packages/ui/src/lib/connMark.ts similarity index 100% rename from frontends/tauri/src/lib/connMark.ts rename to packages/ui/src/lib/connMark.ts diff --git a/frontends/tauri/src/lib/connections.ts b/packages/ui/src/lib/connections.ts similarity index 100% rename from frontends/tauri/src/lib/connections.ts rename to packages/ui/src/lib/connections.ts diff --git a/packages/ui/src/lib/extensions.svelte.ts b/packages/ui/src/lib/extensions.svelte.ts new file mode 100644 index 0000000..819038e --- /dev/null +++ b/packages/ui/src/lib/extensions.svelte.ts @@ -0,0 +1,38 @@ +import type { createBridge } from './bridge'; +import type { createStore } from './store.svelte'; +import { ANSI, type ThemeId, type Theme } from './themes'; + +export type Extension = { id: string; name: string; kind: string; enabled: boolean; capabilities: string[] }; +export type ExtensionTheme = { id: string; name: string; background: string; foreground: string; cursor: string; selection: string; ansi: string[] }; +export type ExtensionCatalog = { + apiVersion: number; extensions: Extension[]; + settings: {theme: string}; themes: ExtensionTheme[]; +}; +export function createExtensions(bridge: ReturnType, store: ReturnType, THEMES: Record, storage: Pick) { + const {cmd} = bridge; const {st} = store; + const extensions = $state<{catalog: ExtensionCatalog | null}>({catalog:null}); + async function refreshExtensions() { + const catalog = await cmd('extensions_status'); + if (catalog.apiVersion !== 1) throw new Error('Unsupported extension API'); + for (const theme of catalog.themes) { + const id = theme.id.replace(/^conn\.theme\./, '') as ThemeId; + const rgb = parseInt(theme.background.replace('#',''),16); + const light = ((rgb >> 16) * .299 + ((rgb >> 8) & 255) * .587 + (rgb & 255) * .114) > 160; + const base = THEMES[id] ?? THEMES[light ? 'paper' : 'midnight']; + // Registry supplies only supported tokens; trusted status/approval colors stay in Conn. + THEMES[id] = {...base, id, name:theme.name, cursor:theme.cursor, tokens:{...base.tokens,bg:theme.background,fg:theme.foreground,selection:theme.selection}, xterm:{...base.xterm, background:theme.background,foreground:theme.foreground,...Object.fromEntries(ANSI.map((key,i) => [key,theme.ansi[i]]))}}; + } + const id = catalog.settings.theme.replace(/^conn\.theme\./, '') as ThemeId; + if (THEMES[id]) { st.theme = id; storage.setItem('ss:theme', id); } + st.themeRevision++; + extensions.catalog = catalog; + return catalog; + } + async function selectTheme(id: string) { + await cmd('extension_configure', {id:extensions.catalog?.themes.find(theme => theme.id === id || theme.id === `conn.theme.${id}`)?.id ?? `conn.theme.${id}`,config:{enabled:true}}); + await refreshExtensions(); + } + + + return { extensions, refreshExtensions, selectTheme }; +} diff --git a/frontends/tauri/src/lib/i18n.svelte.ts b/packages/ui/src/lib/i18n.svelte.ts similarity index 90% rename from frontends/tauri/src/lib/i18n.svelte.ts rename to packages/ui/src/lib/i18n.svelte.ts index 8053402..8da7b83 100644 --- a/frontends/tauri/src/lib/i18n.svelte.ts +++ b/packages/ui/src/lib/i18n.svelte.ts @@ -8,24 +8,27 @@ export const LANGS: { id: Lang; name: string }[] = [ { id: "ko", name: "한국어" }, ]; -function initial(): Lang { - try { - const saved = localStorage.getItem("ss:lang"); - if (saved === "en" || saved === "ko") return saved; - } catch {} - return "en"; -} - -export const i18n = $state({ lang: initial() as Lang }); - -export function setLang(l: Lang) { - i18n.lang = l; - try { localStorage.setItem("ss:lang", l); } catch {} -} - type Dict = Record; const en: Dict = { + "connection.uncertain": "The connection was interrupted, and the last request may have completed. Reconnect, then check the terminal and request state before trying again.", + "host.connect": "Connect to Conn", + "host.occupied": "Open in another view", + "host.occupiedHint": "Continue here to stop input from the previous view. Your running shells stay open.", + "host.localHint": "Reconnect this window to Conn. Your running shells stay open.", + "host.codeHint": "Enter the code from your server connection file. This browser will remember the connection.", + "host.code": "Connection code", + "host.connecting": "Connecting…", + "host.continue": "Continue here", + "host.reconnect": "Reconnect", + "host.connectAction": "Connect", + "host.authentication": "Reconnect using the server connection code.", + "host.versionMismatch": "The host and client versions differ. Reload the UI distributed with this host.", + "host.invalidCode": "Check the connection code.", + "host.updateServer": "Update Conn on the server.", + "host.connectionChanged": "This window’s connection changed. Reconnect to its current state.", + "update.hostManaged": "Updated by your host", + "update.hostManagedHint": "Update the Conn server package to get a newer version.", "activity.title": "Agent activity", "activity.controlling": "Has control", "activity.recent": "Last used", @@ -306,20 +309,29 @@ const en: Dict = { "grace.now": "run now", "grace.cancel": "cancel", "grace.hint": "· any other key cancels and returns the conn to you", + "hold.title": "Run this command?", + "hold.context_reason": "Conn could not confirm the shell context. Review this execution before continuing.", + "hold.remote_reason": "Runs in the remote shell. Target files are not checked on this computer.", + "hold.more_scope": "Change approval scope…", + "ctl.scope": "Can type in this shell. Command approval rules still apply. Your typing takes control back.", + "ctl.waiting": "{agent} · control request", + "ctl.collapse": "Later", + "ctl.options": "Choose a different mode…", + "ctl.copilot_hint": "Give control in Co-pilot mode: every command is proposed before it runs.", "hold.no_intent": "no intent given", "hold.target": "target", "hold.missing": "missing", "hold.git": "git repo", "hold.entries": "{n} entries", "hold.protected": "protected path", - "hold.approve": "approve", - "hold.deny": "deny", - "hold.allow_session": "allow this session", + "hold.approve": "Run once", + "hold.deny": "Deny", + "hold.allow_session": "Allow this command category for this session", "hold.allow_session_hint": "Skip approval for ‘{label}’ in this terminal session. Other rules still apply.", "hold.review_required": "This program or shell requires approval for each command.", - "ctl.asks": "asks for the conn", - "ctl.grant": "Allow", - "ctl.copilot": "As Co-pilot", + "ctl.asks": "Shell control request", + "ctl.grant": "Give control", + "ctl.copilot": "Review every command", "ctl.deny": "Deny", // timeline @@ -416,14 +428,17 @@ const en: Dict = { "mode.copilot.desc": "proposes; you press ⏎", "mode.autopilot.desc": "Runs ordinary commands automatically; policy asks before risky commands.", "admission.title": "New agent connection", - "admission.asks": "wants to join", + "admission.asks": "Shared screen access", "admission.desc": "Once allowed, it can read your shared terminals and ask for control. It stays out of private sessions. This applies to this connection only.", - "admission.allow": "Allow", + "admission.allow": "Allow shared screen access", "admission.deny": "Deny", "admission.more": "+{n} waiting", "sharing.awaiting": "A connection is waiting for your approval.", "sharing.reviewConnections": "Review connection", + "decision.contextChanged": "The shell or command rules changed. Deny this request, then ask the agent to submit it again.", + "decision.scopeUnavailable": "This request can only approve one execution. A session-wide allowance is unavailable.", "decision.failed": "Could not complete this request. Please try again.", + "decision.outcomeUnknown": "The response was lost, so this request may already have completed. Check the terminal and current request state before trying again.", "sharing.connectionGone": "An agent disconnected. Select participants again.", "sharing.changed": "Sharing changed in another window. Reload the selection before applying.", "sharing.reload": "Reload selection", @@ -620,6 +635,24 @@ const en: Dict = { }; const ko: Dict = { + "connection.uncertain": "연결이 끊겨 마지막 요청이 이미 처리됐을 수 있습니다. 다시 연결한 뒤 터미널과 요청 상태를 확인하고 재시도하세요.", + "host.connect": "Conn에 연결", + "host.occupied": "다른 화면에서 열려 있습니다", + "host.occupiedHint": "여기서 이어가면 이전 화면의 입력은 중지됩니다. 작업 중인 셸은 그대로 유지됩니다.", + "host.localHint": "이 창을 실행 중인 Conn에 다시 연결하세요. 작업 중인 셸은 그대로 유지됩니다.", + "host.codeHint": "서버 연결 파일의 연결 코드를 입력하세요. 이 브라우저에서 연결을 기억합니다.", + "host.code": "연결 코드", + "host.connecting": "연결 중…", + "host.continue": "여기서 이어가기", + "host.reconnect": "다시 연결", + "host.connectAction": "연결", + "host.authentication": "서버의 연결 코드로 다시 연결해 주세요.", + "host.versionMismatch": "서버와 화면의 버전이 다릅니다. 서버에서 배포한 화면을 새로 여세요.", + "host.invalidCode": "연결 코드를 확인해 주세요.", + "host.updateServer": "서버에서 Conn을 업데이트하세요.", + "host.connectionChanged": "이 창의 연결이 바뀌었습니다. 현재 상태로 다시 연결하세요.", + "update.hostManaged": "호스트에서 업데이트합니다", + "update.hostManagedHint": "새 버전을 사용하려면 Conn 서버 패키지를 업데이트하세요.", "activity.title": "에이전트 활동", "activity.controlling": "제어 중", "activity.recent": "최근 사용", @@ -896,20 +929,29 @@ const ko: Dict = { "grace.now": "지금 실행", "grace.cancel": "취소", "grace.hint": "· 다른 키를 치면 취소되고 사람에게 돌아온다", + "hold.title": "이 명령을 실행할까요?", + "hold.context_reason": "셸 상태를 확인하지 못했습니다. 이번 실행을 검토해주세요.", + "hold.remote_reason": "원격 셸에서 실행합니다. 대상 파일을 이 컴퓨터에서 검사하지 않습니다.", + "hold.more_scope": "승인 범위 바꾸기…", + "ctl.scope": "이 셸에 입력할 수 있습니다. 명령 승인 규칙은 유지되며, 직접 입력하면 제어권을 회수합니다.", + "ctl.waiting": "{agent} · 제어권 요청", + "ctl.collapse": "나중에", + "ctl.options": "다른 작업 방식 선택…", + "ctl.copilot_hint": "Co-pilot 모드로 제어권을 줍니다. 모든 명령을 실행 전에 제안합니다.", "hold.no_intent": "의도 없음", "hold.target": "대상", "hold.missing": "없음", "hold.git": "git 저장소", "hold.entries": "{n}개", "hold.protected": "보호 경로", - "hold.approve": "승인", + "hold.approve": "한 번 실행", "hold.deny": "거부", - "hold.allow_session": "세션 허용", + "hold.allow_session": "이 세션에서 같은 유형 허용", "hold.allow_session_hint": "이 터미널 세션에서 ‘{label}’ 유형의 승인을 생략합니다. 다른 정책은 유지됩니다.", "hold.review_required": "이 프로그램이나 셸은 명령마다 승인이 필요합니다.", - "ctl.asks": "asks for the conn", - "ctl.grant": "허용", - "ctl.copilot": "Co-pilot으로", + "ctl.asks": "입력 제어권 요청", + "ctl.grant": "제어권 주기", + "ctl.copilot": "모든 명령을 먼저 검토", "ctl.deny": "거부", "tl.title": "타임라인", @@ -1004,14 +1046,17 @@ const ko: Dict = { "mode.copilot.desc": "제안하고 사람이 ⏎", "mode.autopilot.desc": "일반 명령은 자동 실행하고, 위험한 명령은 정책에 따라 승인을 받습니다.", "admission.title": "새 에이전트 연결", - "admission.asks": "참여를 요청합니다", + "admission.asks": "공유 화면 접근 요청", "admission.desc": "허용하면 공유된 터미널을 읽고 제어권을 요청할 수 있습니다. 비공개 세션에는 들어오지 못합니다. 이 연결에만 적용됩니다.", - "admission.allow": "허용", + "admission.allow": "공유 화면 접근 허용", "admission.deny": "거부", "admission.more": "+{n}개 대기 중", "sharing.awaiting": "연결 승인을 기다리는 에이전트가 있습니다.", "sharing.reviewConnections": "연결 요청 보기", + "decision.contextChanged": "셸 상태나 명령 규칙이 바뀌었습니다. 이 요청을 거부한 뒤 에이전트에게 새 요청을 부탁하세요.", + "decision.scopeUnavailable": "이번 실행만 승인할 수 있는 요청입니다. 세션 전체 허용은 사용할 수 없습니다.", "decision.failed": "요청을 처리하지 못했습니다. 다시 시도해 주세요.", + "decision.outcomeUnknown": "응답을 받지 못해 요청이 이미 처리됐을 수 있습니다. 다시 시도하기 전에 터미널과 현재 요청 상태를 확인하세요.", "sharing.connectionGone": "에이전트 연결이 끊겼습니다. 참여자를 다시 선택해 주세요.", "sharing.changed": "다른 창에서 공유 설정이 바뀌었습니다. 선택을 다시 불러온 뒤 적용해 주세요.", "sharing.reload": "선택 다시 불러오기", @@ -1204,18 +1249,46 @@ const ko: Dict = { const DICT: Record = { en, ko }; +function substitute(value: string, params?: Record): string { + if (!params) return value; + return value.replace(/\{(\w+)\}/g, (_, name) => params[name] === undefined ? `{${name}}` : String(params[name])); +} + +/** Pure dictionary lookup, also available before a ConnApp instance has mounted. */ +export function translate(lang: Lang, key: string, params?: Record): string { + return substitute(DICT[lang][key] ?? en[key] ?? key, params); +} + +/** The bootstrap and mounted app start with the same saved preference and English default. */ +export function initialLanguage(storage: Pick): Lang { + try { + const saved = storage.getItem("ss:lang"); + if (saved === "en" || saved === "ko") return saved; + } catch {} + return "en"; +} + +export function createI18n(storage: Pick) { +const i18n = $state({ lang: initialLanguage(storage) }); + +function setLang(l: Lang) { + i18n.lang = l; + try { storage.setItem("ss:lang", l); } catch {} +} + /** Translate `key`, substituting `{name}` placeholders. Falls back to English, then the key. */ -export function t(key: string, params?: Record): string { - const s = shortcutLabel(DICT[i18n.lang][key] ?? en[key] ?? key); - if (!params) return s; - return s.replace(/\{(\w+)\}/g, (_, k) => (params[k] === undefined ? `{${k}}` : String(params[k]))); +function t(key: string, params?: Record): string { + return substitute(shortcutLabel(translate(i18n.lang, key)), params); } /** "tab 2" / "2번 탭" — the way a tab is referred to in prose. */ -export const tabName = (n: number) => t("tab.n", { n }); +const tabName = (n: number) => t("tab.n", { n }); /** Human-readable duration: 0 → none, 1500 → 1.5s, 40 → 40ms. */ -export function fmtMs(ms: number): string { +function fmtMs(ms: number): string { if (!ms) return t("none"); return ms >= 1000 ? `${(ms / 1000).toFixed(ms % 1000 ? 1 : 0)}s` : `${ms}ms`; } + +return { i18n, setLang, t, tabName, fmtMs }; +} diff --git a/packages/ui/src/lib/liveAgents.svelte.ts b/packages/ui/src/lib/liveAgents.svelte.ts new file mode 100644 index 0000000..a3b31da --- /dev/null +++ b/packages/ui/src/lib/liveAgents.svelte.ts @@ -0,0 +1,32 @@ +import type { createBridge } from './bridge'; +import type { Lifetime } from '../runtime/lifetime'; +export type LiveAgent = { conn: number; agentId: string; affordances: string[] }; + +/** One poll loop per app, alive only while a component watches the current session. */ +export function createLiveAgents(bridge: ReturnType, activeSession: () => string, lifetime: Lifetime) { + const liveAgents = $state<{ list: LiveAgent[] }>({ list: [] }); + let watchers = 0; + let timer: ReturnType | undefined; + let revision = 0; + async function poll() { + const session = activeSession(); + const current = ++revision; + try { + const list = await bridge.cmd('agents', {session}); + if (!lifetime.disposed && watchers && current === revision && session === activeSession()) liveAgents.list = list; + } catch { if (!lifetime.disposed && current === revision) liveAgents.list = []; } + } + function watchLiveAgents() { + if (lifetime.disposed) return () => {}; + if (!watchers++) timer = setInterval(poll, 1500); + void poll(); + let stopped = false; + return () => { + if (stopped || lifetime.disposed) return; + stopped = true; + if (!--watchers) { revision++; clearInterval(timer); liveAgents.list = []; } + }; + } + lifetime.own(() => { revision++; clearInterval(timer); watchers = 0; liveAgents.list = []; }); + return { liveAgents, watchLiveAgents }; +} diff --git a/frontends/tauri/src/lib/motion.ts b/packages/ui/src/lib/motion.ts similarity index 66% rename from frontends/tauri/src/lib/motion.ts rename to packages/ui/src/lib/motion.ts index 34891fd..c4fecbe 100644 --- a/frontends/tauri/src/lib/motion.ts +++ b/packages/ui/src/lib/motion.ts @@ -23,3 +23,12 @@ export function dockOffsetFrames(distance: number): Keyframe[] { return { offset: progress, transform: `translateY(${distance * (1 - cubicOut(progress))}px)` }; }); } + +/** Only the surface morphs; text fades independently and the PTY never resizes. */ +export function badgeMorph(node: HTMLElement, anchor: HTMLElement | undefined) { + const to = node.getBoundingClientRect(); + const from = anchor?.getBoundingClientRect() ?? to; + return { duration: reducedMotion() ? 0 : 320, easing: cubicOut, + css: (t: number) => `--morph-x:${(from.left-to.left)*(1-t)}px;--morph-y:${(from.top-to.top)*(1-t)}px;--morph-sx:${t+(1-t)*from.width/Math.max(1,to.width)};--morph-sy:${t+(1-t)*from.height/Math.max(1,to.height)};--morph-radius:${14+30*(1-t)}px;--morph-content:${Math.max(0,(t-.55)/.45)};` + }; +} diff --git a/frontends/tauri/src/lib/profiles.svelte.ts b/packages/ui/src/lib/profiles.svelte.ts similarity index 61% rename from frontends/tauri/src/lib/profiles.svelte.ts rename to packages/ui/src/lib/profiles.svelte.ts index 600a79e..11c18ff 100644 --- a/frontends/tauri/src/lib/profiles.svelte.ts +++ b/packages/ui/src/lib/profiles.svelte.ts @@ -1,12 +1,18 @@ -import { invoke } from "./transport"; +import type { ConnClient } from "../runtime/client"; export type Backend = "local" | "wsl" | "ssh" | "docker"; export type Shell = "posix" | "fish" | "power_shell" | "cmd" | "custom"; export type Profile = { id: string; name: string; enabled: boolean; backend: Backend; shell: Shell; program: string; args: string[]; cwd: string | null; env: Record; target: string | null; port: number | null }; export type ProfileConfig = { version: number; revision: number; defaultProfile: string; profiles: Profile[] }; export type Availability = { available: boolean; message: string }; export type Catalog = { config: ProfileConfig; availability: Record }; -export const profileState = $state({ catalog: null as Catalog | null }); -export async function refreshProfiles() { - profileState.catalog = await invoke("profiles_catalog"); - return profileState.catalog; +export function createProfiles(client: ConnClient) { + const {invoke} = client; + const profileState = $state({ catalog: null as Catalog | null }); + async function refreshProfiles() { + profileState.catalog = await invoke("profiles_catalog"); + return profileState.catalog; + } + + + return { profileState, refreshProfiles }; } diff --git a/frontends/tauri/src/lib/shortcuts.ts b/packages/ui/src/lib/shortcuts.ts similarity index 100% rename from frontends/tauri/src/lib/shortcuts.ts rename to packages/ui/src/lib/shortcuts.ts diff --git a/frontends/tauri/src/lib/store.svelte.ts b/packages/ui/src/lib/store.svelte.ts similarity index 57% rename from frontends/tauri/src/lib/store.svelte.ts rename to packages/ui/src/lib/store.svelte.ts index 6a69a68..7ae242b 100644 --- a/frontends/tauri/src/lib/store.svelte.ts +++ b/packages/ui/src/lib/store.svelte.ts @@ -1,3 +1,5 @@ +import type { Lifetime } from '../runtime/lifetime'; +import type { ConnPorts } from '../runtime/ports'; import { newTimeline, type TimelineState } from "./timeline"; import type { Mode, Pacing } from "./bridge"; import type { ThemeId } from "./themes"; @@ -42,7 +44,7 @@ export type TabState = { agents: string[]; typing: boolean; proposal: null | { id: string; agentId: string; text: string; ready: boolean; intent?: string }; - approval: null | { id: string; agentId: string; cmd: string; label: string; at: number; intent?: string; analysis?: Analysis }; + approval: null | { id: string; agentId: string; cmd: string; label: string; review?: import("./collaboration/events").ReviewContext; at: number; intent?: string; analysis?: Analysis }; grace: null | { execId: string; cmd: string; ms: number; start: number; intent?: string }; ctlReq: null | { id: string; agentId: string; reason?: string; originalRequest?: import("./timeline").OriginalRequest }; lastAgent: null | { agentId: string; lastCmd?: string; connected: boolean }; @@ -64,56 +66,61 @@ export function newTab(id: string, n: number): TabState { /** Island announcement: a short message shown in the centre, then collapsed to the dot. */ export type Announcement = { id: number; text: string; detail?: string; ms: number; color: string; kind: "conn" | "approval" | "attention" | "info" | "warn"; target?: NoticeTarget }; -export const st = $state({ - activity: {revision:-1,connections:[]} as ActivitySnapshot, - externalPending: false, - backendOnline: false, - socket: "", - tabs: {} as Record, - order: [] as string[], - active: "" as string, - tabSeq: 0, - toasts: [] as Toast[], - announcement: null as Announcement | null, - themeRevision: 0, - theme: (localStorage.getItem("ss:theme") as ThemeId) || "midnight", - followSystem: localStorage.getItem("ss:followSystem") === "1", - effects: localStorage.getItem("ss:effects") !== "0", - fontSize: Number(localStorage.getItem("ss:fontSize") || 13), - paletteOpen: false, - centerOpen: false, - sharingOpen: false, - /** Agent connections waiting for the owner's answer. Connection-level, not per tab. */ - admissions: [] as { connId: number; agentId: string }[], - settingsOpen: false, - timelineOpen: false, - settingsTab: "agents" as "profiles" | "agents" | "automation" | "pacing" | "policy" | "appearance" | "extensions" | "diagnostics", -}); +export function createStore(storage: NonNullable, lifetime: Lifetime) { + const st = $state({ + activity: {revision:-1,connections:[]} as ActivitySnapshot, + externalPending: false, + backendOnline: false, + socket: "", + tabs: {} as Record, + order: [] as string[], + active: "" as string, + tabSeq: 0, + toasts: [] as Toast[], + announcement: null as Announcement | null, + themeRevision: 0, + theme: (storage.getItem("ss:theme") as ThemeId) || "midnight", + followSystem: storage.getItem("ss:followSystem") === "1", + effects: storage.getItem("ss:effects") !== "0", + fontSize: Number(storage.getItem("ss:fontSize") || 13), + paletteOpen: false, + centerOpen: false, + sharingOpen: false, + /** Agent connections waiting for the owner's answer. Connection-level, not per tab. */ + admissions: [] as { connId: number; agentId: string }[], + settingsOpen: false, + timelineOpen: false, + settingsTab: "agents" as "profiles" | "agents" | "automation" | "pacing" | "policy" | "appearance" | "extensions" | "diagnostics", + }); -/** The tab the human is looking at. Safe to call before boot (returns a placeholder). */ -const placeholder = newTab("", 0); -export function cur(): TabState { - return st.tabs[st.active] ?? placeholder; -} -export function tab(id: string): TabState | undefined { - return st.tabs[id]; -} -export function tabIndex(id: string): number { - return st.order.indexOf(id) + 1; -} + /** The tab the human is looking at. Safe to call before boot (returns a placeholder). */ + const placeholder = newTab("", 0); + function cur(): TabState { + return st.tabs[st.active] ?? placeholder; + } + function tab(id: string): TabState | undefined { + return st.tabs[id]; + } + function tabIndex(id: string): number { + return st.order.indexOf(id) + 1; + } + + let toastSeq = 0; + function toast(text: string, cls = "") { + const id = ++toastSeq; + st.toasts.push({ id, text, cls }); + lifetime.timeout(() => { st.toasts = st.toasts.filter((t) => t.id !== id); }, 4000); + } + + let annSeq = 0; + let annTimer: number | null = null; + function announce(text: string, color: string, kind: Announcement["kind"] = "info", ms = 2600, detail?: string, target?: NoticeTarget) { + const id = ++annSeq; + st.announcement = { id, text, detail: detail?.trim() || undefined, ms, color, kind, target }; + if (annTimer) lifetime.clearTimeout(annTimer); + annTimer = lifetime.timeout(() => { if (st.announcement?.id === id) st.announcement = null; }, ms); + } -let toastSeq = 0; -export function toast(text: string, cls = "") { - const id = ++toastSeq; - st.toasts.push({ id, text, cls }); - setTimeout(() => { st.toasts = st.toasts.filter((t) => t.id !== id); }, 4000); -} -let annSeq = 0; -let annTimer: number | null = null; -export function announce(text: string, color: string, kind: Announcement["kind"] = "info", ms = 2600, detail?: string, target?: NoticeTarget) { - const id = ++annSeq; - st.announcement = { id, text, detail: detail?.trim() || undefined, ms, color, kind, target }; - if (annTimer) clearTimeout(annTimer); - annTimer = window.setTimeout(() => { if (st.announcement?.id === id) st.announcement = null; }, ms); + return { st, cur, tab, tabIndex, toast, announce }; } diff --git a/frontends/tauri/src/lib/terminalInput.ts b/packages/ui/src/lib/terminalInput.ts similarity index 100% rename from frontends/tauri/src/lib/terminalInput.ts rename to packages/ui/src/lib/terminalInput.ts diff --git a/frontends/tauri/src/lib/terminalOutput.ts b/packages/ui/src/lib/terminalOutput.ts similarity index 53% rename from frontends/tauri/src/lib/terminalOutput.ts rename to packages/ui/src/lib/terminalOutput.ts index 7020b41..e73e946 100644 --- a/frontends/tauri/src/lib/terminalOutput.ts +++ b/packages/ui/src/lib/terminalOutput.ts @@ -1,24 +1,26 @@ type Size = { rows: number; cols: number }; -type Frame = { size: Size; data: Uint8Array }; +type Frame = { size: Size; data: Uint8Array; reset?: boolean; applied?: () => void }; /** xterm parses writes asynchronously. Apply the next frame's size only after * earlier bytes have been parsed, preserving the backend's resize/output order. */ -export function terminalOutputQueue(resize: (size: Size) => void, write: (data: Uint8Array, done: () => void) => void) { +export function terminalOutputQueue(resize: (size: Size) => void, write: (data: Uint8Array, done: () => void) => void, reset: () => void = () => {}) { const pending: Frame[] = []; let writing = false; let disposed = false; function drain() { while (!disposed && !writing && pending.length) { const frame = pending.shift()!; + if (frame.reset) reset(); resize(frame.size); - if (!frame.data.length) continue; + if (!frame.data.length) { frame.applied?.(); continue; } writing = true; - write(frame.data, () => { writing = false; drain(); }); + write(frame.data, () => { writing = false; if (!disposed) frame.applied?.(); drain(); }); } } return { - push(frame: Frame) { if (!disposed) { pending.push(frame); drain(); } }, + push(frame: Frame) { if (!disposed) { if (frame.reset) pending.length = 0; pending.push(frame); drain(); } }, + clear() { pending.length = 0; }, dispose() { disposed = true; pending.length = 0; }, }; } diff --git a/packages/ui/src/lib/terminalResize.ts b/packages/ui/src/lib/terminalResize.ts new file mode 100644 index 0000000..da9d895 --- /dev/null +++ b/packages/ui/src/lib/terminalResize.ts @@ -0,0 +1,25 @@ +type Size = { rows: number; cols: number }; + +/** Submit size changes immediately to the common owner command queue. Keeping a + * second pending-size buffer here would reorder a resize across intervening input. + * Only consecutive identical measurements are redundant. + */ +export function terminalResizeQueue(send: (size: Size) => Promise, onError: (error: unknown) => void) { + let requested: Size | undefined; + let revision = 0; + let disposed = false; + return { + resize(size: Size) { + if (disposed || (requested?.rows === size.rows && requested.cols === size.cols)) return; + requested = { ...size }; + const current = ++revision; + void send({ ...size }).catch(error => { + if (disposed) return; + if (revision === current) requested = undefined; + onError(error); + }); + }, + invalidate() { requested = undefined; revision++; }, + dispose() { disposed = true; requested = undefined; }, + }; +} diff --git a/frontends/tauri/src/lib/themes.ts b/packages/ui/src/lib/themes.ts similarity index 90% rename from frontends/tauri/src/lib/themes.ts rename to packages/ui/src/lib/themes.ts index 63063bd..40859fd 100644 --- a/frontends/tauri/src/lib/themes.ts +++ b/packages/ui/src/lib/themes.ts @@ -25,7 +25,7 @@ const CHROME: Record = { export const ANSI = ["black", "red", "green", "yellow", "blue", "magenta", "cyan", "white", "brightBlack", "brightRed", "brightGreen", "brightYellow", "brightBlue", "brightMagenta", "brightCyan", "brightWhite"] as const; -export const THEMES: Record = Object.fromEntries(builtin.map((p) => { +export const createThemes = (): Record => Object.fromEntries(builtin.map((p) => { const id = p.id.replace(/^conn\.theme\./, ""); const { kind, ...chrome } = CHROME[id]; return [id, { id, name: p.name, kind, cursor: p.cursor, blurb: `theme.${id}`, @@ -45,11 +45,11 @@ export function agentColor(id: string | undefined | null): string { return PALETTE[h % PALETTE.length]; } -export function applyTheme(t: Theme, agent = "#8b7cff"): ITheme { - const r = document.documentElement.style; +export function applyTheme(t: Theme, agent = "#8b7cff", root: HTMLElement): ITheme { + const r = root.style; for (const [k, v] of Object.entries(t.tokens)) r.setProperty(`--${k}`, v); r.setProperty("--agent", agent); - document.documentElement.dataset.theme = t.id; - document.documentElement.dataset.kind = t.kind; + root.dataset.theme = t.id; + root.dataset.kind = t.kind; return { ...t.xterm, cursor: t.cursor ?? t.tokens.fg, cursorAccent: t.tokens.bg, selectionBackground: t.tokens.selection }; } diff --git a/frontends/tauri/src/lib/timeline.ts b/packages/ui/src/lib/timeline.ts similarity index 100% rename from frontends/tauri/src/lib/timeline.ts rename to packages/ui/src/lib/timeline.ts diff --git a/packages/ui/src/lib/updates.svelte.ts b/packages/ui/src/lib/updates.svelte.ts new file mode 100644 index 0000000..90096dc --- /dev/null +++ b/packages/ui/src/lib/updates.svelte.ts @@ -0,0 +1,59 @@ +import type { ConnPorts, UpdateStatus } from '../runtime/ports'; +import type { Lifetime } from '../runtime/lifetime'; +export type { UpdateStatus } from '../runtime/ports'; + +/** Update state belongs to this app; host support is explicit and never simulated as success. */ +export function createUpdates(host: ConnPorts['updates'], storage: NonNullable, lifetime: Lifetime) { + const updater = $state({ status: { phase: host.supported ? 'idle' : 'unsupported', current: '', notes: '', preview: false, supported: host.supported, downloaded: 0 } as UpdateStatus, busy: false, previews: false, automatic: true }); + let initialized = false; + async function initUpdates() { + if (initialized || lifetime.disposed) return; + initialized = true; + try { + const status = await host.invoke('status'); + if (lifetime.disposed) return; + updater.status = host.supported ? status : { ...status, phase: 'unsupported', supported: false }; + updater.previews = storage.getItem('conn:update-previews') === 'true' || (storage.getItem('conn:update-previews') === null && updater.status.preview); + updater.automatic = storage.getItem('conn:auto-update') !== 'false'; + } catch (error) { + if (lifetime.disposed) return; + initialized = false; + updater.status.error = String(error); + } + } + function updatePreference(kind: 'previews' | 'automatic', value: boolean) { + updater[kind] = value; + storage.setItem(kind === 'previews' ? 'conn:update-previews' : 'conn:auto-update', String(value)); + } + async function updateAction(action: 'check' | 'download' | 'install', confirmed = false) { + if (updater.busy || lifetime.disposed || !host.supported) return; + updater.busy = true; + updater.status.error = undefined; + updater.status.phase = action === 'check' ? 'checking' : action === 'download' ? 'downloading' : 'installing'; + let finished = false; + const poll = window.setInterval(async () => { + try { const status = await host.invoke('status'); if (!finished && !lifetime.disposed) updater.status = status; } catch {} + }, 500); + const stop = lifetime.own(() => { finished = true; clearInterval(poll); }); + try { + const status = await host.invoke(action, { previews: updater.previews, confirmed }); + if (!lifetime.disposed) updater.status = status; + } catch (error) { + if (!lifetime.disposed) { updater.status.phase = 'error'; updater.status.error = String(error); } + } finally { stop(); if (!lifetime.disposed) updater.busy = false; } + } + function startAutoUpdates() { + if (!host.supported) return () => {}; + let stopped = false; + const run = async () => { + await initUpdates(); + if (stopped || lifetime.disposed || !initialized || !updater.automatic || updater.busy || ['ready', 'installing'].includes(updater.status.phase)) return; + await updateAction('check'); + if (!stopped && !lifetime.disposed && updater.automatic && updater.status.supported && updater.status.phase === 'available') await updateAction('download'); + }; + const first = window.setTimeout(run, 30000); + const repeat = window.setInterval(run, 6 * 60 * 60 * 1000); + return lifetime.own(() => { stopped = true; clearTimeout(first); clearInterval(repeat); }); + } + return { updater, initUpdates, updateAction, updatePreference, startAutoUpdates, updateCapability: host }; +} diff --git a/frontends/tauri/src/lib/updates.ts b/packages/ui/src/lib/updates.ts similarity index 100% rename from frontends/tauri/src/lib/updates.ts rename to packages/ui/src/lib/updates.ts diff --git a/packages/ui/src/runtime/app.svelte.ts b/packages/ui/src/runtime/app.svelte.ts new file mode 100644 index 0000000..1135036 --- /dev/null +++ b/packages/ui/src/runtime/app.svelte.ts @@ -0,0 +1,49 @@ +import { createLifetime } from './lifetime'; +import { createClient } from './client'; +import type { ConnPorts } from './ports'; +import { createStore } from '../lib/store.svelte'; +import { createI18n } from '../lib/i18n.svelte'; +import { createBridge } from '../lib/bridge'; +import { createThemes, applyTheme } from '../lib/themes'; +import { createProfiles } from '../lib/profiles.svelte'; +import { createExtensions } from '../lib/extensions.svelte'; +import { createLiveAgents } from '../lib/liveAgents.svelte'; +import { createUpdates } from '../lib/updates.svelte'; +import { createAttention } from '../lib/collaboration/attention'; +import { createRequestActions } from '../lib/collaboration/decision.svelte'; +import { createCollaborationApi } from '../lib/collaboration/api'; +import { createControl } from '../lib/collaboration/control.svelte'; +import { createReview } from '../lib/collaboration/review.svelte'; + +/** One invocation per ConnApp mount. No state, request maps or timers survive disposal. */ +export function createConnApp(ports: ConnPorts) { + const lifetime = createLifetime(); + const storage = ports.storage ?? localStorage; + const client = createClient(ports.transport, lifetime); + const store = createStore(storage, lifetime); + const language = createI18n(storage); + const bridge = createBridge(client, store, language); + const THEMES = $state(createThemes()); + const requests = createRequestActions(); + const api = createCollaborationApi(client); + let root: HTMLElement | undefined; + lifetime.own(requests.dispose); + return { + ...client, ...store, ...language, ...bridge, ...api, + ...createProfiles(client), ...createExtensions(bridge, store, THEMES, storage), + ...createLiveAgents(bridge, () => store.st.active, lifetime), ...createUpdates(ports.updates, storage, lifetime), + ...createAttention(ports.attention, lifetime), ...createControl(client, api, requests), ...createReview(client, requests), + requestAction: requests.requestAction, + forgetSession: requests.forgetSession, + storage, THEMES, ports, + openExternal: ports.links?.open ?? ((url: string) => client.invoke('open_release', {url})), + copyText: ports.clipboard?.writeText ?? ((text: string) => navigator.clipboard.writeText(text)), + setRoot(element: HTMLElement) { root = element; }, + get root() { return root; }, + applyTheme(theme: Parameters[0], accent?: string, element = root!) { return applyTheme(theme, accent, element); }, + timeout: lifetime.timeout, + clearTimeout: lifetime.clearTimeout, + dispose: lifetime.dispose, + }; +} +export type ConnAppState = ReturnType; diff --git a/packages/ui/src/runtime/client.ts b/packages/ui/src/runtime/client.ts new file mode 100644 index 0000000..e0df84b --- /dev/null +++ b/packages/ui/src/runtime/client.ts @@ -0,0 +1,142 @@ +import type { ConnTransport } from './ports'; +import type { Lifetime } from './lifetime'; + +type Event = { payload: any }; +type Handler = (event: Event) => void; +type Subscription = { handlers: Set; ready: Promise; stop?: () => void }; +type Stream = { epoch: number; sequence: number }; +const ordered = new Set(['input', 'terminal_response', 'resize']); + +/** One owner client per app. Both native and web use these ordering and recovery rules. */ +export function createClient(transport: ConnTransport, lifetime: Lifetime) { + const queues = new Map>(); + const sequences = new Map(); + const versions = new Map(); + const streams = new Map(); + const recovering = new Set(); + const subscriptions = new Map(); + let operationId = 0; + let connectionVersion = 0; + let epoch = -1; + let lastConnection: Event | undefined; + let needsAttachment = false; + let resetRequested = false; + + const closed = () => new Error('Owner view disconnected or disposed; refresh its current state before retrying.'); + function emit(name: string, event: Event) { + if (lifetime.disposed) return; + for (const handler of subscriptions.get(name)?.handlers ?? []) handler(event); + } + function invalidate(session: string) { + versions.set(session, (versions.get(session) ?? 0) + 1); + } + function resetAttachment(error: unknown) { + if (lifetime.disposed || resetRequested) return; + resetRequested = true; + // Never guess whether a rejected operation consumed its sequence. A fresh + // owner epoch fences every old queued action without resending any input. + if (!needsAttachment) receive('ss:connection', { payload: { ...lastConnection?.payload, connected: false, error: String(error) } }); + transport.reset?.(error); + } + function receive(name: string, event: Event) { + if (lifetime.disposed) return; + if (name === 'ss:connection') { + lastConnection = event; + if (!event.payload.connected) { + needsAttachment = true; + connectionVersion++; + sequences.clear(); streams.clear(); recovering.clear(); + } else { needsAttachment = false; resetRequested = false; } + if (Number.isSafeInteger(event.payload.epoch)) epoch = event.payload.epoch; + } + if (name === 'ss:output') { + const frame = event.payload; + if (!Number.isSafeInteger(frame.epoch) || !Number.isSafeInteger(frame.streamSeq)) return; + if (frame.epoch < epoch) return; + if (frame.epoch > epoch) { epoch = frame.epoch; streams.clear(); } + const previous = streams.get(frame.session); + if (previous && previous.epoch === frame.epoch && frame.streamSeq <= previous.sequence) return; + if (!frame.reset && (!previous || frame.streamSeq !== previous.sequence + 1)) { + if (!recovering.has(frame.session)) { + recovering.add(frame.session); invalidate(frame.session); + emit('ss:terminal_sync', { payload: { session: frame.session, ready: false } }); + // Never replay input. Recover only the owner's terminal state at a new checkpoint. + void invoke('attach_output', { session: frame.session }).catch(error => { + emit('ss:terminal_sync', { payload: { session: frame.session, ready: false, error: String(error) } }); + resetAttachment(error); + }); + } + return; + } + streams.set(frame.session, { epoch: frame.epoch, sequence: frame.streamSeq }); + if (frame.reset) recovering.delete(frame.session); + emit(name, event); + if (frame.reset) emit('ss:terminal_sync', { payload: { session: frame.session, ready: true } }); + return; + } + emit(name, event); + } + function subscribe(name: string): Subscription { + const existing = subscriptions.get(name); + if (existing) return existing; + const entry: Subscription = { handlers: new Set(), ready: Promise.resolve() }; + subscriptions.set(name, entry); + // terminal_sync is a client lifecycle event, not a second backend endpoint. + if (name !== 'ss:terminal_sync') entry.ready = transport.listen(name, event => receive(name, event)).then(stop => { + if (lifetime.disposed) stop(); else entry.stop = stop; + }).catch(error => { subscriptions.delete(name); throw error; }); + return entry; + } + // Disconnect fences queued work even when a view has no terminals. + const connection = subscribe('ss:connection'); + void connection.ready.catch(() => {}); + + function invoke(name: string, args: Record = {}): Promise { + if (lifetime.disposed) return Promise.reject(closed()); + const session = typeof args.session === 'string' ? args.session : ''; + const version = connectionVersion; + const sessionVersion = versions.get(session) ?? 0; + const run = async (): Promise => { + if (lifetime.disposed || needsAttachment || version !== connectionVersion || sessionVersion !== (versions.get(session) ?? 0)) throw closed(); + if (ordered.has(name) && recovering.has(session)) throw new Error('Terminal is synchronizing. Wait before entering more input.'); + const sequence = ordered.has(name) ? (sequences.get(session) ?? 0) + 1 : undefined; + if (sequence !== undefined) sequences.set(session, sequence); + let result: T; + try { result = await transport.invoke(name, args, { operationId: ++operationId, sequence }); } + catch (error) { + const code = String((error as { code?: unknown })?.code ?? error); + if (name === 'attach_output' || (ordered.has(name) && /owner_busy|terminal_sequence_(gap|stale)|outcome_(unknown|pending)|attachment_fenced|offline/.test(code))) resetAttachment(error); + throw error; + } + if (lifetime.disposed || version !== connectionVersion) throw closed(); + if (name === 'close_tab') { + invalidate(session); sequences.delete(session); streams.delete(session); recovering.delete(session); + } + return result; + }; + if (!ordered.has(name)) return run(); + if (!session) return Promise.reject(new Error('Ordered owner commands require a session.')); + const previous = queues.get(session) ?? Promise.resolve(); + const result = previous.then(run, run); + queues.set(session, result); + void result.finally(() => { if (queues.get(session) === result) queues.delete(session); }).catch(() => {}); + return result; + } + async function listen(name: string, handler: (event: { payload: T }) => void) { + if (lifetime.disposed) return () => {}; + const entry = subscribe(name); + entry.handlers.add(handler); + try { await entry.ready; } catch (error) { entry.handlers.delete(handler); throw error; } + if (name === 'ss:connection' && lastConnection && !lifetime.disposed) handler(lastConnection); + let done = false; + return lifetime.own(() => { if (!done) { done = true; entry.handlers.delete(handler); } }); + } + lifetime.own(() => { + connectionVersion++; + for (const entry of subscriptions.values()) { entry.handlers.clear(); entry.stop?.(); } + subscriptions.clear(); queues.clear(); sequences.clear(); streams.clear(); recovering.clear(); + transport.dispose?.(); + }); + return { invoke, listen }; +} +export type ConnClient = ReturnType; diff --git a/packages/ui/src/runtime/context.ts b/packages/ui/src/runtime/context.ts new file mode 100644 index 0000000..b4aa45b --- /dev/null +++ b/packages/ui/src/runtime/context.ts @@ -0,0 +1,9 @@ +import { getContext, setContext } from 'svelte'; +import type { ConnAppState } from './app.svelte'; +const context = Symbol('ConnApp'); +export function provideConnApp(app: ConnAppState) { setContext(context, app); return app; } +export function useConnApp(): ConnAppState { + const app = getContext(context); + if (!app) throw new Error('Conn UI components must be mounted inside ConnApp'); + return app; +} diff --git a/packages/ui/src/runtime/generated.ts b/packages/ui/src/runtime/generated.ts new file mode 100644 index 0000000..fae770c --- /dev/null +++ b/packages/ui/src/runtime/generated.ts @@ -0,0 +1,42 @@ +// Generated from conn-frontend owner DTOs. Do not edit. +// Run: node scripts/generate-owner-contract.mjs [--check] + +export const OWNER_PROTOCOL = 1 as const; + +export type OwnerHello = { + "buildVersion": string; + "epoch": number; + "protocol": number; + "runtimeId": string; + "viewId": string; +}; + +export type OwnerMeta = { + "epoch": number; + "operationId": number; + "sequence"?: number | null; +}; + +export type OwnerOutput = { + "data": string; + "epoch": number; + "generation": number; + "outputSeq": number; + "reset"?: boolean; + "session": string; + "size": OwnerSize; + "streamSeq": number; +}; + +export type OwnerRequest = { + "args"?: unknown; + "epoch": number; + "name": string; + "operationId": number; + "sequence"?: number | null; +}; + +export type OwnerSize = { + "cols": number; + "rows": number; +}; diff --git a/packages/ui/src/runtime/lifetime.ts b/packages/ui/src/runtime/lifetime.ts new file mode 100644 index 0000000..171e231 --- /dev/null +++ b/packages/ui/src/runtime/lifetime.ts @@ -0,0 +1,30 @@ +/** Resources owned by one mounted app; disposal also fences late callbacks. */ +export function createLifetime() { + let disposed = false; + const cleanups = new Set<() => void>(); + const timeouts = new Set(); + return { + get disposed() { return disposed; }, + own(cleanup: () => void) { + let done = false; + const stop = () => { if (done) return; done = true; cleanups.delete(stop); cleanup(); }; + if (disposed) stop(); else cleanups.add(stop); + return stop; + }, + timeout(callback: () => void, ms: number) { + const id = window.setTimeout(() => { timeouts.delete(id); if (!disposed) callback(); }, ms); + if (disposed) window.clearTimeout(id); else timeouts.add(id); + return id; + }, + clearTimeout(id: number) { timeouts.delete(id); window.clearTimeout(id); }, + dispose() { + if (disposed) return; + disposed = true; + for (const id of timeouts) window.clearTimeout(id); + timeouts.clear(); + for (const cleanup of [...cleanups]) cleanup(); + cleanups.clear(); + }, + }; +} +export type Lifetime = ReturnType; diff --git a/packages/ui/src/runtime/ports.ts b/packages/ui/src/runtime/ports.ts new file mode 100644 index 0000000..34bb432 --- /dev/null +++ b/packages/ui/src/runtime/ports.ts @@ -0,0 +1,26 @@ +import type { OwnerMeta } from './generated'; +export { OWNER_PROTOCOL } from './generated'; +export type { OwnerHello, OwnerOutput, OwnerRequest } from './generated'; +/** Host capabilities injected by the entry point. No platform implementation lives in the UI. */ +export type UpdateStatus = { phase: string; current: string; version?: string; notes: string; preview: boolean; supported: boolean; downloaded: number; total?: number; error?: string }; +export type OwnerRequestMeta = Omit; +export interface ConnTransport { + invoke(name: string, args?: Record, meta?: OwnerRequestMeta): Promise; + listen(name: string, handler: (event: { payload: T }) => void): Promise<() => void>; + /** Retire this attachment and surface explicit reconnection; never replay mutations. */ + reset?(cause: unknown): void; + dispose?(): void; +} +export interface ConnPorts { + transport: ConnTransport; + attention: { isFocused(): Promise; request(active: boolean): Promise }; + updates: { + supported: boolean; + reason?: string; + invoke(action: 'status' | 'check' | 'download' | 'install', options?: { previews?: boolean; confirmed?: boolean }): Promise; + }; + links?: { open(url: string): Promise }; + clipboard?: { writeText(text: string): Promise }; + storage?: Pick; + platform?: 'macos' | 'linux' | 'windows' | 'web'; +} diff --git a/frontends/tauri/src/app.css b/packages/ui/src/styles/app.css similarity index 100% rename from frontends/tauri/src/app.css rename to packages/ui/src/styles/app.css diff --git a/packages/ui/svelte.config.js b/packages/ui/svelte.config.js new file mode 100644 index 0000000..9dae8c3 --- /dev/null +++ b/packages/ui/svelte.config.js @@ -0,0 +1,2 @@ +import { vitePreprocess } from "@sveltejs/vite-plugin-svelte"; +export default { preprocess: vitePreprocess() }; diff --git a/packages/ui/tests/app-lifetime/index.html b/packages/ui/tests/app-lifetime/index.html new file mode 100644 index 0000000..e359c83 --- /dev/null +++ b/packages/ui/tests/app-lifetime/index.html @@ -0,0 +1,3 @@ + +Conn app lifetime fixture +
diff --git a/packages/ui/tests/app-lifetime/main.ts b/packages/ui/tests/app-lifetime/main.ts new file mode 100644 index 0000000..45fb0e8 --- /dev/null +++ b/packages/ui/tests/app-lifetime/main.ts @@ -0,0 +1,87 @@ +// State/lifetime boundary fixture: two actual ConnApp roots, no replacement product UI. +// This test deliberately supplies minimal host responses; it does not claim PTY/MCP coverage. +import { mount, unmount } from 'svelte'; +import { ConnApp, translate, type ConnPorts, type ConnTransport } from '../../src/index'; +import '../../src/styles/app.css'; + +type Label = 'one' | 'two'; +type Handler = (event: {payload: any}) => void; +type Fixture = ReturnType; +function fixture(label: Label, lang = 'en') { + const listeners = new Map>(); + const calls: string[] = []; + const links: string[] = []; + const saved = new Map([['ss:lang', lang]]); + let pending = true; + let revision = 0; + let disposed = false; + let fail: 'retryable' | 'outcome_unknown' | null = label === 'two' ? 'retryable' : null; + let release: (() => void) | undefined; + const held = new Promise(resolve => { release = resolve; }); + const emit = (name: string, payload: unknown) => { for (const handler of listeners.get(name) ?? []) handler({payload}); }; + const transport: ConnTransport = { + async invoke(name: string): Promise { + calls.push(name); + let result: unknown; + switch (name) { + case 'admission_snapshot': result = {revision, pending: pending ? [{connId:7, agentId:`fixture-${label}`}] : []}; break; + case 'activity_snapshot': result = {revision, connections:[]}; break; + case 'profiles_catalog': result = {config:{version:1, revision:0, defaultProfile:'fixture', profiles:[]}, availability:{}}; break; + case 'extensions_status': result = {apiVersion:1, extensions:[], settings:{theme:'conn.theme.midnight'}, themes:[]}; break; + case 'start': result = {socket:`fixture-${label}`, session:null, sessions:[], externalPending:false}; break; + case 'decide_admission': + if (label === 'one') await held; + if (fail) { + const code=fail; fail=null; + if(code==='outcome_unknown') throw Object.assign(new Error('Connection lost; the command may have completed.'), {code}); + throw new Error('Synthetic retryable decision failure'); + } + pending = false; revision++; + emit('ss:admission',{connId:7,agentId:`fixture-${label}`,revision,state:'granted'}); + result = {decided:true}; break; + case 'agent_integrations': result = {clients:[],canConfigure:false,backupPath:''}; break; + case 'agent_clients': case 'agents': case 'audit_tail': result = []; break; + case 'admission_policy': result = {ask:true}; break; + case 'cli_status': result = {onPath:null,canConfigure:false,canInstall:false}; break; + case 'diagnostics': result = null; break; + case 'ui_ready': case 'log': result = null; break; + default: throw new Error(`Unhandled fixture owner command: ${name}`); + } + return result as T; + }, + async listen(name: string, handler: (event:{payload:T}) => void) { + const group=listeners.get(name) ?? new Set(); group.add(handler);listeners.set(name,group); + if (name === 'ss:connection') queueMicrotask(()=>handler({payload:{connected:true,epoch:1,runtimeId:label} as T})); + return ()=>{group.delete(handler);}; + }, + dispose() { disposed=true; listeners.clear(); }, + }; + const ports: ConnPorts = { + transport, + storage:{getItem:key=>saved.get(key)??null,setItem:(key,value)=>{saved.set(key,value);},removeItem:key=>{saved.delete(key);}}, + attention:{isFocused:async()=>true,request:async()=>{}}, + updates:{supported:false,invoke:async()=>({phase:'unsupported',current:'fixture',notes:'',preview:false,supported:false,downloaded:0})}, + links:{open:async url=>{links.push(url);}}, + clipboard:{writeText:async()=>{}}, + platform:'web', + }; + return { ports, emit, release:()=>release?.(), uncertain:()=>{fail='outcome_unknown';}, inspect:()=>({calls:[...calls],links:[...links],saved:Object.fromEntries(saved),disposed,listeners:[...listeners.values()].reduce((sum,group)=>sum+group.size,0)}) }; +} +const instances = new Map, fixture:Fixture}>(); +const retired: Fixture[]=[]; +function mountSlot(label: Label, lang = 'en') { + if(instances.has(label))throw new Error('Unmount a slot before remounting it'); + const host=fixture(label,lang); + const component=mount(ConnApp,{target:document.getElementById(label)!,props:{ports:host.ports}}); + instances.set(label,{component,fixture:host}); +} +mountSlot('one');mountSlot('two'); +(window as any).appLifetime = { + inspect:(label:Label)=>instances.get(label)!.fixture.inspect(), + uncertain:(label:Label)=>instances.get(label)!.fixture.uncertain(), + translate, + unmount:async(label:Label)=>{const old=instances.get(label)!;instances.delete(label);retired.push(old.fixture);await unmount(old.component);}, + mount:mountSlot, + releaseRetired:()=>{for(const old of retired){old.release();old.emit('ss:admission',{connId:7,agentId:'late-event',revision:99,state:'pending'});}}, + retired:()=>retired.map(old=>old.inspect()), +}; diff --git a/packages/ui/tests/app-lifetime/native-host.ts b/packages/ui/tests/app-lifetime/native-host.ts new file mode 100644 index 0000000..cae3b36 --- /dev/null +++ b/packages/ui/tests/app-lifetime/native-host.ts @@ -0,0 +1,33 @@ +// Minimal Tauri boundary fixture. The actual NativeRoot, nativePorts and ConnApp are used. +const handlers = new Mapvoid>>(); +const requests: {name:string,args:Record}[] = []; +let attachments = 0, fence = false; +export const inspect = () => ({attachments,requests:[...requests],listeners:[...handlers.values()].reduce((n,set)=>n+set.size,0)}); +export const fenceNext = () => { fence=true; }; +export async function invoke(name:string,args:Record={}) { + requests.push({name,args}); + if(name==='owner_attach') { + if(++attachments===1) throw 'Synthetic owner attachment failure'; + return {protocol:1,runtimeId:'native-fixture',buildVersion:'fixture',epoch:attachments,viewId:'main'}; + } + if(name==='app_update') return {phase:'unsupported',current:'fixture',notes:'',preview:false,supported:false,downloaded:0}; + if(name!=='dispatch') throw new Error(`Unhandled native fixture command: ${name}`); + if(fence) { fence=false; throw 'attachment_fenced'; } + if(args.meta?.epoch!==attachments || !Number.isSafeInteger(args.meta?.operationId)) throw new Error('Native owner metadata missing'); + switch(args.name) { + case 'admission_snapshot': return {revision:0,pending:[]}; + case 'activity_snapshot': return {revision:0,connections:[]}; + case 'profiles_catalog': return {config:{version:1,revision:0,defaultProfile:'fixture',profiles:[]},availability:{}}; + case 'extensions_status': return {apiVersion:1,extensions:[],settings:{theme:'conn.theme.midnight'},themes:[]}; + case 'start': return {socket:'native-fixture',session:null,sessions:[],externalPending:false}; + case 'ui_ready': case 'log': return null; + default: throw new Error(`Unhandled native owner command: ${args.name}`); + } +} +export async function listen(name:string,handler:(event:unknown)=>void) { + const group=handlers.get(name)??new Set(); group.add(handler);handlers.set(name,group); + return ()=>group.delete(handler); +} +export const getCurrentWebviewWindow=()=>({label:'main'}); +export const getCurrentWindow=()=>({isFocused:async()=>true,requestUserAttention:async()=>{}}); +export const UserAttentionType={Informational:2}; diff --git a/packages/ui/tests/app-lifetime/native-main.ts b/packages/ui/tests/app-lifetime/native-main.ts new file mode 100644 index 0000000..ec672f3 --- /dev/null +++ b/packages/ui/tests/app-lifetime/native-main.ts @@ -0,0 +1,7 @@ +// Exercise the actual native bootstrap and shared product UI with low-level IPC fixtures. +import { mount, unmount } from 'svelte'; +import NativeRoot from '../../../../frontends/tauri/src/NativeRoot.svelte'; +import { inspect, fenceNext } from './native-host'; +import '../../src/styles/app.css'; +const component = mount(NativeRoot, {target:document.getElementById('app')!}); +(window as any).nativeLifetime = { inspect, fenceNext, unmount:()=>unmount(component) }; diff --git a/packages/ui/tests/app-lifetime/native.html b/packages/ui/tests/app-lifetime/native.html new file mode 100644 index 0000000..990f291 --- /dev/null +++ b/packages/ui/tests/app-lifetime/native.html @@ -0,0 +1,3 @@ + +Conn native connection lifetime fixture +
diff --git a/packages/ui/tests/app-lifetime/web-flow.mjs b/packages/ui/tests/app-lifetime/web-flow.mjs new file mode 100644 index 0000000..63f8bec --- /dev/null +++ b/packages/ui/tests/app-lifetime/web-flow.mjs @@ -0,0 +1,159 @@ +import assert from 'node:assert/strict'; +import { join } from 'node:path'; + +function ownerResult(name, terminal) { + switch (name) { + case 'admission_snapshot': return {revision:0,pending:[]}; + case 'activity_snapshot': return {revision:0,connections:[]}; + case 'profiles_catalog': return {config:{version:1,revision:0,defaultProfile:'fixture',profiles:[]},availability:{}}; + case 'extensions_status': return {apiVersion:1,extensions:[],settings:{theme:'conn.theme.midnight'},themes:[]}; + case 'start': return {socket:'web-fixture',session:terminal?'fixture-term':null,sessions:terminal?['fixture-term']:[],externalPending:false}; + case 'status': return {shared:false,externalOrigin:false,surfaceAvailable:true,inputPending:false,externalStarting:false,externalInputAvailable:false,processAlive:true,attended:true,profileId:'fixture',profileName:'Fixture',reviewRequired:false,mode:'autopilot',effectiveMode:'autopilot',controlGate:false,pacing:{minWriteIntervalMs:0,enterGraceMs:0,leaseTtlSecs:60,approvalTtlSecs:300},sessionAllows:[],affordanceMask:null,connectedAgents:[],controller:{type:'human'},attentionRequest:null,openedBy:null,lastAgent:null,pending:[],proposal:null,controlRequests:[]}; + case 'ui_ready': case 'log': return null; + default: throw new Error(`Unhandled web fixture command: ${name}`); + } +} + +/** Actual WebRoot/WebTransport/ConnApp, with HTTP/WS responses at the host boundary. */ +export async function testWebBootstrap(browser, baseUrl, output) { + const page=await browser.newPage({locale:'ko-KR',viewport:{width:1000,height:750},reducedMotion:'reduce'}); + const errors=[],hellos=[]; + page.on('pageerror',error=>errors.push(error.message)); + let authenticated=false, socket, epoch=0, terminal=false, failInput=false, failAttach=false, heldInput; + const input=[]; + await page.route('**/api/info',route=>route.fulfill({json:{authenticated,protocol:1,buildVersion:'fixture'}})); + await page.route('**/api/bootstrap',route=>{ + authenticated=route.request().postDataJSON().token==='fixture-code'; + return route.fulfill({status:authenticated?200:401,json:{}}); + }); + await page.routeWebSocket('**/api/ws',route=>{ + socket=route; + let streamSeq=0; + const output=(size,reset=false)=>route.send(JSON.stringify({event:'ss:output',epoch,payload:{epoch,session:'fixture-term',generation:1,outputSeq:streamSeq+1,streamSeq:++streamSeq,reset,size,data:reset?Buffer.from('fixture> ').toString('base64'):''}})); + route.onMessage(raw=>{ + const message=JSON.parse(String(raw)); + if(message.type==='hello') { + hellos.push(message); + route.send(JSON.stringify({type:'hello',protocol:1,runtimeId:'web-fixture',buildVersion:'fixture',epoch:++epoch,viewId:'web'})); + } else { + assert.equal(message.epoch,epoch);assert.ok(message.operationId>0); + if(message.name==='input') { + input.push(message.args.data); + if(failInput) { failInput=false;heldInput=()=>route.send(JSON.stringify({id:message.id,error:'owner_busy',code:'owner_busy'}));return; } + route.send(JSON.stringify({id:message.id,result:null}));return; + } + if(message.name==='attach_output') { + if(failAttach) { failAttach=false;route.send(JSON.stringify({id:message.id,error:'checkpoint temporarily unavailable',code:'command_failed'}));return; } + output({rows:24,cols:80},true); + route.send(JSON.stringify({id:message.id,result:null}));return; + } + if(message.name==='resize') { + output({rows:message.args.rows,cols:message.args.cols}); + route.send(JSON.stringify({id:message.id,result:null}));return; + } + route.send(JSON.stringify({id:message.id,result:ownerResult(message.name,terminal)})); + } + }); + }); + try { + await page.goto(`${baseUrl}tests/app-lifetime/web.html`); + await page.getByRole('button',{name:'Connect',exact:true}).waitFor(); + await page.waitForFunction(()=>!document.querySelector('.host-connection button').disabled); + assert.equal(await page.evaluate(()=>navigator.language),'ko-KR'); + assert.equal(await page.getByRole('alert').count(),0,'a fresh code-required visit is not a failed connection'); + await page.screenshot({path:join(output,'web-first-visit.png')}); + await page.getByLabel('Connection code',{exact:true}).fill('wrong-code'); + await page.getByRole('button',{name:'Connect',exact:true}).click(); + await page.getByRole('alert').filter({hasText:'Check the connection code.'}).waitFor(); + await page.getByLabel('Connection code',{exact:true}).fill('fixture-code'); + await page.getByRole('button',{name:'Connect',exact:true}).click(); + await page.locator('.app[data-runtime-online="true"]').waitFor(); + await page.locator('.app-menu .trigger').click(); + await page.getByRole('menuitem',{name:/^Settings/}).waitFor(); + assert.equal(hellos.length,1); + + authenticated=false; + await socket.close({code:1001,reason:'fixture authentication expired'}); + await page.getByRole('alert').filter({hasText:'Reconnect using the server connection code.'}).waitFor(); + assert.equal(await page.locator('.app').count(),0); + await page.getByLabel('Connection code',{exact:true}).fill('fixture-code'); + await page.getByRole('button',{name:'Connect',exact:true}).click(); + await page.locator('.app[data-runtime-online="true"]').waitFor(); + socket.send(JSON.stringify({type:'attachment_fenced'})); + await page.getByRole('heading',{name:'Open in another view',exact:true}).waitFor(); + assert.equal(await page.locator('input[type="password"]').count(),0); + await page.waitForTimeout(700); + assert.equal(hellos.length,2,'a fenced view cannot automatically take ownership back'); + await page.getByRole('button',{name:'Continue here',exact:true}).click(); + await page.locator('.app[data-runtime-online="true"]').waitFor(); + assert.deepEqual(hellos.map(hello=>hello.takeover),[false,false,true]); + await page.evaluate(()=>localStorage.setItem('ss:lang','ko')); + authenticated=false; + await page.reload(); + await page.getByRole('button',{name:'연결',exact:true}).waitFor(); + await page.waitForFunction(()=>!document.querySelector('.host-connection button').disabled); + assert.equal(await page.getByRole('alert').count(),0); + await page.getByLabel('연결 코드',{exact:true}).fill('fixture-code'); + await page.getByRole('button',{name:'연결',exact:true}).click(); + await page.locator('.app[data-runtime-online="true"]').waitFor(); + await page.locator('.app-menu .trigger').click(); + await page.getByRole('menuitem',{name:/^설정/}).waitFor(); + + // Use the actual Term input path. Hold the first reply so B/C queue behind A. + terminal=true;failInput=true; + await page.evaluate(()=>localStorage.setItem('ss:lang','en')); + await page.reload(); + await page.locator('.host[data-terminal-ready="true"]').waitFor(); + await page.locator('.xterm-helper-textarea').focus(); + await page.keyboard.type('ABC'); + await page.waitForTimeout(50); + assert.ok(heldInput,'genuine terminal input reached the owner transport'); + heldInput(); + await page.getByRole('alert').filter({hasText:'Reconnect, then check the terminal and request state before trying again.'}).waitFor(); + assert.equal(await page.locator('.app').count(),0); + assert.equal(await page.locator('input[type="password"]').count(),0,'uncertain input reconnects with existing authentication'); + const countBeforeReconnect=hellos.length; + await page.waitForTimeout(700); + assert.equal(hellos.length,countBeforeReconnect,'ordered failures do not reconnect automatically'); + assert.deepEqual(input,['A'],'queued input is fenced before reaching the host'); + await page.getByRole('button',{name:'Reconnect',exact:true}).click(); + await page.locator('.host[data-terminal-ready="true"]').waitFor(); + assert.equal(hellos.at(-1).takeover,false,'ordinary retry uses the cookie and does not request a takeover'); + assert.deepEqual(input,['A'],'reconnection never replays input'); + await page.locator('.xterm-helper-textarea').focus(); + await page.keyboard.type('Z'); + await page.waitForTimeout(50); + assert.deepEqual(input,['A','Z'],'only fresh user input is accepted after the new checkpoint'); + + // A failed checkpoint must leave the same explicit escape route, not a locked terminal. + failAttach=true; + await socket.close({code:1001,reason:'fixture checkpoint reconnect'}); + await page.getByRole('alert').filter({hasText:'Reconnect, then check the terminal and request state before trying again.'}).waitFor(); + const countAfterFailedCheckpoint=hellos.length; + await page.waitForTimeout(700); + assert.equal(hellos.length,countAfterFailedCheckpoint); + await page.getByRole('button',{name:'Reconnect',exact:true}).click(); + await page.locator('.host[data-terminal-ready="true"]').waitFor(); + assert.deepEqual(input,['A','Z']); + + // Connection notification can arrive before rejection of its pending input. + failInput=true;heldInput=undefined; + await page.locator('.xterm-helper-textarea').focus(); + await page.keyboard.type('LMN'); + await page.waitForTimeout(50); + assert.ok(heldInput); + const countBeforeLostResponse=hellos.length; + await socket.close({code:1001,reason:'fixture input response lost'}); + await page.getByRole('alert').filter({hasText:'Reconnect, then check the terminal and request state before trying again.'}).waitFor(); + await page.waitForTimeout(700); + assert.equal(hellos.length,countBeforeLostResponse,'lost input outcome still requires explicit reconnect after the close event'); + assert.deepEqual(input,['A','Z','L']); + await page.getByRole('button',{name:'Reconnect',exact:true}).click(); + await page.locator('.host[data-terminal-ready="true"]').waitFor(); + assert.deepEqual(input,['A','Z','L'],'neither the uncertain input nor its queued suffix is replayed'); + assert.deepEqual(errors,[]); + } catch(error) { + await page.screenshot({path:join(output,'web-flow-failure.png')}).catch(()=>{}); + throw error; + } finally { await page.close(); } +} diff --git a/packages/ui/tests/app-lifetime/web-main.ts b/packages/ui/tests/app-lifetime/web-main.ts new file mode 100644 index 0000000..56d0971 --- /dev/null +++ b/packages/ui/tests/app-lifetime/web-main.ts @@ -0,0 +1,5 @@ +// Actual web bootstrap and transport; the test intercepts HTTP/WS at the host boundary. +import { mount } from 'svelte'; +import WebRoot from '../../../../frontends/web/src/WebRoot.svelte'; +import '../../src/styles/app.css'; +mount(WebRoot, {target:document.getElementById('app')!}); diff --git a/packages/ui/tests/app-lifetime/web.html b/packages/ui/tests/app-lifetime/web.html new file mode 100644 index 0000000..0682835 --- /dev/null +++ b/packages/ui/tests/app-lifetime/web.html @@ -0,0 +1,3 @@ + +Conn web connection lifetime fixture +
diff --git a/packages/ui/tests/collaboration/outcome.test.ts b/packages/ui/tests/collaboration/outcome.test.ts new file mode 100644 index 0000000..a92fa85 --- /dev/null +++ b/packages/ui/tests/collaboration/outcome.test.ts @@ -0,0 +1,17 @@ +import assert from 'node:assert/strict'; +import { test } from 'node:test'; +import { failureKey } from '../../src/lib/collaboration/api.ts'; + +test('a lost response explains uncertainty even when its message resembles a disconnect', () => { + const failure = Object.assign(new Error('Connection disconnected after sending the request'), {code:'outcome_unknown'}); + assert.equal(failureKey(failure), 'decision.outcomeUnknown'); +}); +test('native string errors and pending outcomes use the same uncertainty message', () => { + assert.equal(failureKey('outcome_unknown'), 'decision.outcomeUnknown'); + assert.equal(failureKey(Object.assign(new Error('Still executing'), {code:'outcome_pending'})), 'decision.outcomeUnknown'); +}); +test('ordinary failures retain their existing specific or retryable guidance', () => { + assert.equal(failureKey(new Error('sharing_changed')), 'sharing.changed'); + assert.equal(failureKey(new Error('input_pending')), 'sharing.pendingInput'); + assert.equal(failureKey(new Error('Temporary failure')), 'decision.failed'); +}); diff --git a/frontends/tauri/tests/collaboration/state.test.ts b/packages/ui/tests/collaboration/state.test.ts similarity index 91% rename from frontends/tauri/tests/collaboration/state.test.ts rename to packages/ui/tests/collaboration/state.test.ts index b531969..578f35d 100644 --- a/frontends/tauri/tests/collaboration/state.test.ts +++ b/packages/ui/tests/collaboration/state.test.ts @@ -102,3 +102,15 @@ test('sharing revocation immediately clears collaboration and private snapshots applySessionEvent(t,{session:'one',event:'control_requested',request:{requestId:'late',agentId:'one'}}); assert.equal(t.ctlReq,null);assert.deepEqual(t.agents,[]); }); + +test('approval choices follow the request even when the global shell status changes later', () => { + for (const allowSession of [true, false]) { + const t = view(); + const request = { id:'review-context', agentId:'agent', cmd:'rm fixture', label:'delete files', review: { reason: allowSession ? 'command_policy' as const : 'unverified_shell' as const, allowSession, remote:false } }; + applySessionEvent(t, {session:'one', event:'approval_requested', request}); + assert.equal(t.approval?.review?.allowSession, allowSession); + applySessionSnapshot(t, {...snapshot(), reviewRequired:allowSession, pending:[request]}, 'Private'); + assert.equal(t.approval?.review?.allowSession, allowSession); + assert.equal(t.approval?.label, 'delete files'); + } +}); diff --git a/frontends/tauri/tests/connections/status.test.ts b/packages/ui/tests/connections/status.test.ts similarity index 100% rename from frontends/tauri/tests/connections/status.test.ts rename to packages/ui/tests/connections/status.test.ts diff --git a/frontends/tauri/tests/icon/state.test.ts b/packages/ui/tests/icon/state.test.ts similarity index 100% rename from frontends/tauri/tests/icon/state.test.ts rename to packages/ui/tests/icon/state.test.ts diff --git a/packages/ui/tests/runtime/client.test.ts b/packages/ui/tests/runtime/client.test.ts new file mode 100644 index 0000000..c7665f7 --- /dev/null +++ b/packages/ui/tests/runtime/client.test.ts @@ -0,0 +1,110 @@ +import { strict as assert } from 'node:assert'; +import { test } from 'node:test'; +import { createClient } from '../../src/runtime/client.ts'; +import { createLifetime } from '../../src/runtime/lifetime.ts'; + +function fixture() { + const handlers = new Map void>(); + const calls: { name: string; args: any; meta: any; resolve: (result: any) => void; reject: (error: any) => void }[] = []; + let stops = 0, disposed = 0; + const resets: unknown[] = []; + const transport = { + invoke: (name: string, args: any, meta: any) => new Promise((resolve, reject) => calls.push({ name, args, meta, resolve, reject })), + listen: async (name: string, handler: any) => { handlers.set(name, handler); return () => { stops++; handlers.delete(name); }; }, + dispose: () => { disposed++; }, + reset: (cause: unknown) => { resets.push(cause); }, + }; + const lifetime = createLifetime(), client = createClient(transport, lifetime); + const emit = (name: string, payload: any) => handlers.get(name)?.({ payload }); + emit('ss:connection', { connected: true, epoch: 1, runtimeId: 'test' }); + return { client, lifetime, calls, emit, handlers, resets, get stops() { return stops; }, get disposed() { return disposed; } }; +} +const tick = () => new Promise(resolve => setImmediate(resolve)); + +test('per-session FIFO preserves resize/input/terminal replies without blocking another session or slow reads', async () => { + const f = fixture(); + const profile = f.client.invoke('profiles_test'); + const a = f.client.invoke('resize', { session: 'a', cols: 80 }); + const b = f.client.invoke('input', { session: 'a', text: 'x' }); + const c = f.client.invoke('terminal_response', { session: 'a', text: 'reply' }); + const other = f.client.invoke('input', { session: 'b', text: 'y' }); + await tick(); + assert.deepEqual(f.calls.map(x => x.name), ['profiles_test', 'resize', 'input']); + assert.deepEqual(f.calls.map(x => x.meta.sequence), [undefined, 1, 1]); + f.calls[2].resolve('other'); assert.equal(await other, 'other'); + f.calls[1].resolve(null); await a; await tick(); + assert.equal(f.calls[3].name, 'input'); assert.equal(f.calls[3].meta.sequence, 2); + f.calls[3].resolve(null); await b; await tick(); + assert.equal(f.calls[4].name, 'terminal_response'); assert.equal(f.calls[4].meta.sequence, 3); + f.calls[4].resolve(null); await c; + f.calls[0].resolve('late'); await profile; f.lifetime.dispose(); +}); + +test('disconnect fences queued input and does not replay after a new epoch', async () => { + const f = fixture(); + const first = f.client.invoke('input', { session: 'a', text: 'first' }); + const second = f.client.invoke('input', { session: 'a', text: 'second' }); + const failures = Promise.all([assert.rejects(first, /disconnected/), assert.rejects(second, /disconnected/)]); + await tick(); + f.emit('ss:connection', { connected: false, epoch: 1 }); + f.emit('ss:connection', { connected: true, epoch: 2 }); + f.calls[0].resolve(null); await failures; + assert.equal(f.calls.length, 1); + const next = f.client.invoke('input', { session: 'a', text: 'new human action' }); await tick(); + assert.equal(f.calls[1].meta.sequence, 1); f.calls[1].resolve(null); await next; + f.lifetime.dispose(); +}); + +test('output gaps block input and request one checkpoint; stale and duplicate frames never render', async () => { + const f = fixture(), frames: any[] = [], sync: any[] = []; + await f.client.listen('ss:output', e => frames.push(e.payload)); + await f.client.listen('ss:terminal_sync', e => sync.push(e.payload)); + const frame = (streamSeq: number, reset = false, epoch = 1) => f.emit('ss:output', { session: 'a', epoch, streamSeq, reset, data: '' }); + frame(4, true); frame(4); frame(6); frame(7); frame(100, false, 0); + assert.equal(frames.length, 1); assert.equal(f.calls.length, 1); assert.equal(f.calls[0].name, 'attach_output'); + await assert.rejects(f.client.invoke('input', { session: 'a', text: 'unsafe replay' }), /synchronizing/); + frame(8, true); f.calls[0].resolve(null); frame(9); + assert.deepEqual(frames.map(x => x.streamSeq), [4, 8, 9]); + assert.deepEqual(sync.map(x => x.ready), [true, false, true]); + f.lifetime.dispose(); +}); + +test('connection state replays for late subscribers and disposal releases every event listener once', async () => { + const f = fixture(), connections: any[] = []; + await f.client.listen('ss:connection', e => connections.push(e.payload)); + const stop = await f.client.listen('ss:output', () => assert.fail('late event')); + stop(); stop(); + assert.equal(connections.at(-1).epoch, 1); + f.lifetime.dispose(); f.lifetime.dispose(); await tick(); + assert.equal(f.stops, 2); assert.equal(f.disposed, 1); assert.equal(f.handlers.size, 0); + await assert.rejects(f.client.invoke('input', { session: 'a' }), /disposed/); +}); + +test('unconsumed or uncertain input failure fences queued keys until fresh attachment without replay', async () => { + for (const code of ['owner_busy', 'outcome_unknown', 'terminal_sequence_gap']) { + const f = fixture(); + const first = f.client.invoke('input', { session: 'a', text: 'unknown' }); + const queued = f.client.invoke('input', { session: 'a', text: 'must not follow' }); + const failed = Promise.all([assert.rejects(first, new RegExp(code)), assert.rejects(queued, /disconnected/)]); + await tick(); f.calls[0].reject(Object.assign(new Error(code), { code })); await failed; + assert.equal(f.resets.length, 1); assert.equal(f.calls.length, 1); + await assert.rejects(f.client.invoke('input', { session: 'a', text: 'still blocked' }), /disconnected/); + f.emit('ss:connection', { connected: true, epoch: 2 }); + const next = f.client.invoke('input', { session: 'a', text: 'new explicit action' }); await tick(); + assert.equal(f.calls[1].meta.sequence, 1); + assert.equal(f.calls[1].args.text, 'new explicit action'); + f.calls[1].resolve(null); await next; f.lifetime.dispose(); + } +}); + +test('failed checkpoint exposes owner reattachment instead of permanent silent synchronization', async () => { + const f = fixture(); const connections: any[] = []; + await f.client.listen('ss:connection', e => connections.push(e.payload)); + await f.client.listen('ss:output', () => {}); + f.emit('ss:output', { session: 'a', epoch: 1, streamSeq: 1, reset: true }); + f.emit('ss:output', { session: 'a', epoch: 1, streamSeq: 3 }); + f.calls[0].reject(new Error('checkpoint temporarily unavailable')); await tick(); + assert.equal(f.resets.length, 1); assert.equal(connections.at(-1).connected, false); + await assert.rejects(f.client.invoke('input', { session: 'a', text: 'blocked' }), /disconnected/); + f.lifetime.dispose(); +}); diff --git a/frontends/tauri/tests/terminal/input.test.ts b/packages/ui/tests/terminal/input.test.ts similarity index 100% rename from frontends/tauri/tests/terminal/input.test.ts rename to packages/ui/tests/terminal/input.test.ts diff --git a/frontends/tauri/tests/terminal/output.test.ts b/packages/ui/tests/terminal/output.test.ts similarity index 52% rename from frontends/tauri/tests/terminal/output.test.ts rename to packages/ui/tests/terminal/output.test.ts index ddaf64b..eb83d85 100644 --- a/frontends/tauri/tests/terminal/output.test.ts +++ b/packages/ui/tests/terminal/output.test.ts @@ -1,6 +1,6 @@ import assert from 'node:assert/strict'; import test from 'node:test'; -import { terminalOutputQueue } from '../../src/lib/terminalOutput.ts'; +import { terminalOutputQueue } from '../../../../packages/ui/src/lib/terminalOutput.ts'; test('resize markers wait for old bytes and precede the new shell redraw', () => { const events: string[] = []; @@ -32,3 +32,26 @@ test('disposing a renderer discards frames waiting for an asynchronous write', ( queue.push({size:{rows:20,cols:80},data:new Uint8Array()}); assert.deepEqual(applied,[38]); }); + + +test('a checkpoint fences old pending frames and becomes ready only after parsing', () => { + const events: string[]=[]; const completions: (()=>void)[]=[]; + const queue=terminalOutputQueue(size=>events.push(`size:${size.rows}`),(bytes,done)=>{events.push(new TextDecoder().decode(bytes));completions.push(done);},()=>events.push('reset')); + const frame=(text:string)=>({size:{rows:24,cols:80},data:new TextEncoder().encode(text)}); + queue.push(frame('old in flight')); queue.push(frame('discard stale pending')); + queue.push({...frame('checkpoint'),reset:true,applied:()=>events.push('ready')}); + queue.push(frame('new output')); + assert.deepEqual(events,['size:24','old in flight']); + completions.shift()!(); + assert.deepEqual(events,['size:24','old in flight','reset','size:24','checkpoint']); + completions.shift()!(); + assert.deepEqual(events.slice(-3),['ready','size:24','new output']); + completions.shift()!(); queue.dispose(); +}); + +test('unmount cannot enable input from a late checkpoint completion', () => { + let finish!:()=>void; let ready=false; + const queue=terminalOutputQueue(()=>{},(_bytes,done)=>{finish=done;}); + queue.push({size:{rows:24,cols:80},data:new Uint8Array([65]),reset:true,applied:()=>{ready=true;}}); + queue.dispose(); finish(); assert.equal(ready,false); +}); diff --git a/packages/ui/tests/terminal/resize.test.ts b/packages/ui/tests/terminal/resize.test.ts new file mode 100644 index 0000000..f7ad3d9 --- /dev/null +++ b/packages/ui/tests/terminal/resize.test.ts @@ -0,0 +1,38 @@ +import assert from 'node:assert/strict'; +import test from 'node:test'; +import { terminalResizeQueue } from '../../../../packages/ui/src/lib/terminalResize.ts'; +const turn = () => new Promise(resolve => setImmediate(resolve)); + +test('size requests reach the shared queue before intervening input', () => { + const operations: unknown[] = []; + const sizes = terminalResizeQueue(async size => { operations.push(size); }, error => { throw error; }); + sizes.resize({ rows:30, cols:83 }); + sizes.resize({ rows:29, cols:100 }); + operations.push('input'); + sizes.resize({ rows:28, cols:137 }); + assert.deepEqual(operations, [{ rows:30, cols:83 }, { rows:29, cols:100 }, 'input', { rows:28, cols:137 }]); + sizes.dispose(); +}); + +test('only consecutive equal measurements are discarded', () => { + const calls: unknown[] = []; + const queue = terminalResizeQueue(async size => { calls.push(size); }, error => { throw error; }); + queue.resize({ rows:24, cols:80 }); queue.resize({ rows:24, cols:80 }); + queue.resize({ rows:24, cols:100 }); queue.resize({ rows:24, cols:80 }); + assert.equal(calls.length,3); queue.dispose(); +}); + +test('a failed size can be retried and an attachment can invalidate deduplication', async () => { + let calls=0; const errors: unknown[]=[]; + const queue=terminalResizeQueue(async()=>{if(++calls===1)throw new Error('failed');},error=>errors.push(error)); + const size={rows:30,cols:104}; queue.resize(size); await turn(); queue.resize(size); await turn(); + assert.equal(calls,2); assert.equal(errors.length,1); + queue.invalidate(); queue.resize(size); assert.equal(calls,3); queue.dispose(); +}); + +test('disposal rejects new measurements and silences late errors', async () => { + let reject!: (error: Error) => void; let calls=0; const errors: unknown[]=[]; + const queue=terminalResizeQueue(()=>{calls++;return new Promise((_,no)=>reject=no);},error=>errors.push(error)); + queue.resize({rows:30,cols:100}); queue.dispose(); reject(new Error('closed')); await turn(); + queue.resize({rows:40,cols:120}); assert.equal(calls,1); assert.deepEqual(errors,[]); +}); diff --git a/frontends/tauri/tests/timeline/events.test.ts b/packages/ui/tests/timeline/events.test.ts similarity index 100% rename from frontends/tauri/tests/timeline/events.test.ts rename to packages/ui/tests/timeline/events.test.ts diff --git a/packages/ui/tsconfig.json b/packages/ui/tsconfig.json new file mode 100644 index 0000000..5297f8b --- /dev/null +++ b/packages/ui/tsconfig.json @@ -0,0 +1,16 @@ +{ + "extends": "@tsconfig/svelte/tsconfig.json", + "compilerOptions": { + "target": "ES2021", + "module": "ESNext", + "lib": ["ES2021", "DOM", "DOM.Iterable"], + "moduleResolution": "bundler", + "skipLibCheck": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "strict": true, + "verbatimModuleSyntax": true + }, + "include": ["src/**/*.ts", "src/**/*.svelte"] +} diff --git a/plugin/.claude-plugin/plugin.json b/plugin/.claude-plugin/plugin.json index a2a99dc..beb8260 100644 --- a/plugin/.claude-plugin/plugin.json +++ b/plugin/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "conn", "description": "Conn — one shell, one hand on it. Registers the conn MCP server and a skill that teaches the agent how to work in a shell a human is watching.", - "version": "0.8.6", + "version": "0.8.7", "author": { "name": "eggp" }, diff --git a/plugin/.codex-plugin/plugin.json b/plugin/.codex-plugin/plugin.json index ed4607e..67d529e 100644 --- a/plugin/.codex-plugin/plugin.json +++ b/plugin/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "conn", - "version": "0.8.6", + "version": "0.8.7", "description": "Conn — one shell, one hand on it. Registers the conn MCP server and a skill that teaches the agent how to work in a shell a human is watching.", "author": { "name": "eggp" diff --git a/scripts/check-ui-boundaries.mjs b/scripts/check-ui-boundaries.mjs new file mode 100644 index 0000000..b6d6140 --- /dev/null +++ b/scripts/check-ui-boundaries.mjs @@ -0,0 +1,24 @@ +// Prevent a second product UI or a host-specific branch in the common package. +import { readdirSync, readFileSync, existsSync } from 'node:fs'; +import { fileURLToPath } from 'node:url'; +import { join, relative } from 'node:path'; +import assert from 'node:assert/strict'; +const root = fileURLToPath(new URL('../', import.meta.url)); +const walk = directory => readdirSync(directory, { withFileTypes: true }).flatMap(entry => { + const path = join(directory, entry.name); + return entry.isDirectory() ? walk(path) : /\.(ts|js|svelte)$/.test(path) ? [path] : []; +}); +for (const path of walk(join(root, 'packages/ui/src'))) { + const source = readFileSync(path, 'utf8'), name = relative(root, path); + assert.ok(!/@tauri-apps|__TAURI|import\.meta\.env\.MODE|browser-test|CONN_TEST_/.test(source), `Host dependency in ${name}`); + assert.ok(!/(?:from|import\s*\()\s*['"][^'"]*frontends\//.test(source), `Reverse frontend import in ${name}`); +} +for (const frontend of ['tauri', 'web']) { + const files = walk(join(root, `frontends/${frontend}/src`)); + assert.ok(files.length <= 6, `${frontend} entry must remain a small host adapter`); + assert.ok(files.some(path => /ConnApp/.test(readFileSync(path, 'utf8'))), `${frontend} must mount the common ConnApp`); +} +for (const legacy of ['crates/browser-harness', 'frontends/tauri/tests/browser', 'frontends/tauri/scripts/browser-test.mjs', 'frontends/tauri/src/components']) { + assert.ok(!existsSync(join(root, legacy)), `Legacy alternate runtime remains: ${legacy}`); +} +console.log('PASS common UI imports, thin host entries and removal of the alternate browser runtime'); diff --git a/scripts/ci_scope.py b/scripts/ci_scope.py index f9c5eba..cb66ff0 100644 --- a/scripts/ci_scope.py +++ b/scripts/ci_scope.py @@ -23,8 +23,9 @@ # Not part of any build. The always-on job checks the installer (`sh -n`); Dependabot's # configuration is read by GitHub, not by a workflow, so it needs no native runner either. LIGHT_FILES = ("scripts/install.sh", ".github/dependabot.yml") -# The Svelte UI. The native shell under src-tauri is excluded below. -FRONTEND_PREFIX = "frontends/tauri/" +# Shared Svelte UI, thin native/web adapters and browser integration tests. +# The native shell under src-tauri is excluded below. +FRONTEND_PREFIXES = ("packages/ui/", "frontends/tauri/", "frontends/web/", "tests/collaboration/") # The npm workspace root: one lockfile for the UI, the site and the films. No Rust reads it. FRONTEND_ROOT_FILES = ("package.json", "package-lock.json", ".npmrc") NATIVE_SHELL_PREFIX = "frontends/tauri/src-tauri/" @@ -38,7 +39,7 @@ def classify(path: str) -> str: return "platform" if path.startswith(DOCS_PREFIXES) or path in DOCS_ROOT_FILES or path in LIGHT_FILES or ("/" not in path and path.endswith(".md")): return "docs" - if path.startswith(FRONTEND_PREFIX) or path in FRONTEND_ROOT_FILES: + if path.startswith(FRONTEND_PREFIXES) or path in FRONTEND_ROOT_FILES: return "frontend" return "native" diff --git a/scripts/generate-owner-contract.mjs b/scripts/generate-owner-contract.mjs new file mode 100644 index 0000000..8e8d8a6 --- /dev/null +++ b/scripts/generate-owner-contract.mjs @@ -0,0 +1,30 @@ +// Rust serde DTOs are the source of the owner transport schema. +import {execFileSync} from 'node:child_process'; +import {readFileSync,writeFileSync} from 'node:fs'; +import {fileURLToPath} from 'node:url'; +import {dirname,resolve} from 'node:path'; +const root=resolve(dirname(fileURLToPath(import.meta.url)),'..'); +const contract=JSON.parse(execFileSync('cargo',['run','--quiet','--locked','-p','conn-web','--','contract'],{cwd:root,encoding:'utf8'})); +const schemas=new Map(); +for(const schema of Object.values(contract)){if(schema&&typeof schema==='object'&&schema.title){for(const [name,definition]of Object.entries(schema.definitions??{}))schemas.set(name,definition);schemas.set(schema.title,schema);}} +function type(schema){ + if(schema.$ref)return schema.$ref.split('/').at(-1); + if(schema.enum)return schema.enum.map(value=>JSON.stringify(value)).join(' | '); + if(schema.const!==undefined)return JSON.stringify(schema.const); + if(schema.anyOf||schema.oneOf)return (schema.anyOf??schema.oneOf).map(type).join(' | '); + if(schema.allOf)return schema.allOf.map(type).join(' & '); + if(Array.isArray(schema.type))return schema.type.map(t=>type({...schema,type:t})).join(' | '); + switch(schema.type){ + case 'null':return 'null';case 'boolean':return 'boolean';case 'integer':case 'number':return 'number';case 'string':return 'string'; + case 'array':return `Array<${type(schema.items??{})}>`; + case 'object':{ + const properties=Object.entries(schema.properties??{}).map(([name,value])=>`${JSON.stringify(name)}${schema.required?.includes(name)?'':'?'}: ${type(value)};`); + if(schema.additionalProperties&&typeof schema.additionalProperties==='object')properties.push(`[key: string]: ${type(schema.additionalProperties)};`); + return properties.length?`{\n${properties.map(p=>' '+p).join('\n')}\n}`:'Record'; + } + default:return 'unknown'; + } +} +const text='// Generated from conn-frontend owner DTOs. Do not edit.\n// Run: node scripts/generate-owner-contract.mjs [--check]\n\n'+`export const OWNER_PROTOCOL = ${contract.protocol} as const;\n\n`+[...schemas].sort(([a],[b])=>a.localeCompare(b)).map(([name,schema])=>`export type ${name} = ${type(schema)};\n`).join('\n'); +const target=resolve(root,'packages/ui/src/runtime/generated.ts'); +if(process.argv.includes('--check')){if(readFileSync(target,'utf8')!==text)throw Error('Owner wire types differ from Rust. Run node scripts/generate-owner-contract.mjs.');console.log('Owner wire contract matches Rust.');}else{writeFileSync(target,text);console.log('Generated packages/ui/src/runtime/generated.ts');} diff --git a/scripts/package-web.mjs b/scripts/package-web.mjs new file mode 100644 index 0000000..830f706 --- /dev/null +++ b/scripts/package-web.mjs @@ -0,0 +1,57 @@ +// Build a local, self-contained Conn web host. Nothing is uploaded or published. +import {spawn,execFileSync} from 'node:child_process'; +import {createHash} from 'node:crypto'; +import {cpSync,readFileSync,writeFileSync,mkdirSync,mkdtempSync,readdirSync,statSync,existsSync} from 'node:fs'; +import {dirname,resolve,relative,join,basename} from 'node:path'; +import {fileURLToPath} from 'node:url'; +import {tmpdir} from 'node:os'; +import assert from 'node:assert/strict'; +const root=resolve(dirname(fileURLToPath(import.meta.url)),'..'); +const npm=process.platform==='win32'?'npm.cmd':'npm'; +const executable=process.platform==='win32'?'.exe':''; +const debug=process.argv.includes('--debug'); +const profile=debug?'debug':'release'; +const archiveRelease=process.argv.includes('--release-archive'); +if(archiveRelease)assert.ok(!debug && process.platform==='linux' && process.arch==='x64','Release archives currently support verified Linux x64 release builds only.'); +const version=JSON.parse(readFileSync(join(root,'frontends/web/package.json'),'utf8')).version; +const digest=bytes=>createHash('sha256').update(bytes).digest('hex'); +function run(program,args){execFileSync(program,args,{cwd:root,stdio:'inherit'});} +function sourceIdentity(){ + const paths=execFileSync('git',['ls-files','--cached','--others','--exclude-standard','-z'],{cwd:root,encoding:'utf8'}).split('\0').filter(p=>p&&existsSync(join(root,p))&&statSync(join(root,p)).isFile()&&(/^(Cargo\.(toml|lock)|package(-lock)?\.json)$/.test(p)||/^(crates|vendor|packages|frontends\/web|scripts\/package-web)/.test(p))).sort(); + const hash=createHash('sha256');for(const path of paths)hash.update(path+'\0').update(readFileSync(join(root,path))).update('\0');return hash.digest('hex'); +} +const source=sourceIdentity(); +run(npm,['run','build','-w','@conn/web']); +run('cargo',['build','--locked',...(debug?[]:['--release']),'-p','conn-web','-p','conn']); +assert.equal(sourceIdentity(),source,'Sources changed during packaging; rerun to build a coherent UI/server/MCP bundle.'); +const base=join(root,'release-artifacts');mkdirSync(base,{recursive:true}); +const bundle=archiveRelease ? join(mkdtempSync(join(tmpdir(),'conn-web-release-')),`conn-web-${version}-linux-x64`) : mkdtempSync(join(base,`conn-web-${version}-${process.platform}-${process.arch}${debug?'-debug':''}-`)); +mkdirSync(bundle,{recursive:true}); +for(const name of ['conn-web','conn'])cpSync(join(root,'target',profile,name+executable),join(bundle,name+executable)); +cpSync(join(root,'LICENSE'),join(bundle,'LICENSE')); +cpSync(join(root,'frontends/web/dist'),join(bundle,'ui'),{recursive:true}); +const contract=JSON.parse(execFileSync(join(bundle,'conn-web'+executable),['contract'],{encoding:'utf8'})); +for(const name of ['conn-web','conn'])assert.match(execFileSync(join(bundle,name+executable),['--version'],{encoding:'utf8'}),new RegExp(`^${name} ${version.replaceAll('.','\\.')}\\s*$`)); +const manifest={package:'conn-web',version,protocol:contract.protocol,platform:process.platform,architecture:process.arch,profile,sourceCommit:execFileSync('git',['rev-parse','HEAD'],{cwd:root,encoding:'utf8'}).trim(),sourceDirty:execFileSync('git',['status','--porcelain'],{cwd:root,encoding:'utf8'}).trim().length>0,sourceDigest:source,builtAt:new Date().toISOString(),runtime:{server:'conn-web'+executable,agent:'conn'+executable,ui:'ui'},scope:'Loopback local owner; standalone web runtime. No remote hosting or desktop session mirroring.'}; +writeFileSync(join(bundle,'manifest.json'),JSON.stringify(manifest,null,2)+'\n'); +writeFileSync(join(bundle,'README.md'),`# Conn web ${version}\n\nThis ${process.platform}/${process.arch} bundle contains the server, the same-build MCP CLI, and the compiled common UI. Running it does not require Node, Vite, Rust, or a checkout. ${debug?'This is a debug verification bundle, not a release build.':''}\n\nFrom this directory:\n\n\`\`\`sh\n./conn-web${executable} serve --state-dir /path/to/your/conn-web-state\n\`\`\`\n\nThe default address is http://127.0.0.1:1423/. Open it and enter the \`bootstrapToken\` from your private state directory's \`connection.json\`. Keep that file private. The server binds only to loopback; this package does not enable remote access. The default UI directory is \`ui/\` beside the executable.\n\nUse the app's explicit agent setup flow, or configure a persistent MCP process:\n\n\`\`\`sh\n/path/to/this/bundle/conn${executable} --socket /path/to/your/conn-web-state/conn.sock mcp --agent-id your-agent\n\`\`\`\n\nReloading the page preserves the running shell while this server process stays alive. Another owner page requires an explicit handoff. Closing a shell or stopping the server ends its process. Restarting the server does not restore old PTYs, SSH sessions, or permissions. The shell uses the account running this server; a separate state directory is not a filesystem sandbox. Desktop settings and sockets are separate by default.\n\n\`manifest.json\` records the build and source identity. \`SHA256SUMS\` covers the packaged files. Packaging verifies binary versions and static HTTP routes; native macOS UI/IME and your real remote environment require separate acceptance.\n`); +function files(dir){return readdirSync(dir,{withFileTypes:true}).flatMap(entry=>entry.isDirectory()?files(join(dir,entry.name)):[join(dir,entry.name)]);} +writeFileSync(join(bundle,'SHA256SUMS'),files(bundle).sort().map(path=>`${digest(readFileSync(path))} ${relative(bundle,path).replaceAll('\\','/')}`).join('\n')+'\n'); +const state=mkdtempSync(join(tmpdir(),'conn-web-package-check-')); +const server=spawn(join(bundle,'conn-web'+executable),['serve','--port','0','--state-dir',state],{cwd:bundle,stdio:['ignore','ignore','pipe']});let errors='';server.stderr.on('data',bytes=>{errors+=bytes.toString();}); +try{ + let metadata;for(let i=0;i<100;i++){if(existsSync(join(state,'connection.json'))){metadata=JSON.parse(readFileSync(join(state,'connection.json'),'utf8'));break;}if(server.exitCode!==null)throw Error(errors||'Packaged server exited');await new Promise(resolve=>setTimeout(resolve,50));} + assert.ok(metadata,'Packaged server did not become ready');assert.equal(metadata.buildVersion,version);assert.equal(metadata.protocol,contract.protocol); + const html=await fetch(metadata.url);assert.equal(html.status,200);const content=await html.text();assert.match(content,/type="module"/); + const assets=[...content.matchAll(/(?:src|href)="([^"#]+\.(?:js|css))"/g)].map(match=>match[1]);assert.ok(assets.length,'No built assets referenced'); + for(const asset of assets){const response=await fetch(new URL(asset,metadata.url));assert.equal(response.status,200,asset);assert.ok((await response.arrayBuffer()).byteLength,asset);} + const info=await(await fetch(new URL('/api/info',metadata.url))).json();assert.equal(info.buildVersion,version);assert.equal(info.authenticated,false); + writeFileSync(archiveRelease ? join(dirname(bundle),'verification.json') : join(base,`${relative(base,bundle)}-verification.json`),JSON.stringify({bundle,version,profile,staticRoutes:'passed',assets:assets.length,cliVersion:'passed',serverVersion:'passed',protocol:contract.protocol,requiresBuildToolsAtRuntime:false},null,2)+'\n'); + if(archiveRelease){ + const archive=join(base,`conn-web-v${version}-x86_64-unknown-linux-gnu.tar.gz`); + assert.ok(!existsSync(archive),'Refusing to overwrite an existing release archive.'); + run('tar',['-czf',archive,'-C',dirname(bundle),basename(bundle)]); + console.log(`Release archive: ${archive}`); + } + console.log(`Packaged and verified: ${bundle}`); +}finally{server.kill('SIGTERM');await Promise.race([new Promise(resolve=>server.once('exit',resolve)),new Promise(resolve=>setTimeout(()=>{if(server.exitCode===null)server.kill('SIGKILL');resolve();},3000))]);} diff --git a/scripts/release.py b/scripts/release.py index 5e7b280..21dbf9d 100644 --- a/scripts/release.py +++ b/scripts/release.py @@ -13,7 +13,7 @@ import io import json import os -from pathlib import Path +from pathlib import Path, PurePosixPath import re import shutil import subprocess @@ -43,10 +43,11 @@ PLATFORMS = {"aarch64-apple-darwin": "darwin-aarch64", "x86_64-unknown-linux-gnu": "linux-x86_64", "x86_64-pc-windows-msvc": "windows-x86_64"} SEMVER = re.compile(r"(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?") WORKSPACE_VERSION = "Cargo.toml: workspace package" -JSON_MANIFESTS = ("frontends/tauri/package.json", "frontends/tauri/src-tauri/tauri.conf.json", "plugin/.claude-plugin/plugin.json", "plugin/.codex-plugin/plugin.json") +NPM_WORKSPACES = ("frontends/tauri", "frontends/web", "packages/ui") +JSON_MANIFESTS = tuple(f"{name}/package.json" for name in NPM_WORKSPACES) + ("frontends/tauri/src-tauri/tauri.conf.json", "plugin/.claude-plugin/plugin.json", "plugin/.codex-plugin/plugin.json") # Lockfiles list every dependency; only Conn's own packages carry the release version. LOCKED_PACKAGES = { - "Cargo.lock": {"conn", "conn-core", "conn-frontend", "conn-browser-harness", "conn-desktop"}, + "Cargo.lock": {"conn", "conn-core", "conn-frontend", "conn-web", "conn-desktop"}, } # Where `bump` writes what `declarations` reads. Group 1 is the version; each pattern must match exactly once. _JSON_VERSION = r'^ "version": "([^"\n]+)"' @@ -54,8 +55,8 @@ # The desktop crate inherits the workspace version, so its manifest declares none. "Cargo.toml": (r'^\[workspace\.package\]\n(?:(?!\[).*\n)*?version = "([^"\n]+)"', r'^conn-core = \{[^}\n]*\bversion = "([^"\n]+)"', r'^conn-frontend = \{[^}\n]*\bversion = "([^"\n]+)"'), **{name: (_JSON_VERSION,) for name in JSON_MANIFESTS}, - # One npm workspace lockfile at the root; the desktop UI is the only workspace that carries the release version. - "package-lock.json": (r'^ "frontends/tauri": \{\n(?: .*\n)*? "version": "([^"\n]+)"',), + # Shared UI and both frontend adapters are built and versioned together. + "package-lock.json": tuple(rf'^ "{re.escape(name)}": \{{\n(?: .*\n)*? "version": "([^"\n]+)"' for name in NPM_WORKSPACES), ".claude-plugin/marketplace.json": (r'^ "name": "conn",\n(?: .*\n)*? "version": "([^"\n]+)"',), **{name: tuple(rf'^name = "{package}"\nversion = "([^"\n]+)"' for package in sorted(packages)) for name, packages in LOCKED_PACKAGES.items()}, } @@ -127,7 +128,9 @@ def text(name: str) -> str: } for name in JSON_MANIFESTS: found[name] = json.loads(text(name))["version"] - found["package-lock.json: frontends/tauri"] = json.loads(text("package-lock.json"))["packages"]["frontends/tauri"]["version"] + npm_packages = json.loads(text("package-lock.json"))["packages"] + for name in NPM_WORKSPACES: + found[f"package-lock.json: {name}"] = npm_packages[name]["version"] plugins = [p for p in json.loads(text(".claude-plugin/marketplace.json"))["plugins"] if p["name"] == "conn"] if len(plugins) != 1: raise ReleaseError("Claude marketplace must contain exactly one Conn plugin") @@ -282,7 +285,49 @@ def signature_text(path: Path) -> str: def release_names(version: str) -> list[str]: return sorted([name for target in TARGETS for name in asset_names(version, target) + updater_names(version, target)] + - [signing_name(version, target) for target in TARGETS if target.endswith("apple-darwin")] + ["latest.json"]) + [signing_name(version, target) for target in TARGETS if target.endswith("apple-darwin")] + ["latest.json", web_asset(version)]) + + +def web_asset(version: str) -> str: + return f"conn-web-v{version}-x86_64-unknown-linux-gnu.tar.gz" + + +def validate_web_archive(path: Path, version: str, sha: str | None = None): + """Verify a self-contained, same-build bundle without extracting or running it.""" + prefix = f"conn-web-{version}-linux-x64/" + with tarfile.open(path, "r:gz") as archive: + files = {} + for member in archive.getmembers(): + if member.isdir() and member.name.rstrip("/") == prefix.rstrip("/"): + continue + if not member.name.startswith(prefix) or ".." in PurePosixPath(member.name).parts: + raise ReleaseError("Unsafe web archive path") + name = member.name[len(prefix):] + if member.isdir(): + continue + if not member.isfile() or name in files or member.size > 256 * 1024 * 1024: + raise ReleaseError("Invalid web archive member") + files[name] = member + required = {"conn", "conn-web", "manifest.json", "SHA256SUMS", "README.md", "LICENSE", "ui/index.html", "ui/conn-icon.svg"} + if not required.issubset(files) or any(name not in required and not name.startswith("ui/assets/") for name in files): + raise ReleaseError("Unexpected web archive contents") + manifest = json.load(archive.extractfile(files["manifest.json"])) + if manifest.get("version") != version or manifest.get("profile") != "release" or manifest.get("sourceDirty") is not False or manifest.get("platform") != "linux" or manifest.get("architecture") != "x64" or (sha and manifest.get("sourceCommit") != sha): + raise ReleaseError("Web archive build identity does not match the release") + if not all(files[name].mode & 0o111 for name in ("conn", "conn-web")): + raise ReleaseError("Web archive executables are not executable") + lines = archive.extractfile(files["SHA256SUMS"]).read().decode("utf-8").splitlines() + checks = {} + for line in lines: + match = re.fullmatch(r"([0-9a-f]{64}) (.+)", line) + if not match or match[2] in checks: + raise ReleaseError("Invalid web archive checksums") + checks[match[2]] = match[1] + if set(checks) != set(files) - {"SHA256SUMS"}: + raise ReleaseError("Incomplete web archive checksums") + for name, checksum in checks.items(): + if hashlib.file_digest(archive.extractfile(files[name]), "sha256").hexdigest() != checksum: + raise ReleaseError("Web archive checksum mismatch") def updater_manifest(artifacts: Path, version: str): @@ -496,6 +541,7 @@ def finalize(artifacts: Path, tag: str, sha: str | None = None, root: Path = ROO missing = set(expected) - {"latest.json"} - found if extras or missing: raise ReleaseError(f"Release asset mismatch; missing={sorted(missing)}, unexpected={sorted(extras)}") + validate_web_archive(regular_file(artifacts / web_asset(version), artifacts), version, sha) manifest = updater_manifest(artifacts, version) if (artifacts / "latest.json").is_symlink(): raise ReleaseError("Refusing a symlink updater manifest") @@ -535,6 +581,7 @@ def draft(artifacts: Path, tag: str, sha: str, root: Path = ROOT) -> str: if not artifacts.is_dir() or {p.name for p in artifacts.iterdir()} != set(expected) | {"SHA256SUMS", "release-notes.md"}: raise ReleaseError("Expected only the complete finalized asset set; run finalize first") assets = [regular_file(artifacts / name, artifacts) for name in expected] + validate_web_archive(artifacts / web_asset(version), version, sha) for target in TARGETS: if target.endswith("apple-darwin"): validate_signing_report(artifacts / signing_name(version, target), version, target, artifacts, sha) diff --git a/scripts/release_notes.md b/scripts/release_notes.md index 5202943..0755261 100644 --- a/scripts/release_notes.md +++ b/scripts/release_notes.md @@ -30,6 +30,12 @@ required to use these binaries. Windows preview installers are unsigned, so a SmartScreen or unknown-publisher prompt may appear. Native CLI startup is checked in CI; full interactive GUI installation/collaboration checks remain pending. +## Standalone local web host + +[Linux x64 web bundle]({repository}/releases/download/{tag}/conn-web-v{version}-x86_64-unknown-linux-gnu.tar.gz) includes the server, matching MCP CLI and common UI. Extract it and run `./conn-web serve`; follow its README or the [web guide]({repository}/blob/{tag}/docs/browser-testing.md). It binds to loopback and runs independently of desktop sessions. No remote hosting or multi-user access is enabled. + +한국어: Linux x64 웹 패키지는 서버·MCP CLI·공통 UI를 함께 제공합니다. 압축을 풀고 `./conn-web serve`로 실행하세요. 로컬 전용이며 데스크톱에서 이미 열린 셸과는 별도 인스턴스입니다. + ## New in this release {changes} diff --git a/tests/collaboration/package.json b/tests/collaboration/package.json new file mode 100644 index 0000000..7d98f07 --- /dev/null +++ b/tests/collaboration/package.json @@ -0,0 +1,18 @@ +{ + "name": "@conn/collaboration-tests", + "private": true, + "type": "module", + "scripts": { + "test": "node scripts/web-mcp.mjs", + "test:input": "node scripts/input-rendering.mjs" + }, + "dependencies": { + "@conn/ui": "*" + }, + "devDependencies": { + "playwright": "1.63.0", + "@sveltejs/vite-plugin-svelte": "^5.1.1", + "svelte": "^5.57.0", + "vite": "^6.0.0" + } +} diff --git a/tests/collaboration/scripts/input-rendering.mjs b/tests/collaboration/scripts/input-rendering.mjs new file mode 100644 index 0000000..5a69c19 --- /dev/null +++ b/tests/collaboration/scripts/input-rendering.mjs @@ -0,0 +1,345 @@ +// Production web bundle, real Rust PTYs and one persistent matching Conn MCP. +// Owner actions use the DOM. Transport fault injection only delays an existing +// resize frame unchanged; no replacement UI, owner commands or application state. +import {chromium} from 'playwright'; +import {spawn} from 'node:child_process'; +import {mkdtempSync, writeFileSync, readFileSync, existsSync, mkdirSync, openSync} from 'node:fs'; +import {tmpdir} from 'node:os'; +import {join, resolve} from 'node:path'; +import {fileURLToPath} from 'node:url'; +import {createInterface} from 'node:readline'; +import {strict as assert} from 'node:assert'; + +const root = fileURLToPath(new URL('../../../', import.meta.url)); +const state = mkdtempSync(join(tmpdir(), 'conn-input-rendering-')); +const evidence = process.env.CONN_INPUT_REVIEW_OUTPUT ?? join(state, 'evidence'); +const sshFixture = Boolean(process.env.CONN_AUTH_FIXTURE_RUNTIME || process.env.CONN_SSH_FIXTURE_CONFIG); +mkdirSync(evidence, {recursive: true}); +const binary = name => resolve(root, 'target/debug', name + (process.platform === 'win32' ? '.exe' : '')); +const delay = ms => new Promise(resolve => setTimeout(resolve, ms)); +async function until(run, message, milliseconds = 12_000) { + const started = Date.now(); + do { const result = await run(); if (result) return result; await delay(80); } while (Date.now() - started < milliseconds); + throw new Error(message); +} +assert.ok(existsSync(resolve(root, 'frontends/web/dist/index.html')), 'Build @conn/web before running the rendering test'); +writeFileSync(join(state, 'app.json'), JSON.stringify({mode: 'autopilot', gate: true, pacing: {enterGraceMs: 0, minWriteIntervalMs: 0, leaseTtlSecs: 120, approvalTtlSecs: 120}})); +writeFileSync(join(state, 'profiles.json'), JSON.stringify({version: 1, revision: 0, defaultProfile: 'fixture', profiles: [{ + id: 'fixture', name: 'Input rendering fixture', backend: 'local', shell: 'posix', + program: process.env.CONN_REPRO_SHELL ?? '/bin/bash', args: process.env.CONN_REPRO_SHELL ? ['-i'] : ['--noprofile', '--norc', '-i'], + env: {PS1: 'fixture$ ', TERM: 'xterm-256color', HISTFILE: '/dev/null', HISTCONTROL: ''}, cwd: state, +}]})); +const log = openSync(join(state, 'server.log'), 'w'); +const server = spawn(binary('conn-web'), ['serve', '--state-dir', state, '--port', '0', '--ui-dir', resolve(root, 'frontends/web/dist'), '--setup-home', join(state, 'setup-home')], {stdio: ['ignore', log, log]}); +let browser, context, page, agent; +const errors = [], cases = [], resizes = [], outputFrames = [], timers = new Set(); +let resizeDelay = null; + +class MCP { + constructor() { + this.pending = new Map(); this.id = 0; + this.child = spawn(binary('conn'), ['--socket', join(state, 'conn.sock'), 'mcp', '--agent-id', 'input-rendering', '--tools', 'static'], {stdio: ['pipe', 'pipe', log]}); + createInterface({input: this.child.stdout}).on('line', line => { + const message = JSON.parse(line), pending = this.pending.get(message.id); + if (!pending) return; + this.pending.delete(message.id); clearTimeout(pending.timer); + if (message.error) pending.reject(new Error(JSON.stringify(message.error))); else pending.resolve(message.result); + }); + this.child.on('exit', () => { + for (const pending of this.pending.values()) { clearTimeout(pending.timer); pending.reject(new Error('MCP exited')); } + this.pending.clear(); + }); + } + call(method, params = {}) { + const id = ++this.id; + return new Promise((resolve, reject) => { + const timer = setTimeout(() => { this.pending.delete(id); reject(new Error(`MCP timeout: ${method}`)); }, 18_000); + this.pending.set(id, {resolve, reject, timer}); + this.child.stdin.write(JSON.stringify({jsonrpc: '2.0', id, method, params}) + '\n'); + }); + } + async start() { + const initialized = await this.call('initialize', {protocolVersion: '2025-06-18', clientInfo: {name: 'Conn input rendering test', version: '1'}, capabilities: {}}); + const version = JSON.parse(readFileSync(resolve(root, 'packages/ui/package.json'), 'utf8')).version; + assert.equal(initialized.serverInfo.version, version, 'MCP binary and UI release versions match'); + await this.call('tools/list'); + } + async tool(name, args = {}) { + const result = await this.call('tools/call', {name: `terminal_${name}`, arguments: args}); + const text = result.content?.find(item => item.type === 'text')?.text; + if (result.isError) throw new Error(`${name}: ${text}`); + return JSON.parse(text); + } + close() { this.child.stdin.end(); this.child.kill(); } +} + +const host = () => page.locator('.host:not([hidden])'); +const input = () => host().locator('.xterm-helper-textarea'); +const ready = () => page.locator('.host:not([hidden])[data-terminal-ready="true"]').waitFor(); +async function human(text) { await ready(); await input().focus(); await page.keyboard.insertText(text); await page.keyboard.press('Enter'); await delay(250); } +async function share() { + const trigger = page.locator('.sharing-trigger'); + if (await trigger.isVisible()) await trigger.click(); + else { await page.locator('button.dot:not(.hidden)').click(); await page.locator('.sharing-row button').click(); } + await page.locator('.sharing input[type="checkbox"]').first().check(); + await page.locator('.sharing footer .btn:not(.ghost)').click(); + await until(async () => (await agent.tool('list_tabs')).tabs === 1, 'Shared shell not visible to MCP'); +} +async function control() { + const requested = agent.tool('request_control', {reason: 'Verify long input, resizing and approval motion in this fixture shell.'}); + await page.locator('[data-request-key*=":control:"] .primary').click(); + const result = await requested; + assert.equal(result.type, 'agent', 'Control request resolves to the live agent controller'); +} +async function execute(text, intent = 'Print synthetic fixture output.') { + await agent.tool('type', {text}); + const result = await agent.tool('send_key', {key: 'ENTER', intent}); + assert.equal(result.status, 'executed', JSON.stringify(result)); + return result; +} +async function capture(name, extra = {}) { + cases.push({name, ...extra}); + writeFileSync(join(evidence, 'cases.json'), JSON.stringify(cases, null, 2)); + await page.screenshot({path: join(evidence, `${name}.png`)}); + console.log(`PASS ${name}`); +} +async function grid(label) { + await delay(700); + const snapshot = await agent.tool('snapshot'); + const visible = (await host().locator('.xterm-rows > div').allTextContents()).map(row => row.replace(/\u00a0/g, ' ').trimEnd()); + const cursor = await host().evaluate((element, cols) => { + const cell = element.querySelector('.xterm-cursor'), screen = element.querySelector('.xterm-screen'); + const row = cell?.closest('.xterm-rows > div'); + if (!cell || !screen || !row) return null; + return {row: Array.from(row.parentElement.children).indexOf(row), col: Math.round((cell.getBoundingClientRect().left - screen.getBoundingClientRect().left) / (screen.clientWidth / cols))}; + }, snapshot.size.cols); + const result = {label, size: snapshot.size, core: snapshot.screen, visible, cursor: snapshot.cursor, visibleCursor: cursor}; + writeFileSync(join(evidence, `grid-${label}.json`), JSON.stringify(result, null, 2)); + assert.deepEqual(visible, snapshot.screen, `${label}: human and MCP grids agree`); + assert.deepEqual(cursor, snapshot.cursor, `${label}: human and MCP cursor positions agree`); + return result; +} +function delayNextResize(milliseconds) { resizeDelay = milliseconds; return resizes.length; } +function sizesSince(index) { return resizes.slice(index).map(({rows, cols}) => ({rows, cols})); } +async function startMotionSampling() { + await page.evaluate(() => { + window.__connRenderingSamples = []; + const sample = () => { + const host = document.querySelector('.host:not([hidden])'); + window.__connRenderingSamples.push({width: innerWidth, height: innerHeight, hostHeight: host.clientHeight, screenHeight: host.querySelector('.xterm-screen').clientHeight, transform: getComputedStyle(host).transform}); + window.__connRenderingFrame = requestAnimationFrame(sample); + }; + sample(); + }); +} +async function stopMotionSampling() { + return page.evaluate(() => { + cancelAnimationFrame(window.__connRenderingFrame); + const frames = window.__connRenderingSamples; + delete window.__connRenderingFrame; delete window.__connRenderingSamples; + return frames; + }); +} + +try { + await until(() => { if (server.exitCode !== null) throw new Error('Web host failed to start'); return existsSync(join(state, 'connection.json')); }, 'No web connection file'); + const metadata = JSON.parse(readFileSync(join(state, 'connection.json'), 'utf8')); + browser = await chromium.launch({headless: true}); + context = await browser.newContext({viewport: {width: 860, height: 640}, locale: 'en-US'}); + page = await context.newPage(); page.setDefaultTimeout(12_000); + page.on('pageerror', error => errors.push(error.message)); + await page.routeWebSocket('**/api/ws', socket => { + const upstream = socket.connectToServer(); + socket.onMessage(message => { + const request = JSON.parse(message.toString()); + if (request.name === 'resize') { + const record = {rows: request.args.rows, cols: request.args.cols, sequence: request.sequence, requestedAt: Date.now(), forwardedAt: null}; + resizes.push(record); + const forward = () => { record.forwardedAt = Date.now(); upstream.send(message); }; + if (resizeDelay !== null) { + const milliseconds = resizeDelay; resizeDelay = null; + const timer = setTimeout(() => { timers.delete(timer); forward(); }, milliseconds); timers.add(timer); return; + } + forward(); return; + } + // Never retain raw input, including the optional fixture password. + upstream.send(message); + }); + upstream.onMessage(message => { + const response = JSON.parse(message.toString()); + if (response.event === 'ss:output') { + const {size, outputSeq, generation, streamSeq, epoch, reset} = response.payload; + outputFrames.push({size, outputSeq, generation, streamSeq, epoch, reset}); + } + socket.send(message); + }); + }); + await page.goto(metadata.url + '/#token=' + encodeURIComponent(metadata.bootstrapToken)); + await ready(); await delay(600); + if (process.env.CONN_SSH_FIXTURE_CONFIG) { + // A disposable key-authenticated loopback fixture also works without + // installing a password-authenticated account on the macOS host. + const config = process.env.CONN_SSH_FIXTURE_CONFIG; + assert.ok(/^[A-Za-z0-9_./-]+$/.test(config), 'SSH fixture config path must contain no shell metacharacters'); + assert.ok(existsSync(config), 'SSH fixture config must exist'); + await human(`${process.env.CONN_SSH_COMPOUND_ENTRY === "1" ? "printf PRE_SSH; " : ""}ssh -F ${config} validation-host`); + await until(async () => (await host().locator('.xterm-rows').innerText()).includes('remote$'), 'SSH fixture prompt missing'); + await human('printf "REMOTE_READY_%s\\n" "$((6*7))"'); + await until(async () => (await host().locator('.xterm-rows').innerText()).includes('REMOTE_READY_42'), 'SSH fixture ready marker missing'); + } else if (process.env.CONN_AUTH_FIXTURE_RUNTIME) { + const runtime = process.env.CONN_AUTH_FIXTURE_RUNTIME; + const password = readFileSync(join(runtime, 'password'), 'utf8').trim(); + assert.ok(password.startsWith('SYNTHETIC_'), 'Only a disposable synthetic SSH fixture is supported'); + assert.ok(/^[A-Za-z0-9_./-]+$/.test(runtime), 'SSH fixture runtime path must contain no shell metacharacters'); + await human(`ssh -F /dev/null -tt -p 22222 -o StrictHostKeyChecking=yes -o UserKnownHostsFile=${runtime}/known_hosts -o PreferredAuthentications=password -o PubkeyAuthentication=no -o IdentityAgent=none fixture@127.0.0.1`); + await until(async () => (await host().locator('.xterm-rows').innerText()).includes('password:'), 'SSH fixture password prompt missing'); + await human(password); + await human("exec env LC_ALL=C.UTF-8 PS1='remote$ ' bash --noprofile --norc -i"); + await human('printf "REMOTE_READY_%s\\n" "$((6*7))"'); + await until(async () => (await host().locator('.xterm-rows').innerText()).includes('REMOTE_READY_42'), 'SSH fixture ready marker missing'); + } + agent = new MCP(); await agent.start(); + await page.locator('[data-request-key^="connection:"] .primary').click(); + if ((await agent.tool('list_tabs')).tabs === 0) await share(); + await control(); await delay(500); + + const resizeStart = delayNextResize(350); + await page.setViewportSize({width: 700, height: 640}); await delay(80); + await page.setViewportSize({width: 860, height: 640}); await delay(750); + const requested = sizesSince(resizeStart); + assert.ok(requested.length >= 2 && requested[0].cols < requested.at(-1).cols, 'Exercise narrow then wide resize'); + assert.ok(resizes[resizeStart].forwardedAt - resizes[resizeStart].requestedAt >= 300, 'The real resize frame was delayed'); + assert.deepEqual((await grid('delayed-resize')).size, requested.at(-1), 'Late resize cannot restore an obsolete PTY size'); + await capture('delayed-resize', {requested}); + + const metrics = await context.newCDPSession(page); + for (const deviceScaleFactor of [1.25, 1.5, 2, 1]) { + await metrics.send('Emulation.setDeviceMetricsOverride', {width: 860, height: 640, deviceScaleFactor, mobile: false}); + await delay(350); + const geometry = await host().evaluate(element => ({hostWidth: element.clientWidth, screenWidth: element.querySelector('.xterm-screen').clientWidth, dpr: devicePixelRatio})); + assert.equal(geometry.dpr, deviceScaleFactor, 'Browser applied the requested display density'); + assert.ok(geometry.hostWidth - geometry.screenWidth >= 0 && geometry.hostWidth - geometry.screenWidth <= 32, `Terminal fills pane after density change: ${JSON.stringify(geometry)}`); + await grid(`density-${deviceScaleFactor}`); + await capture(`density-${deviceScaleFactor}`, geometry); + } + await metrics.detach(); + + await execute("printf 'synthetic row\\n%.0s' {1..70}", 'Fill the fixture screen to exercise approval dock motion.'); + const beforeDock = await grid('before-dock-motion'); + for (const latency of [0, 500]) { + const start = delayNextResize(latency); + await startMotionSampling(); + await agent.tool('type', {text: `rm -- '${join(state, 'missing-dock-' + 'x'.repeat(120))}'`}); + const review = await agent.tool('send_key', {key: 'ENTER', intent: 'Exercise approval motion without executing the fixture command.'}); + assert.equal(review.status, 'pending'); + const deny = page.locator('[data-request-key*=":review:"] .btn.danger'); + await deny.waitFor(); await delay(latency ? 10 : 90); await deny.click({force: true}); + await until(async () => (await agent.tool('check_approval', {approvalId: review.approvalId})).state === 'denied', 'Dock review was not denied'); + const restored = await grid(`dock-motion-${latency}`); + const motion = {frames: await stopMotionSampling(), sizes: sizesSince(start)}; + writeFileSync(join(evidence, `dock-motion-${latency}.json`), JSON.stringify(motion, null, 2)); + assert.ok(motion.frames.every(frame => frame.width === 860 && frame.height === 640), 'Window stays fixed throughout dock motion'); + if (!latency) assert.ok(motion.frames.some(frame => frame.transform !== 'none' && frame.transform !== 'matrix(1, 0, 0, 1, 0, 0)'), 'Exercise actual terminal motion'); + assert.ok(motion.sizes.length >= 2 && motion.sizes[0].rows < motion.sizes.at(-1).rows, 'Exercise dock shrink then restore'); + assert.ok(motion.sizes.every(size => size.cols === beforeDock.size.cols), 'Dock motion leaves terminal width unchanged'); + assert.deepEqual(restored.size, motion.sizes.at(-1), 'Delayed dock shrink cannot replace restored terminal size'); + const final = motion.frames.at(-1); + assert.ok(final.hostHeight - final.screenHeight >= 0 && final.hostHeight - final.screenHeight < 32, 'Restored terminal fills available height'); + await capture(`fixed-window-dock-motion-${latency}`); + } + + for (const length of [240, 700, 1500, 3500, 7000]) { + const text = 'abcdefghijklmnopqrst'.repeat(Math.ceil(length / 20)).slice(0, length); + await execute(`printf '%s\\n' '${text}'`); + const printed = await grid(`printed-${length}`); + assert.ok(printed.core.slice(0, printed.cursor.row).join('').endsWith(text.slice(-Math.min(length, printed.size.cols * 2))), 'Long command printed its expected final bytes'); + await capture(`output-${length}`); + } + const prompt = sshFixture ? 'remote$' : 'fixture$'; + const cols = (await agent.tool('snapshot')).size.cols; + for (const padding of [0, cols * 2]) { + const body = JSON.stringify({padding: 'x'.repeat(padding), agentMode: {state: 'unavailable'}}); + for (const [ending, format] of [['none', '%s'], ['lf', '%s\\n'], ['crlf', '%s\\r\\n']]) { + await execute(`printf '${format}' '${body}'`, 'Compare synthetic JSON output with and without a trailing newline.'); + const label = `line-ending-${ending}-${padding ? 'wrapped' : 'short'}`; + const result = await grid(label), last = result.visible[result.cursor.row]; + if (ending === 'none') assert.ok(last.endsWith(`}}${prompt}`), 'No newline: prompt follows the final JSON bytes'); + else { assert.equal(last, prompt, 'Newline: prompt starts on a separate line'); assert.ok(result.visible[result.cursor.row - 1].endsWith('}}')); } + await capture(label); + } + } + + for (const text of ['long-input/'.repeat(100), '한글/경로/🙂/'.repeat(65)]) { + const kind = text.startsWith('한') ? 'unicode' : 'ascii'; + await agent.tool('type', {text: `printf '%s\\n' '${text}'`}); + const size = (await agent.tool('snapshot')).size; + const requestsBefore = resizes.length; + for (let i = 0; i < 3; i++) { + await page.keyboard.press('ControlOrMeta+Shift+,'); + await page.getByRole('dialog', {name: 'Settings', exact: true}).waitFor(); await delay(350); + assert.deepEqual((await agent.tool('snapshot')).size, size, 'Settings must not resize the PTY'); + await page.keyboard.press('Escape'); + await page.getByRole('dialog', {name: 'Settings', exact: true}).waitFor({state: 'hidden'}); await delay(350); + } + assert.equal(resizes.length, requestsBefore, 'Settings modal must not send a terminal resize'); + await grid(`settings-${kind}`); await capture(`settings-${kind}`); + assert.equal((await agent.tool('send_key', {key: 'ENTER', intent: 'Print the line after opening and closing Settings.'})).status, 'executed'); + await delay(500); + } + + const absent = join(state, 'missing-' + 'deep/'.repeat(1000) + 'file'); + await agent.tool('type', {text: `rm -- '${absent}'`}); + const approval = await agent.tool('send_key', {key: 'ENTER', intent: 'Remove an absent synthetic fixture path.'}); + assert.equal(approval.status, 'pending'); + await page.locator('.scope-choice summary').click(); + const allowSession = page.getByRole('button', {name: 'Allow this command category for this session', exact: true}); + await allowSession.waitFor(); await page.setViewportSize({width: 700, height: 540}); await delay(600); + const box = await allowSession.boundingBox(); + assert.ok(box && box.y >= 0 && box.y + box.height <= 540, 'Long review keeps approval actions visible'); + await capture('long-approval-narrow'); + await page.setViewportSize({width: 860, height: 640}); await delay(600); + assert.ok(await allowSession.isEnabled()); await allowSession.click(); + await until(async () => (await agent.tool('check_approval', {approvalId: approval.approvalId})).state === 'granted', 'Session allowance did not grant approval'); + await grid('allowed-session'); await capture('allow-session'); + await execute(`rm -- '${join(state, 'never-created')}'`, 'Verify the same session rule on another absent fixture path.'); + await delay(500); + await agent.tool('type', {text: 'sudo id'}); + const unrelated = await agent.tool('send_key', {key: 'ENTER', intent: 'Verify another risk still asks, without running it.'}); + assert.equal(unrelated.status, 'pending'); + await page.locator('[data-request-key*=":review:"] .btn.danger').click(); + await until(async () => (await agent.tool('check_approval', {approvalId: unrelated.approvalId})).state === 'denied', 'Unrelated risk denial missing'); + await delay(500); + + const long = 'cursor-edit/'.repeat(85); + await agent.tool('type', {text: `printf '<%s>\\n' '${long}END'`}); + const before = await grid('cursor-before-edit'); + await input().focus(); + for (let i = 0; i < 4; i++) await page.keyboard.press('ArrowLeft'); + const moved = await grid('cursor-moved'); + const start = Math.min(before.cursor.row, moved.size.rows - 1) * before.size.cols + before.cursor.col - 4; + assert.deepEqual(moved.cursor, {row: Math.floor(start / before.size.cols), col: start % before.size.cols}); + await page.keyboard.insertText('EDIT'); await page.keyboard.press('End'); await page.keyboard.press('Enter'); + await until(async () => (await agent.tool('snapshot')).screen.join('').includes('EDITEND>'), 'Human cursor edit output missing'); + assert.equal((await agent.tool('snapshot')).controller.type, 'human'); + await grid('human-edited'); await capture('human-edited'); + if (sshFixture) { + await human('exit'); + await until(async () => (await agent.tool('snapshot')).screen.some(row => row.trim() === 'fixture$'), 'Outer local shell prompt did not return'); + await human("printf 'LOCAL_BACK_%s\\n' 42"); + await until(async () => (await agent.tool('snapshot')).screen.some(row => row === 'LOCAL_BACK_42'), 'Outer shell marker missing'); + await capture('ssh-returned-to-local'); + } + assert.equal(await page.locator('[data-request-key^="connection:"]').count(), 0, 'Persistent MCP must not request repeat admission'); + assert.deepEqual(errors, [], 'Browser runtime errors'); + writeFileSync(join(evidence, 'transport.json'), JSON.stringify({resizes, outputFrames, pageErrors: errors, sshFixture}, null, 2)); + if (!sshFixture) console.log('SKIP optional SSH fixture: CONN_AUTH_FIXTURE_RUNTIME / CONN_SSH_FIXTURE_CONFIG is not set'); + console.log(`PASS ${cases.length} production input/rendering scenarios\nEvidence: ${evidence}`); +} catch (error) { + if (page) { await page.screenshot({path: join(evidence, 'failure.png')}).catch(() => {}); writeFileSync(join(evidence, 'failure-dom.txt'), await page.locator('body').innerText().catch(() => '')); } + writeFileSync(join(evidence, 'transport.json'), JSON.stringify({resizes, outputFrames, pageErrors: errors}, null, 2)); + console.error(`Evidence: ${evidence}`); throw error; +} finally { + for (const timer of timers) clearTimeout(timer); + agent?.close(); await browser?.close(); server.kill(); + if (server.exitCode === null) await Promise.race([new Promise(resolve => server.once('exit', resolve)), delay(5000).then(() => server.kill('SIGKILL'))]); +} diff --git a/tests/collaboration/scripts/web-mcp.mjs b/tests/collaboration/scripts/web-mcp.mjs new file mode 100644 index 0000000..219d048 --- /dev/null +++ b/tests/collaboration/scripts/web-mcp.mjs @@ -0,0 +1,286 @@ +// Production web bundle + real Rust host + one persistent, matching MCP process. +// All owner actions use the rendered UI. No replacement app, runtime or store hook. +import { chromium } from 'playwright'; +import { spawn } from 'node:child_process'; +import { mkdtempSync, writeFileSync, readFileSync, existsSync, mkdirSync, openSync } from 'node:fs'; +import { tmpdir } from 'node:os'; +import { resolve, join } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { createInterface } from 'node:readline'; +import { strict as assert } from 'node:assert'; + +const root = fileURLToPath(new URL('../../../', import.meta.url)); +const state = mkdtempSync(join(tmpdir(), 'conn-web-mcp-')); +const evidence = join(state, 'evidence'); mkdirSync(evidence); +// Point the unchanged production flow at an extracted release to verify the +// shipped UI/server/MCP together, without rebuilding any of those components. +const bundle = process.env.CONN_TEST_WEB_BUNDLE; +const binary = name => resolve(bundle ?? join(root, 'target/debug'), name + (process.platform === 'win32' ? '.exe' : '')); +const sleep = ms => new Promise(resolve => setTimeout(resolve, ms)); +async function until(run, message, ms = 12_000) { + const start = Date.now(); let value; + do { value = await run(); if (value) return value; await sleep(80); } while (Date.now() - start < ms); + throw new Error(message); +} +writeFileSync(join(state, 'profiles.json'), JSON.stringify({ version: 1, revision: 0, defaultProfile: 'test', profiles: [{ id: 'test', name: 'Local collaboration test', backend: 'local', shell: 'posix', program: '/bin/bash', args: ['--noprofile', '--norc', '-i'], cwd: state, env: { PS1: 'conn-test$ ', HISTFILE: '/dev/null', HISTCONTROL: '' } }] })); +writeFileSync(join(state, 'app.json'), JSON.stringify({ mode: 'autopilot', gate: true, pacing: { enterGraceMs: 0, minWriteIntervalMs: 0, leaseTtlSecs: 120, approvalTtlSecs: 120 } })); +const log = openSync(join(state, 'server.log'), 'w'); +const server = spawn(binary('conn-web'), ['serve', '--state-dir', state, '--port', '0', '--ui-dir', bundle ? resolve(bundle, 'ui') : resolve(root, 'frontends/web/dist'), '--setup-home', join(state, 'setup-home')], { stdio: ['ignore', log, log] }); +let browser, context, page; +const agents = [], failures = [], cases = [], frames = []; +let rejectNextInput = false, rejectedInput = false; +class MCP { + constructor(name) { + this.pending = new Map(); this.id = 0; + this.child = spawn(binary('conn'), ['--socket', join(state, 'conn.sock'), 'mcp', '--agent-id', name, '--tools', 'static'], { stdio: ['pipe', 'pipe', log] }); + createInterface({ input: this.child.stdout }).on('line', line => { + const message = JSON.parse(line), pending = this.pending.get(message.id); + if (!pending) return; this.pending.delete(message.id); clearTimeout(pending.timer); + if (message.error) pending.reject(new Error(JSON.stringify(message.error))); else pending.resolve(message.result); + }); + agents.push(this); + } + call(method, params = {}) { + const id = ++this.id; + return new Promise((resolve, reject) => { + const timer = setTimeout(() => { this.pending.delete(id); reject(new Error(`MCP timeout: ${method} ${params.name ?? ''}`)); }, 18_000); + this.pending.set(id, { resolve, reject, timer }); + this.child.stdin.write(JSON.stringify({ jsonrpc: '2.0', id, method, params }) + '\n'); + }); + } + async start() { + await this.call('initialize', { protocolVersion: '2025-06-18', clientInfo: { name: 'Conn integration test', version: '1' }, capabilities: {} }); + await this.call('tools/list'); + } + async tool(name, args = {}) { + const result = await this.call('tools/call', { name, arguments: args }); + const text = result.content?.find(c => c.type === 'text')?.text; + if (result.isError) throw new Error(`${name}: ${text}`); + return JSON.parse(text); + } + close() { this.child.stdin.end(); for (const p of this.pending.values()) clearTimeout(p.timer); this.pending.clear(); } +} +const ready = () => page.locator('.host:not([hidden])[data-terminal-ready="true"]').waitFor(); +async function decided(agent, approvalId, expected) { + const result = await until(async () => { + const current = await agent.tool('terminal_check_approval', {approvalId}); + return current.state === 'pending' ? false : current; + }, `Approval ${approvalId} did not settle after the owner action`); + assert.ok(expected.includes(result.state), JSON.stringify(result)); + return result; +} +const input = () => page.locator('.host:not([hidden]) .xterm-helper-textarea'); +async function human(text, enter = true) { await ready(); await input().focus(); await page.keyboard.insertText(text); if (enter) await page.keyboard.press('Enter'); } +async function sharing(stop = false) { + const preparation = page.locator('[data-request-key^="preparation:"] .primary'); + if (!stop && await preparation.isVisible()) await preparation.click(); + else { + const trigger = page.locator('.sharing-trigger'); + if (await trigger.isVisible()) await trigger.click(); + else await page.locator('button.dot:not(.hidden)').click(); + await page.locator('.sharing-row button').click(); + } + await page.locator('.sharing').waitFor(); + if (stop) await page.locator('.sharing footer .ghost').click(); + else { await page.locator('.sharing input[type="checkbox"]').first().check(); await page.locator('.sharing footer .btn:not(.ghost)').click(); } + await page.locator('.sharing').waitFor({ state: 'hidden' }); +} +let verifiedControlUx = false; +async function approveControl(agent) { + await input().focus(); + const beforeGrid = await page.locator('.host:not([hidden])').boundingBox(); + const control = agent.tool('terminal_request_control', { reason: 'Verify the shared shell through the production web owner.' }); + control.catch(() => {}); + // Control may return a pollable pending result before the UI acts. + await page.locator('[data-request-key*="\u003acontrol:"] .primary').waitFor(); + if (!verifiedControlUx) { + const panel = page.locator('.control-morph'); + assert.equal(await page.locator('.interaction-dock [data-request-key*="\u003acontrol:"]').count(), 0); + assert.equal(await input().evaluate(el => el === document.activeElement), true, 'new request must not steal typing focus'); + const afterGrid = await page.locator('.host:not([hidden])').boundingBox(); + assert.deepEqual([afterGrid.width,afterGrid.height], [beforeGrid.width,beforeGrid.height], 'badge morph never changes the PTY layout'); + await page.screenshot({path:join(evidence,'control-open.png')}); + await panel.getByRole('button',{name:'Later',exact:true}).click(); + await panel.waitFor({state:'hidden'}); + assert.equal(await page.locator('button.dot.pending').count(), 1, 'collapsed request remains pending'); + await page.screenshot({path:join(evidence,'control-collapsed.png')}); + await page.locator('button.dot.pending').click(); + await panel.waitFor(); + await page.keyboard.press('Escape'); + await panel.waitFor({state:'hidden'}); + await page.emulateMedia({reducedMotion:'reduce'}); + await page.setViewportSize({width:640,height:420}); + await page.locator('button.dot.pending').click(); + await panel.waitFor(); + const box = await panel.boundingBox(); + assert.ok(box.x >= 0 && box.x+box.width <= 640 && box.y+box.height <= 420, 'compact request remains inside the viewport'); + const primaryBox = await panel.locator('.primary').boundingBox(); + assert.ok(primaryBox && primaryBox.y + primaryBox.height < 420, 'compact request keeps the decision buttons on screen'); + await sleep(400); + await page.screenshot({path:join(evidence,'control-compact-reduced.png')}); + await page.setViewportSize({width:1280,height:800}); + await page.emulateMedia({reducedMotion:'no-preference'}); + await sleep(600); + verifiedControlUx = true; + cases.push('badge control morph, no focus or PTY resize, collapse/reopen/Escape, compact and reduced motion'); + } + await page.locator('[data-request-key*="\u003acontrol:"] .primary').click(); + const result = await control; + if (result.status === 'pending') { + await decided(agent, result.approvalId, ['granted', 'executed']); + } +} +async function marker(agent, text, allowInitialReview = false) { + await agent.tool('terminal_type', { text: `printf '%s\\n' '${text}'` }); + const result = await agent.tool('terminal_send_key', { key: 'ENTER', intent: 'Print a synthetic verification marker.' }); + if (allowInitialReview && result.status === 'pending') { + await page.locator('[data-request-key*="\u003areview:"] .btn.ok').click(); + await decided(agent, result.approvalId, ['granted']); + } else assert.equal(result.status, 'executed', JSON.stringify(result)); + return until(async () => { const snap = await agent.tool('terminal_snapshot'); return snap.screen?.some(row => row.trim() === text) ? snap : false; }, `Missing marker ${text}`); +} +try { + await until(() => { if (server.exitCode !== null) throw new Error('Web host failed to start'); return existsSync(join(state, 'connection.json')); }, 'No connection file'); + const metadata = JSON.parse(readFileSync(join(state, 'connection.json'), 'utf8')); + browser = await chromium.launch({ headless: true, args: ['--no-sandbox'] }); + context = await browser.newContext({ viewport: { width: 1280, height: 800 }, locale: 'en-US' }); + page = await context.newPage(); + page.on('pageerror', error => failures.push(error.message)); + await page.routeWebSocket('**/api/ws', socket => { + const upstream = socket.connectToServer(); + socket.onMessage(message => { + const request = JSON.parse(message.toString()); + if (rejectNextInput && request.name === 'input') { + rejectNextInput = false; rejectedInput = true; + // A server capacity failure before sequence consumption. Forward every + // other real frame unchanged; do not simulate any app or PTY state. + socket.send(JSON.stringify({ id: request.id, error: 'owner_busy', code: 'owner_busy' })); + } else upstream.send(message); + }); + upstream.onMessage(message => { frames.push(JSON.parse(message.toString())); socket.send(message); }); + }); + await page.goto(metadata.url + '/#token=' + encodeURIComponent(metadata.bootstrapToken)); + await ready(); assert.equal(new URL(page.url()).hash, ''); + await until(async () => (await page.locator('.host:not([hidden]) .xterm-rows').innerText()).includes('conn-test$'), 'Initial shell prompt'); + const sid = await page.locator('.host:not([hidden])').getAttribute('data-session'); + await human('export CONN_RETAINED=retained_42'); + await sleep(200); + await sharing(true); + cases.push('owner input and private-shell transition'); + + const agent = new MCP('web-collaboration'); await agent.start(); + await page.locator('[data-request-key^="connection:"]').waitFor(); + await until(async () => { + const card = await page.locator('.connection-dock').boundingBox(); + const terminal = await page.locator('.host:not([hidden])').boundingBox(); + return card && terminal && terminal.y >= card.y + card.height; + }, 'Connection admission must reserve space instead of hiding the prompt'); + await page.screenshot({path:join(evidence,'connection-admission.png')}); + await page.locator('[data-request-key^="connection:"] .primary').click(); + const hidden = await agent.tool('terminal_list_tabs'); assert.equal(hidden.tabs, 0, JSON.stringify(hidden)); + await agent.tool('terminal_request_attention', { reason: 'Choose a shell for the collaboration test.' }); + await page.locator('[data-request-key^="preparation:"]').waitFor(); + await sharing(); + await until(async () => (await agent.tool('terminal_list_tabs')).tabs === 1, 'Shared shell not visible'); + await page.locator('[data-request-key^="preparation:"]').waitFor({state:'hidden'}); + await approveControl(agent); + writeFileSync(join(evidence, 'first-snapshot.json'), JSON.stringify(await agent.tool('terminal_snapshot'), null, 2)); + // Sharing invalidates knowledge of the private shell's command context. Review + // the first command explicitly; its real completion establishes the next prompt. + await marker(agent, 'FIRST_MCP_OK', true); + await marker(agent, 'SECOND_MCP_OK'); + assert.equal(await page.locator('[data-request-key^="connection:"]').count(), 0, 'one persistent MCP connection must not re-request admission'); + cases.push('sessionless attention, admission, selected sharing, lease and repeated safe commands'); + + // A real risk review; deny it so no destructive fixture action is executed. + await agent.tool('terminal_type', { text: 'rm -rf ./synthetic-only' }); + const risk = await agent.tool('terminal_send_key', { key: 'ENTER', intent: 'Exercise a risky-command denial in the isolated test directory.' }); + assert.equal(risk.status, 'pending'); + const reviewCard = page.locator('[data-request-key*="\u003areview:"]'); + await reviewCard.getByRole('button',{name:'Run once',exact:true}).waitFor(); + assert.equal(await reviewCard.getByRole('button',{name:'Run once',exact:true}).count(), 1); + assert.equal(await reviewCard.locator('.scope-choice').getAttribute('open'), null, 'broad grant stays behind an explicit scope choice'); + await sleep(600); + assert.deepEqual(await page.locator('.app').evaluate(el=>[el.scrollLeft,el.scrollTop]),[0,0],'focus after a compact-window transition must not pan the application frame'); + await page.screenshot({path:join(evidence,'command-review.png')}); + const deny = page.locator('[data-request-key*="\u003areview:"] button').filter({ hasText: /deny|reject/i }).first(); + await deny.click(); + await decided(agent, risk.approvalId, ['denied']); + await agent.tool('terminal_interrupt'); await sleep(180); + await marker(agent, 'AFTER_IDLE_INTERRUPT_OK'); + cases.push('risky command review and denial; idle Ctrl-C returns to a usable shell prompt'); + await agent.tool('terminal_type', {text:'rm ./synthetic-only'}); + const typingRisk = await agent.tool('terminal_send_key', {key:'ENTER',intent:'Verify human typing preempts pending execution.'}); + assert.equal(typingRisk.status,'pending'); + await human('a',false); + await until(async () => (await agent.tool('terminal_check_approval',{approvalId:typingRisk.approvalId})).state === 'denied', 'typing did not deny the pending command'); + await page.keyboard.press('Control+c'); await sleep(180); + await approveControl(agent); + await marker(agent,'AFTER_HUMAN_LETTER_OK'); + cases.push('typing a in the shell takes over instead of approving an execution'); + + + const long = 'long-' + 'abcdef'.repeat(500); + await agent.tool('terminal_type', { text: `printf '%s\\n' '${long}'` }); + assert.equal((await agent.tool('terminal_send_key', { key: 'ENTER', intent: 'Print synthetic long text for renderer verification.' })).status, 'executed'); + await sleep(250); + await marker(agent, 'AFTER_LONG_INPUT_OK'); + await page.screenshot({ path: join(evidence, 'long-command.png') }); + await agent.tool('terminal_release_control'); + await page.reload(); await ready(); + assert.equal(await page.locator('.host:not([hidden])').getAttribute('data-session'), sid); + await approveControl(agent); + await agent.tool('terminal_type', { text: 'printf "%s\\n" "$CONN_RETAINED"' }); + assert.equal((await agent.tool('terminal_send_key', { key: 'ENTER', intent: 'Read the shell variable set before the browser reload.' })).status, 'executed'); + await until(async () => (await agent.tool('terminal_snapshot')).screen.some(row => row.trim() === 'retained_42'), 'Reload replaced or lost the original shell'); + cases.push('long wrapping input and renderer reload preserve session and process state'); + + const second = await context.newPage(); + await second.goto(metadata.url); await second.getByRole('button', { name: 'Continue here' }).waitFor(); + await second.getByRole('button', { name: 'Continue here' }).click(); + await second.locator('.host:not([hidden])[data-terminal-ready="true"]').waitFor(); + await page.getByRole('button', { name: 'Continue here' }).waitFor(); + assert.equal(await second.locator('.host:not([hidden])').getAttribute('data-session'), sid); + await page.getByRole('button', { name: 'Continue here' }).click(); await ready(); await second.close(); + cases.push('duplicate owner refuses silent attachment; explicit takeover preserves the shell and fences the old renderer'); + + // New agent-created tabs cannot silently move the human's selected view. + const opened = await agent.tool('terminal_open_tab', { reason: 'Verify background tab visibility.' }); + await until(async () => (await page.getByRole('tab').count()) === 2, 'Agent tab not rendered'); + assert.equal(await page.locator('.host:not([hidden])').getAttribute('data-session'), sid); + const tabs = await agent.tool('terminal_list_tabs'); + writeFileSync(join(evidence, 'tab-result.json'), JSON.stringify({ opened, tabs }, null, 2)); + await page.screenshot({ path: join(evidence, 'background-agent-tab.png') }); + cases.push('agent tab appears in the common tab strip without moving the human view'); + + rejectNextInput = true; + await human('SHOULD_NEVER_REPLAY', false); + await page.getByRole('button', { name: 'Reconnect', exact: true }).waitFor(); + assert.ok(rejectedInput); + await page.getByRole('button', { name: 'Reconnect', exact: true }).click(); + await ready(); + assert.equal(await page.locator('.host:not([hidden])').getAttribute('data-session'), sid); + await agent.tool('terminal_switch_tab', { tab: sid }); + assert.ok(!(await agent.tool('terminal_snapshot')).screen.join('\n').includes('SHOULD_NEVER_REPLAY')); + await human("printf '%s\\n' RECOVERED_INPUT_OK"); + await until(async () => (await agent.tool('terminal_snapshot')).screen.some(row => row.trim() === 'RECOVERED_INPUT_OK'), 'New owner epoch did not restore ordered input'); + cases.push('unconsumed input failure requires explicit reattachment, never replays old input and restores the sequence'); + + agent.close(); + const replacement = new MCP('web-collaboration'); await replacement.start(); + await page.locator('[data-request-key^="connection:"]').waitFor(); + await page.locator('[data-request-key^="connection:"] .ghost').click(); + cases.push('same-name new MCP process requests fresh admission'); + assert.ok(frames.some(f => f.event === 'ss:output' && f.payload.reset && f.payload.epoch > 0 && f.payload.streamSeq > 0)); + assert.deepEqual(failures, [], 'browser runtime errors'); + writeFileSync(join(evidence, 'results.json'), JSON.stringify({ cases, pageErrors: failures, outputFrames: frames.filter(f => f.event === 'ss:output').length }, null, 2)); + console.log(`PASS ${cases.length} production web/MCP scenarios\nEvidence: ${evidence}`); +} catch (error) { + writeFileSync(join(evidence, 'frames.json'), JSON.stringify(frames, null, 2)); + if (page) { await page.screenshot({ path: join(evidence, 'failure.png') }).catch(() => {}); writeFileSync(join(evidence, 'failure-dom.txt'), await page.locator('body').innerText().catch(() => '')); } + console.error(`Evidence: ${evidence}`); throw error; +} finally { + for (const agent of agents) { agent.close(); agent.child.kill(); } + await browser?.close(); server.kill(); + if (server.exitCode === null) await Promise.race([new Promise(resolve => server.once('exit', resolve)), sleep(5000).then(() => server.kill('SIGKILL'))]); +} diff --git a/tests/release/test_ci_scope.py b/tests/release/test_ci_scope.py index a70d6c0..ba056d4 100644 --- a/tests/release/test_ci_scope.py +++ b/tests/release/test_ci_scope.py @@ -30,14 +30,19 @@ def test_markdown_compiled_into_binaries_is_not_documentation(self): self.assertEqual(ci_scope.scope("pull_request", ["plugin/skills/conn/SKILL.md"])["rust"], ALL) def test_frontend_only_changes_build_one_desktop_and_skip_rust(self): - self.assertEqual(ci_scope.scope("pull_request", ["frontends/tauri/src/App.svelte", "docs/faq.md"]), {"rust": [], "desktop": [LINUX]}) + for path in ("packages/ui/src/App.svelte", "frontends/tauri/src/nativePorts.ts", + "frontends/web/src/webPorts.ts", "tests/collaboration/owner.test.mjs"): + with self.subTest(path=path): + self.assertEqual(ci_scope.scope("pull_request", [path, "docs/faq.md"]), {"rust": [], "desktop": [LINUX]}) def test_the_npm_workspace_root_is_frontend_but_shared_packages_are_not_assumed_light(self): self.assertEqual(ci_scope.scope("pull_request", ["package-lock.json", "package.json", ".npmrc"]), {"rust": [], "desktop": [LINUX]}) self.assertEqual(ci_scope.classify("packages/themes/builtin-themes.json"), "native") def test_rust_pull_requests_test_everywhere_but_build_one_desktop(self): - self.assertEqual(ci_scope.scope("pull_request", ["crates/core/src/ipc.rs"]), {"rust": ALL, "desktop": [LINUX]}) + for path in ("crates/core/src/ipc.rs", "crates/web/src/main.rs", "crates/frontend/src/owner.rs"): + with self.subTest(path=path): + self.assertEqual(ci_scope.scope("pull_request", [path]), {"rust": ALL, "desktop": [LINUX]}) def test_platform_specific_paths_get_every_desktop_before_merging(self): for path in ("frontends/tauri/src-tauri/src/lib.rs", ".github/workflows/ci.yml", "crates/frontend/src/automation.rs", "scripts/check_macos_scripting.py"): diff --git a/tests/release/test_release.py b/tests/release/test_release.py index 91afea8..1bf91d6 100644 --- a/tests/release/test_release.py +++ b/tests/release/test_release.py @@ -1,5 +1,7 @@ """Release contract tests; no network or platform toolchain required.""" import importlib.util +import io +import hashlib import base64 import json import os @@ -20,6 +22,7 @@ VERSION_FILES = [ "Cargo.toml", "Cargo.lock", "package-lock.json", "frontends/tauri/package.json", + "frontends/web/package.json", "packages/ui/package.json", "frontends/tauri/src-tauri/tauri.conf.json", "plugin/.claude-plugin/plugin.json", "plugin/.codex-plugin/plugin.json", ".claude-plugin/marketplace.json", @@ -118,8 +121,45 @@ def complete_assets(self): report["updater"] = {"archive": name, "sha256": release.sha256(self.out / name), "containedAppVerified": True} path.write_text(json.dumps(report)) (self.out / (name + ".sig")).write_text(signature) + self.web_archive() release.finalize(self.out, self.tag, self.sha, self.root) + def web_archive(self, dirty=False, bad_hash=False): + data = {"conn": b"cli", "conn-web": b"server", "README.md": b"readme", "LICENSE": b"MIT", "ui/index.html": b"", "ui/conn-icon.svg": b"", "ui/assets/app.js": b"code"} + data["manifest.json"] = json.dumps({"version":self.version, "profile":"release", "sourceDirty":dirty, "platform":"linux", "architecture":"x64", "sourceCommit":self.sha}).encode() + data["SHA256SUMS"] = "".join(f"{hashlib.sha256(value).hexdigest()} {name}\n" for name,value in data.items()).encode() + if bad_hash: data["conn-web"] = b"changed server" + with tarfile.open(self.out / release.web_asset(self.version), "w:gz") as archive: + for name, value in data.items(): + info=tarfile.TarInfo(f"conn-web-{self.version}-linux-x64/{name}") + info.size=len(value);info.mode=0o755 if name in ("conn","conn-web") else 0o644 + archive.addfile(info,io.BytesIO(value)) + + def test_web_archive_requires_clean_matching_sources_and_complete_checksums(self): + self.complete_assets() + self.web_archive(dirty=True) + with self.assertRaisesRegex(release.ReleaseError, "build identity"): + release.finalize(self.out, self.tag, self.sha, self.root) + self.web_archive(bad_hash=True) + with self.assertRaisesRegex(release.ReleaseError, "checksum mismatch"): + release.finalize(self.out, self.tag, self.sha, self.root) + self.web_archive() + with self.assertRaisesRegex(release.ReleaseError, "build identity"): + release.validate_web_archive(self.out / release.web_asset(self.version), self.version, "b"*40) + + def test_web_archive_rejects_escape_paths_and_links(self): + self.out.mkdir(parents=True, exist_ok=True) + for name, kind in [("../outside", tarfile.REGTYPE), ("ui/assets/link", tarfile.SYMTYPE)]: + with self.subTest(name=name): + path = self.out / release.web_asset(self.version) + with tarfile.open(path, "w:gz") as archive: + member = tarfile.TarInfo(f"conn-web-{self.version}-linux-x64/{name}") + member.type = kind + member.linkname = "/outside" if kind == tarfile.SYMTYPE else "" + archive.addfile(member) + with self.assertRaises(release.ReleaseError): + release.validate_web_archive(path, self.version, self.sha) + def test_updater_manifest_is_complete_and_tied_to_public_assets(self): self.complete_assets() manifest = release.read_json(self.out / "latest.json") @@ -170,6 +210,18 @@ def test_rejects_drift_in_each_published_manifest(self): release.check(self.root, self.tag) path.write_text(original, encoding="utf-8") + def test_shared_ui_and_each_adapter_lock_version_are_checked_independently(self): + path = self.root / "package-lock.json" + original = path.read_text(encoding="utf-8") + for name in ("frontends/tauri", "frontends/web", "packages/ui"): + with self.subTest(name=name): + lock = json.loads(original) + lock["packages"][name]["version"] = "99.0.0" + path.write_text(json.dumps(lock), encoding="utf-8") + with self.assertRaisesRegex(release.ReleaseError, f"package-lock.json: {name}"): + release.check(self.root, self.tag) + path.write_text(original, encoding="utf-8") + def tree(self): return {path.relative_to(self.root).as_posix(): path.read_bytes() for path in self.root.rglob("*") if path.is_file()} @@ -332,7 +384,7 @@ def test_refuses_symlink_input(self): def test_finalize_requires_exact_matrix_and_checksums_every_asset(self): self.complete_assets() manifest = (self.out / "SHA256SUMS").read_text() - self.assertEqual(len(manifest.splitlines()), 13) + self.assertEqual(len(manifest.splitlines()), 14) for line in manifest.splitlines(): digest, filename = line.split(" ") self.assertEqual(digest, release.sha256(self.out / filename)) @@ -435,7 +487,7 @@ def test_draft_creates_only_unpublished_prerelease_with_allowlisted_uploads(self expected = {str((self.out / name).resolve()) for name in release.release_names(self.version)} expected.add(str((self.out / "SHA256SUMS").resolve())) self.assertEqual(set(upload[upload.index("--clobber") + 1:]), expected) - self.assertEqual(len(expected), 14) + self.assertEqual(len(expected), 15) @unittest.skipUnless(os.name == "posix", "POSIX directory symlinks unavailable") def test_draft_uploads_resolved_paths_through_a_tempdir_symlink(self): diff --git a/vendor/vt100/src/attrs.rs b/vendor/vt100/src/attrs.rs index ae30151..c39b25e 100644 --- a/vendor/vt100/src/attrs.rs +++ b/vendor/vt100/src/attrs.rs @@ -32,6 +32,12 @@ pub struct Attrs { } impl Attrs { + pub fn dim(&self) -> bool { self.mode & 0x20 != 0 } + pub fn set_dim(&mut self, value: bool) { if value { self.mode |= 0x20; } else { self.mode &= !0x20; } } + pub fn blink(&self) -> bool { self.mode & 0x40 != 0 } + pub fn set_blink(&mut self, value: bool) { if value { self.mode |= 0x40; } else { self.mode &= !0x40; } } + pub fn strike(&self) -> bool { self.mode & 0x80 != 0 } + pub fn set_strike(&mut self, value: bool) { if value { self.mode |= 0x80; } else { self.mode &= !0x80; } } pub fn concealed(&self) -> bool { self.mode & 0x10 != 0 } pub fn set_concealed(&mut self, value: bool) { if value { self.mode |= 0x10; } else { self.mode &= !0x10; } } pub fn bold(&self) -> bool { @@ -126,6 +132,13 @@ impl Attrs { }; attrs.write_buf(contents); + // 22 resets both bold and dim; reapply bold when only dim is removed. + if self.dim() != other.dim() { + contents.extend_from_slice(if self.dim() { b"\x1b[2m" } else { b"\x1b[22m" }); + if !self.dim() && self.bold() { contents.extend_from_slice(b"\x1b[1m"); } + } else if self.dim() && self.bold() != other.bold() { contents.extend_from_slice(b"\x1b[2m"); } + if self.blink() != other.blink() { contents.extend_from_slice(if self.blink() { b"\x1b[5m" } else { b"\x1b[25m" }); } + if self.strike() != other.strike() { contents.extend_from_slice(if self.strike() { b"\x1b[9m" } else { b"\x1b[29m" }); } if self.concealed() != other.concealed() { contents.extend_from_slice(if self.concealed() { b"\x1b[8m" } else { b"\x1b[28m" }); } } } diff --git a/vendor/vt100/src/grid.rs b/vendor/vt100/src/grid.rs index 1ace593..ad6c416 100644 --- a/vendor/vt100/src/grid.rs +++ b/vendor/vt100/src/grid.rs @@ -226,7 +226,7 @@ impl Grid { pub fn restore_cursor(&mut self) { self.pos = self.saved_pos; - self.origin_mode = self.saved_origin_mode; + // xterm keeps DEC origin mode global; restoring a cursor does not change it. } pub fn visible_rows(&self) -> impl Iterator { @@ -354,6 +354,64 @@ impl Grid { prev_attrs } + /// Serialize the already bounded normal-buffer model, including reflow + /// history. These are cells from terminal output, never captured input. + pub fn write_contents_with_history(&self, out: &mut Vec) { + if self.scrollback.is_empty() { self.write_contents_formatted(out); return; } + crate::term::ClearAttrs::default().write_buf(out); + crate::term::ClearScreen::default().write_buf(out); + let mut attrs = crate::attrs::Attrs::default(); + let mut pos = Pos::default(); + let mut wrapping = false; + for (index, row) in self.scrollback.iter().chain(self.rows.iter()).enumerate() { + let y = index.min(usize::from(self.size.rows - 1)) as u16; + if index > 0 && !wrapping { out.extend_from_slice(b"\r\n"); pos = Pos { row: y, col: 0 }; } + if wrapping && index >= usize::from(self.size.rows) { pos.row = y.saturating_sub(1); } + let logical_y = if wrapping && self.size.rows == 1 { 1 } else { y }; + let result = row.write_contents_formatted(out, 0, self.size.cols, logical_y, wrapping, Some(pos), Some(attrs)); + pos = result.0; attrs = result.1; wrapping = row.wrapped(); + } + } + + pub fn write_preceding_char(&self, out: &mut Vec, insert: bool) { + use std::io::Write as _; + if self.pos.col == 0 { return; } + let mut col = self.pos.col.min(self.size.cols).saturating_sub(1); + if self.drawing_cell(Pos { row: self.pos.row, col }).is_some_and(|c| c.is_wide_continuation()) { col = col.saturating_sub(1); } + if let Some(cell) = self.drawing_cell(Pos { row: self.pos.row, col }) { + let row = if self.origin_mode { self.pos.row.saturating_sub(self.scroll_top) } else { self.pos.row }; + let _ = write!(out, "\x1b[{};{}H", row + 1, col + 1); + if insert { let _ = write!(out, "\x1b[{}P", if cell.is_wide() { 2 } else { 1 }); } + out.extend_from_slice(cell.contents().as_bytes()); + } + } + + /// Restore the two cursor slots, margins and origin after painting a grid. + pub fn write_checkpoint_state(&self, contents: &mut Vec, saved_attrs: crate::attrs::Attrs) { + use std::io::Write as _; + let _ = write!(contents, "\x1b[{};{}r", self.scroll_top + 1, self.scroll_bottom + 1); + for (pos, origin, save) in [(self.saved_pos, self.saved_origin_mode, true), (self.pos, self.origin_mode, false)] { + contents.extend_from_slice(if origin { b"\x1b[?6h" } else { b"\x1b[?6l" }); + let col = pos.col.min(self.size.cols - 1); + let row = if origin { pos.row.saturating_sub(self.scroll_top) } else { pos.row }; + let _ = write!(contents, "\x1b[{};{}H", row + 1, col + 1); + if pos.col >= self.size.cols { + let mut col = col; + if self.drawing_cell(Pos { row: pos.row, col }).is_some_and(|c| c.is_wide_continuation()) { col = col.saturating_sub(1); } + if let Some(cell) = self.drawing_cell(Pos { row: pos.row, col }) { + let _ = write!(contents, "\x1b[{};{}H\x1b[0m", row + 1, col + 1); + cell.attrs().write_escape_code_diff(contents, &crate::attrs::Attrs::default()); + contents.extend_from_slice(cell.contents().as_bytes()); + } + } + if save { + contents.extend_from_slice(b"\x1b[0m"); + saved_attrs.write_escape_code_diff(contents, &crate::attrs::Attrs::default()); + contents.extend_from_slice(b"\x1b7"); + } + } + } + pub fn write_contents_diff( &self, contents: &mut Vec, @@ -698,10 +756,12 @@ impl Grid { self.scroll_top = 0; self.scroll_bottom = self.size().rows - 1; } - self.pos.row = self.scroll_top; - self.pos.col = 0; + self.set_pos(Pos::default()); } + pub fn origin_mode(&self) -> bool { self.origin_mode } + pub fn inherit_origin_mode(&mut self, value: bool) { self.origin_mode = value; } + fn in_scroll_region(&self) -> bool { self.pos.row >= self.scroll_top && self.pos.row <= self.scroll_bottom } @@ -787,6 +847,11 @@ impl Grid { let mut prev_pos = self.pos; self.pos.col = 0; let scrolled = self.row_inc_scroll(1); + if prev_pos.row < scrolled { + // A one-row viewport moves the wrapped predecessor into history. + if let Some(row) = self.scrollback.back_mut() { row.wrap(wrap); } + return; + } prev_pos.row -= scrolled; let new_pos = self.pos; self.drawing_row_mut(prev_pos.row) diff --git a/vendor/vt100/src/parser.rs b/vendor/vt100/src/parser.rs index 97320b1..60409b9 100644 --- a/vendor/vt100/src/parser.rs +++ b/vendor/vt100/src/parser.rs @@ -3,6 +3,9 @@ pub struct Parser { parser: vte::Parser, screen: crate::screen::Screen, + pending: Vec, + pending_overflow: bool, + last_print: bool, } impl Parser { @@ -12,6 +15,9 @@ impl Parser { pub fn new(rows: u16, cols: u16, scrollback_len: usize) -> Self { Self { parser: vte::Parser::new(), + pending: Vec::new(), + pending_overflow: false, + last_print: false, screen: crate::screen::Screen::new( crate::grid::Size { rows, cols }, scrollback_len, @@ -22,11 +28,36 @@ impl Parser { /// Processes the contents of the given byte string, and updates the /// in-memory terminal state. pub fn process(&mut self, bytes: &[u8]) { - for byte in bytes { - self.parser.advance(&mut self.screen, *byte); + for &byte in bytes { + if !self.pending.is_empty() || byte == 0x1b || byte >= 0x80 { + if self.pending.len() < 65_536 { self.pending.push(byte); } + else { self.pending_overflow = true; } + } + let mut performer = CheckpointPerformer { screen: &mut self.screen, complete: false, executed: false, last_print: self.last_print }; + self.parser.advance(&mut performer, byte); + self.last_print = performer.last_print; + if performer.complete || matches!(byte, 0x18 | 0x1a) { + self.pending.clear(); self.pending_overflow = false; + // OSC/DCS may finish on ESC, which simultaneously begins ST. + if byte == 0x1b { self.pending.push(byte); } + } else if performer.executed && !self.pending.is_empty() { + // C0 actions within a CSI have already affected the model. + // Replaying them with the unfinished prefix would apply twice. + self.pending.pop(); + } } } + /// A complete owner checkpoint, including an unfinished output sequence. + /// The tail is bounded, and oversized control strings fail explicitly. + pub fn renderer_state_formatted(&self) -> Result, &'static str> { + if self.pending_overflow { return Err("terminal checkpoint has an oversized incomplete control sequence"); } + let mut out = self.screen.renderer_state_formatted(); + if self.last_print { self.screen.write_preceding_char(&mut out); } + out.extend_from_slice(&self.pending); + Ok(out) + } + /// Resizes the terminal. pub fn set_size(&mut self, rows: u16, cols: u16) { self.screen.set_size(rows, cols); @@ -79,3 +110,17 @@ impl std::io::Write for Parser { Ok(()) } } + +// Keep only an unfinished terminal-output sequence. Completed output is +// represented by the screen model, never a rolling byte-stream replay. +struct CheckpointPerformer<'a> { screen: &'a mut crate::screen::Screen, complete: bool, executed: bool, last_print: bool } +impl vte::Perform for CheckpointPerformer<'_> { + fn print(&mut self, c: char) { self.screen.print(c); self.complete = true; self.last_print = true; } + fn execute(&mut self, byte: u8) { self.screen.execute(byte); self.executed = true; self.last_print = false; } + fn hook(&mut self, p: &vte::Params, i: &[u8], ignore: bool, action: char) { self.screen.hook(p, i, ignore, action); } + fn put(&mut self, byte: u8) { self.screen.put(byte); } + fn unhook(&mut self) { self.screen.unhook(); self.complete = true; self.last_print = false; } + fn osc_dispatch(&mut self, p: &[&[u8]], bell: bool) { self.screen.osc_dispatch(p, bell); self.complete = true; self.last_print = false; } + fn csi_dispatch(&mut self, p: &vte::Params, i: &[u8], ignore: bool, action: char) { self.screen.csi_dispatch(p, i, ignore, action); self.complete = true; self.last_print = false; } + fn esc_dispatch(&mut self, i: &[u8], ignore: bool, byte: u8) { self.screen.esc_dispatch(i, ignore, byte); self.complete = true; self.last_print = false; } +} diff --git a/vendor/vt100/src/screen.rs b/vendor/vt100/src/screen.rs index 36ff632..cfb9f60 100644 --- a/vendor/vt100/src/screen.rs +++ b/vendor/vt100/src/screen.rs @@ -6,6 +6,9 @@ const MODE_APPLICATION_CURSOR: u8 = 0b0000_0010; const MODE_HIDE_CURSOR: u8 = 0b0000_0100; const MODE_ALTERNATE_SCREEN: u8 = 0b0000_1000; const MODE_BRACKETED_PASTE: u8 = 0b0001_0000; +const MODE_FOCUS_REPORTING: u8 = 0b0010_0000; +const MODE_AUTOWRAP: u8 = 0b0100_0000; +const MODE_INSERT: u8 = 0b1000_0000; /// The xterm mouse handling mode currently in use. #[derive(Copy, Clone, Debug, Eq, PartialEq)] @@ -99,7 +102,7 @@ impl Screen { title: String::default(), icon_name: String::default(), - modes: 0, + modes: MODE_AUTOWRAP, mouse_protocol_mode: MouseProtocolMode::default(), mouse_protocol_encoding: MouseProtocolEncoding::default(), @@ -248,6 +251,31 @@ impl Screen { contents } + /// Reattach an owner renderer from modeled state, not a replay of output. + /// The recipient must have the same size and a freshly reset parser. + /// Retains both active alternate content and the normal screen it returns to. + #[must_use] + pub fn renderer_state_formatted(&self) -> Vec { + let mut out = b"\x1bc\x1b[?6l\x1b[r".to_vec(); + self.grid.write_contents_with_history(&mut out); + self.grid.write_checkpoint_state(&mut out, self.saved_attrs); + if self.alternate_screen() { + out.extend_from_slice(b"\x1b[?47h\x1b[?6l\x1b[r"); + self.alternate_grid.write_contents_formatted(&mut out); + self.alternate_grid.write_checkpoint_state(&mut out, self.saved_attrs); + } + out.extend_from_slice(b"\x1b[0m"); + self.attrs.write_escape_code_diff(&mut out, &crate::attrs::Attrs::default()); + crate::term::HideCursor::new(self.hide_cursor()).write_buf(&mut out); + self.write_input_mode_formatted(&mut out); + self.write_title_formatted(&mut out); + out + } + + pub(crate) fn write_preceding_char(&self, out: &mut Vec) { + self.grid().write_preceding_char(out, self.mode(MODE_INSERT)); + } + /// Return escape codes sufficient to turn the terminal state of the /// screen `prev` into the current terminal state. This is a convenience /// wrapper around `contents_diff`, `input_mode_diff`, `title_diff`, and @@ -405,6 +433,10 @@ impl Screen { } fn write_input_mode_formatted(&self, contents: &mut Vec) { + for (mode, code) in [(MODE_FOCUS_REPORTING, 1004), (MODE_AUTOWRAP, 7)] { + contents.extend_from_slice(format!("\x1b[?{code}{}", if self.mode(mode) { 'h' } else { 'l' }).as_bytes()); + } + contents.extend_from_slice(if self.mode(MODE_INSERT) { b"\x1b[4h" } else { b"\x1b[4l" }); crate::term::ApplicationKeypad::new( self.mode(MODE_APPLICATION_KEYPAD), ) @@ -761,12 +793,21 @@ impl Screen { } fn enter_alternate_grid(&mut self) { - self.grid_mut().set_scrollback(0); - self.set_mode(MODE_ALTERNATE_SCREEN); + if self.alternate_screen() { return; } + self.grid.set_scrollback(0); + self.alternate_grid.clear(); self.alternate_grid.allocate_rows(); + self.alternate_grid.set_pos(self.grid.pos()); + self.alternate_grid.inherit_origin_mode(self.grid.origin_mode()); + self.set_mode(MODE_ALTERNATE_SCREEN); } fn exit_alternate_grid(&mut self) { + if !self.alternate_screen() { return; } + self.grid.inherit_origin_mode(false); + self.grid.set_pos(self.alternate_grid.pos()); + self.grid.inherit_origin_mode(self.alternate_grid.origin_mode()); + self.alternate_grid.clear(); self.clear_mode(MODE_ALTERNATE_SCREEN); } @@ -834,7 +875,9 @@ impl Screen { // that relationship even though the padding cell has no contents; // otherwise a later resize cannot rejoin the logical line. let wrap = pos.col > size.cols.saturating_sub(width); - self.grid_mut().col_wrap(width, wrap); + if self.mode(MODE_AUTOWRAP) { self.grid_mut().col_wrap(width, wrap); } + else if wrap { self.grid_mut().col_set(size.cols.saturating_sub(width.max(1))); } + if self.mode(MODE_INSERT) && width > 0 { self.grid_mut().insert_cells(width); } let pos = self.grid().pos(); if width == 0 { @@ -1228,10 +1271,7 @@ impl Screen { // CSI h #[allow(clippy::unused_self)] fn sm(&mut self, params: &vte::Params) { - // nothing, i think? - if log::log_enabled!(log::Level::Debug) { - log::debug!("unhandled SM mode: {}", param_str(params)); - } + for param in params { if param == &[4] { self.set_mode(MODE_INSERT); } } } // CSI ? h @@ -1240,9 +1280,12 @@ impl Screen { match param { &[1] => self.set_mode(MODE_APPLICATION_CURSOR), &[6] => self.grid_mut().set_origin_mode(true), + &[7] => self.set_mode(MODE_AUTOWRAP), + &[1004] => self.set_mode(MODE_FOCUS_REPORTING), + &[1048] => self.decsc(), &[9] => self.set_mouse_mode(MouseProtocolMode::Press), &[25] => self.clear_mode(MODE_HIDE_CURSOR), - &[47] => self.enter_alternate_grid(), + &[47] | &[1047] => self.enter_alternate_grid(), &[1000] => { self.set_mouse_mode(MouseProtocolMode::PressRelease); } @@ -1284,10 +1327,7 @@ impl Screen { // CSI l #[allow(clippy::unused_self)] fn rm(&mut self, params: &vte::Params) { - // nothing, i think? - if log::log_enabled!(log::Level::Debug) { - log::debug!("unhandled RM mode: {}", param_str(params)); - } + for param in params { if param == &[4] { self.clear_mode(MODE_INSERT); } } } // CSI ? l @@ -1296,9 +1336,12 @@ impl Screen { match param { &[1] => self.clear_mode(MODE_APPLICATION_CURSOR), &[6] => self.grid_mut().set_origin_mode(false), + &[7] => self.clear_mode(MODE_AUTOWRAP), + &[1004] => self.clear_mode(MODE_FOCUS_REPORTING), + &[1048] => self.decrc(), &[9] => self.clear_mouse_mode(MouseProtocolMode::Press), &[25] => self.set_mode(MODE_HIDE_CURSOR), - &[47] => { + &[47] | &[1047] => { self.exit_alternate_grid(); } &[1000] => { @@ -1385,12 +1428,17 @@ impl Screen { match next_param!() { &[0] => self.attrs = crate::attrs::Attrs::default(), &[1] => self.attrs.set_bold(true), + &[2] => self.attrs.set_dim(true), + &[5] | &[6] => self.attrs.set_blink(true), + &[9] => self.attrs.set_strike(true), &[3] => self.attrs.set_italic(true), &[4] => self.attrs.set_underline(true), &[7] => self.attrs.set_inverse(true), // Conn: any subparameter form of 8 conceals; hiding too much is the safe error. &[8, ..] => self.attrs.set_concealed(true), - &[22] => self.attrs.set_bold(false), + &[22] => { self.attrs.set_bold(false); self.attrs.set_dim(false); } + &[25] => self.attrs.set_blink(false), + &[29] => self.attrs.set_strike(false), &[23] => self.attrs.set_italic(false), &[24] => self.attrs.set_underline(false), &[27] => self.attrs.set_inverse(false),