diff --git a/.envrc b/.envrc deleted file mode 100644 index 3550a30..0000000 --- a/.envrc +++ /dev/null @@ -1 +0,0 @@ -use flake diff --git a/.forgejo/workflows/deploy-dev.yml b/.forgejo/workflows/deploy-dev.yml index d456cda..36c5efe 100644 --- a/.forgejo/workflows/deploy-dev.yml +++ b/.forgejo/workflows/deploy-dev.yml @@ -5,110 +5,74 @@ on: paths-ignore: - flake.nix -env: - NIX_CONFIG: experimental-features = nix-command flakes - jobs: build-web: - runs-on: nixos + runs-on: docker steps: - - name: Install node - run: nix profile add nixpkgs#nodejs_24 - - name: Check out repo uses: https://data.forgejo.org/actions/checkout@v4 + - name: Install Packages + run: apt-get update && apt-get install -y sudo curl jq fakeroot dpkg rpm + + - name: Install Nix + uses: https://github.com/cachix/install-nix-action@v30 + + - name: Install Bun + uses: oven-sh/setup-bun@v2 + - name: Install dependencies - run: nix develop .#electron --command pnpm install --frozen-lockfile + run: bun install --frozen-lockfile - name: Copy licenses - run: nix develop .#electron --command pnpm run copy-licenses + run: bun run copy-licenses - name: Build packages - run: nix develop .#electron --command pnpm run build:packages + run: bun run build:packages - name: Build web - run: nix develop .#electron --command pnpm run build:web + run: bun run build:web + + - name: Install rsync + run: apt-get update && apt-get install -y rsync - name: Deploy - run: nix develop .#electron --command rsync -a --delete apps/web/dist/ /var/lib/www/tensamin-web-dev/ + run: rsync -a --delete apps/web/dist/ /var/lib/www/tensamin-web-dev/ build-mobile: - runs-on: nixos + runs-on: docker steps: - - name: Install node - run: nix profile add nixpkgs#nodejs_24 - - name: Check out repo uses: https://data.forgejo.org/actions/checkout@v4 + - name: Install Packages + run: apt-get update && apt-get install -y sudo curl jq fakeroot dpkg rpm + + - name: Install Nix + uses: https://github.com/cachix/install-nix-action@v30 + + - name: Install Bun + uses: oven-sh/setup-bun@v2 + - name: Install dependencies - run: nix develop .#tauri --command pnpm install --frozen-lockfile + run: bun install --frozen-lockfile - name: Copy licenses - run: nix develop .#tauri --command pnpm run copy-licenses + run: bun run copy-licenses - name: Build packages - run: nix develop .#tauri --command pnpm run build:packages + run: bun run build:packages - name: Setup Android Keystore env: KEYSTORE_BASE64: ${{ secrets.ANDROID_KEYSTORE_BASE64 }} KEYSTORE_PROPERTIES: ${{ secrets.ANDROID_KEYSTORE_PROPERTIES }} run: | - nix profile add nixpkgs#gnused - - set -euo pipefail - - if [ -z "$KEYSTORE_BASE64" ]; then - echo "ANDROID_KEYSTORE_BASE64 secret is missing or empty" - exit 1 - fi - - if [ -z "$KEYSTORE_PROPERTIES" ]; then - echo "ANDROID_KEYSTORE_PROPERTIES secret is missing or empty" - exit 1 - fi - - printf '%s' "$KEYSTORE_BASE64" \ - | tr -d '[:space:]' \ - | base64 -d > keystore.jks - - printf '%s' "$KEYSTORE_PROPERTIES" \ - | sed 's/\\n/\n/g' \ - | tr -d '\r' \ - | sed 's|^[[:space:]]*storeFile[[:space:]]*=.*|storeFile=keystore.jks|' \ - > keystore.properties - - grep -q '^[[:space:]]*storeFile[[:space:]]*=' keystore.properties || printf '\nstoreFile=keystore.jks\n' >> keystore.properties - - if [ ! -s keystore.jks ]; then - echo "Decoded keystore.jks is missing or empty" - exit 1 - fi - - if [ ! -s keystore.properties ]; then - echo "Generated keystore.properties is missing or empty" - exit 1 - fi - - if ! grep -q '^[[:space:]]*keyAlias[[:space:]]*=' keystore.properties; then - echo "keystore.properties is missing keyAlias" - exit 1 - fi - - if ! grep -Eq '^[[:space:]]*(keyPassword|password)[[:space:]]*=' keystore.properties; then - echo "keystore.properties is missing keyPassword or password" - exit 1 - fi - - if ! grep -Eq '^[[:space:]]*(storePassword|password)[[:space:]]*=' keystore.properties; then - echo "keystore.properties is missing storePassword or password" - exit 1 - fi + bun -e "require('fs').writeFileSync('keystore.jks', Buffer.from(process.env.KEYSTORE_BASE64.replace(/\s+/g, ''), 'base64'))" + bun -e "const content = process.env.KEYSTORE_PROPERTIES.replace(/\\n/g, '\n').replace(/\r/g, '').split('\n').map(l => l.trim()).filter(l => l).join('\n'); require('fs').writeFileSync('keystore.properties', content)" - name: Build mobile - run: nix develop .#tauri --command pnpm run build:mobile + run: bun run build:mobile - name: Upload mobile artifact uses: https://data.forgejo.org/actions/upload-artifact@v3 @@ -117,30 +81,31 @@ jobs: path: apps/tauri/src-tauri/gen/android/app/build/outputs/apk/universal/release/app-universal-release.apk build-desktop: - runs-on: nixos + runs-on: docker strategy: matrix: target: [linux] steps: - - name: Install node - run: nix profile add nixpkgs#nodejs_24 - - name: Check out repo uses: https://data.forgejo.org/actions/checkout@v4 + - name: Install Packages + run: apt-get update && apt-get install -y sudo curl jq fakeroot dpkg rpm xz-utils + + - name: Install Bun + uses: oven-sh/setup-bun@v2 + - name: Install dependencies - run: nix develop .#electron --command pnpm install --frozen-lockfile + run: bun install --frozen-lockfile - name: Copy licenses - run: nix develop .#electron --command pnpm run copy-licenses + run: bun run copy-licenses - name: Build packages - run: nix develop .#electron --command pnpm run build:packages + run: bun run build:packages - name: Set Electron dev version run: | - nix develop .#electron --command bash <<'EOF' - set -euo pipefail VERSION="$(node -p "require('./package.json').version")" SHORT_SHA="$(git rev-parse --short HEAD)" DEV_VERSION="$VERSION-dev-$SHORT_SHA" @@ -152,15 +117,9 @@ jobs: pkg.version = process.env.DEV_VERSION; fs.writeFileSync(path, JSON.stringify(pkg, null, 2) + "\n"); ' - EOF - name: Build Electron desktop - run: | - nix develop .#electron --command bash <<'EOF' - set -euo pipefail - cd apps/electron - pnpm run package:raw - EOF + run: bun run build:desktop - name: Upload desktop artifacts uses: https://data.forgejo.org/actions/upload-artifact@v3 @@ -169,19 +128,22 @@ jobs: path: apps/electron/release/ release: - runs-on: nixos + runs-on: docker needs: [build-web, build-mobile, build-desktop] steps: - - name: Install node - run: nix profile add nixpkgs#nodejs_24 - - name: Check out repo uses: https://data.forgejo.org/actions/checkout@v4 with: fetch-depth: 0 + - name: Install Packages + run: apt-get update && apt-get install -y sudo curl jq + + - name: Install Bun + uses: oven-sh/setup-bun@v2 + - name: Install dependencies - run: nix develop .#electron --command pnpm install --frozen-lockfile + run: bun install --frozen-lockfile - name: Download mobile artifact uses: https://data.forgejo.org/actions/download-artifact@v3 @@ -198,27 +160,21 @@ jobs: - name: Read version and hash id: version run: | - nix develop .#electron --command bash <<'EOF' - set -euo pipefail VERSION="$(node -p "require('./package.json').version")" SHORT_SHA="$(git rev-parse --short HEAD)" echo "version=$VERSION" >> "$FORGEJO_OUTPUT" echo "short_sha=$SHORT_SHA" >> "$FORGEJO_OUTPUT" echo "tag=${VERSION}-dev-${SHORT_SHA}" >> "$FORGEJO_OUTPUT" echo "title=${VERSION}-dev-${SHORT_SHA}" >> "$FORGEJO_OUTPUT" - EOF - name: Copy releases env: TENSAMIN_RELEASE_VERSION: ${{ steps.version.outputs.tag }} TENSAMIN_RELEASE_TAG: ${{ steps.version.outputs.tag }} run: | - nix develop .#electron --command bash <<'EOF' - set -euo pipefail ASSET_BASE_URL="${{ forgejo.api_url }}" ASSET_BASE_URL="${ASSET_BASE_URL%/api/v1}/${{ forgejo.repository }}/releases/download/${{ steps.version.outputs.tag }}" - FORGEJO_RELEASE_ASSET_BASE_URL="$ASSET_BASE_URL" pnpm run copy-releases - EOF + FORGEJO_RELEASE_ASSET_BASE_URL="$ASSET_BASE_URL" bun --bun run copy-releases - name: Create pre-release and upload files env: @@ -229,7 +185,6 @@ jobs: TAG: ${{ steps.version.outputs.tag }} TITLE: ${{ steps.version.outputs.title }} run: | - nix develop .#electron --command bash <<'EOF' set -eu test -d releases @@ -318,4 +273,3 @@ jobs: -H "Authorization: token $TOKEN" \ -F "attachment=@$file" done - EOF diff --git a/.forgejo/workflows/deploy-prod.yml b/.forgejo/workflows/deploy-prod.yml index 42323f2..6adc499 100644 --- a/.forgejo/workflows/deploy-prod.yml +++ b/.forgejo/workflows/deploy-prod.yml @@ -6,110 +6,74 @@ on: paths-ignore: - flake.nix -env: - NIX_CONFIG: experimental-features = nix-command flakes - jobs: build-web: - runs-on: nixos + runs-on: docker steps: - - name: Install node - run: nix profile add nixpkgs#nodejs_24 - - name: Check out repo uses: https://data.forgejo.org/actions/checkout@v4 + - name: Install Packages + run: apt-get update && apt-get install -y sudo curl jq fakeroot dpkg rpm + + - name: Install Nix + uses: https://github.com/cachix/install-nix-action@v30 + + - name: Install Bun + uses: oven-sh/setup-bun@v2 + - name: Install dependencies - run: nix develop .#electron --command pnpm install --frozen-lockfile + run: bun install --frozen-lockfile - name: Copy licenses - run: nix develop .#electron --command pnpm run copy-licenses + run: bun run copy-licenses - name: Build packages - run: nix develop .#electron --command pnpm run build:packages + run: bun run build:packages - name: Build web - run: nix develop .#electron --command pnpm run build:web + run: bun run build:web + + - name: Install rsync + run: apt-get update && apt-get install -y rsync - name: Deploy - run: nix develop .#electron --command rsync -a --delete apps/web/dist/ /var/lib/www/tensamin-web-prod/ + run: rsync -a --delete apps/web/dist/ /var/lib/www/tensamin-web-prod/ build-mobile: - runs-on: nixos + runs-on: docker steps: - - name: Install node - run: nix profile add nixpkgs#nodejs_24 - - name: Check out repo uses: https://data.forgejo.org/actions/checkout@v4 + - name: Install Packages + run: apt-get update && apt-get install -y sudo curl jq fakeroot dpkg rpm + + - name: Install Nix + uses: https://github.com/cachix/install-nix-action@v30 + + - name: Install Bun + uses: oven-sh/setup-bun@v2 + - name: Install dependencies - run: nix develop .#tauri --command pnpm install --frozen-lockfile + run: bun install --frozen-lockfile - name: Copy licenses - run: nix develop .#tauri --command pnpm run copy-licenses + run: bun run copy-licenses - name: Build packages - run: nix develop .#tauri --command pnpm run build:packages + run: bun run build:packages - name: Setup Android Keystore env: KEYSTORE_BASE64: ${{ secrets.ANDROID_KEYSTORE_BASE64 }} KEYSTORE_PROPERTIES: ${{ secrets.ANDROID_KEYSTORE_PROPERTIES }} run: | - nix profile add nixpkgs#gnused - - set -euo pipefail - - if [ -z "$KEYSTORE_BASE64" ]; then - echo "ANDROID_KEYSTORE_BASE64 secret is missing or empty" - exit 1 - fi - - if [ -z "$KEYSTORE_PROPERTIES" ]; then - echo "ANDROID_KEYSTORE_PROPERTIES secret is missing or empty" - exit 1 - fi - - printf '%s' "$KEYSTORE_BASE64" \ - | tr -d '[:space:]' \ - | base64 -d > keystore.jks - - printf '%s' "$KEYSTORE_PROPERTIES" \ - | sed 's/\\n/\n/g' \ - | tr -d '\r' \ - | sed 's|^[[:space:]]*storeFile[[:space:]]*=.*|storeFile=keystore.jks|' \ - > keystore.properties - - grep -q '^[[:space:]]*storeFile[[:space:]]*=' keystore.properties || printf '\nstoreFile=keystore.jks\n' >> keystore.properties - - if [ ! -s keystore.jks ]; then - echo "Decoded keystore.jks is missing or empty" - exit 1 - fi - - if [ ! -s keystore.properties ]; then - echo "Generated keystore.properties is missing or empty" - exit 1 - fi - - if ! grep -q '^[[:space:]]*keyAlias[[:space:]]*=' keystore.properties; then - echo "keystore.properties is missing keyAlias" - exit 1 - fi - - if ! grep -Eq '^[[:space:]]*(keyPassword|password)[[:space:]]*=' keystore.properties; then - echo "keystore.properties is missing keyPassword or password" - exit 1 - fi - - if ! grep -Eq '^[[:space:]]*(storePassword|password)[[:space:]]*=' keystore.properties; then - echo "keystore.properties is missing storePassword or password" - exit 1 - fi + bun -e "require('fs').writeFileSync('keystore.jks', Buffer.from(process.env.KEYSTORE_BASE64.replace(/\s+/g, ''), 'base64'))" + bun -e "const content = process.env.KEYSTORE_PROPERTIES.replace(/\\n/g, '\n').replace(/\r/g, '').split('\n').map(l => l.trim()).filter(l => l).join('\n'); require('fs').writeFileSync('keystore.properties', content)" - name: Build mobile - run: nix develop .#tauri --command pnpm run build:mobile + run: bun run build:mobile - name: Upload mobile artifact uses: https://data.forgejo.org/actions/upload-artifact@v3 @@ -118,30 +82,31 @@ jobs: path: apps/tauri/src-tauri/gen/android/app/build/outputs/apk/universal/release/app-universal-release.apk build-desktop: - runs-on: nixos + runs-on: docker strategy: matrix: target: [linux] steps: - - name: Install node - run: nix profile add nixpkgs#nodejs_24 - - name: Check out repo uses: https://data.forgejo.org/actions/checkout@v4 + - name: Install Packages + run: apt-get update && apt-get install -y sudo curl jq fakeroot dpkg rpm xz-utils + + - name: Install Bun + uses: oven-sh/setup-bun@v2 + - name: Install dependencies - run: nix develop .#electron --command pnpm install --frozen-lockfile + run: bun install --frozen-lockfile - name: Copy licenses - run: nix develop .#electron --command pnpm run copy-licenses + run: bun run copy-licenses - name: Build packages - run: nix develop .#electron --command pnpm run build:packages + run: bun run build:packages - name: Set Electron prod version run: | - nix develop .#electron --command bash <<'EOF' - set -euo pipefail VERSION="$(node -p "require('./package.json').version")" export VERSION node -e ' @@ -151,15 +116,9 @@ jobs: pkg.version = process.env.VERSION; fs.writeFileSync(path, JSON.stringify(pkg, null, 2) + "\n"); ' - EOF - name: Build Electron desktop - run: | - nix develop .#electron --command bash <<'EOF' - set -euo pipefail - cd apps/electron - pnpm run package:raw - EOF + run: bun run build:desktop - name: Upload desktop artifacts uses: https://data.forgejo.org/actions/upload-artifact@v3 @@ -168,17 +127,20 @@ jobs: path: apps/electron/release/ release: - runs-on: nixos + runs-on: docker needs: [build-web, build-mobile, build-desktop] steps: - - name: Install node - run: nix profile add nixpkgs#nodejs_24 - - name: Check out repo uses: https://data.forgejo.org/actions/checkout@v4 + - name: Install Packages + run: apt-get update && apt-get install -y sudo curl jq + + - name: Install Bun + uses: oven-sh/setup-bun@v2 + - name: Install dependencies - run: nix develop .#electron --command pnpm install --frozen-lockfile + run: bun install --frozen-lockfile - name: Download mobile artifact uses: https://data.forgejo.org/actions/download-artifact@v3 @@ -195,24 +157,18 @@ jobs: - name: Read version id: version run: | - nix develop .#electron --command bash <<'EOF' - set -euo pipefail VERSION="$(node -p "require('./package.json').version")" echo "version=$VERSION" >> "$FORGEJO_OUTPUT" echo "tag=$VERSION" >> "$FORGEJO_OUTPUT" - EOF - name: Copy releases env: TENSAMIN_RELEASE_VERSION: ${{ steps.version.outputs.tag }} TENSAMIN_RELEASE_TAG: ${{ steps.version.outputs.tag }} run: | - nix develop .#electron --command bash <<'EOF' - set -euo pipefail ASSET_BASE_URL="${{ forgejo.api_url }}" ASSET_BASE_URL="${ASSET_BASE_URL%/api/v1}/${{ forgejo.repository }}/releases/download/${{ steps.version.outputs.tag }}" - FORGEJO_RELEASE_ASSET_BASE_URL="$ASSET_BASE_URL" pnpm run copy-releases - EOF + FORGEJO_RELEASE_ASSET_BASE_URL="$ASSET_BASE_URL" bun --bun run copy-releases - name: Create release and upload files env: @@ -222,7 +178,6 @@ jobs: SHA: ${{ forgejo.sha }} TAG: ${{ steps.version.outputs.tag }} run: | - nix develop .#electron --command bash <<'EOF' set -eu test -d releases @@ -276,18 +231,18 @@ jobs: -H "Authorization: token $TOKEN" \ -F "attachment=@$file" done - EOF - - name: Delete dev releases + - name: Delete dev releases for prod version env: TOKEN: ${{ forgejo.token }} API: ${{ forgejo.api_url }} REPO: ${{ forgejo.repository }} + TAG: ${{ steps.version.outputs.tag }} run: | - nix develop .#electron --command bash <<'EOF' set -eu PAGE=1 + PREFIX="$TAG-dev-" DELETE_RELEASES=delete-dev-releases.tsv : > "$DELETE_RELEASES" @@ -302,7 +257,8 @@ jobs: test "$COUNT" -gt 0 || break jq -r \ - '.[] | select(.prerelease == true) | select(.tag_name | contains("-dev-")) | [.id, .tag_name] | @tsv' releases.json \ + --arg prefix "$PREFIX" \ + '.[] | select(.prerelease == true) | select(.tag_name | startswith($prefix)) | [.id, .tag_name] | @tsv' releases.json \ >> "$DELETE_RELEASES" PAGE="$((PAGE + 1))" @@ -315,13 +271,11 @@ jobs: -H "Authorization: token $TOKEN" \ "$API/repos/$REPO/releases/$release_id" done < "$DELETE_RELEASES" - EOF - name: Update root flake release hash env: TAG: ${{ steps.version.outputs.tag }} run: | - nix develop .#electron --command bash <<'EOF' set -eu DEB="$(find releases -maxdepth 1 -type f -name 'Tensamin-*-linux-amd64.deb' -print -quit)" @@ -370,4 +324,3 @@ jobs: git add flake.nix git -c user.name="forgejo-actions" -c user.email="forgejo-actions@localhost" commit -m "(qol): update release flake hash" git push origin HEAD:dev - EOF diff --git a/.gitignore b/.gitignore index c0e6a9b..87d0fc3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ node_modules releases -.fallow -.direnv +.fallow/ diff --git a/apps/electron/.gitignore b/apps/electron/.gitignore index b53a288..158494b 100644 --- a/apps/electron/.gitignore +++ b/apps/electron/.gitignore @@ -1,2 +1,2 @@ dist -release +release \ No newline at end of file diff --git a/apps/electron/build/icons/128x128.png b/apps/electron/build/icons/128x128.png index 357e1c2..425ffb4 100644 Binary files a/apps/electron/build/icons/128x128.png and b/apps/electron/build/icons/128x128.png differ diff --git a/apps/electron/build/icons/128x128@2x.png b/apps/electron/build/icons/128x128@2x.png index be55e24..9fe4117 100644 Binary files a/apps/electron/build/icons/128x128@2x.png and b/apps/electron/build/icons/128x128@2x.png differ diff --git a/apps/electron/build/icons/32x32.png b/apps/electron/build/icons/32x32.png index bc4fba4..3c9a880 100644 Binary files a/apps/electron/build/icons/32x32.png and b/apps/electron/build/icons/32x32.png differ diff --git a/apps/electron/build/icons/64x64.png b/apps/electron/build/icons/64x64.png index 567f4ad..0f9e690 100644 Binary files a/apps/electron/build/icons/64x64.png and b/apps/electron/build/icons/64x64.png differ diff --git a/apps/electron/build/icons/icon.icns b/apps/electron/build/icons/icon.icns index 7f3b591..7ea0993 100644 Binary files a/apps/electron/build/icons/icon.icns and b/apps/electron/build/icons/icon.icns differ diff --git a/apps/electron/build/icons/icon.ico b/apps/electron/build/icons/icon.ico index c5c68f8..fc67bfb 100644 Binary files a/apps/electron/build/icons/icon.ico and b/apps/electron/build/icons/icon.ico differ diff --git a/apps/electron/build/icons/icon.png b/apps/electron/build/icons/icon.png index dad3edb..8e56359 100644 Binary files a/apps/electron/build/icons/icon.png and b/apps/electron/build/icons/icon.png differ diff --git a/apps/electron/flake.lock b/apps/electron/flake.lock new file mode 100644 index 0000000..88748a4 --- /dev/null +++ b/apps/electron/flake.lock @@ -0,0 +1,61 @@ +{ + "nodes": { + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1779508470, + "narHash": "sha256-Ap9KJX+5xHIn3bPIpfNgT6MEXdAECECwo4/rmlQD74M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "29916453413845e54a65b8a1cf996842300cd299", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/apps/electron/flake.nix b/apps/electron/flake.nix new file mode 100644 index 0000000..5bb9cd5 --- /dev/null +++ b/apps/electron/flake.nix @@ -0,0 +1,88 @@ +{ + description = "Electron Development Environment"; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + flake-utils.url = "github:numtide/flake-utils"; + }; + + outputs = {nixpkgs, flake-utils, ...}: + flake-utils.lib.eachDefaultSystem (system: let + pkgs = import nixpkgs {inherit system; config.allowUnfree = true;}; + electronRuntimeLibs = with pkgs; [ + alsa-lib + at-spi2-atk + at-spi2-core + atk + cairo + cups + dbus + expat + fontconfig + freetype + gdk-pixbuf + glib + gtk3 + libdrm + libgbm + libglvnd + libnotify + libpulseaudio + libuuid + libxkbcommon + mesa + nspr + nss + pango + pipewire + systemd + wayland + # xorg + libX11 + libXScrnSaver + libXcomposite + libXcursor + libXdamage + libXext + libXfixes + libXi + libXrandr + libXtst + libxcb + ]; + in { + devShells.default = pkgs.mkShell { + packages = with pkgs; [ + nodejs_22 + corepack_22 + bun + electron + pkg-config + python3 + gcc + gnumake + git + jq + patchelf + dpkg + rpm + fpm + ] ++ electronRuntimeLibs; + + shellHook = '' + export LD_LIBRARY_PATH="${pkgs.lib.makeLibraryPath electronRuntimeLibs}:$LD_LIBRARY_PATH" + export ELECTRON_ENABLE_LOGGING=1 + export ELECTRON_OZONE_PLATFORM_HINT="''${ELECTRON_OZONE_PLATFORM_HINT:-auto}" + export NPM_CONFIG_TARGET_ARCH="''${NPM_CONFIG_TARGET_ARCH:-x64}" + export npm_config_build_from_source=true + export USE_SYSTEM_FPM=true + + alias electron-install='cd ../.. && bun install' + alias electron-build-web='cd ../.. && bun run build:web' + alias electron-dev='bun run dev' + alias electron-package='bun run package:linux' + alias electron-validate='bun run validate' + ''; + }; + }); +} diff --git a/apps/electron/package.json b/apps/electron/package.json index f410033..d650270 100644 --- a/apps/electron/package.json +++ b/apps/electron/package.json @@ -5,28 +5,27 @@ "description": "Tensamin desktop client", "author": "methanium", "homepage": "https://git.methanium.net/tensamin/client", - "desktopName": "Tensamin", "type": "module", "main": "dist/main/main.js", "scripts": { "clean": "rm -rf dist release", "lint": "eslint src", - "build:web": "cd ../.. && pnpm run build:web", + "build:web": "cd ../.. && bun run build:web", "build": "tsc -p tsconfig.json && esbuild src/preload/preload.ts --bundle --platform=node --format=cjs --external:electron --outfile=dist/preload/preload.cjs", - "dev:raw": "cd ../.. && pnpm run build:web && cd apps/electron && pnpm run build && electron . --verbose", - "dev": "if command -v nix >/dev/null 2>&1 && [ -z \"$IN_NIX_SHELL\" ]; then nix develop ../..#electron --command pnpm run dev:raw; else pnpm run dev:raw; fi", - "start:raw": "pnpm run build && electron .", - "start": "if command -v nix >/dev/null 2>&1 && [ -z \"$IN_NIX_SHELL\" ]; then nix develop ../..#electron --command pnpm run start:raw; else pnpm run start:raw; fi", - "package:raw": "cd ../.. && pnpm run build:web && cd apps/electron && pnpm run build && electron-builder --publish never", - "package": "if command -v nix >/dev/null 2>&1 && [ -z \"$IN_NIX_SHELL\" ]; then nix develop ../..#electron --command pnpm run package:raw; else pnpm run package:raw; fi", - "package:linux:raw": "cd ../.. && pnpm run build:web && cd apps/electron && pnpm run build && electron-builder --linux --publish never", - "package:linux": "if command -v nix >/dev/null 2>&1 && [ -z \"$IN_NIX_SHELL\" ]; then nix develop ../..#electron --command pnpm run package:linux:raw; else pnpm run package:linux:raw; fi", - "package:windows:raw": "cd ../.. && pnpm run build:web && cd apps/electron && pnpm run build && electron-builder --win --publish never", - "package:windows": "if command -v nix >/dev/null 2>&1 && [ -z \"$IN_NIX_SHELL\" ]; then nix develop ../..#electron --command pnpm run package:windows:raw; else pnpm run package:windows:raw; fi", - "checksum": "node scripts/generate-release-metadata.ts", - "generate-signing-key": "node scripts/generate-signing-key.ts", - "validate:raw": "pnpm run build && pnpm run package:linux:raw", - "validate": "if command -v nix >/dev/null 2>&1 && [ -z \"$IN_NIX_SHELL\" ]; then nix develop ../..#electron --command pnpm run validate:raw; else pnpm run validate:raw; fi" + "dev:raw": "cd ../.. && bun run build:web && cd apps/electron && bun run build && electron . --verbose", + "dev": "if command -v nix >/dev/null 2>&1 && [ -z \"$IN_NIX_SHELL\" ]; then nix develop --command bun run dev:raw; else bun run dev:raw; fi", + "start:raw": "bun run build && electron .", + "start": "if command -v nix >/dev/null 2>&1 && [ -z \"$IN_NIX_SHELL\" ]; then nix develop --command bun run start:raw; else bun run start:raw; fi", + "package:raw": "cd ../.. && bun run build:web && cd apps/electron && bun run build && electron-builder --publish never", + "package": "if command -v nix >/dev/null 2>&1 && [ -z \"$IN_NIX_SHELL\" ]; then nix develop --command bun run package:raw; else bun run package:raw; fi", + "package:linux:raw": "cd ../.. && bun run build:web && cd apps/electron && bun run build && electron-builder --linux --publish never", + "package:linux": "if command -v nix >/dev/null 2>&1 && [ -z \"$IN_NIX_SHELL\" ]; then nix develop --command bun run package:linux:raw; else bun run package:linux:raw; fi", + "package:windows:raw": "cd ../.. && bun run build:web && cd apps/electron && bun run build && electron-builder --win --publish never", + "package:windows": "if command -v nix >/dev/null 2>&1 && [ -z \"$IN_NIX_SHELL\" ]; then nix develop --command bun run package:windows:raw; else bun run package:windows:raw; fi", + "checksum": "bun scripts/generate-release-metadata.ts", + "generate-signing-key": "bun scripts/generate-signing-key.ts", + "validate:raw": "bun run build && bun run package:linux:raw", + "validate": "if command -v nix >/dev/null 2>&1 && [ -z \"$IN_NIX_SHELL\" ]; then nix develop --command bun run validate:raw; else bun run validate:raw; fi" }, "dependencies": {}, "devDependencies": { @@ -45,9 +44,6 @@ "directories": { "output": "release" }, - "toolsets": { - "appimage": "1.0.3" - }, "files": [ "dist/**/*", "package.json" @@ -58,12 +54,8 @@ "to": "web" }, { - "from": "build/icons", - "to": "icons", - "filter": [ - "32x32.png", - "icon.png" - ] + "from": "build/icons/icon.png", + "to": "icons/icon.png" } ], "linux": { @@ -76,7 +68,6 @@ "executableName": "tensamin", "category": "Network", "maintainer": "Methanium", - "syncDesktopName": true, "desktop": { "entry": { "Name": "Tensamin", diff --git a/apps/electron/src/main/main.ts b/apps/electron/src/main/main.ts index e3099f2..ebda1e5 100644 --- a/apps/electron/src/main/main.ts +++ b/apps/electron/src/main/main.ts @@ -12,18 +12,9 @@ import { import { checkForUpdates } from "./updates.js"; import { ipcChannels, - type DesktopCallStatus, type DesktopScreenShareAudioOutput, type DesktopScreenShareCapabilities, } from "../shared/ipc.js"; -import { initTray, setTrayCallStatus } from "./tray.js"; -import { - clearSecureStorage, - deleteSecureStorage, - getSecureStorageStatus, - loadSecureStorage, - saveSecureStorage, -} from "./secureStorage.js"; const __dirname = dirname(fileURLToPath(import.meta.url)); const verbose = process.argv.includes("--verbose"); @@ -197,37 +188,6 @@ function registerIpc() { ); ipcMain.handle(ipcChannels.getVersion, () => app.getVersion()); ipcMain.handle(ipcChannels.checkForUpdates, checkForUpdates); - ipcMain.handle(ipcChannels.getSecureStorageStatus, getSecureStorageStatus); - ipcMain.handle(ipcChannels.loadSecureStorage, (_event, key: unknown) => - loadSecureStorage(key), - ); - ipcMain.handle( - ipcChannels.saveSecureStorage, - (_event, key: unknown, value: unknown) => saveSecureStorage(key, value), - ); - ipcMain.handle(ipcChannels.deleteSecureStorage, (_event, key: unknown) => - deleteSecureStorage(key), - ); - ipcMain.handle(ipcChannels.clearSecureStorage, clearSecureStorage); - ipcMain.handle(ipcChannels.setCallStatus, (_event, status: unknown) => { - if ( - typeof status !== "object" || - status === null || - typeof (status as DesktopCallStatus).inCall !== "boolean" || - typeof (status as DesktopCallStatus).speaking !== "boolean" || - ((status as DesktopCallStatus).iconDataUrl !== undefined && - (typeof (status as DesktopCallStatus).iconDataUrl !== "string" || - !(status as DesktopCallStatus).iconDataUrl?.startsWith( - "data:image/png;base64,", - ) || - (status as DesktopCallStatus).iconDataUrl!.length > 16_384)) - ) { - throw new Error("Invalid call status."); - } - - const { inCall, iconDataUrl } = status as DesktopCallStatus; - setTrayCallStatus(inCall, iconDataUrl); - }); ipcMain.handle(ipcChannels.minimizeWindow, () => { verboseLog("window:minimize"); mainWindow?.minimize(); @@ -350,7 +310,6 @@ async function start() { verboseLog("app ready"); registerIpc(); registerDisplayMediaHandler(); - initTray(() => mainWindow); await createWindow(); } diff --git a/apps/electron/src/main/secureStorage.ts b/apps/electron/src/main/secureStorage.ts deleted file mode 100644 index b09117e..0000000 --- a/apps/electron/src/main/secureStorage.ts +++ /dev/null @@ -1,130 +0,0 @@ -import { app, safeStorage } from "electron"; -import { mkdir, readFile, rename, writeFile } from "node:fs/promises"; -import { dirname, join } from "node:path"; -import { - secureStorageLimits, - type DesktopSecureStorageStatus, -} from "../shared/ipc.js"; - -type StoredValues = Record; - -let pendingWrite = Promise.resolve(); - -function storagePath() { - return join(app.getPath("userData"), "secure-storage.json"); -} - -function validateKey(key: unknown): asserts key is string { - if ( - typeof key !== "string" || - key.length === 0 || - Buffer.byteLength(key, "utf8") > secureStorageLimits.maxKeyBytes - ) { - throw new Error("Invalid secure storage key."); - } -} - -function validateValue(value: unknown): asserts value is string { - if ( - typeof value !== "string" || - Buffer.byteLength(value, "utf8") > secureStorageLimits.maxValueBytes - ) { - throw new Error("Invalid secure storage value."); - } -} - -export function getSecureStorageStatus(): DesktopSecureStorageStatus { - if (!safeStorage.isEncryptionAvailable()) { - return { available: false, backend: null }; - } - - const backend = - process.platform === "linux" - ? safeStorage.getSelectedStorageBackend() - : process.platform === "darwin" - ? "keychain" - : process.platform === "win32" - ? "dpapi" - : null; - - return { - available: process.platform !== "linux" || backend !== "basic_text", - backend, - }; -} - -function requireAvailable() { - if (!getSecureStorageStatus().available) { - throw new Error("Secure storage is unavailable."); - } -} - -async function readValues(): Promise { - try { - const parsed: unknown = JSON.parse(await readFile(storagePath(), "utf8")); - if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) { - throw new Error("Invalid secure storage data."); - } - - const values = parsed as Record; - if (Object.values(values).some((value) => typeof value !== "string")) { - throw new Error("Invalid secure storage data."); - } - return values as StoredValues; - } catch (error) { - if ((error as NodeJS.ErrnoException).code === "ENOENT") return {}; - throw error; - } -} - -async function writeValues(values: StoredValues) { - const path = storagePath(); - const temporaryPath = `${path}.tmp`; - await mkdir(dirname(path), { recursive: true, mode: 0o700 }); - await writeFile(temporaryPath, JSON.stringify(values), { mode: 0o600 }); - await rename(temporaryPath, path); -} - -function mutateValues(mutation: (values: StoredValues) => void) { - const operation = pendingWrite.then(async () => { - const values = await readValues(); - mutation(values); - await writeValues(values); - }); - pendingWrite = operation.catch(() => undefined); - return operation; -} - -export async function loadSecureStorage(key: unknown): Promise { - requireAvailable(); - validateKey(key); - await pendingWrite; - const encrypted = (await readValues())[key]; - if (encrypted === undefined) return null; - return safeStorage.decryptString(Buffer.from(encrypted, "base64")); -} - -export function saveSecureStorage(key: unknown, value: unknown) { - requireAvailable(); - validateKey(key); - validateValue(value); - const encrypted = safeStorage.encryptString(value).toString("base64"); - return mutateValues((values) => { - values[key] = encrypted; - }); -} - -export function deleteSecureStorage(key: unknown) { - requireAvailable(); - validateKey(key); - return mutateValues((values) => { - delete values[key]; - }); -} - -export function clearSecureStorage() { - requireAvailable(); - return mutateValues((values) => { - for (const key of Object.keys(values)) delete values[key]; - }); -} diff --git a/apps/electron/src/main/tray.ts b/apps/electron/src/main/tray.ts deleted file mode 100644 index 3937a4d..0000000 --- a/apps/electron/src/main/tray.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { app, BrowserWindow, Menu, nativeImage, Tray } from "electron"; -import path from "node:path"; -import { fileURLToPath } from "node:url"; - -let tray: Tray | null = null; - -const __filename = fileURLToPath(import.meta.url); -const __dirname = path.dirname(__filename); - -function getTrayIconPath(filename: string) { - if (app.isPackaged) return path.join(process.resourcesPath, "icons", filename); - return path.resolve(__dirname, "../../build/icons", filename); -} - -export function setTrayCallStatus( - inCall: boolean, - iconDataUrl?: string, -) { - if (!tray) return; - - if (inCall && iconDataUrl) { - const image = nativeImage.createFromDataURL(iconDataUrl); - if (!image.isEmpty()) { - tray.setImage(image); - return; - } - } - - tray.setImage(getTrayIconPath("32x32.png")); -} - -export function initTray(getMainWindow: () => BrowserWindow | null) { - tray = new Tray(getTrayIconPath("32x32.png")); // keep reference alive - - const contextMenu = Menu.buildFromTemplate([ - { - label: "Restart", - type: "normal", - click: () => { - app.relaunch(); - app.quit(); - }, - }, - { label: "Quit", type: "normal", click: () => app.quit() }, - ]); - - tray.setContextMenu(contextMenu); - - tray.on("click", () => { - const mainWindow = getMainWindow(); - if (!mainWindow) return; - - if (mainWindow.isVisible()) { - mainWindow.hide(); - return; - } - - if (mainWindow.isMinimized()) mainWindow.restore(); - mainWindow.show(); - mainWindow.focus(); - }); -} diff --git a/apps/electron/src/preload/preload.ts b/apps/electron/src/preload/preload.ts index c6b61e4..ce65ca7 100644 --- a/apps/electron/src/preload/preload.ts +++ b/apps/electron/src/preload/preload.ts @@ -1,23 +1,10 @@ import { contextBridge, ipcRenderer } from "electron"; -import { - ipcChannels, - type DesktopCallStatus, - type DesktopScreenShareSource, - secureStorageLimits, -} from "../shared/ipc.js"; +import { ipcChannels, type DesktopScreenShareSource } from "../shared/ipc.js"; function windowAction(channel: string) { return () => ipcRenderer.invoke(channel); } -function validKey(key: string) { - return ( - typeof key === "string" && - key.length > 0 && - Buffer.byteLength(key, "utf8") <= secureStorageLimits.maxKeyBytes - ); -} - const desktopApi = { media: { listScreenShareSources: () => @@ -40,39 +27,6 @@ const desktopApi = { updates: { checkForUpdates: () => ipcRenderer.invoke(ipcChannels.checkForUpdates), }, - call: { - setStatus: (status: DesktopCallStatus) => { - if ( - typeof status?.inCall !== "boolean" || - typeof status?.speaking !== "boolean" || - (status.iconDataUrl !== undefined && - (typeof status.iconDataUrl !== "string" || - !status.iconDataUrl.startsWith("data:image/png;base64,"))) - ) { - return Promise.reject(new Error("Invalid call status.")); - } - - return ipcRenderer.invoke(ipcChannels.setCallStatus, status); - }, - }, - secureStorage: { - getStatus: () => ipcRenderer.invoke(ipcChannels.getSecureStorageStatus), - load: (key: string) => - validKey(key) - ? ipcRenderer.invoke(ipcChannels.loadSecureStorage, key) - : Promise.reject(new Error("Invalid secure storage key.")), - save: (key: string, value: string) => - validKey(key) && - typeof value === "string" && - Buffer.byteLength(value, "utf8") <= secureStorageLimits.maxValueBytes - ? ipcRenderer.invoke(ipcChannels.saveSecureStorage, key, value) - : Promise.reject(new Error("Invalid secure storage key or value.")), - delete: (key: string) => - validKey(key) - ? ipcRenderer.invoke(ipcChannels.deleteSecureStorage, key) - : Promise.reject(new Error("Invalid secure storage key.")), - clear: () => ipcRenderer.invoke(ipcChannels.clearSecureStorage), - }, window: { minimize: () => windowAction(ipcChannels.minimizeWindow), maximize: () => windowAction(ipcChannels.maximizeWindow), diff --git a/apps/electron/src/shared/ipc.ts b/apps/electron/src/shared/ipc.ts index 0679349..d1754f9 100644 --- a/apps/electron/src/shared/ipc.ts +++ b/apps/electron/src/shared/ipc.ts @@ -20,22 +20,6 @@ export type DesktopScreenShareCapabilities = { hasReliableSystemAudio: boolean; }; -export type DesktopCallStatus = { - inCall: boolean; - speaking: boolean; - iconDataUrl?: string; -}; - -export type DesktopSecureStorageStatus = { - available: boolean; - backend: string | null; -}; - -export const secureStorageLimits = { - maxKeyBytes: 256, - maxValueBytes: 1024 * 1024, -} as const; - export type ReleaseArtifact = { name: string; platform: string; @@ -71,10 +55,4 @@ export const ipcChannels = { closeWindow: "window:close", getVersion: "app:getVersion", checkForUpdates: "updates:checkForUpdates", - setCallStatus: "call:setStatus", - getSecureStorageStatus: "secureStorage:getStatus", - loadSecureStorage: "secureStorage:load", - saveSecureStorage: "secureStorage:save", - deleteSecureStorage: "secureStorage:delete", - clearSecureStorage: "secureStorage:clear", } as const; diff --git a/apps/tauri/android.png b/apps/tauri/android.png index cdee032..f77258e 100644 Binary files a/apps/tauri/android.png and b/apps/tauri/android.png differ diff --git a/apps/tauri/flake.lock b/apps/tauri/flake.lock new file mode 100644 index 0000000..c3c71cb --- /dev/null +++ b/apps/tauri/flake.lock @@ -0,0 +1,96 @@ +{ + "nodes": { + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1775036866, + "narHash": "sha256-ZojAnPuCdy657PbTq5V0Y+AHKhZAIwSIT2cb8UgAz/U=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "6201e203d09599479a3b3450ed24fa81537ebc4e", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1744536153, + "narHash": "sha256-awS2zRgF4uTwrOKwwiJcByDzDOdo3Q1rPZbiHQg/N38=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "18dd725c29603f582cf1900e0d25f9f1063dbf11", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs", + "rust-overlay": "rust-overlay" + } + }, + "rust-overlay": { + "inputs": { + "nixpkgs": "nixpkgs_2" + }, + "locked": { + "lastModified": 1775272153, + "narHash": "sha256-FwYb64ysv8J2TxaqsYYcDyHAHBUEaQlriPMWPMi1K7M=", + "owner": "oxalica", + "repo": "rust-overlay", + "rev": "740fb0203b2852917b909a72b948d34d0b171ec0", + "type": "github" + }, + "original": { + "owner": "oxalica", + "repo": "rust-overlay", + "type": "github" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/apps/tauri/flake.nix b/apps/tauri/flake.nix new file mode 100644 index 0000000..4e491e8 --- /dev/null +++ b/apps/tauri/flake.nix @@ -0,0 +1,108 @@ +{ + description = "Tauri mobile development environment"; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + rust-overlay.url = "github:oxalica/rust-overlay"; + flake-utils.url = "github:numtide/flake-utils"; + }; + + outputs = { + self, + nixpkgs, + rust-overlay, + flake-utils, + }: + flake-utils.lib.eachDefaultSystem ( + system: let + overlays = [(import rust-overlay)]; + pkgs = import nixpkgs { + inherit system overlays; + config = { + allowUnfree = true; + android_sdk.accept_license = true; + }; + }; + + projectRoot = "."; + androidHome = "${projectRoot}/.android"; + sdkRoot = "${androidHome}/sdk"; + ndkVersion = "29.0.14206865"; + + android = pkgs.androidenv.composeAndroidPackages { + cmdLineToolsVersion = "8.0"; + toolsVersion = "26.1.1"; + platformToolsVersion = "35.0.2"; + buildToolsVersions = ["35.0.0"]; + platformVersions = ["35" "36"]; + includeSources = false; + includeSystemImages = false; + includeNDK = true; + ndkVersions = [ndkVersion]; + useGoogleAPIs = false; + }; + + rustToolchain = pkgs.rust-bin.stable.latest.default.override { + extensions = ["rust-src" "rust-analyzer"]; + targets = [ + "aarch64-linux-android" + "armv7-linux-androideabi" + "i686-linux-android" + "x86_64-linux-android" + "wasm32-unknown-unknown" + ]; + }; + + in { + devShells.default = pkgs.mkShell { + buildInputs = with pkgs; + [ + jdk17 + rustToolchain + gradle + nodejs + pkg-config + ] + ++ [ + android.androidsdk + pkgs.android-studio-tools + ]; + + shellHook = '' + sdkSource="${android.androidsdk}/libexec/android-sdk" + + mkdir -p "${androidHome}" + if [ -L "${sdkRoot}" ]; then + rm -f "${sdkRoot}" + fi + mkdir -p "${sdkRoot}" + + ln -sfn "$sdkSource/build-tools" "${sdkRoot}/build-tools" + ln -sfn "$sdkSource/cmake" "${sdkRoot}/cmake" + ln -sfn "$sdkSource/licenses" "${sdkRoot}/licenses" + ln -sfn "$sdkSource/ndk" "${sdkRoot}/ndk" + ln -sfn "$sdkSource/ndk-bundle" "${sdkRoot}/ndk-bundle" + ln -sfn "$sdkSource/platforms" "${sdkRoot}/platforms" + ln -sfn "$sdkSource/platform-tools" "${sdkRoot}/platform-tools" + ln -sfn "$sdkSource/tools" "${sdkRoot}/tools" + + mkdir -p "${sdkRoot}/cmdline-tools" + ln -sfn "$sdkSource/cmdline-tools/8.0" "${sdkRoot}/cmdline-tools/8.0" + ln -sfn "8.0" "${sdkRoot}/cmdline-tools/latest" + + sdkRootAbs="$(realpath "${sdkRoot}")" + ndkRootAbs="''${sdkRootAbs}/ndk/${ndkVersion}" + + export PATH="''${sdkRootAbs}/cmdline-tools/latest/bin:''${sdkRootAbs}/platform-tools:''${ndkRootAbs}:${pkgs.android-studio-tools}/bin:$PATH" + export ANDROID_HOME="''${sdkRootAbs}" + export ANDROID_SDK_ROOT="''${sdkRootAbs}" + export ANDROID_NDK_ROOT="''${ndkRootAbs}" + export ANDROID_NDK_HOME="$ANDROID_NDK_ROOT" + export NDK_HOME="$ANDROID_NDK_ROOT" + export NDK_PATH="$ANDROID_NDK_ROOT" + export JAVA_HOME="${pkgs.jdk17}" + ''; + }; + } + ); +} diff --git a/apps/tauri/logo.svg b/apps/tauri/logo.svg index d6b091a..e40aa0f 100644 --- a/apps/tauri/logo.svg +++ b/apps/tauri/logo.svg @@ -2,14 +2,14 @@ /dev/null 2>&1 && [ -z \"$IN_NIX_SHELL\" ]; then nix develop ../..#tauri --command pnpm run dev:mobile:raw; else pnpm run dev:mobile:raw; fi", - "start-adb:mobile": "if command -v nix >/dev/null 2>&1 && [ -z \"$IN_NIX_SHELL\" ]; then nix develop ../..#tauri --command pnpm run start-adb:mobile:raw; else pnpm run start-adb:mobile:raw; fi", - "build:mobile": "node render-version.ts && trap 'node render-version.ts --unrender' EXIT && if command -v nix >/dev/null 2>&1 && [ -z \"$IN_NIX_SHELL\" ]; then nix develop ../..#tauri --command pnpm run build:mobile:raw; else pnpm run build:mobile:raw; fi", - "gen-icons": "tauri icon ./logo.json && node scripts/sync-electron-icons.ts", - "format": "pnpm exec prettier --write .", + "dev:mobile": "if command -v nix >/dev/null 2>&1; then nix develop --command bun dev:mobile:raw; else bun dev:mobile:raw; fi", + "start-adb:mobile": "if command -v nix >/dev/null 2>&1; then nix develop --command bun start-adb:mobile:raw; else bun start-adb:mobile:raw; fi", + "build:mobile": "bun run render-version.ts && if command -v nix >/dev/null 2>&1; then nix develop --command bun build:mobile:raw; else bun build:mobile:raw; fi && bun run render-version.ts --unrender", + "gen-icons": "tauri icon ./logo.json && bun scripts/sync-electron-icons.ts", + "format": "bunx prettier --write .", "lint": "eslint src" }, "dependencies": { diff --git a/apps/tauri/render-version.ts b/apps/tauri/render-version.ts index 7635bed..0bd3fca 100644 --- a/apps/tauri/render-version.ts +++ b/apps/tauri/render-version.ts @@ -1,12 +1,9 @@ import fs from "fs"; import path from "path"; -import { fileURLToPath } from "url"; // Config const PLACEHOLDER_VERSION = "0.0.0"; -const __dirname = path.dirname(fileURLToPath(import.meta.url)); - const rootPackageJsonPath = path.resolve(__dirname, "../../package.json"); const cargoTomlPath = path.resolve(__dirname, "./src-tauri/Cargo.toml"); const tauriConfigPath = path.resolve(__dirname, "./src-tauri/tauri.conf.json"); diff --git a/apps/tauri/src-tauri/Cargo.lock b/apps/tauri/src-tauri/Cargo.lock index c872475..37a6827 100644 --- a/apps/tauri/src-tauri/Cargo.lock +++ b/apps/tauri/src-tauri/Cargo.lock @@ -36,9 +36,9 @@ checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" [[package]] name = "alloc-stdlib" -version = "0.2.4" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e76a019e91224d279006ff972f1e984179a6e9feb050adba6ce8274aef23195" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" dependencies = [ "alloc-no-stdlib", ] @@ -71,15 +71,54 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.103" +version = "1.0.102" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a4385e2e34eb35d6b3efe798b9eb88096925d87726c0798709bf56d9ed84af3" +checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" [[package]] name = "arrayvec" -version = "0.7.8" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3fb67a6e08acf24fdeccbac2cb6ac4305825bd1f117462e0e6f2f193345ad56" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "asn1-rs" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7f43a50ac4fdca5df8e885c21b835997f0a1cdee65494a6847694a98652d9d8" +dependencies = [ + "asn1-rs-derive", + "asn1-rs-impl", + "displaydoc", + "nom", + "num-traits", + "rusticata-macros", + "thiserror 2.0.18", + "time", +] + +[[package]] +name = "asn1-rs-derive" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3109e49b1e4909e9db6515a30c633684d68cdeaa252f215214cb4fa1a5bfee2c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", + "synstructure", +] + +[[package]] +name = "asn1-rs-impl" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] [[package]] name = "async-broadcast" @@ -174,7 +213,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.117", ] [[package]] @@ -209,7 +248,7 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.117", ] [[package]] @@ -247,6 +286,29 @@ version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" +[[package]] +name = "aws-lc-rs" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ec2f1fc3ec205783a5da9a7e6c1509cc69dedf09a1949e412c1e18469326d00" +dependencies = [ + "aws-lc-sys", + "untrusted 0.7.1", + "zeroize", +] + +[[package]] +name = "aws-lc-sys" +version = "0.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a2f9779ce85b93ab6170dd940ad0169b5766ff848247aff13bb788b832fe3f4" +dependencies = [ + "cc", + "cmake", + "dunce", + "fs_extra", +] + [[package]] name = "base64" version = "0.21.7" @@ -265,7 +327,7 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" dependencies = [ - "bit-vec", + "bit-vec 0.8.0", ] [[package]] @@ -274,6 +336,15 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" +[[package]] +name = "bit-vec" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b71798fca2c1fe1086445a7258a4bc81e6e49dcd24c8d0dd9a1e57395b603f51" +dependencies = [ + "serde", +] + [[package]] name = "bitflags" version = "1.3.2" @@ -291,9 +362,9 @@ dependencies = [ [[package]] name = "bitvec" -version = "1.1.1" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddcec3d12c579d40898fe0a9a358a803c23e9c52ca3c425707f81c9436211837" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" dependencies = [ "funty", "radium", @@ -310,6 +381,15 @@ dependencies = [ "generic-array", ] +[[package]] +name = "block-buffer" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdd35008169921d80bc60d3d0ab416eecb028c4cd653352907921d95084790be" +dependencies = [ + "hybrid-array", +] + [[package]] name = "block2" version = "0.6.2" @@ -334,9 +414,9 @@ dependencies = [ [[package]] name = "borsh" -version = "1.7.0" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f3f6da4992df95bbcd9af42a6c7dcb994498fc9048230405f3b36ff7cd3f145" +checksum = "cfd1e3f8955a5d7de9fab72fc8373fade9fb8a703968cb200ae3dc6cf08e185a" dependencies = [ "borsh-derive", "bytes", @@ -345,22 +425,22 @@ dependencies = [ [[package]] name = "borsh-derive" -version = "1.7.0" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ae8fb4fb5740e4b2c4884ff95f5f32f5e8479db1e8fd8eb49ddbe09eb09bb7c" +checksum = "bfcfdc083699101d5a7965e49925975f2f55060f94f9a05e7187be95d530ca59" dependencies = [ "once_cell", "proc-macro-crate 3.5.0", "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.117", ] [[package]] name = "brotli" -version = "8.0.4" +version = "8.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc91aac060a7a1e25823bdccbfb6af1875b88f17c6daac97894eed8207166b3" +checksum = "8119e4516436f5708bbc474a9d395bf12f1b5395e93a92a56e647ac3388c8610" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -369,9 +449,9 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "5.0.3" +version = "5.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a32acac15fe1967bc3986b2a6347dffc965602354ea6f450ad07e8bfd253583" +checksum = "5962523e1b92ce1b5e793d9169b9943eece10d39f62550bc04bb605d75b94924" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -394,9 +474,9 @@ checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" [[package]] name = "byte-unit" -version = "5.2.5" +version = "5.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a813de7f2bbedb7dce265b64f1cf5908ebe4d56281ece8d847e98113788b9b0" +checksum = "8c6d47a4e2961fb8721bcfc54feae6455f2f64e7054f9bc67e875f0e77f4c58d" dependencies = [ "rust_decimal", "schemars 1.2.1", @@ -440,9 +520,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.12.0" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae3f5d315924270530207e2a68396c3cc547f6dca3fbdca317cfb1a51edb593" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" dependencies = [ "serde", ] @@ -474,9 +554,9 @@ dependencies = [ [[package]] name = "camino" -version = "1.2.4" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f2d30e4173c4026932d51d31d6b0613b1fd3014bf3f9f8943d4ba139c437ba0" +checksum = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48" dependencies = [ "serde_core", ] @@ -516,11 +596,13 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.65" +version = "1.2.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e228eec9be7c17ccb640b59b36a5cd805ea2a564a4c5e162c2f659fea30d3b96" +checksum = "556e016178bb5662a08681bbe0f00f8e17631781a4dfc8c45e466e4b185ec27f" dependencies = [ "find-msvc-tools", + "jobserver", + "libc", "shlex", ] @@ -575,6 +657,15 @@ dependencies = [ "windows-link 0.2.1", ] +[[package]] +name = "cmake" +version = "0.1.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0f78a02292a74a88ac736019ab962ece0bc380e3f977bf72e376c5d78ff0678" +dependencies = [ + "cc", +] + [[package]] name = "combine" version = "4.6.7" @@ -594,6 +685,12 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "const-oid" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c" + [[package]] name = "const-random" version = "0.1.18" @@ -673,6 +770,15 @@ dependencies = [ "libc", ] +[[package]] +name = "cpufeatures" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" +dependencies = [ + "libc", +] + [[package]] name = "crc32fast" version = "1.5.0" @@ -713,6 +819,15 @@ dependencies = [ "typenum", ] +[[package]] +name = "crypto-common" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453" +dependencies = [ + "hybrid-array", +] + [[package]] name = "cssparser" version = "0.36.0" @@ -733,7 +848,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" dependencies = [ "quote", - "syn 2.0.118", + "syn 2.0.117", ] [[package]] @@ -772,7 +887,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.118", + "syn 2.0.117", ] [[package]] @@ -783,9 +898,15 @@ checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" dependencies = [ "darling_core", "quote", - "syn 2.0.118", + "syn 2.0.117", ] +[[package]] +name = "data-encoding" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8" + [[package]] name = "dbus" version = "0.9.11" @@ -797,12 +918,27 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "der-parser" +version = "10.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07da5016415d5a3c4dd39b11ed26f915f52fc4e0dc197d87908bc916e51bc1a6" +dependencies = [ + "asn1-rs", + "displaydoc", + "nom", + "num-bigint", + "num-traits", + "rusticata-macros", +] + [[package]] name = "deranged" version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" dependencies = [ + "powerfmt", "serde_core", ] @@ -824,7 +960,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 2.0.118", + "syn 2.0.117", ] [[package]] @@ -833,8 +969,19 @@ version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer", - "crypto-common", + "block-buffer 0.10.4", + "crypto-common 0.1.7", +] + +[[package]] +name = "digest" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" +dependencies = [ + "block-buffer 0.12.0", + "const-oid", + "crypto-common 0.2.2", ] [[package]] @@ -878,7 +1025,7 @@ checksum = "1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.117", ] [[package]] @@ -901,7 +1048,7 @@ checksum = "0fbbb781877580993a8707ec48672673ec7b81eeba04cfd2310bd28c08e47c8f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.117", ] [[package]] @@ -921,7 +1068,7 @@ checksum = "521e380c0c8afb8d9a1e83a1822ee03556fc3e3e7dbc1fd30be14e37f9cb3f89" dependencies = [ "bit-set", "cssparser", - "foldhash", + "foldhash 0.2.0", "html5ever", "precomputed-hash", "selectors", @@ -981,9 +1128,9 @@ checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" [[package]] name = "embed-resource" -version = "3.0.11" +version = "3.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbfdaacccebec3b28e4866b8973543c7647797db5ada1bdab552e48fe665fbbd" +checksum = "c31a88c8d26de40ed18fe748c547845aa39de1db3afd958f8cb91579f3644bcb" dependencies = [ "cc", "memchr", @@ -1023,7 +1170,7 @@ checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.117", ] [[package]] @@ -1140,6 +1287,12 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + [[package]] name = "foldhash" version = "0.2.0" @@ -1164,7 +1317,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.117", ] [[package]] @@ -1182,6 +1335,12 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "fs_extra" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" + [[package]] name = "funty" version = "2.0.0" @@ -1241,7 +1400,7 @@ checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.117", ] [[package]] @@ -1388,8 +1547,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" dependencies = [ "cfg-if", + "js-sys", "libc", "wasi", + "wasm-bindgen", ] [[package]] @@ -1399,20 +1560,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", + "js-sys", "libc", "r-efi 5.3.0", "wasip2", + "wasm-bindgen", ] [[package]] name = "getrandom" -version = "0.4.3" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" dependencies = [ "cfg-if", "libc", "r-efi 6.0.0", + "wasip2", + "wasip3", ] [[package]] @@ -1481,7 +1646,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.117", ] [[package]] @@ -1560,7 +1725,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.117", ] [[package]] @@ -1578,6 +1743,15 @@ version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "foldhash 0.1.5", +] + [[package]] name = "hashbrown" version = "0.17.1" @@ -1618,6 +1792,12 @@ dependencies = [ "markup5ever", ] +[[package]] +name = "httlib-huffman" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a9fcbcc408c5526c3ab80d534e5c86e7967c1fb7aa0a8c76abd1edc27deb877" + [[package]] name = "http" version = "1.4.2" @@ -1657,6 +1837,15 @@ version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" +[[package]] +name = "hybrid-array" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9155a582abd142abc056962c29e3ce5ff2ad5469f4246b537ed42c5deba857da" +dependencies = [ + "typenum", +] + [[package]] name = "hyper" version = "1.10.1" @@ -1816,6 +2005,12 @@ dependencies = [ "zerovec", ] +[[package]] +name = "id-arena" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" + [[package]] name = "ident_case" version = "1.0.1" @@ -1970,14 +2165,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" dependencies = [ "quote", - "syn 2.0.118", + "syn 2.0.117", +] + +[[package]] +name = "jobserver" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +dependencies = [ + "getrandom 0.3.4", + "libc", ] [[package]] name = "js-sys" -version = "0.3.103" +version = "0.3.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102" +checksum = "f2025f20d7a4fa7785846e7b63d10a76d3f1cee98ee5cb79ea59703f95e42162" dependencies = [ "cfg-if", "futures-util", @@ -2017,6 +2222,18 @@ dependencies = [ "unicode-segmentation", ] +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "leb128fmt" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" + [[package]] name = "libappindicator" version = "0.9.0" @@ -2068,9 +2285,9 @@ dependencies = [ [[package]] name = "libredox" -version = "0.1.18" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c943259e342f1e06ff2da7a83eabdfe7f92ce10262688dbf1895ff0b3e6e4652" +checksum = "f02ab6bace2054fb888a3c16f990117b579d14a3088e472d63c6011fa185c9d3" dependencies = [ "libc", ] @@ -2098,25 +2315,29 @@ dependencies = [ [[package]] name = "log" -version = "0.4.33" +version = "0.4.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" +checksum = "953f07c43838f8e6f9758cab68bf5bed85465e7587ebe0b823f1bcd81978ad3a" dependencies = [ "value-bag", ] [[package]] -name = "mac-notification-sys" -version = "0.6.15" +name = "lru-slab" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd604973958ddcc11b561193c0fb96ba146506ef2f231ef2e7c35fd2cbc9beca" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" + +[[package]] +name = "mac-notification-sys" +version = "0.6.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50efa634682b3fc5a1ab6f3dd5b2bce7b848011fc485b53b063dc68f2f74feae" dependencies = [ "cc", - "log", "objc2", "objc2-foundation", "time", - "uuid", ] [[package]] @@ -2132,9 +2353,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.8.2" +version = "2.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88904434abc2901f197fe8cc55f0445e7ded921dba5911dad2e2b39b48e663c4" +checksum = "6b947ae49db0d222b1dbc6b113ce7248a3fc3a6ca21b696717bfc000ba4484d8" [[package]] name = "memoffset" @@ -2151,6 +2372,12 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + [[package]] name = "miniz_oxide" version = "0.8.9" @@ -2174,9 +2401,9 @@ dependencies = [ [[package]] name = "muda" -version = "0.19.3" +version = "0.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dd04e60bc0b07438a6771710ee1698f98f6ebbc7f89b61264af1563b8aeb878" +checksum = "47a2e3dff89cd322c66647942668faee0a2b1f88ea6cbb4d374b4a8d7e92528c" dependencies = [ "crossbeam-channel", "dpi", @@ -2224,10 +2451,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" [[package]] -name = "notify-rust" -version = "4.18.0" +name = "nom" +version = "7.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5b4c1b4f2aa9f25f63a7a49d3dd0ed567b3670da15330a66b29434be899b891" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "notify-rust" +version = "4.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50ff2e74231b72c832d82982193b417f230945be6bdb5575b251d941d31adb00" dependencies = [ "futures-lite", "log", @@ -2237,12 +2474,31 @@ dependencies = [ "zbus", ] +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + [[package]] name = "num-conv" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -2271,7 +2527,7 @@ dependencies = [ "proc-macro-crate 3.5.0", "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.117", ] [[package]] @@ -2502,6 +2758,21 @@ dependencies = [ "objc2-security", ] +[[package]] +name = "octets" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8311fa8ab7a57759b4ff1f851a3048d9ef0effaa0130726426b742d26d8a88e7" + +[[package]] +name = "oid-registry" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12f40cff3dde1b6087cc5d5f5d4d65712f34016a03ed60e9c08dcc392736b5b7" +dependencies = [ + "asn1-rs", +] + [[package]] name = "once_cell" version = "1.21.4" @@ -2510,15 +2781,22 @@ checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" [[package]] name = "open" -version = "5.3.6" +version = "5.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd8d3b65c44123a56e0133d2cd06ce4361bd3ca99d41198b2f25e3c3db9b8b4a" +checksum = "2fbaa89d2ddc8473c78a3adf69eea8cffa28c483b8e02a971ef31527cd0fc92c" dependencies = [ "dunce", "is-wsl", "libc", + "pathdiff", ] +[[package]] +name = "openssl-probe" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" + [[package]] name = "option-ext" version = "0.2.0" @@ -2599,6 +2877,22 @@ dependencies = [ "windows-link 0.2.1", ] +[[package]] +name = "pathdiff" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" + +[[package]] +name = "pem" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d30c53c26bc5b31a98cd02d20f25a7c8567146caf63ed593a9d87b2775291be" +dependencies = [ + "base64 0.22.1", + "serde_core", +] + [[package]] name = "percent-encoding" version = "2.3.2" @@ -2646,7 +2940,7 @@ dependencies = [ "phf_shared", "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.117", ] [[package]] @@ -2689,7 +2983,7 @@ checksum = "092791278e026273c1b65bbdcfbba3a300f2994c896bd01ab01da613c29c46f1" dependencies = [ "base64 0.22.1", "indexmap 2.14.0", - "quick-xml", + "quick-xml 0.39.4", "serde", "time", ] @@ -2764,6 +3058,16 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn 2.0.117", +] + [[package]] name = "proc-macro-crate" version = "1.3.1" @@ -2846,6 +3150,15 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "quick-xml" +version = "0.37.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "331e97a1af0bf59823e6eadffe373d7b27f485be8748f71471c662c1f269b7fb" +dependencies = [ + "memchr", +] + [[package]] name = "quick-xml" version = "0.39.4" @@ -2856,10 +3169,66 @@ dependencies = [ ] [[package]] -name = "quote" -version = "1.0.46" +name = "quinn" +version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbc457d0c7a0759a614551b11a6409e5951f6c7537be1f1b7682b9ae9230368" +checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" +dependencies = [ + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls", + "socket2", + "thiserror 2.0.18", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "434b42fec591c96ef50e21e886936e66d3cc3f737104fdb9b737c40ffb94c098" +dependencies = [ + "aws-lc-rs", + "bytes", + "getrandom 0.3.4", + "lru-slab", + "rand 0.9.4", + "ring", + "rustc-hash", + "rustls", + "rustls-pki-types", + "slab", + "thiserror 2.0.18", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2", + "tracing", + "windows-sys 0.60.2", +] + +[[package]] +name = "quote" +version = "1.0.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" dependencies = [ "proc-macro2", ] @@ -2947,6 +3316,19 @@ version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" +[[package]] +name = "rcgen" +version = "0.14.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57f6d249aad744e274e682777a50283a225a32705394ee6d5fcc01efa25e4055" +dependencies = [ + "aws-lc-rs", + "rustls-pki-types", + "time", + "x509-parser", + "yasna", +] + [[package]] name = "redox_syscall" version = "0.5.18" @@ -2984,7 +3366,7 @@ checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.117", ] [[package]] @@ -3059,6 +3441,20 @@ dependencies = [ "web-sys", ] +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.17", + "libc", + "untrusted 0.9.0", + "windows-sys 0.52.0", +] + [[package]] name = "rkyv" version = "0.7.46" @@ -3100,9 +3496,9 @@ dependencies = [ [[package]] name = "rust_decimal" -version = "1.42.1" +version = "1.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be2a24f50780bc85f09cc6ac299bdf1424302742d77221106859c9d8b102126a" +checksum = "0c5108e3d4d903e21aac27f12ba5377b6b34f9f44b325e4894c7924169d06995" dependencies = [ "arrayvec", "borsh", @@ -3130,6 +3526,15 @@ dependencies = [ "semver", ] +[[package]] +name = "rusticata-macros" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632" +dependencies = [ + "nom", +] + [[package]] name = "rustix" version = "1.1.4" @@ -3143,6 +3548,56 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "rustls" +version = "0.23.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef86cd5876211988985292b91c96a8f2d298df24e75989a43a3c73f2d4d8168b" +dependencies = [ + "aws-lc-rs", + "log", + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-native-certs" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dab5152771c58876a2146916e53e35057e1a4dfa2b9df0f0305b07f611fdea4d" +dependencies = [ + "openssl-probe", + "rustls-pki-types", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pki-types" +version = "1.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30a7197ae7eb376e574fe940d068c30fe0462554a3ddbe4eca7838e049c937a9" +dependencies = [ + "web-time", + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" +dependencies = [ + "aws-lc-rs", + "ring", + "rustls-pki-types", + "untrusted 0.9.0", +] + [[package]] name = "rustversion" version = "1.0.22" @@ -3158,6 +3613,15 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "schannel" +version = "0.1.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" +dependencies = [ + "windows-sys 0.61.2", +] + [[package]] name = "schemars" version = "0.8.22" @@ -3209,7 +3673,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.118", + "syn 2.0.117", ] [[package]] @@ -3221,7 +3685,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.118", + "syn 2.0.117", ] [[package]] @@ -3236,6 +3700,29 @@ version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" +[[package]] +name = "security-framework" +version = "3.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" +dependencies = [ + "bitflags 2.13.0", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "selectors" version = "0.36.1" @@ -3304,7 +3791,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.117", ] [[package]] @@ -3315,7 +3802,7 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.117", ] [[package]] @@ -3340,7 +3827,7 @@ checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.117", ] [[package]] @@ -3390,7 +3877,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.117", ] [[package]] @@ -3412,7 +3899,7 @@ checksum = "772ee033c0916d670af7860b6e1ef7d658a4629a6d0b4c8c3e67f09b3765b75d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.117", ] [[package]] @@ -3431,8 +3918,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", - "cpufeatures", - "digest", + "cpufeatures 0.2.17", + "digest 0.10.7", +] + +[[package]] +name = "sha2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "digest 0.11.3", ] [[package]] @@ -3477,9 +3975,9 @@ checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] name = "smallvec" -version = "1.15.2" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] name = "socket2" @@ -3575,6 +4073,30 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" +[[package]] +name = "strum" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9628de9b8791db39ceda2b119bbe13134770b56c138ec1d3af810d045c04f9bd" + +[[package]] +name = "strum_macros" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab85eea0270ee17587ed4156089e10b9e6880ee688791d45a905f5b1ca36f664" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + [[package]] name = "swift-rs" version = "1.0.7" @@ -3599,9 +4121,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.118" +version = "2.0.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9ae57f904213ebb649ce6895b8a66c66f0203b9319718f69a5612a065b1422" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" dependencies = [ "proc-macro2", "quote", @@ -3625,7 +4147,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.117", ] [[package]] @@ -3689,7 +4211,7 @@ checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.117", ] [[package]] @@ -3706,8 +4228,8 @@ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "tauri" -version = "2.11.3" -source = "git+https://github.com/tauri-apps/tauri?branch=feat%2Fcef#20f3f2515c65ca1e115991c3ef3625e2c29c1bbb" +version = "2.11.2" +source = "git+https://github.com/tauri-apps/tauri?branch=feat%2Fcef#7372c8ee97fe590046aca95388895d7cf6b7d807" dependencies = [ "anyhow", "bytes", @@ -3739,11 +4261,11 @@ dependencies = [ "serde_repr", "serialize-to-javascript", "swift-rs", - "tauri-build", + "tauri-build 2.6.2 (git+https://github.com/tauri-apps/tauri?branch=feat%2Fcef)", "tauri-macros", "tauri-runtime", "tauri-runtime-wry", - "tauri-utils 2.9.3 (git+https://github.com/tauri-apps/tauri?branch=feat%2Fcef)", + "tauri-utils 2.9.2 (git+https://github.com/tauri-apps/tauri?branch=feat%2Fcef)", "thiserror 2.0.18", "tokio", "tray-icon", @@ -3756,8 +4278,29 @@ dependencies = [ [[package]] name = "tauri-build" -version = "2.6.3" -source = "git+https://github.com/tauri-apps/tauri?branch=feat%2Fcef#20f3f2515c65ca1e115991c3ef3625e2c29c1bbb" +version = "2.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4aa1f9055fc23919a54e4e125052bed16ed04aef0487086e758fe01a67b451c7" +dependencies = [ + "anyhow", + "cargo_toml", + "dirs", + "glob", + "heck 0.5.0", + "json-patch", + "schemars 0.8.22", + "semver", + "serde", + "serde_json", + "tauri-utils 2.9.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tauri-winres", + "walkdir", +] + +[[package]] +name = "tauri-build" +version = "2.6.2" +source = "git+https://github.com/tauri-apps/tauri?branch=feat%2Fcef#7372c8ee97fe590046aca95388895d7cf6b7d807" dependencies = [ "anyhow", "cargo_toml", @@ -3769,15 +4312,15 @@ dependencies = [ "semver", "serde", "serde_json", - "tauri-utils 2.9.3 (git+https://github.com/tauri-apps/tauri?branch=feat%2Fcef)", + "tauri-utils 2.9.2 (git+https://github.com/tauri-apps/tauri?branch=feat%2Fcef)", "tauri-winres", "walkdir", ] [[package]] name = "tauri-codegen" -version = "2.6.3" -source = "git+https://github.com/tauri-apps/tauri?branch=feat%2Fcef#20f3f2515c65ca1e115991c3ef3625e2c29c1bbb" +version = "2.6.2" +source = "git+https://github.com/tauri-apps/tauri?branch=feat%2Fcef#7372c8ee97fe590046aca95388895d7cf6b7d807" dependencies = [ "base64 0.22.1", "brotli", @@ -3790,9 +4333,9 @@ dependencies = [ "semver", "serde", "serde_json", - "sha2", - "syn 2.0.118", - "tauri-utils 2.9.3 (git+https://github.com/tauri-apps/tauri?branch=feat%2Fcef)", + "sha2 0.10.9", + "syn 2.0.117", + "tauri-utils 2.9.2 (git+https://github.com/tauri-apps/tauri?branch=feat%2Fcef)", "thiserror 2.0.18", "time", "url", @@ -3802,22 +4345,22 @@ dependencies = [ [[package]] name = "tauri-macros" -version = "2.6.3" -source = "git+https://github.com/tauri-apps/tauri?branch=feat%2Fcef#20f3f2515c65ca1e115991c3ef3625e2c29c1bbb" +version = "2.6.2" +source = "git+https://github.com/tauri-apps/tauri?branch=feat%2Fcef#7372c8ee97fe590046aca95388895d7cf6b7d807" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.117", "tauri-codegen", - "tauri-utils 2.9.3 (git+https://github.com/tauri-apps/tauri?branch=feat%2Fcef)", + "tauri-utils 2.9.2 (git+https://github.com/tauri-apps/tauri?branch=feat%2Fcef)", ] [[package]] name = "tauri-plugin" -version = "2.6.3" +version = "2.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74be5dd4bed9afbd145e5716b5fa2ec28cbc29c34ffa61c258c9273d896c8020" +checksum = "e126abc9e84e35cdfd01596140a73a1850cdb0df0a23acf0185776c30b469a6e" dependencies = [ "anyhow", "glob", @@ -3825,7 +4368,7 @@ dependencies = [ "schemars 0.8.22", "serde", "serde_json", - "tauri-utils 2.9.3 (registry+https://github.com/rust-lang/crates.io-index)", + "tauri-utils 2.9.2 (registry+https://github.com/rust-lang/crates.io-index)", "walkdir", ] @@ -3868,7 +4411,7 @@ dependencies = [ "serde_json", "tauri", "tauri-plugin", - "tauri-utils 2.9.3 (registry+https://github.com/rust-lang/crates.io-index)", + "tauri-utils 2.9.2 (registry+https://github.com/rust-lang/crates.io-index)", "thiserror 2.0.18", "tracing", "url", @@ -3941,8 +4484,8 @@ dependencies = [ [[package]] name = "tauri-runtime" -version = "2.11.3" -source = "git+https://github.com/tauri-apps/tauri?branch=feat%2Fcef#20f3f2515c65ca1e115991c3ef3625e2c29c1bbb" +version = "2.11.2" +source = "git+https://github.com/tauri-apps/tauri?branch=feat%2Fcef#7372c8ee97fe590046aca95388895d7cf6b7d807" dependencies = [ "cookie", "dpi", @@ -3954,7 +4497,7 @@ dependencies = [ "raw-window-handle", "serde", "serde_json", - "tauri-utils 2.9.3 (git+https://github.com/tauri-apps/tauri?branch=feat%2Fcef)", + "tauri-utils 2.9.2 (git+https://github.com/tauri-apps/tauri?branch=feat%2Fcef)", "thiserror 2.0.18", "url", "windows", @@ -3962,8 +4505,8 @@ dependencies = [ [[package]] name = "tauri-runtime-wry" -version = "2.11.3" -source = "git+https://github.com/tauri-apps/tauri?branch=feat%2Fcef#20f3f2515c65ca1e115991c3ef3625e2c29c1bbb" +version = "2.11.2" +source = "git+https://github.com/tauri-apps/tauri?branch=feat%2Fcef#7372c8ee97fe590046aca95388895d7cf6b7d807" dependencies = [ "gtk", "http", @@ -3978,7 +4521,7 @@ dependencies = [ "softbuffer", "tao", "tauri-runtime", - "tauri-utils 2.9.3 (git+https://github.com/tauri-apps/tauri?branch=feat%2Fcef)", + "tauri-utils 2.9.2 (git+https://github.com/tauri-apps/tauri?branch=feat%2Fcef)", "url", "webkit2gtk", "webview2-com", @@ -3988,9 +4531,9 @@ dependencies = [ [[package]] name = "tauri-utils" -version = "2.9.3" +version = "2.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e176a18e67764923c4f1ce66f25ae4abe5f688384d5eb1a0fa6c77f3d90f887" +checksum = "092379df9a707631978e6c56b1bc2401d387f01e2d4a3c123360d167bbb9aa95" dependencies = [ "anyhow", "cargo_metadata", @@ -4020,12 +4563,13 @@ dependencies = [ "url", "urlpattern", "uuid", + "walkdir", ] [[package]] name = "tauri-utils" -version = "2.9.3" -source = "git+https://github.com/tauri-apps/tauri?branch=feat%2Fcef#20f3f2515c65ca1e115991c3ef3625e2c29c1bbb" +version = "2.9.2" +source = "git+https://github.com/tauri-apps/tauri?branch=feat%2Fcef#7372c8ee97fe590046aca95388895d7cf6b7d807" dependencies = [ "anyhow", "brotli", @@ -4072,10 +4616,11 @@ dependencies = [ [[package]] name = "tauri-winrt-notification" -version = "0.7.3" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed071c670382e85fc2f48ae706492d8c338f4f89bf72520d32f8abfe880aade" +checksum = "0b1e66e07de489fe43a46678dd0b8df65e0c973909df1b60ba33874e297ba9b9" dependencies = [ + "quick-xml 0.37.5", "thiserror 2.0.18", "windows", "windows-version", @@ -4088,7 +4633,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" dependencies = [ "fastrand", - "getrandom 0.4.3", + "getrandom 0.4.2", "once_cell", "rustix", "windows-sys 0.61.2", @@ -4111,13 +4656,15 @@ dependencies = [ "serde", "serde_json", "tauri", - "tauri-build", + "tauri-build 2.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "tauri-plugin-app-events", "tauri-plugin-barcode-scanner", "tauri-plugin-deep-link", "tauri-plugin-log", "tauri-plugin-notification", "tauri-plugin-opener", + "ttp-core", + "ttp-tauri", ] [[package]] @@ -4146,7 +4693,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.117", ] [[package]] @@ -4157,16 +4704,17 @@ checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.117", ] [[package]] name = "time" -version = "0.3.53" +version = "0.3.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18dfaaeddcb932337b5e7866ee7d0ce9b76d2fd092997146f187ec09b4558a50" +checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" dependencies = [ "deranged", + "itoa", "libc", "num-conv", "num_threads", @@ -4178,15 +4726,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.9" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" +checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" [[package]] name = "time-macros" -version = "0.2.31" +version = "0.2.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c431b87111666e491a90baa837f914fb45cd5dc3c268591b0220ff5057f2085f" +checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" dependencies = [ "num-conv", "time-core", @@ -4235,11 +4783,25 @@ dependencies = [ "bytes", "libc", "mio", + "parking_lot", "pin-project-lite", + "signal-hook-registry", "socket2", + "tokio-macros", "windows-sys 0.61.2", ] +[[package]] +name = "tokio-macros" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + [[package]] name = "tokio-util" version = "0.7.18" @@ -4437,7 +4999,7 @@ checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.117", ] [[package]] @@ -4451,9 +5013,9 @@ dependencies = [ [[package]] name = "tray-icon" -version = "0.24.1" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65ba1e5f6b9ef9fd87e21b9c6f351554dbd717960089168fcfdef854686961dc" +checksum = "e47e6d063cfe4ad2e416fcbb310be3a37c5fd85c745b62cb562bfa4a003df674" dependencies = [ "crossbeam-channel", "dirs", @@ -4477,6 +5039,49 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" +[[package]] +name = "ttp-core" +version = "0.1.0" +source = "git+https://git.methanium.net/tensamin/ttp.git#0ccc2b808c1f8ff38ede906491ef703a51bd7786" +dependencies = [ + "base64 0.22.1", + "byteorder", + "rand 0.8.6", + "serde_json", + "strum", + "strum_macros", +] + +[[package]] +name = "ttp-native" +version = "0.1.0" +source = "git+https://git.methanium.net/tensamin/ttp.git#0ccc2b808c1f8ff38ede906491ef703a51bd7786" +dependencies = [ + "quinn", + "rustls", + "rustls-native-certs", + "thiserror 2.0.18", + "tokio", + "ttp-core", + "webpki-roots", + "wtransport", +] + +[[package]] +name = "ttp-tauri" +version = "0.1.0" +source = "git+https://git.methanium.net/tensamin/ttp.git#0ccc2b808c1f8ff38ede906491ef703a51bd7786" +dependencies = [ + "serde", + "serde_json", + "tauri", + "tauri-plugin", + "thiserror 2.0.18", + "tokio", + "ttp-core", + "ttp-native", +] + [[package]] name = "typeid" version = "1.0.3" @@ -4553,6 +5158,24 @@ version = "1.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + [[package]] name = "url" version = "2.5.8" @@ -4598,11 +5221,11 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] name = "uuid" -version = "1.23.4" +version = "1.23.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf80a72845275afea99e7f2b434723d3bc7e38470fcd1c7ed39a599c73319a53" +checksum = "144d6b123cef80b301b8f72a9e2ca4370ddec21950d0a103dd22c437006d2db7" dependencies = [ - "getrandom 0.4.3", + "getrandom 0.4.2", "js-sys", "serde_core", "wasm-bindgen", @@ -4673,18 +5296,27 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasip2" -version = "1.0.4+wasi-0.2.12" +version = "1.0.3+wasi-0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" +checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6" dependencies = [ - "wit-bindgen", + "wit-bindgen 0.57.1", +] + +[[package]] +name = "wasip3" +version = "0.4.0+wasi-0.3.0-rc-2026-01-06" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" +dependencies = [ + "wit-bindgen 0.51.0", ] [[package]] name = "wasm-bindgen" -version = "0.2.126" +version = "0.2.123" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4" +checksum = "a254a4b10c19a76f09a27640e7ffbf9bc30bf67e16a3bf28aaefa4920fe81563" dependencies = [ "cfg-if", "once_cell", @@ -4695,9 +5327,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.76" +version = "0.4.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c62df1340f32221cb9c54d6a27b030e3dba64361d4a95bed55f9aacb44da291d" +checksum = "54568702fabf5d4849ce2b90fadfa64168a097eaf4b351ce9df8b687a0086aaf" dependencies = [ "js-sys", "wasm-bindgen", @@ -4705,9 +5337,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.126" +version = "0.2.123" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1" +checksum = "24a40fc75b0ec6f3746ceb10d36f53a93dcd68a93b11b6445983945d79eba0dc" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4715,26 +5347,48 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.126" +version = "0.2.123" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e" +checksum = "908f34bd9b9ce3d4caf07b72dfab63d61504d156856c6bd3cd87fa350cf3985b" dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.117", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.126" +version = "0.2.123" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24" +checksum = "7acbf7616c27b194bbb550bf77ed0c2c3e5b7fd1260a93082b95fb7f47959b92" dependencies = [ "unicode-ident", ] +[[package]] +name = "wasm-encoder" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" +dependencies = [ + "leb128fmt", + "wasmparser", +] + +[[package]] +name = "wasm-metadata" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" +dependencies = [ + "anyhow", + "indexmap 2.14.0", + "wasm-encoder", + "wasmparser", +] + [[package]] name = "wasm-streams" version = "0.5.0" @@ -4749,10 +5403,32 @@ dependencies = [ ] [[package]] -name = "web-sys" -version = "0.3.103" +name = "wasmparser" +version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8622dcb61c0bcc9fffa6938bed81210af2da9a7e4a1a834b2e37a59b6dfb6141" +checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" +dependencies = [ + "bitflags 2.13.0", + "hashbrown 0.15.5", + "indexmap 2.14.0", + "semver", +] + +[[package]] +name = "web-sys" +version = "0.3.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e0871acf327f283dc6da28a1696cdc64fb355ba9f935d052021fa77f35cce69" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" dependencies = [ "js-sys", "wasm-bindgen", @@ -4760,9 +5436,9 @@ dependencies = [ [[package]] name = "web_atoms" -version = "0.2.5" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "075474b12bcb3d2e3d4546580e9de478eeeead668a1761e2a8860c836b7ef297" +checksum = "d7cff6eef815df1834fd250e3a2ff436044d82a9f1bc1980ca1dbdf07effc538" dependencies = [ "phf", "phf_codegen", @@ -4814,6 +5490,15 @@ dependencies = [ "system-deps", ] +[[package]] +name = "webpki-roots" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52f5ee44c96cf55f1b349600768e3ece3a8f26010c05265ab73f945bb1a2eb9d" +dependencies = [ + "rustls-pki-types", +] + [[package]] name = "webview2-com" version = "0.38.2" @@ -4836,7 +5521,7 @@ checksum = "67a921c1b6914c367b2b823cd4cde6f96beec77d30a939c8199bb377cf9b9b54" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.117", ] [[package]] @@ -4963,7 +5648,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.117", ] [[package]] @@ -4974,7 +5659,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.117", ] [[package]] @@ -5055,6 +5740,15 @@ dependencies = [ "windows-targets 0.42.2", ] +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + [[package]] name = "windows-sys" version = "0.59.0" @@ -5064,6 +5758,15 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + [[package]] name = "windows-sys" version = "0.61.2" @@ -5097,13 +5800,30 @@ dependencies = [ "windows_aarch64_gnullvm 0.52.6", "windows_aarch64_msvc 0.52.6", "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm", + "windows_i686_gnullvm 0.52.6", "windows_i686_msvc 0.52.6", "windows_x86_64_gnu 0.52.6", "windows_x86_64_gnullvm 0.52.6", "windows_x86_64_msvc 0.52.6", ] +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link 0.2.1", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", +] + [[package]] name = "windows-threading" version = "0.1.0" @@ -5134,6 +5854,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + [[package]] name = "windows_aarch64_msvc" version = "0.42.2" @@ -5146,6 +5872,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + [[package]] name = "windows_i686_gnu" version = "0.42.2" @@ -5158,12 +5890,24 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + [[package]] name = "windows_i686_msvc" version = "0.42.2" @@ -5176,6 +5920,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + [[package]] name = "windows_x86_64_gnu" version = "0.42.2" @@ -5188,6 +5938,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + [[package]] name = "windows_x86_64_gnullvm" version = "0.42.2" @@ -5200,6 +5956,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + [[package]] name = "windows_x86_64_msvc" version = "0.42.2" @@ -5212,6 +5974,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + [[package]] name = "winnow" version = "0.5.40" @@ -5246,12 +6014,100 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "wit-bindgen" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" +dependencies = [ + "wit-bindgen-rust-macro", +] + [[package]] name = "wit-bindgen" version = "0.57.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" +[[package]] +name = "wit-bindgen-core" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" +dependencies = [ + "anyhow", + "heck 0.5.0", + "wit-parser", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" +dependencies = [ + "anyhow", + "heck 0.5.0", + "indexmap 2.14.0", + "prettyplease", + "syn 2.0.117", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn 2.0.117", + "wit-bindgen-core", + "wit-bindgen-rust", +] + +[[package]] +name = "wit-component" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" +dependencies = [ + "anyhow", + "bitflags 2.13.0", + "indexmap 2.14.0", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder", + "wasm-metadata", + "wasmparser", + "wit-parser", +] + +[[package]] +name = "wit-parser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" +dependencies = [ + "anyhow", + "id-arena", + "indexmap 2.14.0", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", +] + [[package]] name = "writeable" version = "0.6.3" @@ -5288,7 +6144,7 @@ dependencies = [ "once_cell", "percent-encoding", "raw-window-handle", - "sha2", + "sha2 0.10.9", "soup3", "tao-macros", "thiserror 2.0.18", @@ -5302,6 +6158,42 @@ dependencies = [ "x11-dl", ] +[[package]] +name = "wtransport" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea4aacf790813ee1956751491800537f4e04af7557b7b370501ccbfbc85963e4" +dependencies = [ + "bytes", + "pem", + "quinn", + "rcgen", + "rustls", + "rustls-native-certs", + "rustls-pki-types", + "sha2 0.11.0", + "socket2", + "thiserror 2.0.18", + "time", + "tokio", + "tracing", + "url", + "wtransport-proto", + "x509-parser", +] + +[[package]] +name = "wtransport-proto" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5867c629e4252f7439d82315923daaf27f4fa442410d51b78ab93ef4c432a11" +dependencies = [ + "httlib-huffman", + "octets", + "thiserror 2.0.18", + "url", +] + [[package]] name = "wyz" version = "0.5.1" @@ -5332,6 +6224,34 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "x509-parser" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d43b0f71ce057da06bc0851b23ee24f3f86190b07203dd8f567d0b706a185202" +dependencies = [ + "asn1-rs", + "aws-lc-rs", + "data-encoding", + "der-parser", + "lazy_static", + "nom", + "oid-registry", + "rusticata-macros", + "thiserror 2.0.18", + "time", +] + +[[package]] +name = "yasna" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5f6765e852b9b4dc8e2a76843e4d64d1cea8e79bcde0b6901aea8e7c7f08282" +dependencies = [ + "bit-vec 0.9.1", + "time", +] + [[package]] name = "yoke" version = "0.8.3" @@ -5351,7 +6271,7 @@ checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.117", "synstructure", ] @@ -5399,7 +6319,7 @@ dependencies = [ "proc-macro-crate 3.5.0", "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.117", "zbus_names", "zvariant", "zvariant_utils", @@ -5418,22 +6338,22 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.52" +version = "0.8.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce1022995ff5ff5d841ad7d994facc23098cd40152f2c1d11cd607c6f530653f" +checksum = "3b065d4f0e55f82fae73202e189638116a87c55ab6b8e6c2721e13dd9d854ad1" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.52" +version = "0.8.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ae7f38b72ec2a254e2b87ef277cf2cd4fb97cbebf944faa6f33354da0867930" +checksum = "0b631b19d36a892ab55420c92dbc83ccd79274f25be714855d3074aa71cab639" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.117", ] [[package]] @@ -5453,10 +6373,16 @@ checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.117", "synstructure", ] +[[package]] +name = "zeroize" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" + [[package]] name = "zerotrie" version = "0.2.4" @@ -5487,7 +6413,7 @@ checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.117", ] [[package]] @@ -5519,7 +6445,7 @@ dependencies = [ "proc-macro-crate 3.5.0", "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.117", "zvariant_utils", ] @@ -5532,6 +6458,6 @@ dependencies = [ "proc-macro2", "quote", "serde", - "syn 2.0.118", + "syn 2.0.117", "winnow 1.0.3", ] diff --git a/apps/tauri/src-tauri/Cargo.toml b/apps/tauri/src-tauri/Cargo.toml index 1d3bdf5..556bb8b 100644 --- a/apps/tauri/src-tauri/Cargo.toml +++ b/apps/tauri/src-tauri/Cargo.toml @@ -15,7 +15,7 @@ name = "mobile_lib" crate-type = ["staticlib", "cdylib", "rlib"] [build-dependencies] -tauri-build = { git = "https://github.com/tauri-apps/tauri", branch = "feat/cef", features = [] } +tauri-build = { version = "2", features = [] } [dependencies] tauri-plugin-opener = "2" @@ -23,6 +23,8 @@ serde = { version = "1", features = ["derive"] } serde_json = "1" tauri-plugin-deep-link = "2" tauri-plugin-notification = "2" +ttp-core = { git = "https://git.methanium.net/tensamin/ttp.git", package = "ttp-core" } +ttp-tauri = { git = "https://git.methanium.net/tensamin/ttp.git", package = "ttp-tauri" } tauri-plugin-log = "2" [target.'cfg(target_os = "android")'.dependencies.tauri] diff --git a/apps/tauri/src-tauri/capabilities/default.json b/apps/tauri/src-tauri/capabilities/default.json index 73d510a..352eda0 100644 --- a/apps/tauri/src-tauri/capabilities/default.json +++ b/apps/tauri/src-tauri/capabilities/default.json @@ -9,9 +9,17 @@ "core:default", "opener:default", "core:window:default", + "core:window:allow-start-dragging", + "core:window:allow-close", + "core:window:allow-toggle-maximize", + "core:window:allow-minimize", "core:event:default", "deep-link:default", "notification:default", - "log:default" + "log:default", + "ttp-tauri:allow-connect", + "ttp-tauri:allow-send", + "ttp-tauri:allow-close", + "ttp-tauri:allow-ready-state" ] } diff --git a/apps/tauri/src-tauri/capabilities/mobile.json b/apps/tauri/src-tauri/capabilities/mobile.json index 342dd9e..d9914a6 100644 --- a/apps/tauri/src-tauri/capabilities/mobile.json +++ b/apps/tauri/src-tauri/capabilities/mobile.json @@ -14,6 +14,10 @@ "barcode-scanner:allow-scan", "barcode-scanner:allow-cancel", "notification:default", - "log:default" + "log:default", + "ttp-tauri:allow-connect", + "ttp-tauri:allow-send", + "ttp-tauri:allow-close", + "ttp-tauri:allow-ready-state" ] } diff --git a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher.png index cd21ec7..fbd7184 100644 Binary files a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher.png and b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png index fcd876f..0eac8d0 100644 Binary files a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png and b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png differ diff --git a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png index 772d941..7b90201 100644 Binary files a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png and b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher.png index 22e9714..10832d3 100644 Binary files a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher.png and b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png index 3de42b8..b2a3603 100644 Binary files a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png and b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png differ diff --git a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png index 6823287..f5fb52c 100644 Binary files a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png and b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png index de98c38..4a07614 100644 Binary files a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png and b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png index cab8a74..ac4b850 100644 Binary files a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png and b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png differ diff --git a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png index fe68af3..7ed0607 100644 Binary files a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png and b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index 0f90d7b..7aee207 100644 Binary files a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png index 8fca244..6ab46b6 100644 Binary files a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png and b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png differ diff --git a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png index 2f8677f..f596b89 100644 Binary files a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png and b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index 93598e4..1030031 100644 Binary files a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png index b3b35ee..f20325b 100644 Binary files a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png and b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png differ diff --git a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png index 94582d8..d70a938 100644 Binary files a/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png and b/apps/tauri/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/apps/tauri/src-tauri/icons/128x128.png b/apps/tauri/src-tauri/icons/128x128.png index 357e1c2..425ffb4 100644 Binary files a/apps/tauri/src-tauri/icons/128x128.png and b/apps/tauri/src-tauri/icons/128x128.png differ diff --git a/apps/tauri/src-tauri/icons/128x128@2x.png b/apps/tauri/src-tauri/icons/128x128@2x.png index be55e24..9fe4117 100644 Binary files a/apps/tauri/src-tauri/icons/128x128@2x.png and b/apps/tauri/src-tauri/icons/128x128@2x.png differ diff --git a/apps/tauri/src-tauri/icons/32x32.png b/apps/tauri/src-tauri/icons/32x32.png index bc4fba4..3c9a880 100644 Binary files a/apps/tauri/src-tauri/icons/32x32.png and b/apps/tauri/src-tauri/icons/32x32.png differ diff --git a/apps/tauri/src-tauri/icons/64x64.png b/apps/tauri/src-tauri/icons/64x64.png index 567f4ad..0f9e690 100644 Binary files a/apps/tauri/src-tauri/icons/64x64.png and b/apps/tauri/src-tauri/icons/64x64.png differ diff --git a/apps/tauri/src-tauri/icons/Square107x107Logo.png b/apps/tauri/src-tauri/icons/Square107x107Logo.png index 48dd0e1..1ec3cb3 100644 Binary files a/apps/tauri/src-tauri/icons/Square107x107Logo.png and b/apps/tauri/src-tauri/icons/Square107x107Logo.png differ diff --git a/apps/tauri/src-tauri/icons/Square142x142Logo.png b/apps/tauri/src-tauri/icons/Square142x142Logo.png index be8a336..5b92228 100644 Binary files a/apps/tauri/src-tauri/icons/Square142x142Logo.png and b/apps/tauri/src-tauri/icons/Square142x142Logo.png differ diff --git a/apps/tauri/src-tauri/icons/Square150x150Logo.png b/apps/tauri/src-tauri/icons/Square150x150Logo.png index 78b70fe..e1c1b1b 100644 Binary files a/apps/tauri/src-tauri/icons/Square150x150Logo.png and b/apps/tauri/src-tauri/icons/Square150x150Logo.png differ diff --git a/apps/tauri/src-tauri/icons/Square284x284Logo.png b/apps/tauri/src-tauri/icons/Square284x284Logo.png index c896c52..2d33951 100644 Binary files a/apps/tauri/src-tauri/icons/Square284x284Logo.png and b/apps/tauri/src-tauri/icons/Square284x284Logo.png differ diff --git a/apps/tauri/src-tauri/icons/Square30x30Logo.png b/apps/tauri/src-tauri/icons/Square30x30Logo.png index f8f8e7a..686bcb7 100644 Binary files a/apps/tauri/src-tauri/icons/Square30x30Logo.png and b/apps/tauri/src-tauri/icons/Square30x30Logo.png differ diff --git a/apps/tauri/src-tauri/icons/Square310x310Logo.png b/apps/tauri/src-tauri/icons/Square310x310Logo.png index 5fe0250..20207a5 100644 Binary files a/apps/tauri/src-tauri/icons/Square310x310Logo.png and b/apps/tauri/src-tauri/icons/Square310x310Logo.png differ diff --git a/apps/tauri/src-tauri/icons/Square44x44Logo.png b/apps/tauri/src-tauri/icons/Square44x44Logo.png index fbfc485..7fcb138 100644 Binary files a/apps/tauri/src-tauri/icons/Square44x44Logo.png and b/apps/tauri/src-tauri/icons/Square44x44Logo.png differ diff --git a/apps/tauri/src-tauri/icons/Square71x71Logo.png b/apps/tauri/src-tauri/icons/Square71x71Logo.png index 091f375..6be9a53 100644 Binary files a/apps/tauri/src-tauri/icons/Square71x71Logo.png and b/apps/tauri/src-tauri/icons/Square71x71Logo.png differ diff --git a/apps/tauri/src-tauri/icons/Square89x89Logo.png b/apps/tauri/src-tauri/icons/Square89x89Logo.png index 861261f..84bab9e 100644 Binary files a/apps/tauri/src-tauri/icons/Square89x89Logo.png and b/apps/tauri/src-tauri/icons/Square89x89Logo.png differ diff --git a/apps/tauri/src-tauri/icons/StoreLogo.png b/apps/tauri/src-tauri/icons/StoreLogo.png index 7cc6b2d..df2463e 100644 Binary files a/apps/tauri/src-tauri/icons/StoreLogo.png and b/apps/tauri/src-tauri/icons/StoreLogo.png differ diff --git a/apps/tauri/src-tauri/icons/icon.icns b/apps/tauri/src-tauri/icons/icon.icns index 7f3b591..7ea0993 100644 Binary files a/apps/tauri/src-tauri/icons/icon.icns and b/apps/tauri/src-tauri/icons/icon.icns differ diff --git a/apps/tauri/src-tauri/icons/icon.ico b/apps/tauri/src-tauri/icons/icon.ico index c5c68f8..fc67bfb 100644 Binary files a/apps/tauri/src-tauri/icons/icon.ico and b/apps/tauri/src-tauri/icons/icon.ico differ diff --git a/apps/tauri/src-tauri/icons/icon.png b/apps/tauri/src-tauri/icons/icon.png index dad3edb..8e56359 100644 Binary files a/apps/tauri/src-tauri/icons/icon.png and b/apps/tauri/src-tauri/icons/icon.png differ diff --git a/apps/tauri/src-tauri/icons/ios/AppIcon-20x20@1x.png b/apps/tauri/src-tauri/icons/ios/AppIcon-20x20@1x.png index e18a9c8..d7880c7 100644 Binary files a/apps/tauri/src-tauri/icons/ios/AppIcon-20x20@1x.png and b/apps/tauri/src-tauri/icons/ios/AppIcon-20x20@1x.png differ diff --git a/apps/tauri/src-tauri/icons/ios/AppIcon-20x20@2x-1.png b/apps/tauri/src-tauri/icons/ios/AppIcon-20x20@2x-1.png index 0861c9d..a447149 100644 Binary files a/apps/tauri/src-tauri/icons/ios/AppIcon-20x20@2x-1.png and b/apps/tauri/src-tauri/icons/ios/AppIcon-20x20@2x-1.png differ diff --git a/apps/tauri/src-tauri/icons/ios/AppIcon-20x20@2x.png b/apps/tauri/src-tauri/icons/ios/AppIcon-20x20@2x.png index 0861c9d..a447149 100644 Binary files a/apps/tauri/src-tauri/icons/ios/AppIcon-20x20@2x.png and b/apps/tauri/src-tauri/icons/ios/AppIcon-20x20@2x.png differ diff --git a/apps/tauri/src-tauri/icons/ios/AppIcon-20x20@3x.png b/apps/tauri/src-tauri/icons/ios/AppIcon-20x20@3x.png index 20e1a6e..3524382 100644 Binary files a/apps/tauri/src-tauri/icons/ios/AppIcon-20x20@3x.png and b/apps/tauri/src-tauri/icons/ios/AppIcon-20x20@3x.png differ diff --git a/apps/tauri/src-tauri/icons/ios/AppIcon-29x29@1x.png b/apps/tauri/src-tauri/icons/ios/AppIcon-29x29@1x.png index 1720996..5aa9fac 100644 Binary files a/apps/tauri/src-tauri/icons/ios/AppIcon-29x29@1x.png and b/apps/tauri/src-tauri/icons/ios/AppIcon-29x29@1x.png differ diff --git a/apps/tauri/src-tauri/icons/ios/AppIcon-29x29@2x-1.png b/apps/tauri/src-tauri/icons/ios/AppIcon-29x29@2x-1.png index a534e4c..36d8549 100644 Binary files a/apps/tauri/src-tauri/icons/ios/AppIcon-29x29@2x-1.png and b/apps/tauri/src-tauri/icons/ios/AppIcon-29x29@2x-1.png differ diff --git a/apps/tauri/src-tauri/icons/ios/AppIcon-29x29@2x.png b/apps/tauri/src-tauri/icons/ios/AppIcon-29x29@2x.png index a534e4c..36d8549 100644 Binary files a/apps/tauri/src-tauri/icons/ios/AppIcon-29x29@2x.png and b/apps/tauri/src-tauri/icons/ios/AppIcon-29x29@2x.png differ diff --git a/apps/tauri/src-tauri/icons/ios/AppIcon-29x29@3x.png b/apps/tauri/src-tauri/icons/ios/AppIcon-29x29@3x.png index e1cd9f0..4ece183 100644 Binary files a/apps/tauri/src-tauri/icons/ios/AppIcon-29x29@3x.png and b/apps/tauri/src-tauri/icons/ios/AppIcon-29x29@3x.png differ diff --git a/apps/tauri/src-tauri/icons/ios/AppIcon-40x40@1x.png b/apps/tauri/src-tauri/icons/ios/AppIcon-40x40@1x.png index 0861c9d..a447149 100644 Binary files a/apps/tauri/src-tauri/icons/ios/AppIcon-40x40@1x.png and b/apps/tauri/src-tauri/icons/ios/AppIcon-40x40@1x.png differ diff --git a/apps/tauri/src-tauri/icons/ios/AppIcon-40x40@2x-1.png b/apps/tauri/src-tauri/icons/ios/AppIcon-40x40@2x-1.png index 4fe3372..8b4aaa8 100644 Binary files a/apps/tauri/src-tauri/icons/ios/AppIcon-40x40@2x-1.png and b/apps/tauri/src-tauri/icons/ios/AppIcon-40x40@2x-1.png differ diff --git a/apps/tauri/src-tauri/icons/ios/AppIcon-40x40@2x.png b/apps/tauri/src-tauri/icons/ios/AppIcon-40x40@2x.png index 4fe3372..8b4aaa8 100644 Binary files a/apps/tauri/src-tauri/icons/ios/AppIcon-40x40@2x.png and b/apps/tauri/src-tauri/icons/ios/AppIcon-40x40@2x.png differ diff --git a/apps/tauri/src-tauri/icons/ios/AppIcon-40x40@3x.png b/apps/tauri/src-tauri/icons/ios/AppIcon-40x40@3x.png index a9e0a6c..dd1ff43 100644 Binary files a/apps/tauri/src-tauri/icons/ios/AppIcon-40x40@3x.png and b/apps/tauri/src-tauri/icons/ios/AppIcon-40x40@3x.png differ diff --git a/apps/tauri/src-tauri/icons/ios/AppIcon-512@2x.png b/apps/tauri/src-tauri/icons/ios/AppIcon-512@2x.png index 7ebf2f2..25d9e54 100644 Binary files a/apps/tauri/src-tauri/icons/ios/AppIcon-512@2x.png and b/apps/tauri/src-tauri/icons/ios/AppIcon-512@2x.png differ diff --git a/apps/tauri/src-tauri/icons/ios/AppIcon-60x60@2x.png b/apps/tauri/src-tauri/icons/ios/AppIcon-60x60@2x.png index a9e0a6c..dd1ff43 100644 Binary files a/apps/tauri/src-tauri/icons/ios/AppIcon-60x60@2x.png and b/apps/tauri/src-tauri/icons/ios/AppIcon-60x60@2x.png differ diff --git a/apps/tauri/src-tauri/icons/ios/AppIcon-60x60@3x.png b/apps/tauri/src-tauri/icons/ios/AppIcon-60x60@3x.png index 6e946d2..e46366a 100644 Binary files a/apps/tauri/src-tauri/icons/ios/AppIcon-60x60@3x.png and b/apps/tauri/src-tauri/icons/ios/AppIcon-60x60@3x.png differ diff --git a/apps/tauri/src-tauri/icons/ios/AppIcon-76x76@1x.png b/apps/tauri/src-tauri/icons/ios/AppIcon-76x76@1x.png index 22f1af4..c732ee4 100644 Binary files a/apps/tauri/src-tauri/icons/ios/AppIcon-76x76@1x.png and b/apps/tauri/src-tauri/icons/ios/AppIcon-76x76@1x.png differ diff --git a/apps/tauri/src-tauri/icons/ios/AppIcon-76x76@2x.png b/apps/tauri/src-tauri/icons/ios/AppIcon-76x76@2x.png index 828c395..52368fe 100644 Binary files a/apps/tauri/src-tauri/icons/ios/AppIcon-76x76@2x.png and b/apps/tauri/src-tauri/icons/ios/AppIcon-76x76@2x.png differ diff --git a/apps/tauri/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png b/apps/tauri/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png index ee9fc5d..d328f97 100644 Binary files a/apps/tauri/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png and b/apps/tauri/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png differ diff --git a/apps/tauri/src-tauri/src/lib.rs b/apps/tauri/src-tauri/src/lib.rs index 2a51174..cfa496a 100644 --- a/apps/tauri/src-tauri/src/lib.rs +++ b/apps/tauri/src-tauri/src/lib.rs @@ -2,7 +2,8 @@ pub fn run() { let builder = tauri::Builder::default() .plugin(tauri_plugin_log::Builder::new().level(tauri_plugin_log::log::LevelFilter::Info).build()) - .plugin(tauri_plugin_notification::init()); + .plugin(tauri_plugin_notification::init()) + .plugin(ttp_tauri::init()); let builder = builder .plugin(tauri_plugin_deep_link::init()) diff --git a/apps/tauri/src-tauri/tauri.conf.json b/apps/tauri/src-tauri/tauri.conf.json index 3fcf7bc..17effab 100644 --- a/apps/tauri/src-tauri/tauri.conf.json +++ b/apps/tauri/src-tauri/tauri.conf.json @@ -5,9 +5,9 @@ "mainBinaryName": "tensamin", "identifier": "net.tensamin.client", "build": { - "beforeDevCommand": "cd ../web && pnpm run dev && cd ../tauri", + "beforeDevCommand": "cd ../web && bun run dev && cd ../tauri", "devUrl": "http://localhost:3000", - "beforeBuildCommand": "cd ../.. && pnpm run build:web && cd apps/tauri", + "beforeBuildCommand": "cd ../.. && bun run build:web && cd apps/tauri", "frontendDist": "../../web/dist" }, "app": { diff --git a/apps/web/.gitignore b/apps/web/.gitignore index 8952e07..a547bf3 100644 --- a/apps/web/.gitignore +++ b/apps/web/.gitignore @@ -22,5 +22,3 @@ dist-ssr *.njsproj *.sln *.sw? - -.android diff --git a/apps/web/package.json b/apps/web/package.json index dfa243a..5cbfb60 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -4,128 +4,38 @@ "version": "0.0.0", "type": "module", "scripts": { - "format": "pnpm exec prettier --write .", + "format": "bunx prettier --write .", "lint": "eslint src", "dev": "vite --port 3000 --host 0.0.0.0", - "test": "vitest run --passWithNoTests", - "build": "pnpm run test && tsc -b && vite build", + "test": "bun test --pass-with-no-tests", + "build": "bun run test && tsc -b && vite build", "preview": "cd dist && nix-shell -p python3 --run 'python3 -m http.server 3000' && cd .." }, "dependencies": { - "@base-ui/react": "^1.0.0", - "@base-ui/utils": "0.3.1", - "@babel/runtime": "^7.29.2", - "@fontsource-variable/inter": "^5.2.8", "@fontsource-variable/public-sans": "^5.2.7", - "@floating-ui/core": "^1.7.0", - "@floating-ui/dom": "^1.7.0", - "@floating-ui/react-dom": "^2.1.8", - "@floating-ui/utils": "^0.2.11", - "@radix-ui/primitive": "^1.1.0", - "@radix-ui/react-compose-refs": "^1.1.1", - "@radix-ui/react-context": "^1.1.4", - "@radix-ui/react-dialog": "^1.1.6", - "@radix-ui/react-dismissable-layer": "^1.1.11", - "@radix-ui/react-focus-guards": "^1.1.4", - "@radix-ui/react-focus-scope": "^1.1.11", - "@radix-ui/react-id": "^1.1.0", - "@radix-ui/react-portal": "^1.1.13", - "@radix-ui/react-presence": "^1.1.6", - "@radix-ui/react-primitive": "^2.0.2", - "@radix-ui/react-slot": "^1.1.2", - "@radix-ui/react-use-callback-ref": "^1.1.1", - "@radix-ui/react-use-controllable-state": "^1.2.3", - "@radix-ui/react-use-effect-event": "^0.0.2", - "@radix-ui/react-use-layout-effect": "^1.1.0", - "@reduxjs/toolkit": "^2.0.0", "@tailwindcss/vite": "^4.2.4", - "@tanstack/devtools-event-client": "^0.3.0", - "@tanstack/query-core": "^5.0.0", "@tanstack/react-router": "^1.169.1", - "@tanstack/history": "1.162.0", - "@tanstack/react-store": "^0.9.3", - "@tanstack/router-core": "^1.169.1", - "@tanstack/store": "^0.9.3", - "@tanstack/virtual-core": "^3.13.24", "@tanstack/react-virtual": "^3.13.24", "@tauri-apps/api": "^2", "@tensamin/call": "workspace:*", - "@tensamin/cache": "workspace:*", "@tensamin/chat": "workspace:*", "@tensamin/crypto": "workspace:*", "@tensamin/shared": "workspace:*", - "@tensamin/settings": "workspace:*", "@tensamin/storage": "workspace:*", "@tensamin/tauri": "workspace:*", - "@tensamin/mtp": "workspace:*", + "@tensamin/ttp": "workspace:*", "@tensamin/tauth": "workspace:*", "@tensamin/markdown": "workspace:*", "@tensamin/ui": "*", "@tensamin/user": "workspace:*", "@tensamin/notifications": "workspace:*", - "aria-hidden": "^1.2.4", - "class-variance-authority": "^0.7.1", - "clsx": "^2.1.1", - "cmdk": "^1.1.1", - "cookie-es": "^3.0.0", - "d3-array": "^3.1.6", - "d3-color": "^3.1.0", - "d3-ease": "^3.0.1", - "d3-format": "^3.1.0", - "d3-interpolate": "^3.0.1", - "d3-path": "^3.0.1", - "d3-scale": "^4.0.2", - "d3-shape": "^3.1.0", - "d3-time": "^3.0.0", - "d3-time-format": "^4.1.0", - "d3-timer": "^3.0.1", - "date-fns": "^4.4.0", - "decimal.js-light": "^2.5.1", - "detect-node-es": "^1.1.0", - "dijkstrajs": "^1.0.1", - "embla-carousel": "8.6.0", - "embla-carousel-react": "^8.6.0", - "embla-carousel-reactive-utils": "8.6.0", - "es-toolkit": "^1.39.3", - "eventemitter3": "^5.0.1", - "get-nonce": "^1.0.1", - "immer": "^10.1.1", - "input-otp": "^1.4.2", - "internmap": "^2.0.3", "tw-animate-css": "^1.4.0", "lucide-react": "^1.14.0", - "next-themes": "^0.4.6", - "pngjs": "^5.0.0", "qrcode": "^1.5.4", "react": "^19.2.0", - "react-day-picker": "^10.0.1", "react-dom": "^19.2.0", - "react-is": "^19.0.0", - "react-redux": "^9.0.0", - "react-remove-scroll": "^2.7.2", - "react-remove-scroll-bar": "^2.3.7", - "react-resizable-panels": "^4.11.2", - "react-style-singleton": "^2.2.3", - "recharts": "3.8.1", - "redux": "^5.0.0", - "redux-thunk": "^3.1.0", - "reselect": "5.1.1", - "scheduler": "^0.27.0", - "seroval": "^1.5.4", - "seroval-plugins": "^1.5.4", - "shadcn": "^4.11.0", - "sonner": "^2.0.7", "tailwindcss": "^4.2.4", - "tailwind-merge": "^3.6.0", "tailwind-scrollbar-hide": "^4.0.0", - "tiny-invariant": "^1.3.3", - "tslib": "^2.8.1", - "use-callback-ref": "^1.3.3", - "use-sidecar": "^1.1.3", - "use-sync-external-store": "^1.2.2", - "vaul": "^1.1.2", - "victory-vendor": "^37.0.2", - "yargs": "^15.3.1", "zod": "^4.3.6" }, "devDependencies": { diff --git a/apps/web/src/components/modals/basic.tsx b/apps/web/src/components/modals/basic.tsx index 01794cb..8a7df3b 100644 --- a/apps/web/src/components/modals/basic.tsx +++ b/apps/web/src/components/modals/basic.tsx @@ -19,13 +19,13 @@ export function Basic({ extra?: React.ReactNode; }) { return ( - +
- + - {user.Display.slice(0, 2).toUpperCase()} + {user.display.slice(0, 2).toUpperCase()} @@ -34,7 +34,7 @@ export function Basic({
@@ -42,14 +42,15 @@ export function Basic({ } /> - {user.OnlineStatus.split("_") + {user.online_status + .split("_") .map((word) => word.charAt(0).toUpperCase() + word.slice(1)) .join(" ")}
-

{user.Display}

+

{user.display}

{extra}
@@ -58,5 +59,5 @@ export function Basic({ } export function Loading() { - return ; + return ; } diff --git a/apps/web/src/components/modals/profile.tsx b/apps/web/src/components/modals/profile.tsx index 62405cc..c46e4ef 100644 --- a/apps/web/src/components/modals/profile.tsx +++ b/apps/web/src/components/modals/profile.tsx @@ -1,27 +1,77 @@ import type { User } from "@tensamin/user/context"; -import { Avatar, AvatarFallback, AvatarImage, Button } from "@tensamin/ui"; +import { + Avatar, + AvatarFallback, + AvatarImage, + Button, + Tooltip, + TooltipContent, + TooltipTrigger, +} from "@tensamin/ui"; +import { toLossySixDigitCode } from "@tensamin/shared/code"; import Text from "@tensamin/markdown/text"; -import { ChevronDown, ChevronUp } from "lucide-react"; -import { useState } from "react"; +import { ChevronDown, ChevronUp, Info } from "lucide-react"; +import { useEffect, useState } from "react"; +import { useCrypto } from "@tensamin/crypto/context"; +import { useStorage } from "@tensamin/storage/context"; +import { useUser } from "@tensamin/user/context"; export default function Profile({ user }: { user: User }) { const [showAdvancedInformation, setShowAdvancedInformation] = useState(false); + const [sharedSecret, setSharedSecret] = useState(""); + + const { getSharedSecret } = useCrypto(); + const { load } = useStorage(); + const { get } = useUser(); + + useEffect(() => { + let active = true; + + void (async () => { + try { + const ownId = await load("user_id"); + const privateKey = await load("private_key"); + const ownData = await get(ownId); + const secret = await getSharedSecret( + privateKey, + ownData.public_key, + user.public_key, + ); + + if (active) { + setSharedSecret(secret); + } + } catch { + if (active) { + setSharedSecret(""); + } + } + })(); + + return () => { + active = false; + }; + }, [get, getSharedSecret, load, user.public_key]); + + const sharedSecretCode = sharedSecret + ? toLossySixDigitCode(sharedSecret) + : "------"; return (
- + - {user.Display.slice(0, 2).toUpperCase()} + {user.display.slice(0, 2).toUpperCase()}
-

{user.Display}

-

{user.Username}

+

{user.display}

+

{user.username}

- + } @@ -95,7 +96,7 @@ export default function Navbar({ forMobile }: { forMobile: boolean }) { ) } - loading={} + loading={} /> )}
@@ -120,8 +121,8 @@ export default function Navbar({ forMobile }: { forMobile: boolean }) { onClick={() => { void joinCall( id, - currentCalls[0].CallSecret, - currentCalls[0].CallId, + currentCalls[0].call_secret, + currentCalls[0].call_id, ); }} className="w-9 h-9 aspect-square rounded-lg" @@ -146,13 +147,13 @@ export default function Navbar({ forMobile }: { forMobile: boolean }) { {currentCalls.map((call) => ( { - void joinCall(id, call.CallSecret, call.CallId); + void joinCall(id, call.call_secret, call.call_id); }} > - {displayCallId(call.CallId)} + {displayCallId(call.call_id)} ))} @@ -194,6 +195,7 @@ export function MobileNavbar() {
- - + +
@@ -102,19 +126,45 @@ export function List({ label, id }: { const labelId = `${String(id)}-${index}`; const selected = selectedItems.has(index); const deletingSelectedItems = selectedItems.size > 1; + return ( - - setSelectedItems((previous) => { - const nextSelected = new Set(previous); - if (checked) nextSelected.add(index); - else nextSelected.delete(index); - return nextSelected; - })} /> -
-
} /> + + { + setSelectedItems((previous) => { + const nextSelected = new Set(previous); + + if (checked) { + nextSelected.add(index); + } else { + nextSelected.delete(index); + } + + return nextSelected; + }); + }} + /> + +
+
+ } + /> - deleteItems(deletingSelectedItems ? selectedItems : new Set([index]))}> + + deleteItems( + deletingSelectedItems + ? selectedItems + : new Set([index]), + ) + } + > {deletingSelectedItems ? "Delete Selected" : "Delete"} diff --git a/packages/settings/src/layout.tsx b/apps/web/src/features/settings/layout.tsx similarity index 53% rename from packages/settings/src/layout.tsx rename to apps/web/src/features/settings/layout.tsx index 1864d1b..36d366a 100644 --- a/packages/settings/src/layout.tsx +++ b/apps/web/src/features/settings/layout.tsx @@ -1,22 +1,25 @@ +import { Button, ClearStorageButton } from "@tensamin/ui"; + +import options from "@tensamin/shared/settings"; +import { cn, useIsMobile } from "@tensamin/ui"; import { Outlet, useLocation, useNavigate } from "@tanstack/react-router"; -import { Button, ClearStorageButton, cn, useIsMobile } from "@tensamin/ui"; -import { settingsNavigation } from "./manifest"; - -export default function SettingsLayout() { +export default function Screen() { const isMobile = useIsMobile(); const location = useLocation(); return (
{!isMobile && } + + {/* Page */}

{location.pathname .split("/") .pop() ?.replace(/-/g, " ") - .replace(/\b\w/g, (letter) => letter.toUpperCase())} + .replace(/\b\w/g, (l) => l.toUpperCase())}

@@ -25,32 +28,45 @@ export default function SettingsLayout() { } export function SettingsSidebar() { + const settingsOptions = options as Record< + string, + Record> + >; + const isMobile = useIsMobile(); const navigate = useNavigate(); - const categories = [...new Set(settingsNavigation.map((page) => page.category))]; return (
- {categories.map((category) => ( + {/* Settings */} + {Object.keys(settingsOptions).map((category) => ( + // Category

{category}

- {settingsNavigation - .filter((page) => page.category === category) - .map((page) => ( + {Object.keys(settingsOptions[category]).map((page) => ( + // Page +
- ))} +
+ ))}
))}
diff --git a/apps/web/src/index.css b/apps/web/src/index.css index 3037fec..f7dcb91 100644 --- a/apps/web/src/index.css +++ b/apps/web/src/index.css @@ -22,17 +22,6 @@ } } -@theme inline { - --radius-sm: calc(var(--radius) * 0.6); - --radius-md: calc(var(--radius) * 0.8); - --radius-lg: var(--radius); - --radius-xl: calc(var(--radius) * 1.4); - --radius-2xl: calc(var(--radius) * 1.8); - --radius-3xl: calc(var(--radius) * 2.2); - --radius-4xl: calc(var(--radius) * 2.6); - --radius-full: calc(var(--radius) * 9999); -} - html, body, #root { diff --git a/apps/web/src/index.tsx b/apps/web/src/index.tsx index f59bfc5..306e7e2 100644 --- a/apps/web/src/index.tsx +++ b/apps/web/src/index.tsx @@ -14,7 +14,7 @@ import "@tensamin/ui/index.css"; import NotFound from "@/routes/404"; import AppLayout from "@/routes/app/layout"; -import { createSettingsRoute } from "@tensamin/settings"; +import SettingsLayout from "@/features/settings/layout"; import Home from "@/routes/app/home"; import ChatScreen from "@tensamin/chat/screen"; @@ -23,16 +23,15 @@ import Login from "@/routes/screens/login"; import CallPopout from "@tensamin/call/popout"; import ChatContext from "@tensamin/chat/context"; -import { useCall, useInitializeCall } from "@tensamin/call/store"; -import { useIsSpeaking } from "@tensamin/call/speakingState"; -import { Provider as MTPProvider } from "@tensamin/mtp"; -import UserProvider from "@tensamin/user/context"; +import { useInitializeCall } from "@tensamin/call/store"; +import { Provider as TTPProvider } from "@tensamin/ttp"; +import UserContext from "@tensamin/user/context"; import DeeplinkContext from "@tensamin/tauri/deeplinkHandler"; import NotificationsProvider from "@tensamin/notifications/context"; import TAuthWrapper from "@tensamin/tauth/context"; -import { ErrorScreen, ThemeProvider, useTheme } from "@tensamin/ui"; +import { ThemeProvider, useTheme } from "@tensamin/ui"; import z from "zod"; import { useEffect, useRef, useState, type ReactNode } from "react"; @@ -41,10 +40,8 @@ import Storage from "@tensamin/storage/context"; import Session from "@tensamin/storage/session"; import Crypto from "@tensamin/crypto/context"; import DesktopMediaProvider from "@tensamin/shared/desktopMedia"; -import { log } from "@tensamin/shared/log"; import LegalWrapper from "@/features/legal/screen"; -import CacheSync from "@tensamin/cache/sync"; import { useStorage } from "@tensamin/storage/context"; import { useLocation, useNavigate } from "@tanstack/react-router"; @@ -73,39 +70,34 @@ window.setLogLevelToMax = () => { function LoginWrapper({ children }: { children: ReactNode }) { const [loggedIn, setLoggedIn] = useState(null); - const { load, secureStorage } = useStorage(); + const { load } = useStorage(); const navigate = useNavigate(); const location = useLocation(); useEffect(() => { - if (secureStorage === null) return; let active = true; - Promise.all([load("user_id"), load("mtp_keyring")]) - .then(([userId, keyring]) => { - if (!active) return; - if (userId !== 0 && keyring !== "") { - setLoggedIn(true); - if (location.pathname === "/login") { - void navigate({ to: "/", replace: true }); - } - return; - } - setLoggedIn(false); - void navigate({ - to: "/login", - replace: true, - }); - }) - .catch((error) => { - log(0, "login", "red", "Failed to load login state", error); + load("user_id").then((userId) => { + if (!active) { + return; + } + + if (userId !== 0) { + setLoggedIn(true); + return; + } + + setLoggedIn(false); + navigate({ + to: "/login", }); + }); return () => { active = false; }; - }, [load, location.pathname, navigate, secureStorage]); + }, [load, navigate]); if (loggedIn !== true && location.pathname !== "/login") { return null; @@ -127,10 +119,6 @@ function ThemeStorageBridge() { setThemePolarity, themeTint, setThemeTint, - themeBorderRadius, - setThemeBorderRadius, - themeCustomCss, - setThemeCustomCss, } = useTheme(); const loadedRef = useRef(false); @@ -143,41 +131,25 @@ function ThemeStorageBridge() { load("theme_primary_color"), load("theme_polarity"), load("theme_tint"), - load("theme_border_radius"), - load("theme_custom_css"), - ]).then( - ([ - color, - palette, - primaryColor, - polarity, - tint, - borderRadius, - customCss, - ]) => { - if (!active) { - return; - } + ]).then(([color, palette, primaryColor, polarity, tint]) => { + if (!active) { + return; + } - setThemeColor(color); - setThemePalette(palette); - setThemePrimaryColor(primaryColor); - setThemePolarity(polarity); - setThemeTint(tint); - setThemeBorderRadius(borderRadius); - setThemeCustomCss(customCss); - loadedRef.current = true; - }, - ); + setThemeColor(color); + setThemePalette(palette); + setThemePrimaryColor(primaryColor); + setThemePolarity(polarity); + setThemeTint(tint); + loadedRef.current = true; + }); return () => { active = false; }; }, [ load, - setThemeBorderRadius, setThemeColor, - setThemeCustomCss, setThemePalette, setThemePolarity, setThemePrimaryColor, @@ -185,33 +157,45 @@ function ThemeStorageBridge() { ]); useEffect(() => { - if (loadedRef.current) save("theme_color", themeColor); + if (!loadedRef.current) { + return; + } + + save("theme_color", themeColor); }, [save, themeColor]); useEffect(() => { - if (loadedRef.current) save("theme_palette", themePalette); + if (!loadedRef.current) { + return; + } + + save("theme_palette", themePalette); }, [save, themePalette]); useEffect(() => { - if (loadedRef.current) save("theme_primary_color", themePrimaryColor); + if (!loadedRef.current) { + return; + } + + save("theme_primary_color", themePrimaryColor); }, [save, themePrimaryColor]); useEffect(() => { - if (loadedRef.current) save("theme_polarity", themePolarity); + if (!loadedRef.current) { + return; + } + + save("theme_polarity", themePolarity); }, [save, themePolarity]); useEffect(() => { - if (loadedRef.current) save("theme_tint", themeTint); + if (!loadedRef.current) { + return; + } + + save("theme_tint", themeTint); }, [save, themeTint]); - useEffect(() => { - if (loadedRef.current) save("theme_border_radius", themeBorderRadius); - }, [save, themeBorderRadius]); - - useEffect(() => { - if (loadedRef.current) save("theme_custom_css", themeCustomCss); - }, [save, themeCustomCss]); - return null; } @@ -226,8 +210,6 @@ function RootShell() { paletteStorageKey={null} primaryColorStorageKey={null} tintStorageKey={null} - borderRadiusStorageKey={null} - customCssStorageKey={null} >
- + - + @@ -277,110 +258,18 @@ function AppShell() { - + - + ); } -function createCallTrayIcon(color: string, speaking: boolean) { - const canvas = document.createElement("canvas"); - canvas.width = 32; - canvas.height = 32; - - const context = canvas.getContext("2d"); - if (!context) return undefined; - - context.globalAlpha = speaking ? 1 : 0.55; - context.fillStyle = color; - context.beginPath(); - context.arc(16, 16, 13, 0, Math.PI * 2); - context.fill(); - - if (speaking) { - context.globalAlpha = 0.3; - context.fillStyle = "#ffffff"; - context.fill(); - } - - return canvas.toDataURL("image/png"); -} - function CallInit() { - useInitializeCall(); - - const { load } = useStorage(); - const { - themeColor, - themePalette, - themePrimaryColor, - themePolarity, - themeTint, - themeCustomCss, - } = useTheme(); - const [localUserId, setLocalUserId] = useState(-1); - const [primaryColor, setPrimaryColor] = useState(""); - const inCall = useCall((state) => state.state === "open"); - const speaking = useIsSpeaking(localUserId); - - useEffect(() => { - let active = true; - - load("user_id").then((userId) => { - if (active) setLocalUserId(userId); - }); - - return () => { - active = false; - }; - }, [load]); - - useEffect(() => { - const frame = requestAnimationFrame(() => { - setPrimaryColor( - getComputedStyle(document.documentElement) - .getPropertyValue("--primary") - .trim(), - ); - }); - - return () => cancelAnimationFrame(frame); - }, [ - themeColor, - themeCustomCss, - themePalette, - themePolarity, - themePrimaryColor, - themeTint, - ]); - - useEffect(() => { - const iconDataUrl = primaryColor - ? createCallTrayIcon(primaryColor, speaking) - : undefined; - - void window.tensaminDesktop?.call - ?.setStatus?.({ - inCall, - speaking: inCall && speaking, - iconDataUrl: inCall ? iconDataUrl : undefined, - }) - .catch((error: unknown) => { - console.error("Failed to update desktop call status", error); - }); - }, [inCall, primaryColor, speaking]); - - return null; + return useInitializeCall(); } const rootRoute = createRootRoute({ component: RootShell, - errorComponent: ({ error }: { error: Error }) => ( - - ), }); const appRoute = createRoute({ @@ -390,7 +279,47 @@ const appRoute = createRoute({ notFoundComponent: NotFound, }); -const settingsRoute = createSettingsRoute(appRoute); +const settingsRoute = createRoute({ + getParentRoute: () => appRoute, + path: "settings", + component: SettingsLayout, + staticData: { + showMobileNavbar: true, + }, +}); + +type SettingsRouteModule = { + default?: () => React.JSX.Element; + component?: () => React.JSX.Element; +}; + +const settingsRouteModules = import.meta.glob( + "./routes/settings/*.tsx", + { eager: true }, +); + +const settingsChildren = Object.entries(settingsRouteModules).map( + ([filePath, module]) => { + const fileName = filePath.split("/").pop()?.replace(".tsx", "") ?? ""; + const path = fileName === "index" ? "/" : fileName; + const component = module.component ?? module.default; + + if (!component) { + throw new Error( + `Settings route module "${filePath}" must export a default component`, + ); + } + + return createRoute({ + getParentRoute: () => settingsRoute, + path, + component, + staticData: { + showMobileNavbar: true, + }, + }); + }, +); const homeRoute = createRoute({ getParentRoute: () => appRoute, @@ -432,7 +361,12 @@ const loginRoute = createRoute({ }); const routeTree = rootRoute.addChildren([ - appRoute.addChildren([homeRoute, chatRoute, callRoute, settingsRoute]), + appRoute.addChildren([ + homeRoute, + chatRoute, + callRoute, + settingsRoute.addChildren(settingsChildren), + ]), loginRoute, ]); diff --git a/apps/web/src/routes/app/home.tsx b/apps/web/src/routes/app/home.tsx index ee5220b..ed725b1 100644 --- a/apps/web/src/routes/app/home.tsx +++ b/apps/web/src/routes/app/home.tsx @@ -11,47 +11,27 @@ import { useIsMobile, } from "@tensamin/ui"; import z from "zod"; -import { useMTP } from "@tensamin/mtp"; +import { useTTP } from "@tensamin/ttp"; import { useState } from "react"; import { Loader2 } from "lucide-react"; import { isTauri } from "@tauri-apps/api/core"; import { useSession } from "@tensamin/storage/session"; -import { useStorage } from "@tensamin/storage/context"; -import { ShieldAlert } from "lucide-react"; // The page export default function Page() { const isMobile = useIsMobile(); - const { secureStorage } = useStorage(); return ( -
-
- - -
- {secureStorage && !secureStorage.secure && ( -
- -
-

Secure storage is unavailable

-

{secureStorage.reason}

-

- Your keyring and cached messages will get saved in regular - storage. -

-
-
- )} +
+ +
); } // Add Conversation Button Component function AddConversationButton() { - const { send } = useMTP(); + const { send } = useTTP(); const { contacts, insertContact } = useSession(); const [loading, setLoading] = useState(false); const [open, setOpen] = useState(false); @@ -75,11 +55,11 @@ function AddConversationButton() { } // user existence check - const user = await send("GetUserData", { - Username: result.data, + const user = await send("get_user_data", { + username: result.data, }) .then((data) => { - if (data.data.UserId === 0) { + if (data.data.user_id === 0) { throw new Error(); } @@ -92,7 +72,7 @@ function AddConversationButton() { if (!user) return; // alrady added check - if (contacts.some((contact) => contact.UserId === user.data.UserId)) { + if (contacts.some((contact) => contact.user_id === user.data.user_id)) { setError("Conversation already exists"); return; } @@ -100,11 +80,11 @@ function AddConversationButton() { // add the conv const timeout = setTimeout(() => setLoading(true), 500); - send("AddConversation", { - ChatPartnerName: result.data, + send("add_conversation", { + chat_partner_name: result.data, }) .then(() => { - insertContact(user.data.UserId); + insertContact(user.data.user_id); setOpen(false); }) .catch((error) => { diff --git a/packages/settings/src/pages/chat.tsx b/apps/web/src/routes/settings/chat.tsx similarity index 67% rename from packages/settings/src/pages/chat.tsx rename to apps/web/src/routes/settings/chat.tsx index e8b9018..aef03c6 100644 --- a/packages/settings/src/pages/chat.tsx +++ b/apps/web/src/routes/settings/chat.tsx @@ -1,10 +1,7 @@ -import { storageDefaults } from "@tensamin/shared/data"; -import { useStorage } from "@tensamin/storage/context"; -import { Button, Kbd } from "@tensamin/ui"; -import { List, Switch } from "../components"; +import { List, Switch } from "@/features/settings/components"; +import { Kbd } from "@tensamin/ui"; export default function Page() { - const { save } = useStorage(); return (
-
- -
); diff --git a/packages/settings/src/pages/index.tsx b/apps/web/src/routes/settings/index.tsx similarity index 71% rename from packages/settings/src/pages/index.tsx rename to apps/web/src/routes/settings/index.tsx index e691f6c..568d53f 100644 --- a/packages/settings/src/pages/index.tsx +++ b/apps/web/src/routes/settings/index.tsx @@ -1,5 +1,5 @@ +import { SettingsSidebar } from "@/features/settings/layout"; import { useIsMobile } from "@tensamin/ui"; -import { SettingsSidebar } from "../layout"; export default function Page() { const isMobile = useIsMobile(); diff --git a/apps/web/src/routes/settings/licenses.tsx b/apps/web/src/routes/settings/licenses.tsx new file mode 100644 index 0000000..31293b1 --- /dev/null +++ b/apps/web/src/routes/settings/licenses.tsx @@ -0,0 +1,144 @@ +import { + Card, + CardContent, + CardTitle, + CardHeader, + CardDescription, + CardFooter, + Button, + Badge, + Dialog, + DialogContent, + DialogTrigger, +} from "@tensamin/ui"; +import { + packages, + packageCount, + generatedAt, +} from "../../../../../licenses/third-party-credits.json"; + +const licenseTexts = import.meta.glob("../../../../../licenses/**/*", { + eager: true, + import: "default", + query: "?raw", +}) as Record; + +function getLicenseFiles(licensePackage: (typeof packages)[number]) { + return licensePackage.files.map((fileName) => { + const path = + "../../../../../" + licensePackage.licenseFolder + "/" + fileName; + + return { + fileName, + text: licenseTexts[path], + }; + }); +} + +export default function Page() { + return ( +
+
+

Last generated: {generatedAt}

+

Package Count: {packageCount}

+
+
+
+ {packages.map((licensePackage) => ( + + + + {licensePackage.license} {licensePackage.name}{" "} + {licensePackage.version} + + + {licensePackage.description && ( + + + {licensePackage.description} + + + )} + + + {licensePackage.repository ? ( + + + + ) : ( + + )} + {licensePackage.homepage ? ( + + + + ) : ( + + )} + + + ))} +
+
+
+ ); +} + +function LicenseDialog({ + licensePackage, +}: { + licensePackage: (typeof packages)[number]; +}) { + const licenseFiles = getLicenseFiles(licensePackage); + const hasLicenseText = licenseFiles.some(({ text }) => text); + + return ( + + + Open License + + } + /> + +
+ {licenseFiles.map(({ fileName, text }, index) => ( +
+

= 1 && "pt-2"}`} + > + {fileName} +

+
+                {text ||
+                  "License text could not be loaded. Please contact support@tensamin.net"}
+              
+
+ ))} +
+
+
+ ); +} diff --git a/apps/web/src/routes/settings/profile.tsx b/apps/web/src/routes/settings/profile.tsx new file mode 100644 index 0000000..e0d6847 --- /dev/null +++ b/apps/web/src/routes/settings/profile.tsx @@ -0,0 +1,218 @@ +import { useStorage } from "@tensamin/storage/context"; +import { + Avatar, + AvatarFallback, + AvatarImage, + Button, + cn, + Input, + useIsMobile, +} from "@tensamin/ui"; +import { useUser, type User } from "@tensamin/user/context"; +import { useEffect, useRef, useState } from "react"; +import MDInput from "@tensamin/markdown/input"; +import { ttp } from "@tensamin/shared/data"; +import { useTTP } from "@tensamin/ttp"; +import { Check } from "lucide-react"; + +async function prepImage( + file: File, + size = 300, + quality = 0.8, +): Promise { + const bitmap = await createImageBitmap(file); + + const canvas = document.createElement("canvas"); + canvas.width = size; + canvas.height = size; + + const ctx = canvas.getContext("2d"); + if (!ctx) throw new Error("Could not get canvas context"); + + const scale = Math.max(size / bitmap.width, size / bitmap.height); + const width = bitmap.width * scale; + const height = bitmap.height * scale; + const x = (size - width) / 2; + const y = (size - height) / 2; + + ctx.drawImage(bitmap, x, y, width, height); + + return canvas.toDataURL("image/webp", quality); +} + +export default function Page() { + const { get } = useUser(); + const { load } = useStorage(); + const { send } = useTTP(); + const [currentUser, setCurrentUser] = useState(null); + const [draftUser, setDraftUser] = useState>({}); + const [errorMessage, setErrorMessage] = useState(""); + const [saveSucceeded, setSaveSucceeded] = useState(false); + const avatarUploadRef = useRef(null); + const draftInitializedRef = useRef(false); + const effectiveAvatar = + draftUser.avatar === "none" ? undefined : draftUser.avatar; + + const updateDraftUser = ( + updater: (previous: Partial) => Partial, + ) => { + setSaveSucceeded(false); + setErrorMessage(""); + setDraftUser(updater); + }; + + useEffect(() => { + const fetchUser = async () => { + const user = await get(await load("user_id")); + setCurrentUser(user); + }; + + fetchUser(); + }, [load, get]); + + useEffect(() => { + if (!currentUser || draftInitializedRef.current) return; + + setDraftUser(currentUser); + draftInitializedRef.current = true; + }, [currentUser]); + + const handleAvatarUpload = async (file: File) => { + const final = await prepImage(file); + updateDraftUser((prev) => ({ ...prev, avatar: final })); + if (avatarUploadRef.current) { + avatarUploadRef.current.value = ""; + } + }; + + const isMobile = useIsMobile(); + + return currentUser ? ( + <> + + e.target.files?.[0] && handleAvatarUpload(e.target.files[0]) + } + type="file" + /> +
+
+ + + + {draftUser.display?.slice(0, 2).toUpperCase() || + currentUser.display.slice(0, 2).toUpperCase()} + + +
+

Avatar

+
+ + +
+

+ GIFs are supported in decentralised mode or with Tensamin Premium. +
+ Maximum file size is 16mb. +

+
+
+ + updateDraftUser((prev) => ({ + ...prev, + display: event.target.value, + })) + } + placeholder="Display Name" + value={draftUser.display || ""} + /> + + updateDraftUser((prev) => ({ + ...prev, + username: event.target.value, + })) + } + placeholder="Username" + value={draftUser.username || ""} + /> + + updateDraftUser((prev) => ({ ...prev, about: value })) + } + value={draftUser.about || ""} + /> + + {errorMessage && ( +

{errorMessage}

+ )} +
+ + ) : ( +

Loading...

+ ); +} diff --git a/apps/web/src/routes/settings/security.tsx b/apps/web/src/routes/settings/security.tsx new file mode 100644 index 0000000..86c580e --- /dev/null +++ b/apps/web/src/routes/settings/security.tsx @@ -0,0 +1,125 @@ +import { useStorage } from "@tensamin/storage/context"; +import { useEffect, useState } from "react"; +import QRCode from "qrcode"; +import { + AlertDialog, + AlertDialogAction, + AlertDialogCancel, + AlertDialogContent, + AlertDialogDescription, + AlertDialogFooter, + AlertDialogHeader, + AlertDialogTitle, + AlertDialogTrigger, + Button, +} from "@tensamin/ui"; + +export default function Page() { + return ( +
+ +
+ ); +} + +// QR Code Login +const generateQR = async (text: string): Promise => { + try { + const url = await QRCode.toDataURL(text, { + errorCorrectionLevel: "H", + margin: 1, + color: { + dark: "#000000FF", + light: "#FFFFFFFF", + }, + }); + return url; + } catch (err) { + console.error(err); + throw err; + } +}; +function QrCodeLogin() { + const { load } = useStorage(); + const [userId, setUserId] = useState(0); + const [privateKey, setPrivateKey] = useState(""); + const [qrCodeBase64, setQrCodeBase64] = useState( + undefined, + ); + const [connectionString, setConnectionString] = useState(null); + + useEffect(() => { + load("private_key").then((value) => { + if (value) { + setPrivateKey(value); + } + }); + load("user_id").then((value) => { + if (value) { + setUserId(value); + } + }); + load("ttp_url") + .then((value) => { + if (value) { + const url = new URL(value); + setConnectionString(`@${url.host}`); + } else { + setConnectionString(""); + } + }) + .catch(() => setConnectionString("")); + }, [load]); + + useEffect(() => { + if (userId && privateKey && connectionString !== null) { + generateQR( + `tensamin://tu::${userId}${connectionString}::${privateKey}`, + ).then(setQrCodeBase64); + } + }, [userId, privateKey, connectionString]); + + const [qrCodeVisible, setQrCodeVisible] = useState(false); + + return ( +
+

Login QR Code

+
+ {qrCodeBase64 && ( + QR Code + )} + {!qrCodeVisible && ( + <> +
+
+ + Show QR Code} /> + + + Are you sure? + + Exposing this QR code is the same as sharing your .tu + file. Since changing your private key is quite tedious, + only do this when you're confident the key won't be + compromised. + + + + Cancel + setQrCodeVisible(true)}> + Show QR Code + + } + /> + + + +
+ + )} +
+
+ ); +} diff --git a/apps/web/src/routes/settings/theme.tsx b/apps/web/src/routes/settings/theme.tsx new file mode 100644 index 0000000..353dcc4 --- /dev/null +++ b/apps/web/src/routes/settings/theme.tsx @@ -0,0 +1,5 @@ +import { StylePicker } from "@tensamin/ui"; + +export default function Page() { + return ; +} diff --git a/apps/web/vite.config.ts b/apps/web/vite.config.ts index 3e05688..71fb4ac 100644 --- a/apps/web/vite.config.ts +++ b/apps/web/vite.config.ts @@ -6,7 +6,6 @@ import { fileURLToPath } from "node:url"; import { defineConfig, type Plugin } from "vite"; import react from "@vitejs/plugin-react"; import tailwindcss from "@tailwindcss/vite"; -import { mtp } from "mtp/vite"; const host = process.env.TAURI_DEV_HOST; const appDir = dirname(fileURLToPath(import.meta.url)); @@ -75,22 +74,6 @@ export default defineConfig({ }, ], dedupe: [ - "react", - "react-dom", - "react-redux", - "use-sync-external-store", - "@tanstack/history", - "@tanstack/react-router", - "@tanstack/react-store", - "@tanstack/router-core", - "@tanstack/store", - "@tensamin/crypto", - "@tensamin/settings", - "@tensamin/storage", - "@tensamin/mtp", - "@tensamin/user", - "@tensamin/tauri", - "@tensamin/chat", "@codemirror/commands", "@codemirror/lang-markdown", "@codemirror/state", @@ -110,42 +93,11 @@ export default defineConfig({ : undefined, watch: { ignored: ["**/src-tauri/**"], - usePolling: true, - interval: 100, }, }, envPrefix: ["VITE_", "TAURI_ENV_*"], optimizeDeps: { - include: [ - "react-redux", - "use-sync-external-store/shim/with-selector", - "use-sync-external-store/with-selector", - "decimal.js-light", - "eventemitter3", - "react-is", - ], - exclude: [ - "mtp", - "mtp/raw", - "mtp/type-map", - "@tensamin/call", - "@tensamin/call/utils", - "@tensamin/chat", - "@tensamin/crypto", - "@tensamin/crypto/context", - "@tensamin/markdown", - "@tensamin/mtp", - "@tensamin/notifications", - "@tensamin/shared", - "@tensamin/shared/data", - "@tensamin/shared/log", - "@tensamin/settings", - "@tensamin/storage", - "@tensamin/storage/context", - "@tensamin/tauri", - "@tensamin/tauth", - "@tensamin/user", - ], + exclude: ["@tensamin/ttp-core"], }, build: { minify: !process.env.TAURI_ENV_DEBUG ? "esbuild" : false, @@ -153,18 +105,6 @@ export default defineConfig({ }, plugins: [ deepFilterAssetHeaders(resolve(appDir, "public")), - mtp({ typeMaps: resolve(appDir, "../../type-maps.yaml") }), - { - name: "workspace-realpath-resolution", - enforce: "post", - config() { - return { - resolve: { - preserveSymlinks: false, - }, - }; - }, - }, react(), tailwindcss(), ], diff --git a/bun.lock b/bun.lock new file mode 100644 index 0000000..bfa8ee8 --- /dev/null +++ b/bun.lock @@ -0,0 +1,2216 @@ +{ + "lockfileVersion": 1, + "configVersion": 1, + "workspaces": { + "": { + "name": "tensamin", + "dependencies": { + "@tensamin/ttp-core": "*", + "@tensamin/ui": "*", + "sonner": "^2.0.7", + }, + "devDependencies": { + "@eslint/js": "^10.0.1", + "@types/node": "^25.6.0", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "@typescript-eslint/parser": "^8.59.1", + "eslint": "^10.2.1", + "eslint-plugin-react-hooks": "^7.1.1", + "fallow": "^2.86.0", + "globals": "^17.5.0", + "jsonc-parser": "^3.3.1", + "prettier": "^3.8.3", + "typescript": "^6.0.3", + "typescript-eslint": "^8.59.1", + }, + }, + "apps/electron": { + "name": "@tensamin/electron", + "version": "0.0.3", + "devDependencies": { + "@types/node": "^25.9.1", + "electron": "^39.2.7", + "electron-builder": "^26.0.12", + "esbuild": "^0.25.11", + "typescript": "~6.0.3", + }, + }, + "apps/tauri": { + "name": "@tensamin/tauri", + "version": "0.0.0", + "dependencies": { + "@tauri-apps/api": "^2", + "@tauri-apps/plugin-barcode-scanner": "~2", + "@tauri-apps/plugin-deep-link": "~2", + "@tauri-apps/plugin-log": "~2", + "@tauri-apps/plugin-notification": "~2", + "@tensamin/shared": "workspace:*", + "@tensamin/ui": "*", + "react": "^19.2.0", + "react-dom": "^19.2.0", + }, + "devDependencies": { + "@tauri-apps/cli": "^2", + "@types/node": "^25.9.1", + }, + }, + "apps/web": { + "name": "@tensamin/web", + "version": "0.0.0", + "dependencies": { + "@fontsource-variable/public-sans": "^5.2.7", + "@tailwindcss/vite": "^4.2.4", + "@tanstack/react-router": "^1.169.1", + "@tanstack/react-virtual": "^3.13.24", + "@tauri-apps/api": "^2", + "@tensamin/call": "workspace:*", + "@tensamin/chat": "workspace:*", + "@tensamin/crypto": "workspace:*", + "@tensamin/markdown": "workspace:*", + "@tensamin/notifications": "workspace:*", + "@tensamin/shared": "workspace:*", + "@tensamin/storage": "workspace:*", + "@tensamin/tauri": "workspace:*", + "@tensamin/tauth": "workspace:*", + "@tensamin/ttp": "workspace:*", + "@tensamin/ui": "*", + "@tensamin/user": "workspace:*", + "lucide-react": "^1.14.0", + "qrcode": "^1.5.4", + "react": "^19.2.0", + "react-dom": "^19.2.0", + "tailwind-scrollbar-hide": "^4.0.0", + "tailwindcss": "^4.2.4", + "tw-animate-css": "^1.4.0", + "zod": "^4.3.6", + }, + "devDependencies": { + "@eslint/js": "^10.0.1", + "@types/qrcode": "^1.5.6", + "@types/react": "^19.2.2", + "@types/react-dom": "^19.2.2", + "@vitejs/plugin-react": "^6.0.1", + "esbuild": "^0.25.11", + "eslint": "^10.0.3", + "globals": "^17.4.0", + "typescript": "~6.0.3", + "typescript-eslint": "^8.57.0", + "vite": "^8.0.10", + }, + }, + "packages/call": { + "name": "@tensamin/call", + "version": "0.0.0", + "dependencies": { + "@livekit/components-react": "^2.9.20", + "@tanstack/react-router": "^1.169.1", + "@tauri-apps/api": "^2", + "@tensamin/crypto": "workspace:*", + "@tensamin/shared": "workspace:*", + "@tensamin/storage": "workspace:*", + "@tensamin/ttp": "workspace:*", + "@tensamin/ui": "*", + "@tensamin/user": "workspace:*", + "deepfilternet3-noise-filter": "^1.2.1", + "livekit-client": "^2.18.8", + "lucide-react": "^1.14.0", + "react": "^19.2.0", + "react-dom": "^19.2.0", + "recharts": "^3.8.1", + "zod": "^4.3.6", + "zustand": "^5.0.8", + }, + }, + "packages/chat": { + "name": "@tensamin/chat", + "version": "0.0.0", + "dependencies": { + "@tanstack/pacer": "^0.21.1", + "@tanstack/react-query": "^5.0.0", + "@tanstack/react-router": "^1.0.0", + "@tanstack/react-virtual": "^3.0.0", + "@tensamin/crypto": "workspace:*", + "@tensamin/markdown": "workspace:*", + "@tensamin/shared": "workspace:*", + "@tensamin/storage": "workspace:*", + "@tensamin/ttp": "workspace:*", + "@tensamin/ui": "*", + "@tensamin/user": "workspace:*", + "lucide-react": "^1.14.0", + "react": "^19.2.0", + "react-dom": "^19.2.0", + "zod": "^4.3.6", + }, + }, + "packages/crypto": { + "name": "@tensamin/crypto", + "version": "0.0.0", + "dependencies": { + "@noble/curves": "^2.0.1", + "comlink": "^4.4.2", + "react": "^19.2.0", + "react-dom": "^19.2.0", + }, + }, + "packages/markdown": { + "name": "@tensamin/markdown", + "version": "0.0.0", + "dependencies": { + "@codemirror/commands": "^6.10.2", + "@codemirror/lang-markdown": "^6.5.0", + "@codemirror/state": "^6.5.4", + "@codemirror/view": "^6.41.1", + "react": "^19.2.0", + "react-dom": "^19.2.0", + }, + }, + "packages/notifications": { + "name": "@tensamin/notifications", + "version": "0.0.0", + "dependencies": { + "@tanstack/react-router": "^1.169.1", + "@tauri-apps/api": "^2.11.0", + "@tensamin/chat": "workspace:*", + "@tensamin/crypto": "workspace:*", + "@tensamin/shared": "workspace:*", + "@tensamin/storage": "workspace:*", + "@tensamin/ttp": "workspace:*", + "@tensamin/ui": "*", + "@tensamin/user": "workspace:*", + "react": "^19.2.0", + "react-dom": "^19.2.0", + "sonner": "^2.0.7", + "zod": "^4.3.6", + }, + }, + "packages/shared": { + "name": "@tensamin/shared", + "version": "0.0.0", + "dependencies": { + "@tensamin/ui": "*", + "lucide-react": "^1.14.0", + "react": "^19.2.0", + "react-dom": "^19.2.0", + "zod": "^4.3.6", + }, + }, + "packages/storage": { + "name": "@tensamin/storage", + "version": "0.0.0", + "dependencies": { + "@tensamin/shared": "workspace:*", + "@tensamin/ttp": "workspace:*", + "@tensamin/ui": "*", + "react": "^19.2.0", + "react-dom": "^19.2.0", + }, + }, + "packages/tauth": { + "name": "@tensamin/tauth", + "version": "0.0.0", + "dependencies": { + "@tanstack/react-router": "^1.0.0", + "@tauri-apps/api": "^2.10.1", + "@tensamin/crypto": "workspace:*", + "@tensamin/shared": "workspace:*", + "@tensamin/storage": "workspace:*", + "@tensamin/tauri": "workspace:*", + "@tensamin/ttp": "workspace:*", + "@tensamin/ui": "*", + "@tensamin/user": "workspace:*", + "lucide-react": "^1.8.0", + "react": "^19.2.0", + "react-dom": "^19.2.0", + }, + }, + "packages/ttp": { + "name": "@tensamin/ttp", + "version": "0.0.0", + "dependencies": { + "@tanstack/react-router": "^1.0.0", + "@tauri-apps/api": "^2", + "@tensamin/crypto": "workspace:*", + "@tensamin/shared": "workspace:*", + "@tensamin/storage": "workspace:*", + "@tensamin/ttp-core": "*", + "@tensamin/ui": "*", + "react": "^19.2.0", + "react-dom": "^19.2.0", + "tauri-plugin-app-events-api": "^0.2.0", + }, + "devDependencies": { + "eslint": "^10.0.3", + }, + }, + "packages/user": { + "name": "@tensamin/user", + "version": "0.0.0", + "dependencies": { + "@tensamin/shared": "workspace:*", + "@tensamin/storage": "workspace:*", + "@tensamin/ttp": "workspace:*", + "react": "^19.2.0", + "react-dom": "^19.2.0", + "zod": "^4.3.6", + }, + }, + }, + "overrides": { + "@tensamin/ttp-core": "https://git.methanium.net/tensamin/ttp/archive/0.0.24.tar.gz", + "@tensamin/ui": "https://git.methanium.net/tensamin/ui/archive/0.0.37.tar.gz", + }, + "packages": { + "@antfu/ni": ["@antfu/ni@25.0.0", "", { "dependencies": { "ansis": "^4.0.0", "fzf": "^0.5.2", "package-manager-detector": "^1.3.0", "tinyexec": "^1.0.1" }, "bin": { "na": "bin/na.mjs", "ni": "bin/ni.mjs", "nr": "bin/nr.mjs", "nci": "bin/nci.mjs", "nlx": "bin/nlx.mjs", "nun": "bin/nun.mjs", "nup": "bin/nup.mjs" } }, "sha512-9q/yCljni37pkMr4sPrI3G4jqdIk074+iukc5aFJl7kmDCCsiJrbZ6zKxnES1Gwg+i9RcDZwvktl23puGslmvA=="], + + "@babel/code-frame": ["@babel/code-frame@7.29.7", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw=="], + + "@babel/compat-data": ["@babel/compat-data@7.29.7", "", {}, "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg=="], + + "@babel/core": ["@babel/core@7.29.7", "", { "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" } }, "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA=="], + + "@babel/generator": ["@babel/generator@7.29.7", "", { "dependencies": { "@babel/parser": "^7.29.7", "@babel/types": "^7.29.7", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ=="], + + "@babel/helper-annotate-as-pure": ["@babel/helper-annotate-as-pure@7.29.7", "", { "dependencies": { "@babel/types": "^7.29.7" } }, "sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw=="], + + "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.29.7", "", { "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" } }, "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g=="], + + "@babel/helper-create-class-features-plugin": ["@babel/helper-create-class-features-plugin@7.29.7", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.29.7", "@babel/helper-member-expression-to-functions": "^7.29.7", "@babel/helper-optimise-call-expression": "^7.29.7", "@babel/helper-replace-supers": "^7.29.7", "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", "@babel/traverse": "^7.29.7", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg=="], + + "@babel/helper-globals": ["@babel/helper-globals@7.29.7", "", {}, "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA=="], + + "@babel/helper-member-expression-to-functions": ["@babel/helper-member-expression-to-functions@7.29.7", "", { "dependencies": { "@babel/traverse": "^7.29.7", "@babel/types": "^7.29.7" } }, "sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg=="], + + "@babel/helper-module-imports": ["@babel/helper-module-imports@7.29.7", "", { "dependencies": { "@babel/traverse": "^7.29.7", "@babel/types": "^7.29.7" } }, "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g=="], + + "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.29.7", "", { "dependencies": { "@babel/helper-module-imports": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7", "@babel/traverse": "^7.29.7" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg=="], + + "@babel/helper-optimise-call-expression": ["@babel/helper-optimise-call-expression@7.29.7", "", { "dependencies": { "@babel/types": "^7.29.7" } }, "sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong=="], + + "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.29.7", "", {}, "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw=="], + + "@babel/helper-replace-supers": ["@babel/helper-replace-supers@7.29.7", "", { "dependencies": { "@babel/helper-member-expression-to-functions": "^7.29.7", "@babel/helper-optimise-call-expression": "^7.29.7", "@babel/traverse": "^7.29.7" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ=="], + + "@babel/helper-skip-transparent-expression-wrappers": ["@babel/helper-skip-transparent-expression-wrappers@7.29.7", "", { "dependencies": { "@babel/traverse": "^7.29.7", "@babel/types": "^7.29.7" } }, "sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ=="], + + "@babel/helper-string-parser": ["@babel/helper-string-parser@7.29.7", "", {}, "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw=="], + + "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="], + + "@babel/helper-validator-option": ["@babel/helper-validator-option@7.29.7", "", {}, "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw=="], + + "@babel/helpers": ["@babel/helpers@7.29.7", "", { "dependencies": { "@babel/template": "^7.29.7", "@babel/types": "^7.29.7" } }, "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg=="], + + "@babel/parser": ["@babel/parser@7.29.7", "", { "dependencies": { "@babel/types": "^7.29.7" }, "bin": "./bin/babel-parser.js" }, "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg=="], + + "@babel/plugin-syntax-jsx": ["@babel/plugin-syntax-jsx@7.29.7", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.29.7" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A=="], + + "@babel/plugin-syntax-typescript": ["@babel/plugin-syntax-typescript@7.29.7", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.29.7" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA=="], + + "@babel/plugin-transform-modules-commonjs": ["@babel/plugin-transform-modules-commonjs@7.29.7", "", { "dependencies": { "@babel/helper-module-transforms": "^7.29.7", "@babel/helper-plugin-utils": "^7.29.7" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ=="], + + "@babel/plugin-transform-typescript": ["@babel/plugin-transform-typescript@7.29.7", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.29.7", "@babel/helper-create-class-features-plugin": "^7.29.7", "@babel/helper-plugin-utils": "^7.29.7", "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", "@babel/plugin-syntax-typescript": "^7.29.7" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw=="], + + "@babel/preset-typescript": ["@babel/preset-typescript@7.29.7", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.29.7", "@babel/helper-validator-option": "^7.29.7", "@babel/plugin-syntax-jsx": "^7.29.7", "@babel/plugin-transform-modules-commonjs": "^7.29.7", "@babel/plugin-transform-typescript": "^7.29.7" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-/Foi8vKY2EVbed/1eZx0gJEEwHAIxogrySI7rULcRIvhZzbvoE/b5qG5Ghc0WKAFKOHA9SD1x7RsFlOYdutIiQ=="], + + "@babel/runtime": ["@babel/runtime@7.29.7", "", {}, "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw=="], + + "@babel/template": ["@babel/template@7.29.7", "", { "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/parser": "^7.29.7", "@babel/types": "^7.29.7" } }, "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg=="], + + "@babel/traverse": ["@babel/traverse@7.29.7", "", { "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/generator": "^7.29.7", "@babel/helper-globals": "^7.29.7", "@babel/parser": "^7.29.7", "@babel/template": "^7.29.7", "@babel/types": "^7.29.7", "debug": "^4.3.1" } }, "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw=="], + + "@babel/types": ["@babel/types@7.29.7", "", { "dependencies": { "@babel/helper-string-parser": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7" } }, "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA=="], + + "@base-ui/react": ["@base-ui/react@1.5.0", "", { "dependencies": { "@babel/runtime": "^7.29.2", "@base-ui/utils": "0.2.9", "@floating-ui/react-dom": "^2.1.8", "@floating-ui/utils": "^0.2.11", "use-sync-external-store": "^1.6.0" }, "peerDependencies": { "@date-fns/tz": "^1.2.0", "@types/react": "^17 || ^18 || ^19", "date-fns": "^4.0.0", "react": "^17 || ^18 || ^19", "react-dom": "^17 || ^18 || ^19" }, "optionalPeers": ["@date-fns/tz", "@types/react", "date-fns"] }, "sha512-z1gSAlced1yY+iM+mHDEtIkD8UI3Ebs52MuBPxvV6f5hRutk+xvCH/wuB7hDqDzK9JG5FoMz5nhrqtSs1wjt1A=="], + + "@base-ui/utils": ["@base-ui/utils@0.2.9", "", { "dependencies": { "@babel/runtime": "^7.29.2", "@floating-ui/utils": "^0.2.11", "reselect": "^5.1.1", "use-sync-external-store": "^1.6.0" }, "peerDependencies": { "@types/react": "^17 || ^18 || ^19", "react": "^17 || ^18 || ^19", "react-dom": "^17 || ^18 || ^19" }, "optionalPeers": ["@types/react"] }, "sha512-x/PDDCYzoqPpjrdyb3VcyylTI2IjUXEtYDGi5foh7KsnmNJIIaVwA2GLgDH1dps1GgXiJbA60hM+AyuTfQzIvw=="], + + "@bufbuild/protobuf": ["@bufbuild/protobuf@1.10.1", "", {}, "sha512-wJ8ReQbHxsAfXhrf9ixl0aYbZorRuOWpBNzm8pL8ftmSxQx/wnJD5Eg861NwJU/czy2VXFIebCeZnZrI9rktIQ=="], + + "@codemirror/autocomplete": ["@codemirror/autocomplete@6.20.3", "", { "dependencies": { "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.17.0", "@lezer/common": "^1.0.0" } }, "sha512-tlosUqb+3BbxCxZdu4tKeRghPFC+QM7q4X5YhKV2eCmPG+1r2F3f4AaSz5sCrFqUtX4Jh20VFTKecl16MgiV9g=="], + + "@codemirror/commands": ["@codemirror/commands@6.10.3", "", { "dependencies": { "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.6.0", "@codemirror/view": "^6.27.0", "@lezer/common": "^1.1.0" } }, "sha512-JFRiqhKu+bvSkDLI+rUhJwSxQxYb759W5GBezE8Uc8mHLqC9aV/9aTC7yJSqCtB3F00pylrLCwnyS91Ap5ej4Q=="], + + "@codemirror/lang-css": ["@codemirror/lang-css@6.3.1", "", { "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.0.0", "@lezer/common": "^1.0.2", "@lezer/css": "^1.1.7" } }, "sha512-kr5fwBGiGtmz6l0LSJIbno9QrifNMUusivHbnA1H6Dmqy4HZFte3UAICix1VuKo0lMPKQr2rqB+0BkKi/S3Ejg=="], + + "@codemirror/lang-html": ["@codemirror/lang-html@6.4.11", "", { "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/lang-css": "^6.0.0", "@codemirror/lang-javascript": "^6.0.0", "@codemirror/language": "^6.4.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.17.0", "@lezer/common": "^1.0.0", "@lezer/css": "^1.1.0", "@lezer/html": "^1.3.12" } }, "sha512-9NsXp7Nwp891pQchI7gPdTwBuSuT3K65NGTHWHNJ55HjYcHLllr0rbIZNdOzas9ztc1EUVBlHou85FFZS4BNnw=="], + + "@codemirror/lang-javascript": ["@codemirror/lang-javascript@6.2.5", "", { "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/language": "^6.6.0", "@codemirror/lint": "^6.0.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.17.0", "@lezer/common": "^1.0.0", "@lezer/javascript": "^1.0.0" } }, "sha512-zD4e5mS+50htS7F+TYjBPsiIFGanfVqg4HyUz6WNFikgOPf2BgKlx+TQedI1w6n/IqRBVBbBWmGFdLB/7uxO4A=="], + + "@codemirror/lang-markdown": ["@codemirror/lang-markdown@6.5.0", "", { "dependencies": { "@codemirror/autocomplete": "^6.7.1", "@codemirror/lang-html": "^6.0.0", "@codemirror/language": "^6.3.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.0.0", "@lezer/common": "^1.2.1", "@lezer/markdown": "^1.0.0" } }, "sha512-0K40bZ35jpHya6FriukbgaleaqzBLZfOh7HuzqbMxBXkbYMJDxfF39c23xOgxFezR+3G+tR2/Mup+Xk865OMvw=="], + + "@codemirror/language": ["@codemirror/language@6.12.3", "", { "dependencies": { "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.23.0", "@lezer/common": "^1.5.0", "@lezer/highlight": "^1.0.0", "@lezer/lr": "^1.0.0", "style-mod": "^4.0.0" } }, "sha512-QwCZW6Tt1siP37Jet9Tb02Zs81TQt6qQrZR2H+eGMcFsL1zMrk2/b9CLC7/9ieP1fjIUMgviLWMmgiHoJrj+ZA=="], + + "@codemirror/lint": ["@codemirror/lint@6.9.7", "", { "dependencies": { "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.42.0", "crelt": "^1.0.5" } }, "sha512-28/+iWLYxKxsvGYhSYL7zaCZqLz5+FFFDq9tVsvGv9kv8RY4fFAchJ5WX9M3YrrRlTIsECjsXPqeNgnSmNP2dg=="], + + "@codemirror/state": ["@codemirror/state@6.6.0", "", { "dependencies": { "@marijn/find-cluster-break": "^1.0.0" } }, "sha512-4nbvra5R5EtiCzr9BTHiTLc+MLXK2QGiAVYMyi8PkQd3SR+6ixar/Q/01Fa21TBIDOZXgeWV4WppsQolSreAPQ=="], + + "@codemirror/view": ["@codemirror/view@6.43.1", "", { "dependencies": { "@codemirror/state": "^6.6.0", "crelt": "^1.0.6", "style-mod": "^4.1.0", "w3c-keyname": "^2.2.4" } }, "sha512-+BIjw/AG3tDQ4pJgTLPYdAW25eDE66YsvM4LKyVPgGzVgZ4a9Wj1SRX8kPVKgBDdPt8oHtZ15F0qx7p0oOHdHw=="], + + "@date-fns/tz": ["@date-fns/tz@1.5.0", "", {}, "sha512-lwYN/vDPeNRULcepoE/LO2Pgx+7/RV+S9ARfbc9lr2DtGkOD7pAiruHvbR1RX3Qyf6ja47EWJDMsNK5vK08DJg=="], + + "@dotenvx/dotenvx": ["@dotenvx/dotenvx@1.71.3", "", { "dependencies": { "commander": "^11.1.0", "dotenv": "^17.2.1", "eciesjs": "^0.4.10", "enquirer": "^2.4.1", "execa": "^5.1.1", "fdir": "^6.2.0", "ignore": "^5.3.0", "object-treeify": "1.1.33", "picomatch": "^4.0.4", "which": "^4.0.0", "yocto-spinner": "^1.1.0" }, "bin": { "dotenvx": "src/cli/dotenvx.js" } }, "sha512-WSmox5aD+XxJEUEOTk7gKLpd5+Iz9Nik89Zpbu5DijMln6LsFiv3xpNKBMc/b9sSkUlKvAblzrhik2TqKFE7NA=="], + + "@ecies/ciphers": ["@ecies/ciphers@0.2.6", "", { "peerDependencies": { "@noble/ciphers": "^1.0.0" } }, "sha512-patgsRPKGkhhoBjETV4XxD0En4ui5fbX0hzayqI3M8tvNMGUoUvmyYAIWwlxBc1KX5cturfqByYdj5bYGRpN9g=="], + + "@electron/asar": ["@electron/asar@3.4.1", "", { "dependencies": { "commander": "^5.0.0", "glob": "^7.1.6", "minimatch": "^3.0.4" }, "bin": { "asar": "bin/asar.js" } }, "sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA=="], + + "@electron/fuses": ["@electron/fuses@1.8.0", "", { "dependencies": { "chalk": "^4.1.1", "fs-extra": "^9.0.1", "minimist": "^1.2.5" }, "bin": { "electron-fuses": "dist/bin.js" } }, "sha512-zx0EIq78WlY/lBb1uXlziZmDZI4ubcCXIMJ4uGjXzZW0nS19TjSPeXPAjzzTmKQlJUZm0SbmZhPKP7tuQ1SsEw=="], + + "@electron/get": ["@electron/get@2.0.3", "", { "dependencies": { "debug": "^4.1.1", "env-paths": "^2.2.0", "fs-extra": "^8.1.0", "got": "^11.8.5", "progress": "^2.0.3", "semver": "^6.2.0", "sumchecker": "^3.0.1" }, "optionalDependencies": { "global-agent": "^3.0.0" } }, "sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ=="], + + "@electron/notarize": ["@electron/notarize@2.5.0", "", { "dependencies": { "debug": "^4.1.1", "fs-extra": "^9.0.1", "promise-retry": "^2.0.1" } }, "sha512-jNT8nwH1f9X5GEITXaQ8IF/KdskvIkOFfB2CvwumsveVidzpSc+mvhhTMdAGSYF3O+Nq49lJ7y+ssODRXu06+A=="], + + "@electron/osx-sign": ["@electron/osx-sign@1.3.3", "", { "dependencies": { "compare-version": "^0.1.2", "debug": "^4.3.4", "fs-extra": "^10.0.0", "isbinaryfile": "^4.0.8", "minimist": "^1.2.6", "plist": "^3.0.5" }, "bin": { "electron-osx-flat": "bin/electron-osx-flat.js", "electron-osx-sign": "bin/electron-osx-sign.js" } }, "sha512-KZ8mhXvWv2rIEgMbWZ4y33bDHyUKMXnx4M0sTyPNK/vcB81ImdeY9Ggdqy0SWbMDgmbqyQ+phgejh6V3R2QuSg=="], + + "@electron/rebuild": ["@electron/rebuild@4.0.4", "", { "dependencies": { "@malept/cross-spawn-promise": "^2.0.0", "debug": "^4.1.1", "node-abi": "^4.2.0", "node-api-version": "^0.2.1", "node-gyp": "^12.2.0", "read-binary-file-arch": "^1.0.6" }, "bin": { "electron-rebuild": "lib/cli.js" } }, "sha512-Rzc39XPdk/+/wBG8MfwAHohXflep0ITUfulb6Rgz3R0NeSB1noE+E9/M/cb8ftCAiyDD9PPhLuuWgE1GaInbKg=="], + + "@electron/universal": ["@electron/universal@2.0.3", "", { "dependencies": { "@electron/asar": "^3.3.1", "@malept/cross-spawn-promise": "^2.0.0", "debug": "^4.3.1", "dir-compare": "^4.2.0", "fs-extra": "^11.1.1", "minimatch": "^9.0.3", "plist": "^3.1.0" } }, "sha512-Wn9sPYIVFRFl5HmwMJkARCCf7rqK/EurkfQ/rJZ14mHP3iYTjZSIOSVonEAnhWeAXwtw7zOekGRlc6yTtZ0t+g=="], + + "@electron/windows-sign": ["@electron/windows-sign@1.2.2", "", { "dependencies": { "cross-dirname": "^0.1.0", "debug": "^4.3.4", "fs-extra": "^11.1.1", "minimist": "^1.2.8", "postject": "^1.0.0-alpha.6" }, "bin": { "electron-windows-sign": "bin/electron-windows-sign.js" } }, "sha512-dfZeox66AvdPtb2lD8OsIIQh12Tp0GNCRUDfBHIKGpbmopZto2/A8nSpYYLoedPIHpqkeblZ/k8OV0Gy7PYuyQ=="], + + "@emnapi/core": ["@emnapi/core@1.10.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.1", "tslib": "^2.4.0" } }, "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw=="], + + "@emnapi/runtime": ["@emnapi/runtime@1.10.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA=="], + + "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w=="], + + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.12", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA=="], + + "@esbuild/android-arm": ["@esbuild/android-arm@0.25.12", "", { "os": "android", "cpu": "arm" }, "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg=="], + + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.12", "", { "os": "android", "cpu": "arm64" }, "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg=="], + + "@esbuild/android-x64": ["@esbuild/android-x64@0.25.12", "", { "os": "android", "cpu": "x64" }, "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg=="], + + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.12", "", { "os": "darwin", "cpu": "arm64" }, "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg=="], + + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.12", "", { "os": "darwin", "cpu": "x64" }, "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA=="], + + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.12", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg=="], + + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.12", "", { "os": "freebsd", "cpu": "x64" }, "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ=="], + + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.12", "", { "os": "linux", "cpu": "arm" }, "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw=="], + + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.12", "", { "os": "linux", "cpu": "arm64" }, "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ=="], + + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.12", "", { "os": "linux", "cpu": "ia32" }, "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA=="], + + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng=="], + + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw=="], + + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.12", "", { "os": "linux", "cpu": "ppc64" }, "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA=="], + + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w=="], + + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.12", "", { "os": "linux", "cpu": "s390x" }, "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg=="], + + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.12", "", { "os": "linux", "cpu": "x64" }, "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw=="], + + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg=="], + + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.12", "", { "os": "none", "cpu": "x64" }, "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ=="], + + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.12", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A=="], + + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.12", "", { "os": "openbsd", "cpu": "x64" }, "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw=="], + + "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg=="], + + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.12", "", { "os": "sunos", "cpu": "x64" }, "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w=="], + + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.12", "", { "os": "win32", "cpu": "arm64" }, "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg=="], + + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.12", "", { "os": "win32", "cpu": "ia32" }, "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ=="], + + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.12", "", { "os": "win32", "cpu": "x64" }, "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA=="], + + "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.9.1", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ=="], + + "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="], + + "@eslint/config-array": ["@eslint/config-array@0.23.5", "", { "dependencies": { "@eslint/object-schema": "^3.0.5", "debug": "^4.3.1", "minimatch": "^10.2.4" } }, "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA=="], + + "@eslint/config-helpers": ["@eslint/config-helpers@0.6.0", "", { "dependencies": { "@eslint/core": "^1.2.1" } }, "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA=="], + + "@eslint/core": ["@eslint/core@1.2.1", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ=="], + + "@eslint/js": ["@eslint/js@10.0.1", "", { "peerDependencies": { "eslint": "^10.0.0" }, "optionalPeers": ["eslint"] }, "sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA=="], + + "@eslint/object-schema": ["@eslint/object-schema@3.0.5", "", {}, "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw=="], + + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.7.2", "", { "dependencies": { "@eslint/core": "^1.2.1", "levn": "^0.4.1" } }, "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A=="], + + "@fallow-cli/darwin-arm64": ["@fallow-cli/darwin-arm64@2.96.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-y5zqGloIyeDnLXtrmCDSaANK+jrEXIR9an3UokkIhtCvztq2/Oi4ha2kWgBuNDQhrT8dk9tXTYX/+lBV9a7Yhg=="], + + "@fallow-cli/darwin-x64": ["@fallow-cli/darwin-x64@2.96.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-ofN1Y4MoGV2bO19j0p7REZBdflZJ7oSAAel8DOQkrcoAqa5rEu2iJAFO0u9I0gSDxQG/g++GawojPK2jWsGz7Q=="], + + "@fallow-cli/linux-arm64-gnu": ["@fallow-cli/linux-arm64-gnu@2.96.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-GlHpuXQhrK/BpDLV2GahGHSL+LawzufDLGfFujdrLCsOsCHggqWr0T3NR6fuzHgapel/nhtjBRzWJSYAMz0PLg=="], + + "@fallow-cli/linux-arm64-musl": ["@fallow-cli/linux-arm64-musl@2.96.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-EAKnmAxvALNiSomznrT/UwGOSI3B/V2ISFoJFaIOcd+K2tVr9rbxNyv40gPWgzECWukiDn+u+vWMO+ul7fpd4A=="], + + "@fallow-cli/linux-x64-gnu": ["@fallow-cli/linux-x64-gnu@2.96.0", "", { "os": "linux", "cpu": "x64" }, "sha512-gobVZ9J1rhPanZyPkVHT0T9SmPHgC+C46IPPcjdjC0C655X7pAGV6CysVjvIBAo+pAIcUWVvkD5DiDa1OFYwgw=="], + + "@fallow-cli/linux-x64-musl": ["@fallow-cli/linux-x64-musl@2.96.0", "", { "os": "linux", "cpu": "x64" }, "sha512-SjeU14V5SYUhXzYjKOVo2oijpxYSbMxKoiKzeiKNK+hmMGC7SoCPruP9jD8IdsTr1NmgR+MdkKafxuGmWBvWKw=="], + + "@fallow-cli/win32-arm64-msvc": ["@fallow-cli/win32-arm64-msvc@2.96.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-KL6Xf/J/XPOhK0VfIURFYCyJ11tfa4pn6+HzKc8hKa4DucwJlvpO+Pk4937hEQgCkLC/HmCzZWPn3rE7WiIvNQ=="], + + "@fallow-cli/win32-x64-msvc": ["@fallow-cli/win32-x64-msvc@2.96.0", "", { "os": "win32", "cpu": "x64" }, "sha512-WXrNyYxqW4A1jMAZuMLInGuzL4E35kQlaDfLtGqkbC3vbbq36eMPmdoXuK8trtllqg0NA8Cd+KYQwN8xA8zzNA=="], + + "@floating-ui/core": ["@floating-ui/core@1.7.5", "", { "dependencies": { "@floating-ui/utils": "^0.2.11" } }, "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ=="], + + "@floating-ui/dom": ["@floating-ui/dom@1.7.4", "", { "dependencies": { "@floating-ui/core": "^1.7.3", "@floating-ui/utils": "^0.2.10" } }, "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA=="], + + "@floating-ui/react-dom": ["@floating-ui/react-dom@2.1.8", "", { "dependencies": { "@floating-ui/dom": "^1.7.6" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A=="], + + "@floating-ui/utils": ["@floating-ui/utils@0.2.11", "", {}, "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg=="], + + "@fontsource-variable/inter": ["@fontsource-variable/inter@5.2.8", "", {}, "sha512-kOfP2D+ykbcX/P3IFnokOhVRNoTozo5/JxhAIVYLpea/UBmCQ/YWPBfWIDuBImXX/15KH+eKh4xpEUyS2sQQGQ=="], + + "@fontsource-variable/public-sans": ["@fontsource-variable/public-sans@5.2.7", "", {}, "sha512-4mvade2J3slKkvwRkS+p8T3szet/0vhWoSnuUJTVU81Uo2pRpSZY/Y8bSLRqpSwzIPxjVmRJ53oq6JKP/l/PSg=="], + + "@hono/node-server": ["@hono/node-server@1.19.14", "", { "peerDependencies": { "hono": "^4" } }, "sha512-GwtvgtXxnWsucXvbQXkRgqksiH2Qed37H9xHZocE5sA3N8O8O8/8FA3uclQXxXVzc9XBZuEOMK7+r02FmSpHtw=="], + + "@humanfs/core": ["@humanfs/core@0.19.2", "", { "dependencies": { "@humanfs/types": "^0.15.0" } }, "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA=="], + + "@humanfs/node": ["@humanfs/node@0.16.8", "", { "dependencies": { "@humanfs/core": "^0.19.2", "@humanfs/types": "^0.15.0", "@humanwhocodes/retry": "^0.4.0" } }, "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ=="], + + "@humanfs/types": ["@humanfs/types@0.15.0", "", {}, "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q=="], + + "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="], + + "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="], + + "@inquirer/ansi": ["@inquirer/ansi@2.0.7", "", {}, "sha512-3eTuUO1vH2cZm2ZKHeQxnOqlTi9EfZDGgIe3BL3I4u+rJHocr9Fz86M4fjYABPvFnQG/gGK551HqDiIcETwU6Q=="], + + "@inquirer/confirm": ["@inquirer/confirm@6.1.1", "", { "dependencies": { "@inquirer/core": "^11.2.1", "@inquirer/type": "^4.0.7" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-eb8DBZcz/2qHWQda4rk2JiQk5h9QV/cVHi1yjt0f69WFZMRFn0sJTye3EAP8icut8UDMjQPsaH5KbcOogefrFQ=="], + + "@inquirer/core": ["@inquirer/core@11.2.1", "", { "dependencies": { "@inquirer/ansi": "^2.0.7", "@inquirer/figures": "^2.0.7", "@inquirer/type": "^4.0.7", "cli-width": "^4.1.0", "fast-wrap-ansi": "^0.2.0", "mute-stream": "^3.0.0", "signal-exit": "^4.1.0" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-Qd6GJT1yVyrZZCfN8W2qKF5ApmqryXRhRKCuip8h01x2w/esJQ2XIYc6f9abMIHgKQdBfFTSOdbHRLAhuM09UA=="], + + "@inquirer/figures": ["@inquirer/figures@2.0.7", "", {}, "sha512-aJ8TBPOGB6f/2qziPfElISTCEd5XOYTFckA2SGjhNmiKzfK/u4ot3v0DUzGVdUnKjN10EqnnEPck36BkyfLnJw=="], + + "@inquirer/type": ["@inquirer/type@4.0.7", "", { "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-t28inv14nMQ1PhKpsJPY+kEs/c00qzeCOS2gTNRyTjG5d6qsVA2fItxW4hkvGZ5lvanGLdtCzVIx5dwdRpN1+g=="], + + "@isaacs/fs-minipass": ["@isaacs/fs-minipass@4.0.1", "", { "dependencies": { "minipass": "^7.0.4" } }, "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w=="], + + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], + + "@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="], + + "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], + + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], + + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], + + "@lezer/common": ["@lezer/common@1.5.2", "", {}, "sha512-sxQE460fPZyU3sdc8lafxiPwJHBzZRy/udNFynGQky1SePYBdhkBl1kOagA9uT3pxR8K09bOrmTUqA9wb/PjSQ=="], + + "@lezer/css": ["@lezer/css@1.3.3", "", { "dependencies": { "@lezer/common": "^1.2.0", "@lezer/highlight": "^1.0.0", "@lezer/lr": "^1.3.0" } }, "sha512-RzBo8r+/6QJeow7aPHIpGVIH59xTcJXp399820gZoMo9noQDRVpJLheIBUicYwKcsbOYoBRoLZlf2720dG/4Tg=="], + + "@lezer/highlight": ["@lezer/highlight@1.2.3", "", { "dependencies": { "@lezer/common": "^1.3.0" } }, "sha512-qXdH7UqTvGfdVBINrgKhDsVTJTxactNNxLk7+UMwZhU13lMHaOBlJe9Vqp907ya56Y3+ed2tlqzys7jDkTmW0g=="], + + "@lezer/html": ["@lezer/html@1.3.13", "", { "dependencies": { "@lezer/common": "^1.2.0", "@lezer/highlight": "^1.0.0", "@lezer/lr": "^1.0.0" } }, "sha512-oI7n6NJml729m7pjm9lvLvmXbdoMoi2f+1pwSDJkl9d68zGr7a9Btz8NdHTGQZtW2DA25ybeuv/SyDb9D5tseg=="], + + "@lezer/javascript": ["@lezer/javascript@1.5.4", "", { "dependencies": { "@lezer/common": "^1.2.0", "@lezer/highlight": "^1.1.3", "@lezer/lr": "^1.3.0" } }, "sha512-vvYx3MhWqeZtGPwDStM2dwgljd5smolYD2lR2UyFcHfxbBQebqx8yjmFmxtJ/E6nN6u1D9srOiVWm3Rb4tmcUA=="], + + "@lezer/lr": ["@lezer/lr@1.4.10", "", { "dependencies": { "@lezer/common": "^1.0.0" } }, "sha512-rnCpTIBafOx4mRp43xOxDJbFipJm/c0cia/V5TiGlhmMa+wsSdoGmUN3w5Bqrks/09Q/D4tNAmWaT8p6NRi77A=="], + + "@lezer/markdown": ["@lezer/markdown@1.6.4", "", { "dependencies": { "@lezer/common": "^1.5.0", "@lezer/highlight": "^1.0.0" } }, "sha512-N0SxazMj4k65DBfaf1azqtMZd6u7MqluP84/NZnB/io8Td9aleFmAhz9hcbvSfsxT5tdYlJ5qgv5aMJGY4zEtA=="], + + "@livekit/components-core": ["@livekit/components-core@0.12.13", "", { "dependencies": { "@floating-ui/dom": "1.7.4", "loglevel": "1.9.1", "rxjs": "7.8.2" }, "peerDependencies": { "livekit-client": "^2.17.2", "tslib": "^2.6.2" } }, "sha512-DQmi84afHoHjZ62wm8y+XPNIDHTwFHAltjd3lmyXj8UZHOY7wcza4vFt1xnghJOD5wLRY58L1dkAgAw59MgWvw=="], + + "@livekit/components-react": ["@livekit/components-react@2.9.21", "", { "dependencies": { "@livekit/components-core": "0.12.13", "clsx": "2.1.1", "events": "^3.3.0", "jose": "^6.0.12", "usehooks-ts": "3.1.1" }, "peerDependencies": { "@livekit/krisp-noise-filter": "^0.2.12 || ^0.3.0", "livekit-client": "^2.18.2", "react": ">=18", "react-dom": ">=18", "tslib": "^2.6.2" }, "optionalPeers": ["@livekit/krisp-noise-filter"] }, "sha512-6hU9VucJJL+gAhilNGe4MBCDCZVk64qyjP9Ck86krvOIdVU76WeWksddg1MYUP10AlUwwrfD7davz41pJTcMJw=="], + + "@livekit/mutex": ["@livekit/mutex@1.1.1", "", {}, "sha512-EsshAucklmpuUAfkABPxJNhzj9v2sG7JuzFDL4ML1oJQSV14sqrpTYnsaOudMAw9yOaW53NU3QQTlUQoRs4czw=="], + + "@livekit/protocol": ["@livekit/protocol@1.45.8", "", { "dependencies": { "@bufbuild/protobuf": "^1.10.0" } }, "sha512-Q+l57E7w/xxOBFVWzdX5rkAZO7ffyF+rlDzNUYq2SU114+5aTyCq+PK4unaEVDNd4952Af7wteKr3sOgasGuaA=="], + + "@malept/cross-spawn-promise": ["@malept/cross-spawn-promise@2.0.0", "", { "dependencies": { "cross-spawn": "^7.0.1" } }, "sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg=="], + + "@malept/flatpak-bundler": ["@malept/flatpak-bundler@0.4.0", "", { "dependencies": { "debug": "^4.1.1", "fs-extra": "^9.0.0", "lodash": "^4.17.15", "tmp-promise": "^3.0.2" } }, "sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q=="], + + "@marijn/find-cluster-break": ["@marijn/find-cluster-break@1.0.2", "", {}, "sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g=="], + + "@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.29.0", "", { "dependencies": { "@hono/node-server": "^1.19.9", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.2.1", "express-rate-limit": "^8.2.1", "hono": "^4.11.4", "jose": "^6.1.3", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.1" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ=="], + + "@mswjs/interceptors": ["@mswjs/interceptors@0.41.9", "", { "dependencies": { "@open-draft/deferred-promise": "^2.2.0", "@open-draft/logger": "^0.3.0", "@open-draft/until": "^2.0.0", "is-node-process": "^1.2.0", "outvariant": "^1.4.3", "strict-event-emitter": "^0.5.1" } }, "sha512-VVPPgHyQ6ShqnrmDWuxjmUIsO9gWyOZFmuOfLd9LfBGQJwZfy0gvv9pbHSJuoFNIYC7ZDX9aoFwowjcdSC4E8w=="], + + "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.5", "", { "dependencies": { "@tybys/wasm-util": "^0.10.2" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" } }, "sha512-AWPoBRJ9tsnVhor4sjO7rkni+7p+2IAEFj6cx06UgP10jkQHqay/36uRV/bFkgrh18D9vb4cr8Q0Pthskgzy+Q=="], + + "@noble/ciphers": ["@noble/ciphers@1.3.0", "", {}, "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw=="], + + "@noble/curves": ["@noble/curves@2.2.0", "", { "dependencies": { "@noble/hashes": "2.2.0" } }, "sha512-T/BoHgFXirb0ENSPBquzX0rcjXeM6Lo892a2jlYJkqk83LqZx0l1Of7DzlKJ6jkpvMrkHSnAcgb5JegL8SeIkQ=="], + + "@noble/hashes": ["@noble/hashes@2.2.0", "", {}, "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg=="], + + "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], + + "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], + + "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], + + "@open-draft/deferred-promise": ["@open-draft/deferred-promise@3.0.0", "", {}, "sha512-XW375UK8/9SqUVNVa6M0yEy8+iTi4QN5VZ7aZuRFQmy76LRwI9wy5F4YIBU6T+eTe2/DNDo8tqu8RHlwLHM6RA=="], + + "@open-draft/logger": ["@open-draft/logger@0.3.0", "", { "dependencies": { "is-node-process": "^1.2.0", "outvariant": "^1.4.0" } }, "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ=="], + + "@open-draft/until": ["@open-draft/until@2.1.0", "", {}, "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg=="], + + "@oxc-project/types": ["@oxc-project/types@0.133.0", "", {}, "sha512-KzkdCd6Uxqnf6l3HOw1xfatAlUURA0g14cvBYFyJ5SaNOQbOUvBr9PKArcPcrNIeRsBdgcUzOGrhKveVpvOIGA=="], + + "@peculiar/asn1-schema": ["@peculiar/asn1-schema@2.8.0", "", { "dependencies": { "@peculiar/utils": "^2.0.2", "asn1js": "^3.0.10", "tslib": "^2.8.1" } }, "sha512-7YT0U/ze0tF2QOBbE15gKZwy5tvgGyLRiRHLzhlbOpf7BT032oBSd0haZqXn5W6l26WLlu3dyxzjM+2638/z2Q=="], + + "@peculiar/json-schema": ["@peculiar/json-schema@1.1.12", "", { "dependencies": { "tslib": "^2.0.0" } }, "sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w=="], + + "@peculiar/utils": ["@peculiar/utils@2.0.3", "", { "dependencies": { "tslib": "^2.8.1" } }, "sha512-+oL3HPFRIZ1St2K50lWCXiioIgSoxzz7R1J3uF6neO2yl1sgmpgY6XXJH4BdpoDkMWznQTeYF6oWNDZLCdQ4eQ=="], + + "@peculiar/webcrypto": ["@peculiar/webcrypto@1.7.1", "", { "dependencies": { "@peculiar/asn1-schema": "^2.7.0", "@peculiar/json-schema": "^1.1.12", "@peculiar/utils": "^2.0.2", "tslib": "^2.8.1", "webcrypto-core": "^1.9.2" } }, "sha512-ODOov0sGMJMf3jPonOkgGqPknTsu+DdQ7kD++gz8aI+aFMOMHFbWAA2taqXXVTdP+OTOQR/znGvSpmkeI0WTYQ=="], + + "@radix-ui/primitive": ["@radix-ui/primitive@1.1.4", "", {}, "sha512-7AdCK9PQyiljKoBDbN8OuctCbd/esdwZPQ8RtOE3SsyQtUpiPb+ND75q0jEhC1m1ecBI0MFNeLJvwIh9iKHRcQ=="], + + "@radix-ui/react-compose-refs": ["@radix-ui/react-compose-refs@1.1.3", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-rYOP8OMnuuPMQF1uhPVlGNcCDlkokKqGFE3JcxFViIkAXP7EvFWUliJAstrapypaBLJNHbZL6jGhbVDGTwmVhA=="], + + "@radix-ui/react-context": ["@radix-ui/react-context@1.1.4", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-QwH4PO5urrbO+FaGd5Aglg+YJgWTyyuZ3g/6mKvsqraLkglDdckw9JafgL5McL5VEJ6EPNduPaT3ZE9BttDAqg=="], + + "@radix-ui/react-dialog": ["@radix-ui/react-dialog@1.1.17", "", { "dependencies": { "@radix-ui/primitive": "1.1.4", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.1.4", "@radix-ui/react-dismissable-layer": "1.1.13", "@radix-ui/react-focus-guards": "1.1.4", "@radix-ui/react-focus-scope": "1.1.10", "@radix-ui/react-id": "1.1.2", "@radix-ui/react-portal": "1.1.12", "@radix-ui/react-presence": "1.1.6", "@radix-ui/react-primitive": "2.1.6", "@radix-ui/react-slot": "1.3.0", "@radix-ui/react-use-controllable-state": "1.2.3", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.7.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-TDTYmpdq8dI2+Xgvgj9AJ8Ghqq+Eph/TRVEdaFQPDItIY+6QSkU7MJMeevw1568Yw/2Ijz8BTphPSP2XejKphw=="], + + "@radix-ui/react-dismissable-layer": ["@radix-ui/react-dismissable-layer@1.1.13", "", { "dependencies": { "@radix-ui/primitive": "1.1.4", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-primitive": "2.1.6", "@radix-ui/react-use-callback-ref": "1.1.2", "@radix-ui/react-use-escape-keydown": "1.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-2v+zNAWWe0ySxgC0D0yeXMPQ23xZVgXZTerTz+JKlmdRj6gfTqmCcR29jb6d290DezXPGgruHWDX/vYUebtErg=="], + + "@radix-ui/react-focus-guards": ["@radix-ui/react-focus-guards@1.1.4", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-cot/aB/mOm0IYVYTTmQcEEK1M48lZWi8FlYe5nDPQQ8NYZUlXEFgncJ9p2Kzer3RKSrY7cTTpEMLZKNo9QoP5Q=="], + + "@radix-ui/react-focus-scope": ["@radix-ui/react-focus-scope@1.1.10", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-primitive": "2.1.6", "@radix-ui/react-use-callback-ref": "1.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Fas/lXQqhVvqwAb64s5RFeHiHYElZ6SUQbZaNd6EkfhP/Al7wTIQ9WIR4QVX475tlu5yFCEdDcJH6/UwsZjMWw=="], + + "@radix-ui/react-id": ["@radix-ui/react-id@1.1.2", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-orBC88futVpqCmhX1p4cvquNHsELQ+w+vBJnuj3ftETI5bJb0bZn3Tqu3SWN2IOcPycTnMGnhwoermvISt72sA=="], + + "@radix-ui/react-portal": ["@radix-ui/react-portal@1.1.12", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.6", "@radix-ui/react-use-layout-effect": "1.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m309havGzsjLHHaIX50G5PlvRs3xkgPCsGk/5PTvYm8D5q33yG0J7w/712PTOhid7NTaFETtnSXjngHQavvhVw=="], + + "@radix-ui/react-presence": ["@radix-ui/react-presence@1.1.6", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-zdTk4PlUO0E18HnZ3wYbW0KkJJxWCdiNYp6g6X1PtONFhxVkg01vliTJAmwIszU6mHiyBOoW9P0rAugl5/hULQ=="], + + "@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.6", "", { "dependencies": { "@radix-ui/react-slot": "1.3.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-wetd0QI77DbvrPpTAvH1SqOxsYF2wZe5TNxqwOd5Ty4XDpV3dpV0s8K/1MGMJBeY5o7lg8ub5VIt1Ub+yVen6g=="], + + "@radix-ui/react-slot": ["@radix-ui/react-slot@1.3.0", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.3" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-MojKku4U/miO8Av4Dkb+ctMAQx7JmY96LmtDQlAarCRtd7rN52QCSzBF+XAvr5S6coSVj9HEPBgHAHKEJVk/WA=="], + + "@radix-ui/react-use-callback-ref": ["@radix-ui/react-use-callback-ref@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-xCso9j1/u8sEgP1RNHjFrXJLApL8LiqOkI1R4ywuN00rxWdYg4oQXuwKLS3i0j5NWLromUD27/4nlxj2UFVvIw=="], + + "@radix-ui/react-use-controllable-state": ["@radix-ui/react-use-controllable-state@1.2.3", "", { "dependencies": { "@radix-ui/react-use-effect-event": "0.0.3", "@radix-ui/react-use-layout-effect": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-PLzC90MS+ReootmjC597dvopoelpZ8Q61HJkDXZSExitIq7PL55vHNnesAHwguHK0aPfBnpdNzQtv1uliaqQrA=="], + + "@radix-ui/react-use-effect-event": ["@radix-ui/react-use-effect-event@0.0.3", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-6c8ZqvPTWILEKnyVkP53EGRCcpnJiKTC21sS/6R1GF5xKyHJJWQEPfkqlcgUkdRQivd6tb23abUwe4ngWmY0JA=="], + + "@radix-ui/react-use-escape-keydown": ["@radix-ui/react-use-escape-keydown@1.1.2", "", { "dependencies": { "@radix-ui/react-use-callback-ref": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-2uVLvLjgO7NZCWw01/FdqRwmA42J0BcjPMUCA+koFEOAb+zjqIP7SiFz/7zWPrKnVmSqr76Omq2ALyCuX4dhLw=="], + + "@radix-ui/react-use-layout-effect": ["@radix-ui/react-use-layout-effect@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jrBWOxZITuGcnjRCM2t2U5ZPkCLxD+Ym6DjfssS5haTj2iiak/DOb64JeN6OdLfLgptb6/e2kKR+ZuTrGoZTPA=="], + + "@reduxjs/toolkit": ["@reduxjs/toolkit@2.12.0", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "@standard-schema/utils": "^0.3.0", "immer": "^11.0.0", "redux": "^5.0.1", "redux-thunk": "^3.1.0", "reselect": "^5.1.0" }, "peerDependencies": { "react": "^16.9.0 || ^17.0.0 || ^18 || ^19", "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" }, "optionalPeers": ["react", "react-redux"] }, "sha512-KiT+RzZbp6mQET+Mg+h2c97+9j1sNflUxQkIHI7Yuzf6Peu+OYpmkn6nbHWmLLWj+1ZODUJFwGZ7gx3L9R9EOw=="], + + "@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.0.3", "", { "os": "android", "cpu": "arm64" }, "sha512-454rs7jHngixp/NMxd5srYD57OnzSlZ/eFTETjORQHLwJG1lRtmNOJcBerZlfu4GjKqeq8aCCIQrMdHyhI51Hw=="], + + "@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.0.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-PcAhP+ynjURNyy8SKGl5DQP94aGuB/7JrXJb/t7P+hanXvQVMWzUvRRhBAcg/lNRadBhoUPqSoP4xw5tR/KBEA=="], + + "@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.0.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-9YpfeUvSE2RS7wysJ81uOZkXJz7f7Q55H2Gvp3VEw/EsahqDtrphrZ0EwDLK5vvKOzaCrBsjF8JmnMLcUt78Gg=="], + + "@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.0.3", "", { "os": "freebsd", "cpu": "x64" }, "sha512-yB1IlAsSNHncV6SCTL27/MVGR5htvQsoGxIv5KMGXALp+Ll1wYsn+x98M9MW7qa+NdSbvrrY7ANI4wLJ0n1e6g=="], + + "@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.0.3", "", { "os": "linux", "cpu": "arm" }, "sha512-Yi30IVAAfLUCy2MseFjbB1jAMDl1VMCAas5StnYp8da9+CKvMd2H2cbEjWcw5NPaPqzvYkVIaF1nNUG+b7u/sw=="], + + "@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.0.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-jsO7R8To+AdlYgUmN5sHSCZbfhtMBkO0WUx8iORQnPcMMdgr7qM2DQmMwgabs3GhNztdmoKkMKQFHD6DTMCIQw=="], + + "@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.0.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-VWkUHwWriDciit80wleYwKILoR/KMvxh/IdwS/paX+ZgpuRpCrKLUdadJbc0NpBEiyhpYawsJ73j9aCvOH+f7Q=="], + + "@rolldown/binding-linux-ppc64-gnu": ["@rolldown/binding-linux-ppc64-gnu@1.0.3", "", { "os": "linux", "cpu": "ppc64" }, "sha512-5f1laC0SlIR0yDbFCd8acUhvJIag6N3zC5P7oUPN6wX0aOma+uKJ0wBDH5aq7I1PVI2ttTlhJwzwRIBnLiSGEg=="], + + "@rolldown/binding-linux-s390x-gnu": ["@rolldown/binding-linux-s390x-gnu@1.0.3", "", { "os": "linux", "cpu": "s390x" }, "sha512-Iq4ko0r4XsgbrF/LunNgHtAGLRRVE2kXonAXQ/MV0mC6jQpMOhW1SvtZja2EhC/kd05++bP78dsqBeIQyYJ6Yg=="], + + "@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.0.3", "", { "os": "linux", "cpu": "x64" }, "sha512-B8m6tD5+/N5FeNQFbKlLA/2yVq9ycQP1SeedyEYYKWBNR3ZQbkvIUcNnDNM03lO1l5F2roiiFJGgvoLLyZXtSg=="], + + "@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.0.3", "", { "os": "linux", "cpu": "x64" }, "sha512-pSdpdUJHkuCxun9LE7jvgUB9qsRgaiyNNCX7m/AvHTcq67AiT/Yhoxvw5zPfhrM8k/BfP8ce/hMOpthKDpEUow=="], + + "@rolldown/binding-openharmony-arm64": ["@rolldown/binding-openharmony-arm64@1.0.3", "", { "os": "none", "cpu": "arm64" }, "sha512-OXXS3RKJgX2uLwM+gYyuH5omcH8fL1LJs96pZGgtetVCahON57+d4SJHzTgZiOjxgGkSnpXpOsWuPDGAKAigEg=="], + + "@rolldown/binding-wasm32-wasi": ["@rolldown/binding-wasm32-wasi@1.0.3", "", { "dependencies": { "@emnapi/core": "1.10.0", "@emnapi/runtime": "1.10.0", "@napi-rs/wasm-runtime": "^1.1.4" }, "cpu": "none" }, "sha512-JTtb8BWFynicNSoPrehsCzBtOKjZ6jhMiPFEmOiuXg1Fl8dn2KHQob+GuPSGR0dryQa1PQJbzjF3dqO/whhjLg=="], + + "@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.0.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-gEdFFEN70A/jxb2svrWsN3aDL7OUtmvlOy+6fa2jxG8K0wQ1ZbdeLGnidov6Yu5/733dI5ySfzFlQ/cb0bSz1g=="], + + "@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.0.3", "", { "os": "win32", "cpu": "x64" }, "sha512-eXB7CHuaQdqmJcc3koCNtNPmT/bj2gc999kUFgBxG8Ac0NdgXc4rkCHhqrgrhN3zddvvvrgzj1e90SuSfmyIXA=="], + + "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.1", "", {}, "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw=="], + + "@sec-ant/readable-stream": ["@sec-ant/readable-stream@0.4.1", "", {}, "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg=="], + + "@sindresorhus/is": ["@sindresorhus/is@4.6.0", "", {}, "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw=="], + + "@sindresorhus/merge-streams": ["@sindresorhus/merge-streams@4.0.0", "", {}, "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ=="], + + "@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="], + + "@standard-schema/utils": ["@standard-schema/utils@0.3.0", "", {}, "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g=="], + + "@szmarczak/http-timer": ["@szmarczak/http-timer@4.0.6", "", { "dependencies": { "defer-to-connect": "^2.0.0" } }, "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w=="], + + "@tabby_ai/hijri-converter": ["@tabby_ai/hijri-converter@1.0.5", "", {}, "sha512-r5bClKrcIusDoo049dSL8CawnHR6mRdDwhlQuIgZRNty68q0x8k3Lf1BtPAMxRf/GgnHBnIO4ujd3+GQdLWzxQ=="], + + "@tailwindcss/node": ["@tailwindcss/node@4.3.1", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "enhanced-resolve": "5.21.6", "jiti": "^2.7.0", "lightningcss": "1.32.0", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", "tailwindcss": "4.3.1" } }, "sha512-6NDaqRoAMSXD1mr/RXu0HBvNE9a2n5tHPsxu9XHLws8o4Twes5rBM2205SUUiJ9goAtadrN6xTGX0UDEwp/N4A=="], + + "@tailwindcss/oxide": ["@tailwindcss/oxide@4.3.1", "", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.3.1", "@tailwindcss/oxide-darwin-arm64": "4.3.1", "@tailwindcss/oxide-darwin-x64": "4.3.1", "@tailwindcss/oxide-freebsd-x64": "4.3.1", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.1", "@tailwindcss/oxide-linux-arm64-gnu": "4.3.1", "@tailwindcss/oxide-linux-arm64-musl": "4.3.1", "@tailwindcss/oxide-linux-x64-gnu": "4.3.1", "@tailwindcss/oxide-linux-x64-musl": "4.3.1", "@tailwindcss/oxide-wasm32-wasi": "4.3.1", "@tailwindcss/oxide-win32-arm64-msvc": "4.3.1", "@tailwindcss/oxide-win32-x64-msvc": "4.3.1" } }, "sha512-yVPyo8RNkabVr3O2EhHEE0Rewu7YKzc1DhIqfL46LKveFrmu9XbDazNOJY7/GRuvw1h6u3utWnR29H/p5JPlgA=="], + + "@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.3.1", "", { "os": "android", "cpu": "arm64" }, "sha512-SVlyf61g374l5cHyg8x9kf5xmLcOaxvOTsbsqDnSsDJaKOEFZ7GCvi84VAVGpxojYOs1+3K6M0UjXfqPU8vmOQ=="], + + "@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.3.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-hVnWLwv+e/l7c4WKyVtHVrIPvYdqWHjRB3MDIqARynzFtnQg85kmQEFCbV9Ja0VVx4xXTIiDWY60Y7iz/iNoDA=="], + + "@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.3.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-Cf7abu0WVgbhU7ANgPUnSAvm7nCvMweusHb8FnaHlLfv/Caq4GYaEZg7ZImzzmjx4lIAfuS8q+eLIS7A7IzxIg=="], + + "@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.3.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-ZZqzX2Y+GXtXXfqSfpJhDm60OoZfvLHLCgm+J7NVqgHHJjG/m9ugZI77RwTsVd4fnBJuCFP6Ae6kTJb71UdS8g=="], + + "@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.3.1", "", { "os": "linux", "cpu": "arm" }, "sha512-/Ah/xik0LaMYfv9DZ0S/t4pBlBNYOcqtRwusjgovHkvT8ixueWCLyJjsaF5kQIckjb4IT8Q6K6p/iPmZMixYgg=="], + + "@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.3.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-gqdFoVJlw444GvpnheZLHmvTzSxI/cOUUh2KSNejQjTcYkW062SVD+En0rUgD+QV91bz1XGIGtt1HJd48xUGbQ=="], + + "@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.3.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-Bwv9KwOvE0VKa86xPFif9b9c3Y1NxOV1P0gLti/IYaWEsQYZXDlxfGEtA8mdDZ7SG3wyNXAWYT5SIn3giL57oA=="], + + "@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.3.1", "", { "os": "linux", "cpu": "x64" }, "sha512-Ymi8O8T15HYQdOUWUtTI6ldN0neHP85FC+Qz32xTcZ7iJXtem/x8ITev0o1e9e5rkqj4lONZfTRLvkmin1+tKg=="], + + "@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.3.1", "", { "os": "linux", "cpu": "x64" }, "sha512-M+P/91qJ6uILLw4k2G93GMDRAXj61SMvFQYt39AqvUqYgExXpLL5aepfns7sj4HiAQeolirQF9E0lzRvdf4zPQ=="], + + "@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.3.1", "", { "dependencies": { "@emnapi/core": "^1.10.0", "@emnapi/runtime": "^1.10.0", "@emnapi/wasi-threads": "^1.2.1", "@napi-rs/wasm-runtime": "^1.1.4", "@tybys/wasm-util": "^0.10.2", "tslib": "^2.8.1" }, "cpu": "none" }, "sha512-zsM8uOeqvVGHsAXsJxsT28ttosFahLJKCLOTUBqRAtKnVgGSRitds9T432QiT8b77Yga7JIBkulIRRlJPtYhRA=="], + + "@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.3.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-aiNvSq9BsVk8V513lDKlrCFAgf8qBMPZTpgEhInL+NwQqs97mYmupVMrPrgBBSL8Pv/0zXu9MrMF9rMun1ZeNg=="], + + "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.3.1", "", { "os": "win32", "cpu": "x64" }, "sha512-xDEyu1rg290472FEGaKHnzyDyh5QH+AlWvsU5hMoMtPpzmKlRI0jaYKCgSHDYtaQWZOYbMaduSyCwFwY4n1HmA=="], + + "@tailwindcss/vite": ["@tailwindcss/vite@4.3.1", "", { "dependencies": { "@tailwindcss/node": "4.3.1", "@tailwindcss/oxide": "4.3.1", "tailwindcss": "4.3.1" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7 || ^8" } }, "sha512-hItDHuIIlEV61R+faXu66s1K36aTurO/Qw0e45Vskz57gXl9pWOT6eg3zmcEui6CZXddbN7zd41bwmvag4JGwQ=="], + + "@tanstack/devtools-event-client": ["@tanstack/devtools-event-client@0.4.3", "", { "bin": { "intent": "bin/intent.js" } }, "sha512-OZI6QyULw0FI0wjgmeYzCIfbgPsOEzwJtCpa69XrfLMtNXLGnz3d/dIabk7frg0TmHo+Ah49w5I4KC7Tufwsvw=="], + + "@tanstack/history": ["@tanstack/history@1.162.0", "", {}, "sha512-79pf/RkhteYZTRgcR4F9kbk84P2N8rugQJswxfIqovlbRiT3yI7eBE+5QorIrZaOKktsgzRlXh1l/du/xpl4iA=="], + + "@tanstack/pacer": ["@tanstack/pacer@0.21.1", "", { "dependencies": { "@tanstack/devtools-event-client": "^0.4.3", "@tanstack/store": "^0.11.0" } }, "sha512-hB01dd4rlsYcTCNP7wK186jgAe6K5qimgM1Y5Jtvz+9PUaILvpmeLLjmQNUNSO1l23lIt+CeQR6mO1mjlPvRtQ=="], + + "@tanstack/query-core": ["@tanstack/query-core@5.101.0", "", {}, "sha512-cQetA74EB+seWySv1TTKr828TnP0u39m6LykwDXIo84SNortpDkp30TMEjkqtYCNP9c40uT/iwl6MLiufEt0Ow=="], + + "@tanstack/react-query": ["@tanstack/react-query@5.101.0", "", { "dependencies": { "@tanstack/query-core": "5.101.0" }, "peerDependencies": { "react": "^18 || ^19" } }, "sha512-rLlJXSpkqfizLWgkR5+eLeIk0MvTx/meEIR7LRjxic+qxiQP8zVjq7BqQkiCMNLQBlLfuOLqqr6KO5GtrDlmSg=="], + + "@tanstack/react-router": ["@tanstack/react-router@1.170.15", "", { "dependencies": { "@tanstack/history": "1.162.0", "@tanstack/react-store": "^0.9.3", "@tanstack/router-core": "1.171.13", "isbot": "^5.1.22" }, "peerDependencies": { "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } }, "sha512-GawYz7HEjj8rTUUDoT/SemDEVm63pZUO+2mOcXHY9Jl3EwMS5gFBnPu/2UvcrwRm1jN1k79fokc0d4aFmrLatg=="], + + "@tanstack/react-store": ["@tanstack/react-store@0.9.3", "", { "dependencies": { "@tanstack/store": "0.9.3", "use-sync-external-store": "^1.6.0" }, "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" } }, "sha512-y2iHd/N9OkoQbFJLUX1T9vbc2O9tjH0pQRgTcx1/Nz4IlwLvkgpuglXUx+mXt0g5ZDFrEeDnONPqkbfxXJKwRg=="], + + "@tanstack/react-virtual": ["@tanstack/react-virtual@3.14.2", "", { "dependencies": { "@tanstack/virtual-core": "3.17.0" }, "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" } }, "sha512-IpWnmCLvuymRfeeLNVXIzNEYBFLpd3drVIS91sqV78VTZFyldlChkOocZRCPp1B+Wnk09bcLNme8WaMU/9/9bQ=="], + + "@tanstack/router-core": ["@tanstack/router-core@1.171.13", "", { "dependencies": { "@tanstack/history": "1.162.0", "cookie-es": "^3.0.0", "seroval": "^1.5.4", "seroval-plugins": "^1.5.4" } }, "sha512-+NOwEj1kO/6IGmpHRIZHasYxYWpyBQGNIZAST9aNrk9Q3YlU9SgqVnl1pbLa9qAKfeNdXQIRve0RQb/0kyDeDA=="], + + "@tanstack/store": ["@tanstack/store@0.11.0", "", {}, "sha512-WlzzCt3xi0G6pCAJu1U+2jiECwabETDpQDi3hfkFZvJii9AuZqEKbOiVarX1/bWhTNjU486yQtJCCasi/0q+Cw=="], + + "@tanstack/virtual-core": ["@tanstack/virtual-core@3.17.0", "", {}, "sha512-gOxY/hFkPh/XQYhnThBHzkbkX3Ed+z/iushyz+R+JAr213aXxUDgQoTgTdrDpBSRsjFM73P/KfUyWmaF9WHMkQ=="], + + "@tauri-apps/api": ["@tauri-apps/api@2.11.0", "", {}, "sha512-7CinYODhky9lmO23xHnUFv0Xt43fbtWMyxZcLcRBlFkcgXKuEirBvHpmtJ89YMhyeGcq20Wuc47Fa4XjyniywA=="], + + "@tauri-apps/cli": ["@tauri-apps/cli@2.11.2", "", { "optionalDependencies": { "@tauri-apps/cli-darwin-arm64": "2.11.2", "@tauri-apps/cli-darwin-x64": "2.11.2", "@tauri-apps/cli-linux-arm-gnueabihf": "2.11.2", "@tauri-apps/cli-linux-arm64-gnu": "2.11.2", "@tauri-apps/cli-linux-arm64-musl": "2.11.2", "@tauri-apps/cli-linux-riscv64-gnu": "2.11.2", "@tauri-apps/cli-linux-x64-gnu": "2.11.2", "@tauri-apps/cli-linux-x64-musl": "2.11.2", "@tauri-apps/cli-win32-arm64-msvc": "2.11.2", "@tauri-apps/cli-win32-ia32-msvc": "2.11.2", "@tauri-apps/cli-win32-x64-msvc": "2.11.2" }, "bin": { "tauri": "tauri.js" } }, "sha512-bk3HemqvGRoy+5D/dVMUQHKMYLglD0jVnMm/0iGMH6ufZ+p8r14m6BpIixwij3PBvZdvORUp1YifTD8QxVZ1Nw=="], + + "@tauri-apps/cli-darwin-arm64": ["@tauri-apps/cli-darwin-arm64@2.11.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-+4UZzLt+eOAEQCwgd+TqKgyUJMrvx+BgdXLLaqJYmPqzP+nE6YZr/hY6CWLYGQb8jFn99jEkmC6uA3tNvamA1w=="], + + "@tauri-apps/cli-darwin-x64": ["@tauri-apps/cli-darwin-x64@2.11.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-VjYYtZUPqDMLutSfJEyxFE3Bz+DPi7c8wC3imckgvciLDZLq4qwKJxBicg0BXGhXjJsl8vKWgWRFNMPELQ+Xyg=="], + + "@tauri-apps/cli-linux-arm-gnueabihf": ["@tauri-apps/cli-linux-arm-gnueabihf@2.11.2", "", { "os": "linux", "cpu": "arm" }, "sha512-yMemD6f4i95AQriS8EazyOFzbE34yjnP16i3IOzpHGQvBoy2DjypFMFBq0NtPuITURv/cOGguRtHR5d79/9CSA=="], + + "@tauri-apps/cli-linux-arm64-gnu": ["@tauri-apps/cli-linux-arm64-gnu@2.11.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-cgI91D2wL8GSgoWwZXDqt+DwnuZCP2/bz03QAE4TrhgAKIsrB4hX26W/H1EONPUUNkqrsgeCD0wU6pcNjV/5kw=="], + + "@tauri-apps/cli-linux-arm64-musl": ["@tauri-apps/cli-linux-arm64-musl@2.11.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-X1rm0BERqAAggtYTESSgXrS3sz4Sb/OiPiz54UqISlXW+GkR3vNIGnsy/lejNmoXGVqri3Q53BCfQiclOIyRPw=="], + + "@tauri-apps/cli-linux-riscv64-gnu": ["@tauri-apps/cli-linux-riscv64-gnu@2.11.2", "", { "os": "linux", "cpu": "none" }, "sha512-usbMLJbT3KtkOrBMDVeGYNM35aTHXx38SJSzTMSqqjeUIOQ+iVPjb2yAGNAE+KqmBbAx4FOFIyMeKXx2M/JKGQ=="], + + "@tauri-apps/cli-linux-x64-gnu": ["@tauri-apps/cli-linux-x64-gnu@2.11.2", "", { "os": "linux", "cpu": "x64" }, "sha512-Ru4gwJKPG0ctVGchRGpRup4Y4lW2SSfFnrbQcyHhCliKy4g8Qz97TrUgCur4CbWyAgKxvGh3SjrkA0LDYzDGiw=="], + + "@tauri-apps/cli-linux-x64-musl": ["@tauri-apps/cli-linux-x64-musl@2.11.2", "", { "os": "linux", "cpu": "x64" }, "sha512-eUm7T6clN1MMmNSRQ9gaWsQdyehQx2Gmn5hht/QUlqZQI/qcP2OJK5dnaxqwFzCr2HdsEo9ydxaqcS1oJzMvUw=="], + + "@tauri-apps/cli-win32-arm64-msvc": ["@tauri-apps/cli-win32-arm64-msvc@2.11.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-HeeZW80jU+gVTOEX4X/hC6NVSAdDVXajwP5fxIZ/3z9WvUC7qrudX2GMTilYq6Dg0e0sk0XgsAJD1hZ5wPBXUA=="], + + "@tauri-apps/cli-win32-ia32-msvc": ["@tauri-apps/cli-win32-ia32-msvc@2.11.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-YhjQNZcXfbkCLyazSv1nPnJ9iRFE1wm6kc51FDbU10/Dk09io+6PAGMLjkxnX2GdM0qMnDmTjstY8mTDVvtKeA=="], + + "@tauri-apps/cli-win32-x64-msvc": ["@tauri-apps/cli-win32-x64-msvc@2.11.2", "", { "os": "win32", "cpu": "x64" }, "sha512-d2JchlFIpZevZVReyqhQOekJmb1UH3rhZ5VX6sH3ty9ETE0TKQavpihvoScUXfKKpW6HZC0MrFGRU0ZtD+w3gA=="], + + "@tauri-apps/plugin-barcode-scanner": ["@tauri-apps/plugin-barcode-scanner@2.4.5", "", { "dependencies": { "@tauri-apps/api": "^2.11.0" } }, "sha512-sIPRYEfxww8/y8skZ2LcAp/h5bwvlHkQiq+3w6QEl+2BHs13xnpn7hP+pv4fkBs8DyDfpUbOBIYS5YBwP7x1QQ=="], + + "@tauri-apps/plugin-deep-link": ["@tauri-apps/plugin-deep-link@2.4.9", "", { "dependencies": { "@tauri-apps/api": "^2.11.0" } }, "sha512-u0SKOUHnJ1wqeqXsDFq2+kASCBj9xxbG0g9XZWPy9SOmU4wXtp6b/wiYpm6oH6/5fBTQsLqnLhIvqLBRpgHJlA=="], + + "@tauri-apps/plugin-log": ["@tauri-apps/plugin-log@2.8.0", "", { "dependencies": { "@tauri-apps/api": "^2.8.0" } }, "sha512-a+7rOq3MJwpTOLLKbL8d0qGZ85hgHw5pNOWusA9o3cf7cEgtYHiGY/+O8fj8MvywQIGqFv0da2bYQDlrqLE7rw=="], + + "@tauri-apps/plugin-notification": ["@tauri-apps/plugin-notification@2.3.3", "", { "dependencies": { "@tauri-apps/api": "^2.8.0" } }, "sha512-Zw+ZH18RJb41G4NrfHgIuofJiymusqN+q8fGUIIV7vyCH+5sSn5coqRv/MWB9qETsUs97vmU045q7OyseCV3Qg=="], + + "@tensamin/call": ["@tensamin/call@workspace:packages/call"], + + "@tensamin/chat": ["@tensamin/chat@workspace:packages/chat"], + + "@tensamin/crypto": ["@tensamin/crypto@workspace:packages/crypto"], + + "@tensamin/electron": ["@tensamin/electron@workspace:apps/electron"], + + "@tensamin/markdown": ["@tensamin/markdown@workspace:packages/markdown"], + + "@tensamin/notifications": ["@tensamin/notifications@workspace:packages/notifications"], + + "@tensamin/shared": ["@tensamin/shared@workspace:packages/shared"], + + "@tensamin/storage": ["@tensamin/storage@workspace:packages/storage"], + + "@tensamin/tauri": ["@tensamin/tauri@workspace:apps/tauri"], + + "@tensamin/tauth": ["@tensamin/tauth@workspace:packages/tauth"], + + "@tensamin/ttp": ["@tensamin/ttp@workspace:packages/ttp"], + + "@tensamin/ttp-core": ["@tensamin/ttp-core@https://git.methanium.net/tensamin/ttp/archive/0.0.24.tar.gz", { "dependencies": { "@eslint/js": "^10.0.1", "@tauri-apps/api": "^2.9.0", "@typescript-eslint/parser": "^8.59.1", "@webtransport-bun/webtransport": "^0.3.0", "globals": "^17.5.0", "typescript": "^6.0.3", "typescript-eslint": "^8.59.1", "zod": "^4.4.1" } }, "sha512-Db94CDOTYvzJSQDZGDgziUXRvXx9PiEfYDQt6sYe8Nyg+KD/aiKnyQx7NeEiG03TfYE3ogNxXOsrcsip4di8+g=="], + + "@tensamin/ui": ["@tensamin/ui@https://git.methanium.net/tensamin/ui/archive/0.0.37.tar.gz", { "dependencies": { "@base-ui/react": "^1.3.0", "@fontsource-variable/inter": "^5.2.6", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "cmdk": "^1.1.1", "date-fns": "^4.1.0", "embla-carousel-react": "^8.6.0", "input-otp": "^1.4.2", "lucide-react": "^1.8.0", "next-themes": "^0.4.6", "react-day-picker": "^9.14.0", "react-resizable-panels": "^4.10.0", "recharts": "3.8.0", "shadcn": "^3.5.0", "sonner": "^2.0.7", "tailwind-merge": "^3.5.0", "tw-animate-css": "^1.3.0", "vaul": "^1.1.2" }, "peerDependencies": { "react": "^19.2.0", "react-dom": "^19.2.0" } }, "sha512-yxZjHxzagey2+r5UqXi2+Z2GYVSuj2QKVtitHLAuXzdidobGDdtV8tHkTJP7WKLdFASJ/g4ULSWvGJ12PHPoaw=="], + + "@tensamin/user": ["@tensamin/user@workspace:packages/user"], + + "@tensamin/web": ["@tensamin/web@workspace:apps/web"], + + "@ts-morph/common": ["@ts-morph/common@0.27.0", "", { "dependencies": { "fast-glob": "^3.3.3", "minimatch": "^10.0.1", "path-browserify": "^1.0.1" } }, "sha512-Wf29UqxWDpc+i61k3oIOzcUfQt79PIT9y/MWfAGlrkjg6lBC1hwDECLXPVJAhWjiGbfBCxZd65F/LIZF3+jeJQ=="], + + "@tybys/wasm-util": ["@tybys/wasm-util@0.10.2", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg=="], + + "@types/cacheable-request": ["@types/cacheable-request@6.0.3", "", { "dependencies": { "@types/http-cache-semantics": "*", "@types/keyv": "^3.1.4", "@types/node": "*", "@types/responselike": "^1.0.0" } }, "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw=="], + + "@types/d3-array": ["@types/d3-array@3.2.2", "", {}, "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw=="], + + "@types/d3-color": ["@types/d3-color@3.1.3", "", {}, "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A=="], + + "@types/d3-ease": ["@types/d3-ease@3.0.2", "", {}, "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA=="], + + "@types/d3-interpolate": ["@types/d3-interpolate@3.0.4", "", { "dependencies": { "@types/d3-color": "*" } }, "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA=="], + + "@types/d3-path": ["@types/d3-path@3.1.1", "", {}, "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg=="], + + "@types/d3-scale": ["@types/d3-scale@4.0.9", "", { "dependencies": { "@types/d3-time": "*" } }, "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw=="], + + "@types/d3-shape": ["@types/d3-shape@3.1.8", "", { "dependencies": { "@types/d3-path": "*" } }, "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w=="], + + "@types/d3-time": ["@types/d3-time@3.0.4", "", {}, "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g=="], + + "@types/d3-timer": ["@types/d3-timer@3.0.2", "", {}, "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw=="], + + "@types/debug": ["@types/debug@4.1.13", "", { "dependencies": { "@types/ms": "*" } }, "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw=="], + + "@types/dom-mediacapture-record": ["@types/dom-mediacapture-record@1.0.22", "", {}, "sha512-mUMZLK3NvwRLcAAT9qmcK+9p7tpU2FHdDsntR3YI4+GY88XrgG4XiE7u1Q2LAN2/FZOz/tdMDC3GQCR4T8nFuw=="], + + "@types/esrecurse": ["@types/esrecurse@4.3.1", "", {}, "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw=="], + + "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], + + "@types/fs-extra": ["@types/fs-extra@9.0.13", "", { "dependencies": { "@types/node": "*" } }, "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA=="], + + "@types/http-cache-semantics": ["@types/http-cache-semantics@4.2.0", "", {}, "sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q=="], + + "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], + + "@types/keyv": ["@types/keyv@3.1.4", "", { "dependencies": { "@types/node": "*" } }, "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg=="], + + "@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="], + + "@types/node": ["@types/node@25.9.3", "", { "dependencies": { "undici-types": ">=7.24.0 <7.24.7" } }, "sha512-603BddQMv3pUcr4U2dhujk83N2tTDVr/34wII2B6bJy6g+8WD6yUb11jszNs0gdi4PesVWl7ABt8nYMVpnLUcg=="], + + "@types/qrcode": ["@types/qrcode@1.5.6", "", { "dependencies": { "@types/node": "*" } }, "sha512-te7NQcV2BOvdj2b1hCAHzAoMNuj65kNBMz0KBaxM6c3VGBOhU0dURQKOtH8CFNI/dsKkwlv32p26qYQTWoB5bw=="], + + "@types/react": ["@types/react@19.2.17", "", { "dependencies": { "csstype": "^3.2.2" } }, "sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw=="], + + "@types/react-dom": ["@types/react-dom@19.2.3", "", { "peerDependencies": { "@types/react": "^19.2.0" } }, "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ=="], + + "@types/responselike": ["@types/responselike@1.0.3", "", { "dependencies": { "@types/node": "*" } }, "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw=="], + + "@types/set-cookie-parser": ["@types/set-cookie-parser@2.4.10", "", { "dependencies": { "@types/node": "*" } }, "sha512-GGmQVGpQWUe5qglJozEjZV/5dyxbOOZ0LHe/lqyWssB88Y4svNfst0uqBVscdDeIKl5Jy5+aPSvy7mI9tYRguw=="], + + "@types/statuses": ["@types/statuses@2.0.6", "", {}, "sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA=="], + + "@types/use-sync-external-store": ["@types/use-sync-external-store@0.0.6", "", {}, "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg=="], + + "@types/validate-npm-package-name": ["@types/validate-npm-package-name@4.0.2", "", {}, "sha512-lrpDziQipxCEeK5kWxvljWYhUvOiB2A9izZd9B2AFarYAkqZshb4lPbRs7zKEic6eGtH8V/2qJW+dPp9OtF6bw=="], + + "@types/yauzl": ["@types/yauzl@2.10.3", "", { "dependencies": { "@types/node": "*" } }, "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q=="], + + "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.61.1", "", { "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.61.1", "@typescript-eslint/type-utils": "8.61.1", "@typescript-eslint/utils": "8.61.1", "@typescript-eslint/visitor-keys": "8.61.1", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.61.1", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-ZPlVl3PB3et/59Ne0fv/sci6ZXz4T4Hp4nTJ56i/Y0gR89ARb+KphojTq6j+56E5PIezmOIOOWyY+aWQFd+IkQ=="], + + "@typescript-eslint/parser": ["@typescript-eslint/parser@8.61.1", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.61.1", "@typescript-eslint/types": "8.61.1", "@typescript-eslint/typescript-estree": "8.61.1", "@typescript-eslint/visitor-keys": "8.61.1", "debug": "^4.4.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-PJ5vePq5/ognBbrIcoC5+SHO5dfpeLPzP9FpLkzWrguoYQEeeSjlJpVwOpo1JRSTEi7dRcwNy4h4dzV70PqHcg=="], + + "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.61.1", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.61.1", "@typescript-eslint/types": "^8.61.1", "debug": "^4.4.3" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-PrC4JYGmR241lYnfhmKGTXkFqv8+ymbTFgSAY0fVXpY82/QkMw5TZPl+vGzuDDU2QYJk9fIDOBTntF+yDv9LEA=="], + + "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.61.1", "", { "dependencies": { "@typescript-eslint/types": "8.61.1", "@typescript-eslint/visitor-keys": "8.61.1" } }, "sha512-L2bdIeoQS8FlKAvONAr20w6OcLXeB+qiDKbAooS9A0Ben+iSIkBef0FxqwKWYqt5sa0i4KJtxVyVmhMylKzF5w=="], + + "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.61.1", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-UN/H4di+OO7EWx2ovME+8t31YO+KVnK0RRKEHR3kOt21/Ay8BOq3M1OMvWs5vNiqcFCYGYoxK3MXPZzmMUE+yg=="], + + "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.61.1", "", { "dependencies": { "@typescript-eslint/types": "8.61.1", "@typescript-eslint/typescript-estree": "8.61.1", "@typescript-eslint/utils": "8.61.1", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-GYRicKmVK0C4fsKgaACaknOUAq9Oa2kwsjnpFhFcS/5p4Ht5IP9OVLbgIgcK4SRk92nVHFluurg1lumD9dBcLw=="], + + "@typescript-eslint/types": ["@typescript-eslint/types@8.61.1", "", {}, "sha512-G+CRlPqLv7Bz1IZVs03x5K59F1veqL0EJUROAdGhKsEq8qOiRiZbI+HUojPq5l0fEGOKModD9br6lObhB8zkoA=="], + + "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.61.1", "", { "dependencies": { "@typescript-eslint/project-service": "8.61.1", "@typescript-eslint/tsconfig-utils": "8.61.1", "@typescript-eslint/types": "8.61.1", "@typescript-eslint/visitor-keys": "8.61.1", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-u+oQD3BqYWPc8YV9Zab4vaJElJuwOLPRc10Jm1o/qS+6Qwen14HCWwx0Seo4LnSn2wxea2Ik8DxPt2/FHmuhrg=="], + + "@typescript-eslint/utils": ["@typescript-eslint/utils@8.61.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.61.1", "@typescript-eslint/types": "8.61.1", "@typescript-eslint/typescript-estree": "8.61.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-1+P/3Dj6jvtybE1q0HQ6yBt/gq+oKJyLdEv4HdnqasaEXRSYCAsD59mXEVQnM/ULNdQxbX77tdG4jPRjIS6knA=="], + + "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.61.1", "", { "dependencies": { "@typescript-eslint/types": "8.61.1", "eslint-visitor-keys": "^5.0.0" } }, "sha512-6fJ9MHWtK14C1DSkiMlHUSOmrVebL7150xZJBlJiL62jjhIA4JmOq6flwBgDxIdBKKdoiZRel+dfPD5MLfny3w=="], + + "@vitejs/plugin-react": ["@vitejs/plugin-react@6.0.2", "", { "dependencies": { "@rolldown/pluginutils": "^1.0.0" }, "peerDependencies": { "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", "babel-plugin-react-compiler": "^1.0.0", "vite": "^8.0.0" }, "optionalPeers": ["@rolldown/plugin-babel", "babel-plugin-react-compiler"] }, "sha512-DlSMqo4WhThw4vB8Mpn0Woe9J+Jfq1geJ61AKW0QEgLzGMNwtIMdxbDUzLxcun8W7NbJO0e2Jg/Nxm3cCSVzzg=="], + + "@webtransport-bun/webtransport": ["@webtransport-bun/webtransport@0.3.0", "", { "os": [ "linux", "win32", "darwin", ], "cpu": [ "x64", "arm64", ] }, "sha512-/OX/TCgBD64n/0BjMNytObq5NK2pAM0KOoXBEw49l3sTmbVXNTPP1ZRPIdIyV43agM+mKtZBaV3Er3k3YoB6sw=="], + + "@xmldom/xmldom": ["@xmldom/xmldom@0.8.13", "", {}, "sha512-KRYzxepc14G/CEpEGc3Yn+JKaAeT63smlDr+vjB8jRfgTBBI9wRj/nkQEO+ucV8p8I9bfKLWp37uHgFrbntPvw=="], + + "abbrev": ["abbrev@4.0.0", "", {}, "sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA=="], + + "accepts": ["accepts@2.0.0", "", { "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" } }, "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng=="], + + "acorn": ["acorn@8.17.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg=="], + + "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], + + "agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], + + "ajv": ["ajv@6.15.0", "", { "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" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], + + "ajv-formats": ["ajv-formats@3.0.1", "", { "dependencies": { "ajv": "^8.0.0" } }, "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ=="], + + "ansi-colors": ["ansi-colors@4.1.3", "", {}, "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw=="], + + "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], + + "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "ansis": ["ansis@4.3.1", "", {}, "sha512-BJ8/l4R5LRE7hW9WdSuGYrLSHi2ynxeFpDFbH0K/CgNeY/tyhk+vO6TYxXC5r5CpUhNVX310xzPsN/H9lCdfOA=="], + + "app-builder-lib": ["app-builder-lib@26.15.3", "", { "dependencies": { "@electron/asar": "3.4.1", "@electron/fuses": "^1.8.0", "@electron/get": "^3.0.0", "@electron/notarize": "2.5.0", "@electron/osx-sign": "1.3.3", "@electron/rebuild": "^4.0.4", "@electron/universal": "2.0.3", "@malept/flatpak-bundler": "^0.4.0", "@noble/hashes": "^2.2.0", "@peculiar/webcrypto": "^1.7.1", "@types/fs-extra": "9.0.13", "ajv": "^8.18.0", "asn1js": "^3.0.10", "async-exit-hook": "^2.0.1", "builder-util": "26.15.3", "builder-util-runtime": "9.7.0", "chromium-pickle-js": "^0.2.0", "ci-info": "4.3.1", "debug": "^4.3.4", "dotenv": "^16.4.5", "dotenv-expand": "^11.0.6", "ejs": "^3.1.8", "electron-publish": "26.15.3", "fs-extra": "^10.1.0", "hosted-git-info": "^4.1.0", "isbinaryfile": "^5.0.0", "jiti": "^2.4.2", "js-yaml": "^4.1.0", "json5": "^2.2.3", "lazy-val": "^1.0.5", "minimatch": "^10.2.5", "pkijs": "^3.4.0", "plist": "3.1.0", "proper-lockfile": "^4.1.2", "resedit": "^1.7.0", "semver": "~7.7.3", "tar": "^7.5.7", "temp-file": "^3.4.0", "tiny-async-pool": "1.3.0", "unzipper": "^0.12.3", "which": "^5.0.0" }, "peerDependencies": { "dmg-builder": "26.15.3", "electron-builder-squirrel-windows": "26.15.3" } }, "sha512-2VnyWkqsP5v5XbBhL3tD5Syx8iNPBYsoU7kY4S2fz7wg8Rj/nztWKCUzGKaFRTv0Xwf3/H058CR1Kvtd/3lRow=="], + + "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + + "aria-hidden": ["aria-hidden@1.2.6", "", { "dependencies": { "tslib": "^2.0.0" } }, "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA=="], + + "asn1js": ["asn1js@3.0.10", "", { "dependencies": { "pvtsutils": "^1.3.6", "pvutils": "^1.1.5", "tslib": "^2.8.1" } }, "sha512-S2s3aOytiKdFRdulw2qPE51MzjzVOisppcVv7jVFR+Kw0kxwvFrDcYA0h7Ndqbmj0HkMIXYWaoj7fli8kgx1eg=="], + + "ast-types": ["ast-types@0.16.1", "", { "dependencies": { "tslib": "^2.0.1" } }, "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg=="], + + "async": ["async@3.2.6", "", {}, "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA=="], + + "async-exit-hook": ["async-exit-hook@2.0.1", "", {}, "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw=="], + + "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="], + + "at-least-node": ["at-least-node@1.0.0", "", {}, "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg=="], + + "aws4": ["aws4@1.13.2", "", {}, "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw=="], + + "balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + + "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], + + "baseline-browser-mapping": ["baseline-browser-mapping@2.10.37", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-girxaJ7WZssDOFhzCGZTDKoTa1gk6A1TbflaYTpykLJ4UU9Fz9kx1aREM8JCuoVHbL8X8T/mJg7w2oYSq72Oig=="], + + "bluebird": ["bluebird@3.7.2", "", {}, "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="], + + "body-parser": ["body-parser@2.3.0", "", { "dependencies": { "bytes": "^3.1.2", "content-type": "^2.0.0", "debug": "^4.4.3", "http-errors": "^2.0.1", "iconv-lite": "^0.7.2", "on-finished": "^2.4.1", "qs": "^6.15.2", "raw-body": "^3.0.2", "type-is": "^2.1.0" } }, "sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw=="], + + "boolean": ["boolean@3.2.0", "", {}, "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw=="], + + "brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], + + "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], + + "browserslist": ["browserslist@4.28.2", "", { "dependencies": { "baseline-browser-mapping": "^2.10.12", "caniuse-lite": "^1.0.30001782", "electron-to-chromium": "^1.5.328", "node-releases": "^2.0.36", "update-browserslist-db": "^1.2.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg=="], + + "buffer-crc32": ["buffer-crc32@0.2.13", "", {}, "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ=="], + + "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="], + + "builder-util": ["builder-util@26.15.3", "", { "dependencies": { "@types/debug": "^4.1.6", "builder-util-runtime": "9.7.0", "chalk": "^4.1.2", "cross-spawn": "^7.0.6", "debug": "^4.3.4", "fs-extra": "^10.1.0", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.0", "js-yaml": "^4.1.0", "sanitize-filename": "^1.6.3", "source-map-support": "^0.5.19", "stat-mode": "^1.0.0", "temp-file": "^3.4.0", "tiny-async-pool": "1.3.0" } }, "sha512-q2hn7Mbo2nFNkVekPiHFx6Nfo3hURmES3tfBn+k5Pqxl2RkmP3QGqZUhH/q9Pch/4G05NRhPjDlVj1O8q4Txvw=="], + + "builder-util-runtime": ["builder-util-runtime@9.7.0", "", { "dependencies": { "debug": "^4.3.4", "sax": "^1.2.4" } }, "sha512-g/kR520giAFYkSXTzcmF3kqQq7wi8F6N6SzeDgZrqTBN+VHdmgWOyTdD1yD7AATDId/yXLvuP34CxW46/BwCdw=="], + + "bundle-name": ["bundle-name@4.1.0", "", { "dependencies": { "run-applescript": "^7.0.0" } }, "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q=="], + + "bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="], + + "bytestreamjs": ["bytestreamjs@2.0.1", "", {}, "sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ=="], + + "cacheable-lookup": ["cacheable-lookup@5.0.4", "", {}, "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA=="], + + "cacheable-request": ["cacheable-request@7.0.4", "", { "dependencies": { "clone-response": "^1.0.2", "get-stream": "^5.1.0", "http-cache-semantics": "^4.0.0", "keyv": "^4.0.0", "lowercase-keys": "^2.0.0", "normalize-url": "^6.0.1", "responselike": "^2.0.0" } }, "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg=="], + + "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], + + "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], + + "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], + + "camelcase": ["camelcase@5.3.1", "", {}, "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="], + + "caniuse-lite": ["caniuse-lite@1.0.30001799", "", {}, "sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw=="], + + "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="], + + "chromium-pickle-js": ["chromium-pickle-js@0.2.0", "", {}, "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw=="], + + "ci-info": ["ci-info@4.4.0", "", {}, "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg=="], + + "class-variance-authority": ["class-variance-authority@0.7.1", "", { "dependencies": { "clsx": "^2.1.1" } }, "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg=="], + + "cli-cursor": ["cli-cursor@5.0.0", "", { "dependencies": { "restore-cursor": "^5.0.0" } }, "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw=="], + + "cli-spinners": ["cli-spinners@2.9.2", "", {}, "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg=="], + + "cli-width": ["cli-width@4.1.0", "", {}, "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ=="], + + "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], + + "clone-response": ["clone-response@1.0.3", "", { "dependencies": { "mimic-response": "^1.0.0" } }, "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA=="], + + "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], + + "cmdk": ["cmdk@1.1.1", "", { "dependencies": { "@radix-ui/react-compose-refs": "^1.1.1", "@radix-ui/react-dialog": "^1.1.6", "@radix-ui/react-id": "^1.1.0", "@radix-ui/react-primitive": "^2.0.2" }, "peerDependencies": { "react": "^18 || ^19 || ^19.0.0-rc", "react-dom": "^18 || ^19 || ^19.0.0-rc" } }, "sha512-Vsv7kFaXm+ptHDMZ7izaRsP70GgrW9NBNGswt9OZaVBLlE0SNpDq8eu/VGXyF9r7M0azK3Wy7OlYXsuyYLFzHg=="], + + "code-block-writer": ["code-block-writer@13.0.3", "", {}, "sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg=="], + + "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="], + + "comlink": ["comlink@4.4.2", "", {}, "sha512-OxGdvBmJuNKSCMO4NTl1L47VRp6xn2wG4F/2hYzB6tiCb709otOxtEYCSvK80PtjODfXXZu8ds+Nw5kVCjqd2g=="], + + "commander": ["commander@14.0.3", "", {}, "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw=="], + + "compare-version": ["compare-version@0.1.2", "", {}, "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A=="], + + "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], + + "content-disposition": ["content-disposition@1.1.0", "", {}, "sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g=="], + + "content-type": ["content-type@1.0.5", "", {}, "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="], + + "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], + + "cookie": ["cookie@1.1.1", "", {}, "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ=="], + + "cookie-es": ["cookie-es@3.1.1", "", {}, "sha512-UaXxwISYJPTr9hwQxMFYZ7kNhSXboMXP+Z3TRX6f1/NyaGPfuNUZOWP1pUEb75B2HjfklIYLVRfWiFZJyC6Npg=="], + + "cookie-signature": ["cookie-signature@1.2.2", "", {}, "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg=="], + + "core-util-is": ["core-util-is@1.0.3", "", {}, "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="], + + "cors": ["cors@2.8.6", "", { "dependencies": { "object-assign": "^4", "vary": "^1" } }, "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw=="], + + "cosmiconfig": ["cosmiconfig@9.0.2", "", { "dependencies": { "env-paths": "^2.2.1", "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", "parse-json": "^5.2.0" }, "peerDependencies": { "typescript": ">=4.9.5" }, "optionalPeers": ["typescript"] }, "sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg=="], + + "crelt": ["crelt@1.0.6", "", {}, "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g=="], + + "cross-dirname": ["cross-dirname@0.1.0", "", {}, "sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q=="], + + "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + + "cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="], + + "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="], + + "d3-array": ["d3-array@3.2.4", "", { "dependencies": { "internmap": "1 - 2" } }, "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg=="], + + "d3-color": ["d3-color@3.1.0", "", {}, "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA=="], + + "d3-ease": ["d3-ease@3.0.1", "", {}, "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w=="], + + "d3-format": ["d3-format@3.1.2", "", {}, "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg=="], + + "d3-interpolate": ["d3-interpolate@3.0.1", "", { "dependencies": { "d3-color": "1 - 3" } }, "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g=="], + + "d3-path": ["d3-path@3.1.0", "", {}, "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ=="], + + "d3-scale": ["d3-scale@4.0.2", "", { "dependencies": { "d3-array": "2.10.0 - 3", "d3-format": "1 - 3", "d3-interpolate": "1.2.0 - 3", "d3-time": "2.1.1 - 3", "d3-time-format": "2 - 4" } }, "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ=="], + + "d3-shape": ["d3-shape@3.2.0", "", { "dependencies": { "d3-path": "^3.1.0" } }, "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA=="], + + "d3-time": ["d3-time@3.1.0", "", { "dependencies": { "d3-array": "2 - 3" } }, "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q=="], + + "d3-time-format": ["d3-time-format@4.1.0", "", { "dependencies": { "d3-time": "1 - 3" } }, "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg=="], + + "d3-timer": ["d3-timer@3.0.1", "", {}, "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA=="], + + "data-uri-to-buffer": ["data-uri-to-buffer@4.0.1", "", {}, "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A=="], + + "date-fns": ["date-fns@4.4.0", "", {}, "sha512-+1UMbeh68lH1SegH83CGWwpb6OHHbpSgr3+s5Eww5M4CAgswBpoWS0AjTOfEJ33HiYKz1hdj/KTFprzXHmq/6w=="], + + "date-fns-jalali": ["date-fns-jalali@4.1.0-0", "", {}, "sha512-hTIP/z+t+qKwBDcmmsnmjWTduxCg+5KfdqWQvb2X/8C9+knYY6epN/pfxdDuyVlSVeFz0sM5eEfwIUQ70U4ckg=="], + + "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + + "decamelize": ["decamelize@1.2.0", "", {}, "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA=="], + + "decimal.js-light": ["decimal.js-light@2.5.1", "", {}, "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg=="], + + "decompress-response": ["decompress-response@6.0.0", "", { "dependencies": { "mimic-response": "^3.1.0" } }, "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ=="], + + "dedent": ["dedent@1.7.2", "", { "peerDependencies": { "babel-plugin-macros": "^3.1.0" }, "optionalPeers": ["babel-plugin-macros"] }, "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA=="], + + "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], + + "deepfilternet3-noise-filter": ["deepfilternet3-noise-filter@1.2.1", "", { "peerDependencies": { "livekit-client": "^2.0.0" } }, "sha512-OAyrHTDlUHH+AhfpVNKYEOhVqb9cZpu0fdNThplA/tB/Ts4PF/UsI+abl2n1IbSxUkhiF0OqDejEhk1n42Oqpw=="], + + "deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="], + + "default-browser": ["default-browser@5.5.0", "", { "dependencies": { "bundle-name": "^4.1.0", "default-browser-id": "^5.0.0" } }, "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw=="], + + "default-browser-id": ["default-browser-id@5.0.1", "", {}, "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q=="], + + "defer-to-connect": ["defer-to-connect@2.0.1", "", {}, "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg=="], + + "define-data-property": ["define-data-property@1.1.4", "", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" } }, "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A=="], + + "define-lazy-prop": ["define-lazy-prop@3.0.0", "", {}, "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg=="], + + "define-properties": ["define-properties@1.2.1", "", { "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } }, "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg=="], + + "delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="], + + "depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="], + + "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], + + "detect-node": ["detect-node@2.1.0", "", {}, "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g=="], + + "detect-node-es": ["detect-node-es@1.1.0", "", {}, "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="], + + "diff": ["diff@8.0.4", "", {}, "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw=="], + + "dijkstrajs": ["dijkstrajs@1.0.3", "", {}, "sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA=="], + + "dir-compare": ["dir-compare@4.2.0", "", { "dependencies": { "minimatch": "^3.0.5", "p-limit": "^3.1.0 " } }, "sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ=="], + + "dmg-builder": ["dmg-builder@26.15.3", "", { "dependencies": { "app-builder-lib": "26.15.3", "builder-util": "26.15.3", "fs-extra": "^10.1.0", "js-yaml": "^4.1.0" } }, "sha512-O3zJUFUYHJKgzPqioHxfxzBzlSC1eXCSr79gMSBKBP5AgjjpmrydMsMLotEg9fAJF36vdUncb+4ndRNxoPdlSQ=="], + + "dotenv": ["dotenv@16.6.1", "", {}, "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow=="], + + "dotenv-expand": ["dotenv-expand@11.0.7", "", { "dependencies": { "dotenv": "^16.4.5" } }, "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA=="], + + "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], + + "duplexer2": ["duplexer2@0.1.4", "", { "dependencies": { "readable-stream": "^2.0.2" } }, "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA=="], + + "eciesjs": ["eciesjs@0.4.18", "", { "dependencies": { "@ecies/ciphers": "^0.2.5", "@noble/ciphers": "^1.3.0", "@noble/curves": "^1.9.7", "@noble/hashes": "^1.8.0" } }, "sha512-wG99Zcfcys9fZux7Cft8BAX/YrOJLJSZ3jyYPfhZHqN2E+Ffx+QXBDsv3gubEgPtV6dTzJMSQUwk1H98/t/0wQ=="], + + "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="], + + "ejs": ["ejs@3.1.10", "", { "dependencies": { "jake": "^10.8.5" }, "bin": { "ejs": "bin/cli.js" } }, "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA=="], + + "electron": ["electron@39.8.10", "", { "dependencies": { "@electron/get": "^2.0.0", "@types/node": "^22.7.7", "extract-zip": "^2.0.1" }, "bin": { "electron": "cli.js" } }, "sha512-zbYtGPYUI7PzqLAzkk21Rk6j67WN0hxn0Mq/njErZo1d0HSf33is4f8ICI5fMLy5vYe0JtCtM5sYunNOaochSQ=="], + + "electron-builder": ["electron-builder@26.15.3", "", { "dependencies": { "app-builder-lib": "26.15.3", "builder-util": "26.15.3", "builder-util-runtime": "9.7.0", "chalk": "^4.1.2", "ci-info": "^4.2.0", "dmg-builder": "26.15.3", "fs-extra": "^10.1.0", "lazy-val": "^1.0.5", "simple-update-notifier": "2.0.0", "yargs": "^17.6.2" }, "bin": { "electron-builder": "./cli.js", "install-app-deps": "./install-app-deps.js" } }, "sha512-a1KM5heqS3gQCZzizXEI8RjJy3QVogULPdeSknt76uLDpBIW/HDGsMg/XgP0riP6PI9COsRvFITKKGDqA8fJxA=="], + + "electron-builder-squirrel-windows": ["electron-builder-squirrel-windows@26.15.3", "", { "dependencies": { "app-builder-lib": "26.15.3", "builder-util": "26.15.3", "electron-winstaller": "5.4.0" } }, "sha512-Jc19XPV9y9+2bAdZPkXuVNGNIEFBq9poHC61l8Kv6FdK7DRG3+Ic0rerC0DXOaeHNz8yW0fg/JnF8GQROOF5MA=="], + + "electron-publish": ["electron-publish@26.15.3", "", { "dependencies": { "@types/fs-extra": "^9.0.11", "aws4": "^1.13.2", "builder-util": "26.15.3", "builder-util-runtime": "9.7.0", "chalk": "^4.1.2", "form-data": "^4.0.5", "fs-extra": "^10.1.0", "lazy-val": "^1.0.5", "mime": "^2.5.2" } }, "sha512-g/2bn8YTavY4cuS5F+jOS7zmZbXXBV8KZ8yHKfJjFPoKtzBqrpCdNPxBd3tqdBwP7BVd0lGzf7Bk2s0KesWZ4Q=="], + + "electron-to-chromium": ["electron-to-chromium@1.5.372", "", {}, "sha512-M3yhbAlilnwqC8D21t28UCDGHyitShTmmLRU/H+b74P6Ski16Nb9HONYEaVpMj/pwC7BEo5B95FpjODLCWbtfA=="], + + "electron-winstaller": ["electron-winstaller@5.4.0", "", { "dependencies": { "@electron/asar": "^3.2.1", "debug": "^4.1.1", "fs-extra": "^7.0.1", "lodash": "^4.17.21", "temp": "^0.9.0" }, "optionalDependencies": { "@electron/windows-sign": "^1.1.2" } }, "sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg=="], + + "embla-carousel": ["embla-carousel@8.6.0", "", {}, "sha512-SjWyZBHJPbqxHOzckOfo8lHisEaJWmwd23XppYFYVh10bU66/Pn5tkVkbkCMZVdbUE5eTCI2nD8OyIP4Z+uwkA=="], + + "embla-carousel-react": ["embla-carousel-react@8.6.0", "", { "dependencies": { "embla-carousel": "8.6.0", "embla-carousel-reactive-utils": "8.6.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.1 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" } }, "sha512-0/PjqU7geVmo6F734pmPqpyHqiM99olvyecY7zdweCw+6tKEXnrE90pBiBbMMU8s5tICemzpQ3hi5EpxzGW+JA=="], + + "embla-carousel-reactive-utils": ["embla-carousel-reactive-utils@8.6.0", "", { "peerDependencies": { "embla-carousel": "8.6.0" } }, "sha512-fMVUDUEx0/uIEDM0Mz3dHznDhfX+znCCDCeIophYb1QGVM7YThSWX+wz11zlYwWFOr74b4QLGg0hrGPJeG2s4A=="], + + "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="], + + "end-of-stream": ["end-of-stream@1.4.5", "", { "dependencies": { "once": "^1.4.0" } }, "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg=="], + + "enhanced-resolve": ["enhanced-resolve@5.21.6", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.3" } }, "sha512-aNnGCvbJ/RIyWo1IuhNdVjnNF+EjH9wpzpNHt+ci/m9He9LJvUN8wrCcXjp9cWsGNAuvSpVFTx/vraAFQ8qGjQ=="], + + "enquirer": ["enquirer@2.4.1", "", { "dependencies": { "ansi-colors": "^4.1.1", "strip-ansi": "^6.0.1" } }, "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ=="], + + "env-paths": ["env-paths@2.2.1", "", {}, "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A=="], + + "err-code": ["err-code@2.0.3", "", {}, "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA=="], + + "error-ex": ["error-ex@1.3.4", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ=="], + + "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], + + "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], + + "es-object-atoms": ["es-object-atoms@1.1.2", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw=="], + + "es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="], + + "es-toolkit": ["es-toolkit@1.47.1", "", {}, "sha512-5RAqEwf4P4E17p+W75KLOWw/nOvKZzSQpxM32IpI2KZLaVonjTrZ0Ai5ghMaVI9eKC2p8eoQgcBdkEDgzFk6+Q=="], + + "es6-error": ["es6-error@4.1.1", "", {}, "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg=="], + + "esbuild": ["esbuild@0.25.12", "", { "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" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg=="], + + "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], + + "escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="], + + "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], + + "eslint": ["eslint@10.5.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.5", "@eslint/config-helpers": "^0.6.0", "@eslint/core": "^1.2.1", "@eslint/plugin-kit": "^0.7.2", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^9.1.2", "eslint-visitor-keys": "^5.0.1", "espree": "^11.2.0", "esquery": "^1.7.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", "minimatch": "^10.2.4", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-1y+7C+vi12bUK1IpZeaV3gsH9fHLBmPvYmPx42pvT/E9yG0IC8g3PUZZgp0+JLJl7ZDK0flc2gc+Aw9dpCvIsQ=="], + + "eslint-plugin-react-hooks": ["eslint-plugin-react-hooks@7.1.1", "", { "dependencies": { "@babel/core": "^7.24.4", "@babel/parser": "^7.24.4", "hermes-parser": "^0.25.1", "zod": "^3.25.0 || ^4.0.0", "zod-validation-error": "^3.5.0 || ^4.0.0" }, "peerDependencies": { "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0" } }, "sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g=="], + + "eslint-scope": ["eslint-scope@9.1.2", "", { "dependencies": { "@types/esrecurse": "^4.3.1", "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ=="], + + "eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], + + "espree": ["espree@11.2.0", "", { "dependencies": { "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^5.0.1" } }, "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw=="], + + "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], + + "esquery": ["esquery@1.7.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g=="], + + "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="], + + "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], + + "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], + + "etag": ["etag@1.8.1", "", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="], + + "eventemitter3": ["eventemitter3@5.0.4", "", {}, "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw=="], + + "events": ["events@3.3.0", "", {}, "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="], + + "eventsource": ["eventsource@3.0.7", "", { "dependencies": { "eventsource-parser": "^3.0.1" } }, "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA=="], + + "eventsource-parser": ["eventsource-parser@3.1.0", "", {}, "sha512-kJezFj9YFAMLeORyi7aCLxLbD5/qWMQnoMVlVPyHIll7lgRJCc3JVln9Vgl9nwQi0YkMnhdGTMNn7CkRRAptMg=="], + + "execa": ["execa@9.6.1", "", { "dependencies": { "@sindresorhus/merge-streams": "^4.0.0", "cross-spawn": "^7.0.6", "figures": "^6.1.0", "get-stream": "^9.0.0", "human-signals": "^8.0.1", "is-plain-obj": "^4.1.0", "is-stream": "^4.0.1", "npm-run-path": "^6.0.0", "pretty-ms": "^9.2.0", "signal-exit": "^4.1.0", "strip-final-newline": "^4.0.0", "yoctocolors": "^2.1.1" } }, "sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA=="], + + "exponential-backoff": ["exponential-backoff@3.1.3", "", {}, "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA=="], + + "express": ["express@5.2.1", "", { "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.1", "content-disposition": "^1.0.0", "content-type": "^1.0.5", "cookie": "^0.7.1", "cookie-signature": "^1.2.1", "debug": "^4.4.0", "depd": "^2.0.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "finalhandler": "^2.1.0", "fresh": "^2.0.0", "http-errors": "^2.0.0", "merge-descriptors": "^2.0.0", "mime-types": "^3.0.0", "on-finished": "^2.4.1", "once": "^1.4.0", "parseurl": "^1.3.3", "proxy-addr": "^2.0.7", "qs": "^6.14.0", "range-parser": "^1.2.1", "router": "^2.2.0", "send": "^1.1.0", "serve-static": "^2.2.0", "statuses": "^2.0.1", "type-is": "^2.0.1", "vary": "^1.1.2" } }, "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw=="], + + "express-rate-limit": ["express-rate-limit@8.5.2", "", { "dependencies": { "ip-address": "^10.2.0" }, "peerDependencies": { "express": ">= 4.11" } }, "sha512-5Kb34ipNX694DH48vN9irak1Qx30nb0PLYHXfJgw4YEjiC3ZEmZJhwOp+VfiCYwFzvFTdB9QkArYS5kXa2cx2A=="], + + "extract-zip": ["extract-zip@2.0.1", "", { "dependencies": { "debug": "^4.1.1", "get-stream": "^5.1.0", "yauzl": "^2.10.0" }, "optionalDependencies": { "@types/yauzl": "^2.9.1" }, "bin": { "extract-zip": "cli.js" } }, "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg=="], + + "fallow": ["fallow@2.96.0", "", { "dependencies": { "detect-libc": "2.1.2" }, "optionalDependencies": { "@fallow-cli/darwin-arm64": "2.96.0", "@fallow-cli/darwin-x64": "2.96.0", "@fallow-cli/linux-arm64-gnu": "2.96.0", "@fallow-cli/linux-arm64-musl": "2.96.0", "@fallow-cli/linux-x64-gnu": "2.96.0", "@fallow-cli/linux-x64-musl": "2.96.0", "@fallow-cli/win32-arm64-msvc": "2.96.0", "@fallow-cli/win32-x64-msvc": "2.96.0" }, "bin": { "fallow": "bin/fallow", "fallow-lsp": "bin/fallow-lsp", "fallow-mcp": "bin/fallow-mcp" } }, "sha512-fNEj+b/LUVXwfyxZPnr+SJjdQHCKjUbWgluW/wC7Q5kcJENHNEJtmFDgpHEqKY6gY257xRCgyg1AlSC8YQgROA=="], + + "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], + + "fast-glob": ["fast-glob@3.3.3", "", { "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" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], + + "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="], + + "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="], + + "fast-string-truncated-width": ["fast-string-truncated-width@3.0.3", "", {}, "sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g=="], + + "fast-string-width": ["fast-string-width@3.0.2", "", { "dependencies": { "fast-string-truncated-width": "^3.0.2" } }, "sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg=="], + + "fast-uri": ["fast-uri@3.1.2", "", {}, "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ=="], + + "fast-wrap-ansi": ["fast-wrap-ansi@0.2.2", "", { "dependencies": { "fast-string-width": "^3.0.2" } }, "sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q=="], + + "fastq": ["fastq@1.20.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw=="], + + "fd-slicer": ["fd-slicer@1.1.0", "", { "dependencies": { "pend": "~1.2.0" } }, "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g=="], + + "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], + + "fetch-blob": ["fetch-blob@3.2.0", "", { "dependencies": { "node-domexception": "^1.0.0", "web-streams-polyfill": "^3.0.3" } }, "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ=="], + + "figures": ["figures@6.1.0", "", { "dependencies": { "is-unicode-supported": "^2.0.0" } }, "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg=="], + + "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="], + + "filelist": ["filelist@1.0.6", "", { "dependencies": { "minimatch": "^5.0.1" } }, "sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA=="], + + "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], + + "finalhandler": ["finalhandler@2.1.1", "", { "dependencies": { "debug": "^4.4.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "on-finished": "^2.4.1", "parseurl": "^1.3.3", "statuses": "^2.0.1" } }, "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA=="], + + "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], + + "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="], + + "flatted": ["flatted@3.4.2", "", {}, "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA=="], + + "form-data": ["form-data@4.0.6", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.4", "mime-types": "^2.1.35" } }, "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ=="], + + "formdata-polyfill": ["formdata-polyfill@4.0.10", "", { "dependencies": { "fetch-blob": "^3.1.2" } }, "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g=="], + + "forwarded": ["forwarded@0.2.0", "", {}, "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="], + + "fresh": ["fresh@2.0.0", "", {}, "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A=="], + + "fs-extra": ["fs-extra@10.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ=="], + + "fs.realpath": ["fs.realpath@1.0.0", "", {}, "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="], + + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + + "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], + + "fuzzysort": ["fuzzysort@3.1.0", "", {}, "sha512-sR9BNCjBg6LNgwvxlBd0sBABvQitkLzoVY9MYYROQVX/FvfJ4Mai9LsGhDgd8qYdds0bY77VzYd5iuB+v5rwQQ=="], + + "fzf": ["fzf@0.5.2", "", {}, "sha512-Tt4kuxLXFKHy8KT40zwsUPUkg1CrsgY25FxA2U/j/0WgEDCk3ddc/zLTCCcbSHX9FcKtLuVaDGtGE/STWC+j3Q=="], + + "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], + + "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], + + "get-east-asian-width": ["get-east-asian-width@1.6.0", "", {}, "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA=="], + + "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], + + "get-nonce": ["get-nonce@1.0.1", "", {}, "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q=="], + + "get-own-enumerable-keys": ["get-own-enumerable-keys@1.0.0", "", {}, "sha512-PKsK2FSrQCyxcGHsGrLDcK0lx+0Ke+6e8KFFozA9/fIQLhQzPaRvJFdcz7+Axg3jUH/Mq+NI4xa5u/UT2tQskA=="], + + "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], + + "get-stream": ["get-stream@5.2.0", "", { "dependencies": { "pump": "^3.0.0" } }, "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA=="], + + "glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + + "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], + + "global-agent": ["global-agent@3.0.0", "", { "dependencies": { "boolean": "^3.0.1", "es6-error": "^4.1.1", "matcher": "^3.0.0", "roarr": "^2.15.3", "semver": "^7.3.2", "serialize-error": "^7.0.1" } }, "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q=="], + + "globals": ["globals@17.6.0", "", {}, "sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA=="], + + "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], + + "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], + + "got": ["got@11.8.6", "", { "dependencies": { "@sindresorhus/is": "^4.0.0", "@szmarczak/http-timer": "^4.0.5", "@types/cacheable-request": "^6.0.1", "@types/responselike": "^1.0.0", "cacheable-lookup": "^5.0.3", "cacheable-request": "^7.0.2", "decompress-response": "^6.0.0", "http2-wrapper": "^1.0.0-beta.5.2", "lowercase-keys": "^2.0.0", "p-cancelable": "^2.0.0", "responselike": "^2.0.0" } }, "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g=="], + + "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], + + "graphql": ["graphql@16.14.2", "", {}, "sha512-Chq1s4CY7jmh8gO2qvLIJyfCDIN+EHLFW/9iShnp1z8FjBQMoodWP1kDC36VAMXXIvAjj4ARa7ntfAV2BrjsbA=="], + + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], + + "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], + + "has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="], + + "hasown": ["hasown@2.0.4", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A=="], + + "headers-polyfill": ["headers-polyfill@5.0.1", "", { "dependencies": { "@types/set-cookie-parser": "^2.4.10", "set-cookie-parser": "^3.0.1" } }, "sha512-1TJ6Fih/b8h5TIcv+1+Hw0PDQWJTKDKzFZzcKOiW1wJza3XoAQlkCuXLbymPYB8+ZQyw8mHvdw560e8zVFIWyA=="], + + "hermes-estree": ["hermes-estree@0.25.1", "", {}, "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw=="], + + "hermes-parser": ["hermes-parser@0.25.1", "", { "dependencies": { "hermes-estree": "0.25.1" } }, "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA=="], + + "hono": ["hono@4.12.25", "", {}, "sha512-2NFaIyNVgJmBs/ecmtGzlmluTFs5cHEWGTdu0t1HBwYzoGXOL5nUQBRMXsXWla5i4KkG//QMzVP88m1+I3fdAQ=="], + + "hosted-git-info": ["hosted-git-info@4.1.0", "", { "dependencies": { "lru-cache": "^6.0.0" } }, "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA=="], + + "http-cache-semantics": ["http-cache-semantics@4.2.0", "", {}, "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ=="], + + "http-errors": ["http-errors@2.0.1", "", { "dependencies": { "depd": "~2.0.0", "inherits": "~2.0.4", "setprototypeof": "~1.2.0", "statuses": "~2.0.2", "toidentifier": "~1.0.1" } }, "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ=="], + + "http-proxy-agent": ["http-proxy-agent@7.0.2", "", { "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" } }, "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig=="], + + "http2-wrapper": ["http2-wrapper@1.0.3", "", { "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.0.0" } }, "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg=="], + + "https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], + + "human-signals": ["human-signals@8.0.1", "", {}, "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ=="], + + "iconv-lite": ["iconv-lite@0.7.2", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw=="], + + "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + + "immer": ["immer@10.2.0", "", {}, "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw=="], + + "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], + + "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], + + "inflight": ["inflight@1.0.6", "", { "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="], + + "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], + + "input-otp": ["input-otp@1.4.2", "", { "peerDependencies": { "react": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc" } }, "sha512-l3jWwYNvrEa6NTCt7BECfCm48GvwuZzkoeG3gBL2w4CHeOXW3eKFmf9UNYkNfYc3mxMrthMnxjIE07MT0zLBQA=="], + + "internmap": ["internmap@2.0.3", "", {}, "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg=="], + + "ip-address": ["ip-address@10.2.0", "", {}, "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA=="], + + "ipaddr.js": ["ipaddr.js@1.9.1", "", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="], + + "is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="], + + "is-docker": ["is-docker@3.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="], + + "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], + + "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + + "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], + + "is-in-ssh": ["is-in-ssh@1.0.0", "", {}, "sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw=="], + + "is-inside-container": ["is-inside-container@1.0.0", "", { "dependencies": { "is-docker": "^3.0.0" }, "bin": { "is-inside-container": "cli.js" } }, "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA=="], + + "is-interactive": ["is-interactive@2.0.0", "", {}, "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ=="], + + "is-node-process": ["is-node-process@1.2.0", "", {}, "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw=="], + + "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], + + "is-obj": ["is-obj@3.0.0", "", {}, "sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ=="], + + "is-plain-obj": ["is-plain-obj@4.1.0", "", {}, "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg=="], + + "is-promise": ["is-promise@4.0.0", "", {}, "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ=="], + + "is-regexp": ["is-regexp@3.1.0", "", {}, "sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA=="], + + "is-stream": ["is-stream@4.0.1", "", {}, "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A=="], + + "is-unicode-supported": ["is-unicode-supported@2.1.0", "", {}, "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ=="], + + "is-wsl": ["is-wsl@3.1.1", "", { "dependencies": { "is-inside-container": "^1.0.0" } }, "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw=="], + + "isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], + + "isbinaryfile": ["isbinaryfile@5.0.7", "", {}, "sha512-gnWD14Jh3FzS3CPhF0AxNOJ8CxqeblPTADzI38r0wt8ZyQl5edpy75myt08EG2oKvpyiqSqsx+Wkz9vtkbTqYQ=="], + + "isbot": ["isbot@5.1.43", "", {}, "sha512-drJhFmibra4LO6Wd7D3Oi6UICRK9244vSZkmxzhlZP0TTdwCA2ueK4PEkUkzPYeuqug9+cqqdWPgihjk5+83Cg=="], + + "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "jake": ["jake@10.9.4", "", { "dependencies": { "async": "^3.2.6", "filelist": "^1.0.4", "picocolors": "^1.1.1" }, "bin": { "jake": "bin/cli.js" } }, "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA=="], + + "jiti": ["jiti@2.7.0", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ=="], + + "jose": ["jose@6.2.3", "", {}, "sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw=="], + + "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], + + "js-yaml": ["js-yaml@4.2.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw=="], + + "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], + + "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], + + "json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="], + + "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + + "json-schema-typed": ["json-schema-typed@8.0.2", "", {}, "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA=="], + + "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="], + + "json-stringify-safe": ["json-stringify-safe@5.0.1", "", {}, "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="], + + "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], + + "jsonc-parser": ["jsonc-parser@3.3.1", "", {}, "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ=="], + + "jsonfile": ["jsonfile@6.2.1", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q=="], + + "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], + + "kleur": ["kleur@4.1.5", "", {}, "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ=="], + + "lazy-val": ["lazy-val@1.0.5", "", {}, "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q=="], + + "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], + + "lightningcss": ["lightningcss@1.32.0", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.32.0", "lightningcss-darwin-arm64": "1.32.0", "lightningcss-darwin-x64": "1.32.0", "lightningcss-freebsd-x64": "1.32.0", "lightningcss-linux-arm-gnueabihf": "1.32.0", "lightningcss-linux-arm64-gnu": "1.32.0", "lightningcss-linux-arm64-musl": "1.32.0", "lightningcss-linux-x64-gnu": "1.32.0", "lightningcss-linux-x64-musl": "1.32.0", "lightningcss-win32-arm64-msvc": "1.32.0", "lightningcss-win32-x64-msvc": "1.32.0" } }, "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ=="], + + "lightningcss-android-arm64": ["lightningcss-android-arm64@1.32.0", "", { "os": "android", "cpu": "arm64" }, "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg=="], + + "lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.32.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ=="], + + "lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.32.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w=="], + + "lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.32.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig=="], + + "lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.32.0", "", { "os": "linux", "cpu": "arm" }, "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw=="], + + "lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ=="], + + "lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg=="], + + "lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA=="], + + "lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg=="], + + "lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.32.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw=="], + + "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.32.0", "", { "os": "win32", "cpu": "x64" }, "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q=="], + + "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="], + + "livekit-client": ["livekit-client@2.19.2", "", { "dependencies": { "@livekit/mutex": "1.1.1", "@livekit/protocol": "1.45.8", "events": "^3.3.0", "jose": "^6.1.0", "loglevel": "^1.9.2", "sdp-transform": "^2.15.0", "tslib": "2.8.1", "typed-emitter": "^2.1.0", "webrtc-adapter": "9.0.5" }, "peerDependencies": { "@types/dom-mediacapture-record": "^1" } }, "sha512-Kvk07QYDWRAbmYNLRll04ZIuxMQobW/oLPYnmR1kCy8GGHpU0gqyHf704Rz+29zfy8IJZRjKqeVbzGSKn9sumw=="], + + "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], + + "lodash": ["lodash@4.18.1", "", {}, "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q=="], + + "lodash.debounce": ["lodash.debounce@4.0.8", "", {}, "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="], + + "log-symbols": ["log-symbols@6.0.0", "", { "dependencies": { "chalk": "^5.3.0", "is-unicode-supported": "^1.3.0" } }, "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw=="], + + "loglevel": ["loglevel@1.9.2", "", {}, "sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg=="], + + "lowercase-keys": ["lowercase-keys@2.0.0", "", {}, "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA=="], + + "lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], + + "lucide-react": ["lucide-react@1.18.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-LZDb7H/0YfM+RJncD0hDQRCAu+vSGODqpe35TuVI8EuXaRjkczbsx7p8dY4J87F/MUSj6bpYqeI8nw8qXaAdmA=="], + + "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], + + "matcher": ["matcher@3.0.0", "", { "dependencies": { "escape-string-regexp": "^4.0.0" } }, "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng=="], + + "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], + + "media-typer": ["media-typer@1.1.0", "", {}, "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw=="], + + "merge-descriptors": ["merge-descriptors@2.0.0", "", {}, "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g=="], + + "merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="], + + "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], + + "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + + "mime": ["mime@2.6.0", "", { "bin": { "mime": "cli.js" } }, "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg=="], + + "mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], + + "mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], + + "mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="], + + "mimic-function": ["mimic-function@5.0.1", "", {}, "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA=="], + + "mimic-response": ["mimic-response@3.1.0", "", {}, "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ=="], + + "minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], + + "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], + + "minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="], + + "minizlib": ["minizlib@3.1.0", "", { "dependencies": { "minipass": "^7.1.2" } }, "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw=="], + + "mkdirp": ["mkdirp@0.5.6", "", { "dependencies": { "minimist": "^1.2.6" }, "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw=="], + + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "msw": ["msw@2.14.6", "", { "dependencies": { "@inquirer/confirm": "^6.0.11", "@mswjs/interceptors": "^0.41.3", "@open-draft/deferred-promise": "^3.0.0", "@types/statuses": "^2.0.6", "cookie": "^1.1.1", "graphql": "^16.13.2", "headers-polyfill": "^5.0.1", "is-node-process": "^1.2.0", "outvariant": "^1.4.3", "path-to-regexp": "^6.3.0", "picocolors": "^1.1.1", "rettime": "^0.11.11", "statuses": "^2.0.2", "strict-event-emitter": "^0.5.1", "tough-cookie": "^6.0.1", "type-fest": "^5.5.0", "until-async": "^3.0.2", "yargs": "^17.7.2" }, "peerDependencies": { "typescript": ">= 4.8.x" }, "optionalPeers": ["typescript"], "bin": { "msw": "cli/index.js" } }, "sha512-ALe+N10S72cyx94cMcy3Zs4HhXCj35sgeAL4c+WTvKi0zWnbd8/h0lcFqv0mb2P+aSgAdD7p9HzvA0DiUPxsyg=="], + + "mute-stream": ["mute-stream@3.0.0", "", {}, "sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw=="], + + "nanoid": ["nanoid@3.3.12", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ=="], + + "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], + + "negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="], + + "next-themes": ["next-themes@0.4.6", "", { "peerDependencies": { "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" } }, "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA=="], + + "node-abi": ["node-abi@4.31.0", "", { "dependencies": { "semver": "^7.6.3" } }, "sha512-Erq5w/t3syw3s4sDsUaX4QttIdBPsGKTT1DTRsCkTonGggczhlDKm/wDX3o+HPJpQ41EjXCbcmXf0tgr5YZJXw=="], + + "node-api-version": ["node-api-version@0.2.1", "", { "dependencies": { "semver": "^7.3.5" } }, "sha512-2xP/IGGMmmSQpI1+O/k72jF/ykvZ89JeuKX3TLJAYPDVLUalrshrLHkeVcCCZqG/eEa635cr8IBYzgnDvM2O8Q=="], + + "node-domexception": ["node-domexception@1.0.0", "", {}, "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ=="], + + "node-fetch": ["node-fetch@3.3.2", "", { "dependencies": { "data-uri-to-buffer": "^4.0.0", "fetch-blob": "^3.1.4", "formdata-polyfill": "^4.0.10" } }, "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA=="], + + "node-gyp": ["node-gyp@12.4.0", "", { "dependencies": { "env-paths": "^2.2.0", "exponential-backoff": "^3.1.1", "graceful-fs": "^4.2.6", "nopt": "^9.0.0", "proc-log": "^6.0.0", "semver": "^7.3.5", "tar": "^7.5.4", "tinyglobby": "^0.2.12", "undici": "^6.25.0", "which": "^6.0.0" }, "bin": { "node-gyp": "bin/node-gyp.js" } }, "sha512-OMcPNvqTCFUnNaBlmdgq+lfNqY7gTiSmNRDjY3uAXRyudeKZEZxu3CLtjMQrx4zZxCX2b/mpNqTtwuCJgXhHkw=="], + + "node-int64": ["node-int64@0.4.0", "", {}, "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw=="], + + "node-releases": ["node-releases@2.0.47", "", {}, "sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og=="], + + "nopt": ["nopt@9.0.0", "", { "dependencies": { "abbrev": "^4.0.0" }, "bin": { "nopt": "bin/nopt.js" } }, "sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw=="], + + "normalize-url": ["normalize-url@6.1.0", "", {}, "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A=="], + + "npm-run-path": ["npm-run-path@6.0.0", "", { "dependencies": { "path-key": "^4.0.0", "unicorn-magic": "^0.3.0" } }, "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA=="], + + "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], + + "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="], + + "object-keys": ["object-keys@1.1.1", "", {}, "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="], + + "object-treeify": ["object-treeify@1.1.33", "", {}, "sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A=="], + + "on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="], + + "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], + + "onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], + + "open": ["open@11.0.0", "", { "dependencies": { "default-browser": "^5.4.0", "define-lazy-prop": "^3.0.0", "is-in-ssh": "^1.0.0", "is-inside-container": "^1.0.0", "powershell-utils": "^0.1.0", "wsl-utils": "^0.3.0" } }, "sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw=="], + + "optionator": ["optionator@0.9.4", "", { "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" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], + + "ora": ["ora@8.2.0", "", { "dependencies": { "chalk": "^5.3.0", "cli-cursor": "^5.0.0", "cli-spinners": "^2.9.2", "is-interactive": "^2.0.0", "is-unicode-supported": "^2.0.0", "log-symbols": "^6.0.0", "stdin-discarder": "^0.2.2", "string-width": "^7.2.0", "strip-ansi": "^7.1.0" } }, "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw=="], + + "outvariant": ["outvariant@1.4.3", "", {}, "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA=="], + + "p-cancelable": ["p-cancelable@2.1.1", "", {}, "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg=="], + + "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], + + "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], + + "p-try": ["p-try@2.2.0", "", {}, "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="], + + "package-manager-detector": ["package-manager-detector@1.6.0", "", {}, "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA=="], + + "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], + + "parse-json": ["parse-json@5.2.0", "", { "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" } }, "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="], + + "parse-ms": ["parse-ms@4.0.0", "", {}, "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw=="], + + "parseurl": ["parseurl@1.3.3", "", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="], + + "path-browserify": ["path-browserify@1.0.1", "", {}, "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g=="], + + "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], + + "path-is-absolute": ["path-is-absolute@1.0.1", "", {}, "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="], + + "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + + "path-to-regexp": ["path-to-regexp@6.3.0", "", {}, "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ=="], + + "pe-library": ["pe-library@0.4.1", "", {}, "sha512-eRWB5LBz7PpDu4PUlwT0PhnQfTQJlDDdPa35urV4Osrm0t0AqQFGn+UIkU3klZvwJ8KPO3VbBFsXquA6p6kqZw=="], + + "pend": ["pend@1.2.0", "", {}, "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg=="], + + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + + "picomatch": ["picomatch@4.0.4", "", {}, "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="], + + "pkce-challenge": ["pkce-challenge@5.0.1", "", {}, "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ=="], + + "pkijs": ["pkijs@3.4.0", "", { "dependencies": { "@noble/hashes": "1.4.0", "asn1js": "^3.0.6", "bytestreamjs": "^2.0.1", "pvtsutils": "^1.3.6", "pvutils": "^1.1.3", "tslib": "^2.8.1" } }, "sha512-emEcLuomt2j03vxD54giVB4SxTjnsqkU692xZOZXHDVoYyypEm+b3jpiTcc+Cf+myooc+/Ly0z01jqeNHVgJGw=="], + + "plist": ["plist@3.1.0", "", { "dependencies": { "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.5.1", "xmlbuilder": "^15.1.1" } }, "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ=="], + + "pngjs": ["pngjs@5.0.0", "", {}, "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw=="], + + "postcss": ["postcss@8.5.15", "", { "dependencies": { "nanoid": "^3.3.12", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A=="], + + "postcss-selector-parser": ["postcss-selector-parser@7.1.4", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg=="], + + "postject": ["postject@1.0.0-alpha.6", "", { "dependencies": { "commander": "^9.4.0" }, "bin": { "postject": "dist/cli.js" } }, "sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A=="], + + "powershell-utils": ["powershell-utils@0.1.0", "", {}, "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A=="], + + "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], + + "prettier": ["prettier@3.8.4", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-N2MylSdi48+5N/6S5j+maeHbUSIzzZ5uOcX5Hm4QpV8Dkb1HFjfAKTKX6yNPJQD9AhcT3ifHNB66tWTTJDi11Q=="], + + "pretty-ms": ["pretty-ms@9.3.0", "", { "dependencies": { "parse-ms": "^4.0.0" } }, "sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ=="], + + "proc-log": ["proc-log@6.1.0", "", {}, "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ=="], + + "process-nextick-args": ["process-nextick-args@2.0.1", "", {}, "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="], + + "progress": ["progress@2.0.3", "", {}, "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA=="], + + "promise-retry": ["promise-retry@2.0.1", "", { "dependencies": { "err-code": "^2.0.2", "retry": "^0.12.0" } }, "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g=="], + + "prompts": ["prompts@2.4.2", "", { "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" } }, "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q=="], + + "proper-lockfile": ["proper-lockfile@4.1.2", "", { "dependencies": { "graceful-fs": "^4.2.4", "retry": "^0.12.0", "signal-exit": "^3.0.2" } }, "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA=="], + + "proxy-addr": ["proxy-addr@2.0.7", "", { "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg=="], + + "pump": ["pump@3.0.4", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA=="], + + "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], + + "pvtsutils": ["pvtsutils@1.3.6", "", { "dependencies": { "tslib": "^2.8.1" } }, "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg=="], + + "pvutils": ["pvutils@1.1.5", "", {}, "sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA=="], + + "qrcode": ["qrcode@1.5.4", "", { "dependencies": { "dijkstrajs": "^1.0.1", "pngjs": "^5.0.0", "yargs": "^15.3.1" }, "bin": { "qrcode": "bin/qrcode" } }, "sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg=="], + + "qs": ["qs@6.15.2", "", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw=="], + + "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], + + "quick-lru": ["quick-lru@5.1.1", "", {}, "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA=="], + + "range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="], + + "raw-body": ["raw-body@3.0.2", "", { "dependencies": { "bytes": "~3.1.2", "http-errors": "~2.0.1", "iconv-lite": "~0.7.0", "unpipe": "~1.0.0" } }, "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA=="], + + "react": ["react@19.2.7", "", {}, "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ=="], + + "react-day-picker": ["react-day-picker@9.14.0", "", { "dependencies": { "@date-fns/tz": "^1.4.1", "@tabby_ai/hijri-converter": "1.0.5", "date-fns": "^4.1.0", "date-fns-jalali": "4.1.0-0" }, "peerDependencies": { "react": ">=16.8.0" } }, "sha512-tBaoDWjPwe0M5pGrum4H0SR6Lyk+BO9oHnp9JbKpGKW2mlraNPgP9BMfsg5pWpwrssARmeqk7YBl2oXutZTaHA=="], + + "react-dom": ["react-dom@19.2.7", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.7" } }, "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ=="], + + "react-is": ["react-is@19.2.7", "", {}, "sha512-kZFnouyVv7eP/Phmrlo9FK+zcAdriZJvzxXHF1Sl1P377WSGe2G/JxVolhTrB/jeV47lKImhNUsijjHAAbcl/A=="], + + "react-redux": ["react-redux@9.3.0", "", { "dependencies": { "@types/use-sync-external-store": "^0.0.6", "use-sync-external-store": "^1.4.0" }, "peerDependencies": { "@types/react": "^18.2.25 || ^19", "react": "^18.0 || ^19", "redux": "^5.0.0" }, "optionalPeers": ["@types/react", "redux"] }, "sha512-KQopgqFo/p/fgmAs5qz6p5RWaNAzq40WAu7fJIXnQpYxFPbJYtsJPWvGeF2rOBaY/kEuV77AVsX8TsQzKm+A/g=="], + + "react-remove-scroll": ["react-remove-scroll@2.7.2", "", { "dependencies": { "react-remove-scroll-bar": "^2.3.7", "react-style-singleton": "^2.2.3", "tslib": "^2.1.0", "use-callback-ref": "^1.3.3", "use-sidecar": "^1.1.3" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q=="], + + "react-remove-scroll-bar": ["react-remove-scroll-bar@2.3.8", "", { "dependencies": { "react-style-singleton": "^2.2.2", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q=="], + + "react-resizable-panels": ["react-resizable-panels@4.11.2", "", { "peerDependencies": { "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" } }, "sha512-+kfFbDZ8mygc7g0vxOcDzCVGuwiIUOnILqPoUHo6/uP+Mmyx6HzZU+kj1aOPDlktXuobYbr6BtQekvJwHRX4Eg=="], + + "react-style-singleton": ["react-style-singleton@2.2.3", "", { "dependencies": { "get-nonce": "^1.0.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ=="], + + "read-binary-file-arch": ["read-binary-file-arch@1.0.6", "", { "dependencies": { "debug": "^4.3.4" }, "bin": { "read-binary-file-arch": "cli.js" } }, "sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg=="], + + "readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], + + "recast": ["recast@0.23.11", "", { "dependencies": { "ast-types": "^0.16.1", "esprima": "~4.0.0", "source-map": "~0.6.1", "tiny-invariant": "^1.3.3", "tslib": "^2.0.1" } }, "sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA=="], + + "recharts": ["recharts@3.8.1", "", { "dependencies": { "@reduxjs/toolkit": "^1.9.0 || 2.x.x", "clsx": "^2.1.1", "decimal.js-light": "^2.5.1", "es-toolkit": "^1.39.3", "eventemitter3": "^5.0.1", "immer": "^10.1.1", "react-redux": "8.x.x || 9.x.x", "reselect": "5.1.1", "tiny-invariant": "^1.3.3", "use-sync-external-store": "^1.2.2", "victory-vendor": "^37.0.2" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-is": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-mwzmO1s9sFL0TduUpwndxCUNoXsBw3u3E/0+A+cLcrSfQitSG62L32N69GhqUrrT5qKcAE3pCGVINC6pqkBBQg=="], + + "redux": ["redux@5.0.1", "", {}, "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w=="], + + "redux-thunk": ["redux-thunk@3.1.0", "", { "peerDependencies": { "redux": "^5.0.0" } }, "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw=="], + + "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], + + "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="], + + "require-main-filename": ["require-main-filename@2.0.0", "", {}, "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="], + + "resedit": ["resedit@1.7.2", "", { "dependencies": { "pe-library": "^0.4.1" } }, "sha512-vHjcY2MlAITJhC0eRD/Vv8Vlgmu9Sd3LX9zZvtGzU5ZImdTN3+d6e/4mnTyV8vEbyf1sgNIrWxhWlrys52OkEA=="], + + "reselect": ["reselect@5.1.1", "", {}, "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w=="], + + "resolve-alpn": ["resolve-alpn@1.2.1", "", {}, "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g=="], + + "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], + + "responselike": ["responselike@2.0.1", "", { "dependencies": { "lowercase-keys": "^2.0.0" } }, "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw=="], + + "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], + + "retry": ["retry@0.12.0", "", {}, "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow=="], + + "rettime": ["rettime@0.11.11", "", {}, "sha512-ILJRqVWBCTlg9r42fFgwVZx1gnFAcQF8mRoMkbgQfIrjEDf9nbBFDFx00oloOa+Q869FUtaYDXZvEfnecQSCoQ=="], + + "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], + + "rimraf": ["rimraf@2.6.3", "", { "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "./bin.js" } }, "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA=="], + + "roarr": ["roarr@2.15.4", "", { "dependencies": { "boolean": "^3.0.1", "detect-node": "^2.0.4", "globalthis": "^1.0.1", "json-stringify-safe": "^5.0.1", "semver-compare": "^1.0.0", "sprintf-js": "^1.1.2" } }, "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A=="], + + "rolldown": ["rolldown@1.0.3", "", { "dependencies": { "@oxc-project/types": "=0.133.0", "@rolldown/pluginutils": "^1.0.0" }, "optionalDependencies": { "@rolldown/binding-android-arm64": "1.0.3", "@rolldown/binding-darwin-arm64": "1.0.3", "@rolldown/binding-darwin-x64": "1.0.3", "@rolldown/binding-freebsd-x64": "1.0.3", "@rolldown/binding-linux-arm-gnueabihf": "1.0.3", "@rolldown/binding-linux-arm64-gnu": "1.0.3", "@rolldown/binding-linux-arm64-musl": "1.0.3", "@rolldown/binding-linux-ppc64-gnu": "1.0.3", "@rolldown/binding-linux-s390x-gnu": "1.0.3", "@rolldown/binding-linux-x64-gnu": "1.0.3", "@rolldown/binding-linux-x64-musl": "1.0.3", "@rolldown/binding-openharmony-arm64": "1.0.3", "@rolldown/binding-wasm32-wasi": "1.0.3", "@rolldown/binding-win32-arm64-msvc": "1.0.3", "@rolldown/binding-win32-x64-msvc": "1.0.3" }, "bin": { "rolldown": "./bin/cli.mjs" } }, "sha512-i00lAJ2ks1BYr7rjNjKC7BcqAS7nVfiT3QX1SI5aY+AFHblCmaUf9OE9dbdzDvW6dJxbi2ZCZiy9v3CcwOiX3g=="], + + "router": ["router@2.2.0", "", { "dependencies": { "debug": "^4.4.0", "depd": "^2.0.0", "is-promise": "^4.0.0", "parseurl": "^1.3.3", "path-to-regexp": "^8.0.0" } }, "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ=="], + + "run-applescript": ["run-applescript@7.1.0", "", {}, "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q=="], + + "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], + + "rxjs": ["rxjs@7.8.2", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA=="], + + "safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], + + "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], + + "sanitize-filename": ["sanitize-filename@1.6.4", "", { "dependencies": { "truncate-utf8-bytes": "^1.0.0" } }, "sha512-9ZyI08PsvdQl2r/bBIGubpVdR3RR9sY6RDiWFPreA21C/EFlQhmgo20UZlNjZMMZNubusLhAQozkA0Od5J21Eg=="], + + "sax": ["sax@1.6.0", "", {}, "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA=="], + + "scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], + + "sdp": ["sdp@3.2.2", "", {}, "sha512-xZocWwfyp4hkbN4hLWxMjmv2Q8aNa9MhmOZ7L9aCZPT+dZsgRr6wZRrSYE3HTdyk/2pZKPSgqI7ns7Een1xMSA=="], + + "sdp-transform": ["sdp-transform@2.15.0", "", { "bin": { "sdp-verify": "checker.js" } }, "sha512-KrOH82c/W+GYQ0LHqtr3caRpM3ITglq3ljGUIb8LTki7ByacJZ9z+piSGiwZDsRyhQbYBOBJgr2k6X4BZXi3Kw=="], + + "semver": ["semver@7.8.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA=="], + + "semver-compare": ["semver-compare@1.0.0", "", {}, "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow=="], + + "send": ["send@1.2.1", "", { "dependencies": { "debug": "^4.4.3", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "fresh": "^2.0.0", "http-errors": "^2.0.1", "mime-types": "^3.0.2", "ms": "^2.1.3", "on-finished": "^2.4.1", "range-parser": "^1.2.1", "statuses": "^2.0.2" } }, "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ=="], + + "serialize-error": ["serialize-error@7.0.1", "", { "dependencies": { "type-fest": "^0.13.1" } }, "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw=="], + + "seroval": ["seroval@1.5.4", "", {}, "sha512-46uFvgrXTVxZcUorgSSRZ4y+ieqLLQRMlG4bnCZKW3qI6BZm7Rg4ntMW4p1mILEEBZWrFlcpp0AyIIlM6jD9iw=="], + + "seroval-plugins": ["seroval-plugins@1.5.4", "", { "peerDependencies": { "seroval": "^1.0" } }, "sha512-S0xQPhUTefAhNvNWFg0c1J8qJArHt5KdtJ/cFAofo06KD1MVSeFWyl4iiu+ApDIuw0WhjpOfCdgConOfAnLgkw=="], + + "serve-static": ["serve-static@2.2.1", "", { "dependencies": { "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "parseurl": "^1.3.3", "send": "^1.2.0" } }, "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw=="], + + "set-blocking": ["set-blocking@2.0.0", "", {}, "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw=="], + + "set-cookie-parser": ["set-cookie-parser@3.1.0", "", {}, "sha512-kjnC1DXBHcxaOaOXBHBeRtltsDG2nUiUni+jP92M9gYdW12rsmx92UsfpH7o5tDRs7I1ZZPSQJQGv3UaRfCiuw=="], + + "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="], + + "shadcn": ["shadcn@3.8.5", "", { "dependencies": { "@antfu/ni": "^25.0.0", "@babel/core": "^7.28.0", "@babel/parser": "^7.28.0", "@babel/plugin-transform-typescript": "^7.28.0", "@babel/preset-typescript": "^7.27.1", "@dotenvx/dotenvx": "^1.48.4", "@modelcontextprotocol/sdk": "^1.26.0", "@types/validate-npm-package-name": "^4.0.2", "browserslist": "^4.26.2", "commander": "^14.0.0", "cosmiconfig": "^9.0.0", "dedent": "^1.6.0", "deepmerge": "^4.3.1", "diff": "^8.0.2", "execa": "^9.6.0", "fast-glob": "^3.3.3", "fs-extra": "^11.3.1", "fuzzysort": "^3.1.0", "https-proxy-agent": "^7.0.6", "kleur": "^4.1.5", "msw": "^2.10.4", "node-fetch": "^3.3.2", "open": "^11.0.0", "ora": "^8.2.0", "postcss": "^8.5.6", "postcss-selector-parser": "^7.1.0", "prompts": "^2.4.2", "recast": "^0.23.11", "stringify-object": "^5.0.0", "tailwind-merge": "^3.0.1", "ts-morph": "^26.0.0", "tsconfig-paths": "^4.2.0", "validate-npm-package-name": "^7.0.1", "zod": "^3.24.1", "zod-to-json-schema": "^3.24.6" }, "bin": { "shadcn": "dist/index.js" } }, "sha512-jPRx44e+eyeV7xwY3BLJXcfrks00+M0h5BGB9l6DdcBW4BpAj4x3lVmVy0TXPEs2iHEisxejr62sZAAw6B1EVA=="], + + "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + + "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + + "side-channel": ["side-channel@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.4", "side-channel-list": "^1.0.1", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ=="], + + "side-channel-list": ["side-channel-list@1.0.1", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.4" } }, "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w=="], + + "side-channel-map": ["side-channel-map@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" } }, "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA=="], + + "side-channel-weakmap": ["side-channel-weakmap@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="], + + "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + + "simple-update-notifier": ["simple-update-notifier@2.0.0", "", { "dependencies": { "semver": "^7.5.3" } }, "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w=="], + + "sisteransi": ["sisteransi@1.0.5", "", {}, "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="], + + "sonner": ["sonner@2.0.7", "", { "peerDependencies": { "react": "^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc" } }, "sha512-W6ZN4p58k8aDKA4XPcx2hpIQXBRAgyiWVkYhT7CvK6D3iAu7xjvVyhQHg2/iaKJZ1XVJ4r7XuwGL+WGEK37i9w=="], + + "source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], + + "source-map-support": ["source-map-support@0.5.21", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="], + + "sprintf-js": ["sprintf-js@1.1.3", "", {}, "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA=="], + + "stat-mode": ["stat-mode@1.0.0", "", {}, "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg=="], + + "statuses": ["statuses@2.0.2", "", {}, "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw=="], + + "stdin-discarder": ["stdin-discarder@0.2.2", "", {}, "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ=="], + + "strict-event-emitter": ["strict-event-emitter@0.5.1", "", {}, "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ=="], + + "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], + + "stringify-object": ["stringify-object@5.0.0", "", { "dependencies": { "get-own-enumerable-keys": "^1.0.0", "is-obj": "^3.0.0", "is-regexp": "^3.1.0" } }, "sha512-zaJYxz2FtcMb4f+g60KsRNFOpVMUyuJgA51Zi5Z1DOTC3S59+OQiVOzE9GZt0x72uBGWKsQIuBKeF9iusmKFsg=="], + + "strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="], + + "strip-bom": ["strip-bom@3.0.0", "", {}, "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA=="], + + "strip-final-newline": ["strip-final-newline@4.0.0", "", {}, "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw=="], + + "style-mod": ["style-mod@4.1.3", "", {}, "sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ=="], + + "sumchecker": ["sumchecker@3.0.1", "", { "dependencies": { "debug": "^4.1.0" } }, "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg=="], + + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "tagged-tag": ["tagged-tag@1.0.0", "", {}, "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng=="], + + "tailwind-merge": ["tailwind-merge@3.6.0", "", {}, "sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w=="], + + "tailwind-scrollbar-hide": ["tailwind-scrollbar-hide@4.0.0", "", { "peerDependencies": { "tailwindcss": ">=3.0.0 || >= 4.0.0 || >= 4.0.0-beta.8 || >= 4.0.0-alpha.20" } }, "sha512-gobtvVcThB2Dxhy0EeYSS1RKQJ5baDFkamkhwBvzvevwX6L4XQfpZ3me9s25Ss1ecFVT5jPYJ50n+7xTBJG9WQ=="], + + "tailwindcss": ["tailwindcss@4.3.1", "", {}, "sha512-hk+TB1m+K8CYNrP6rjQaq/Y+4Zylwpa87mLYBKCunwnnQ9p+fHb7kmSfGqyEJoxF/O6CDyABWVFEafNSYKll+Q=="], + + "tapable": ["tapable@2.3.3", "", {}, "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A=="], + + "tar": ["tar@7.5.16", "", { "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.1.0", "yallist": "^5.0.0" } }, "sha512-56adEpPMouktRlBLXiaYFFzZ/3+JXa8P9n7WbR+ibIjtviN55mEaOkiysCnPnWm+7kkui1Dn8J9l+g6zV8731w=="], + + "tauri-plugin-app-events-api": ["tauri-plugin-app-events-api@0.2.0", "", { "dependencies": { "@tauri-apps/api": "^2.0.3" } }, "sha512-CnlAeucWhT+Rgx6CCsqUpq2D3pqgx0fhjSPKomH7O2t1rGVu5kGLMkYvaCX6gqVTUYpIWX5BLV7LGY2DRri0QA=="], + + "temp": ["temp@0.9.4", "", { "dependencies": { "mkdirp": "^0.5.1", "rimraf": "~2.6.2" } }, "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA=="], + + "temp-file": ["temp-file@3.4.0", "", { "dependencies": { "async-exit-hook": "^2.0.1", "fs-extra": "^10.0.0" } }, "sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg=="], + + "tiny-async-pool": ["tiny-async-pool@1.3.0", "", { "dependencies": { "semver": "^5.5.0" } }, "sha512-01EAw5EDrcVrdgyCLgoSPvqznC0sVxDSVeiOz09FUpjh71G79VCqneOr+xvt7T1r76CF6ZZfPjHorN2+d+3mqA=="], + + "tiny-invariant": ["tiny-invariant@1.3.3", "", {}, "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg=="], + + "tinyexec": ["tinyexec@1.2.4", "", {}, "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg=="], + + "tinyglobby": ["tinyglobby@0.2.17", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g=="], + + "tldts": ["tldts@7.4.3", "", { "dependencies": { "tldts-core": "^7.4.3" }, "bin": { "tldts": "bin/cli.js" } }, "sha512-A3BDQBeeukYPzB4QdQ1DtdlUmp4x2OCH8n5UVhEWbyANxNep8GavottKzd1xYKFJKjUgMyPT7EzOfnBO55s8Sg=="], + + "tldts-core": ["tldts-core@7.4.3", "", {}, "sha512-27ep5H9PzdBrNd5OFM/j3WCU8F3kPwM9D0BOaOf7uYfxMJfyr0K5Tjj69Gri+sZlh2WXd5buIm47NuPF29CDiw=="], + + "tmp": ["tmp@0.2.7", "", {}, "sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw=="], + + "tmp-promise": ["tmp-promise@3.0.3", "", { "dependencies": { "tmp": "^0.2.0" } }, "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ=="], + + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], + + "toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="], + + "tough-cookie": ["tough-cookie@6.0.1", "", { "dependencies": { "tldts": "^7.0.5" } }, "sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw=="], + + "truncate-utf8-bytes": ["truncate-utf8-bytes@1.0.2", "", { "dependencies": { "utf8-byte-length": "^1.0.1" } }, "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ=="], + + "ts-api-utils": ["ts-api-utils@2.5.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA=="], + + "ts-morph": ["ts-morph@26.0.0", "", { "dependencies": { "@ts-morph/common": "~0.27.0", "code-block-writer": "^13.0.3" } }, "sha512-ztMO++owQnz8c/gIENcM9XfCEzgoGphTv+nKpYNM1bgsdOVC/jRZuEBf6N+mLLDNg68Kl+GgUZfOySaRiG1/Ug=="], + + "tsconfig-paths": ["tsconfig-paths@4.2.0", "", { "dependencies": { "json5": "^2.2.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg=="], + + "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "tw-animate-css": ["tw-animate-css@1.4.0", "", {}, "sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ=="], + + "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], + + "type-fest": ["type-fest@5.7.0", "", { "dependencies": { "tagged-tag": "^1.0.0" } }, "sha512-1URUxUqfHFM1c+zfSPsa3gnkO7Aq21qyH75SIduNYz4SzY964rn1X2vCMQaHSHhktiw+0kPa2iyb6PUpXqB6Vg=="], + + "type-is": ["type-is@2.1.0", "", { "dependencies": { "content-type": "^2.0.0", "media-typer": "^1.1.0", "mime-types": "^3.0.0" } }, "sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA=="], + + "typed-emitter": ["typed-emitter@2.1.0", "", { "optionalDependencies": { "rxjs": "*" } }, "sha512-g/KzbYKbH5C2vPkaXGu8DJlHrGKHLsM25Zg9WuC9pMGfuvT+X25tZQWo5fK1BjBm8+UrVE9LDCvaY0CQk+fXDA=="], + + "typescript": ["typescript@6.0.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw=="], + + "typescript-eslint": ["typescript-eslint@8.61.1", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.61.1", "@typescript-eslint/parser": "8.61.1", "@typescript-eslint/typescript-estree": "8.61.1", "@typescript-eslint/utils": "8.61.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-V7PayAfJokV3pEHgN7/v03D1SpujhRfQtYLbLIiBfDDncdg4PAiRBfoS4cnCANK4jmAPncczi59QO3afiXUlNw=="], + + "undici": ["undici@6.27.0", "", {}, "sha512-YmfV3YnEDzXRC5lZ2jWtWWHKGUm1zIt8AhesR1tens+HTNv+YZlN/dp6G727LOvMJ8xjP9Be7Y2Sdr96LDm+pg=="], + + "undici-types": ["undici-types@7.24.6", "", {}, "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg=="], + + "unicorn-magic": ["unicorn-magic@0.3.0", "", {}, "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA=="], + + "universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], + + "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="], + + "until-async": ["until-async@3.0.2", "", {}, "sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw=="], + + "unzipper": ["unzipper@0.12.3", "", { "dependencies": { "bluebird": "~3.7.2", "duplexer2": "~0.1.4", "fs-extra": "^11.2.0", "graceful-fs": "^4.2.2", "node-int64": "^0.4.0" } }, "sha512-PZ8hTS+AqcGxsaQntl3IRBw65QrBI6lxzqDEL7IAo/XCEqRTKGfOX56Vea5TH9SZczRVxuzk1re04z/YjuYCJA=="], + + "update-browserslist-db": ["update-browserslist-db@1.2.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="], + + "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], + + "use-callback-ref": ["use-callback-ref@1.3.3", "", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg=="], + + "use-sidecar": ["use-sidecar@1.1.3", "", { "dependencies": { "detect-node-es": "^1.1.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ=="], + + "use-sync-external-store": ["use-sync-external-store@1.6.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w=="], + + "usehooks-ts": ["usehooks-ts@3.1.1", "", { "dependencies": { "lodash.debounce": "^4.0.8" }, "peerDependencies": { "react": "^16.8.0 || ^17 || ^18 || ^19 || ^19.0.0-rc" } }, "sha512-I4diPp9Cq6ieSUH2wu+fDAVQO43xwtulo+fKEidHUwZPnYImbtkTjzIJYcDcJqxgmX31GVqNFURodvcgHcW0pA=="], + + "utf8-byte-length": ["utf8-byte-length@1.0.5", "", {}, "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA=="], + + "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], + + "validate-npm-package-name": ["validate-npm-package-name@7.0.2", "", {}, "sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A=="], + + "vary": ["vary@1.1.2", "", {}, "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="], + + "vaul": ["vaul@1.1.2", "", { "dependencies": { "@radix-ui/react-dialog": "^1.1.1" }, "peerDependencies": { "react": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc" } }, "sha512-ZFkClGpWyI2WUQjdLJ/BaGuV6AVQiJ3uELGk3OYtP+B6yCO7Cmn9vPFXVJkRaGkOJu3m8bQMgtyzNHixULceQA=="], + + "victory-vendor": ["victory-vendor@37.3.6", "", { "dependencies": { "@types/d3-array": "^3.0.3", "@types/d3-ease": "^3.0.0", "@types/d3-interpolate": "^3.0.1", "@types/d3-scale": "^4.0.2", "@types/d3-shape": "^3.1.0", "@types/d3-time": "^3.0.0", "@types/d3-timer": "^3.0.0", "d3-array": "^3.1.6", "d3-ease": "^3.0.1", "d3-interpolate": "^3.0.1", "d3-scale": "^4.0.2", "d3-shape": "^3.1.0", "d3-time": "^3.0.0", "d3-timer": "^3.0.1" } }, "sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ=="], + + "vite": ["vite@8.0.16", "", { "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.4", "postcss": "^8.5.15", "rolldown": "1.0.3", "tinyglobby": "^0.2.17" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.1.18", "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" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-h9bXPmJichP5fLmVQo3PyaGSDE2n3aPuomeAlVRm0JLmt4rY6zmPKd59HYI4LNW8oTK7tlTsuC7l/m7awx9Jcw=="], + + "w3c-keyname": ["w3c-keyname@2.2.8", "", {}, "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ=="], + + "web-streams-polyfill": ["web-streams-polyfill@3.3.3", "", {}, "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw=="], + + "webcrypto-core": ["webcrypto-core@1.9.2", "", { "dependencies": { "@peculiar/asn1-schema": "^2.7.0", "@peculiar/json-schema": "^1.1.12", "@peculiar/utils": "^2.0.2", "asn1js": "^3.0.10", "tslib": "^2.8.1" } }, "sha512-gsXecm82UQNlTBURJGuqOWy1Ww08S3kZUcr3aOJS02Pk0xLtkfeUAVC0u0xhgdonFme80edSJUIJyuvL/7250Q=="], + + "webrtc-adapter": ["webrtc-adapter@9.0.5", "", { "dependencies": { "sdp": "^3.2.0" } }, "sha512-U9vjByy/sK2OMXu5mmfuZFKTMIUQe34c0JXRO+oDrxJTsntdYT2iIFwYMOV7HhMTuktcZLGf2W1N/OcSf9ssWg=="], + + "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + + "which-module": ["which-module@2.0.1", "", {}, "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ=="], + + "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], + + "wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], + + "wsl-utils": ["wsl-utils@0.3.1", "", { "dependencies": { "is-wsl": "^3.1.0", "powershell-utils": "^0.1.0" } }, "sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg=="], + + "xmlbuilder": ["xmlbuilder@15.1.1", "", {}, "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg=="], + + "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], + + "yallist": ["yallist@5.0.0", "", {}, "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="], + + "yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], + + "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], + + "yauzl": ["yauzl@2.10.0", "", { "dependencies": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" } }, "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g=="], + + "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], + + "yocto-spinner": ["yocto-spinner@1.2.0", "", { "dependencies": { "yoctocolors": "^2.1.1" } }, "sha512-Yw0hUB6UA3o4YUgKy3oSe9a4cxoaZ9sBfYDw+JSxo6Id0KoJGoxzPA24qqUXYKBWABs/zDSGTz9kww7t3F0XGw=="], + + "yoctocolors": ["yoctocolors@2.1.2", "", {}, "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug=="], + + "zod": ["zod@4.4.3", "", {}, "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ=="], + + "zod-to-json-schema": ["zod-to-json-schema@3.25.2", "", { "peerDependencies": { "zod": "^3.25.28 || ^4" } }, "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA=="], + + "zod-validation-error": ["zod-validation-error@4.0.2", "", { "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ=="], + + "zustand": ["zustand@5.0.14", "", { "peerDependencies": { "@types/react": ">=18.0.0", "immer": ">=9.0.6", "react": ">=18.0.0", "use-sync-external-store": ">=1.2.0" }, "optionalPeers": ["@types/react", "immer", "react", "use-sync-external-store"] }, "sha512-/8tAspM5LMPr28b3fwLYrtdj77ECpfZviaP75CMTnwO8ISyaE4GDIG/9rDDYq/cH9D2Xw2A2RXglLInmVBQB/g=="], + + "@babel/core/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "@babel/helper-create-class-features-plugin/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "@dotenvx/dotenvx/commander": ["commander@11.1.0", "", {}, "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ=="], + + "@dotenvx/dotenvx/dotenv": ["dotenv@17.4.2", "", {}, "sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw=="], + + "@dotenvx/dotenvx/execa": ["execa@5.1.1", "", { "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" } }, "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg=="], + + "@dotenvx/dotenvx/which": ["which@4.0.0", "", { "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" } }, "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg=="], + + "@electron/asar/commander": ["commander@5.1.0", "", {}, "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg=="], + + "@electron/asar/minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], + + "@electron/fuses/fs-extra": ["fs-extra@9.1.0", "", { "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ=="], + + "@electron/get/fs-extra": ["fs-extra@8.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g=="], + + "@electron/get/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "@electron/notarize/fs-extra": ["fs-extra@9.1.0", "", { "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ=="], + + "@electron/osx-sign/isbinaryfile": ["isbinaryfile@4.0.10", "", {}, "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw=="], + + "@electron/universal/fs-extra": ["fs-extra@11.3.5", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg=="], + + "@electron/universal/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], + + "@electron/windows-sign/fs-extra": ["fs-extra@11.3.5", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg=="], + + "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], + + "@floating-ui/react-dom/@floating-ui/dom": ["@floating-ui/dom@1.7.6", "", { "dependencies": { "@floating-ui/core": "^1.7.5", "@floating-ui/utils": "^0.2.11" } }, "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ=="], + + "@livekit/components-core/loglevel": ["loglevel@1.9.1", "", {}, "sha512-hP3I3kCrDIMuRwAwHltphhDM1r8i55H33GgqjXbrisuJhF4kRhW1dNuxsRklp4bXl8DSdLaNLuiL4A/LWRfxvg=="], + + "@malept/flatpak-bundler/fs-extra": ["fs-extra@9.1.0", "", { "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ=="], + + "@modelcontextprotocol/sdk/ajv": ["ajv@8.20.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA=="], + + "@mswjs/interceptors/@open-draft/deferred-promise": ["@open-draft/deferred-promise@2.2.0", "", {}, "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA=="], + + "@reduxjs/toolkit/immer": ["immer@11.1.8", "", {}, "sha512-/tbkHMW7y10Lx6i1crLjD4/OhNkRG+Fo7byZHtah0547nIeXYcpIXaUh0IAQY6gO5459qpGGYapcEOHtFXkIuA=="], + + "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.10.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.1", "tslib": "^2.4.0" }, "bundled": true }, "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw=="], + + "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.10.0", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA=="], + + "@tailwindcss/oxide-wasm32-wasi/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.2", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA=="], + + "@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.5", "", { "dependencies": { "@tybys/wasm-util": "^0.10.2" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" }, "bundled": true }, "sha512-AWPoBRJ9tsnVhor4sjO7rkni+7p+2IAEFj6cx06UgP10jkQHqay/36uRV/bFkgrh18D9vb4cr8Q0Pthskgzy+Q=="], + + "@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util": ["@tybys/wasm-util@0.10.2", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg=="], + + "@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@tanstack/react-store/@tanstack/store": ["@tanstack/store@0.9.3", "", {}, "sha512-8reSzl/qGWGGVKhBoxXPMWzATSbZLZFWhwBAFO9NAyp0TxzfBP0mIrGb8CP8KrQTmvzXlR/vFPPUrHTLBGyFyw=="], + + "@tensamin/ui/recharts": ["recharts@3.8.0", "", { "dependencies": { "@reduxjs/toolkit": "^1.9.0 || 2.x.x", "clsx": "^2.1.1", "decimal.js-light": "^2.5.1", "es-toolkit": "^1.39.3", "eventemitter3": "^5.0.1", "immer": "^10.1.1", "react-redux": "8.x.x || 9.x.x", "reselect": "5.1.1", "tiny-invariant": "^1.3.3", "use-sync-external-store": "^1.2.2", "victory-vendor": "^37.0.2" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-is": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Z/m38DX3L73ExO4Tpc9/iZWHmHnlzWG4njQbxsF5aSjwqmHNDDIm0rdEBArkwsBvR8U6EirlEHiQNYWCVh9sGQ=="], + + "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], + + "ajv-formats/ajv": ["ajv@8.20.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA=="], + + "app-builder-lib/@electron/get": ["@electron/get@3.1.0", "", { "dependencies": { "debug": "^4.1.1", "env-paths": "^2.2.0", "fs-extra": "^8.1.0", "got": "^11.8.5", "progress": "^2.0.3", "semver": "^6.2.0", "sumchecker": "^3.0.1" }, "optionalDependencies": { "global-agent": "^3.0.0" } }, "sha512-F+nKc0xW+kVbBRhFzaMgPy3KwmuNTYX1fx6+FxxoSnNgwYX6LD7AKBTWkU0MQ6IBoe7dz069CNkR673sPAgkCQ=="], + + "app-builder-lib/ajv": ["ajv@8.20.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA=="], + + "app-builder-lib/ci-info": ["ci-info@4.3.1", "", {}, "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA=="], + + "app-builder-lib/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="], + + "app-builder-lib/which": ["which@5.0.0", "", { "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" } }, "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ=="], + + "body-parser/content-type": ["content-type@2.0.0", "", {}, "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ=="], + + "cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "clone-response/mimic-response": ["mimic-response@1.0.1", "", {}, "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ=="], + + "dir-compare/minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], + + "eciesjs/@noble/curves": ["@noble/curves@1.9.7", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw=="], + + "eciesjs/@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], + + "electron/@types/node": ["@types/node@22.19.21", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-VMeFBSCKQKmm2swI2kW51SFusDqekC6q9trBCvJ/JliDchFSuoYYKN7yVNjPthP1HKZcx3U1gI/wTcEBjEFKTA=="], + + "electron-winstaller/fs-extra": ["fs-extra@7.0.1", "", { "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw=="], + + "enquirer/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "execa/get-stream": ["get-stream@9.0.1", "", { "dependencies": { "@sec-ant/readable-stream": "^0.4.1", "is-stream": "^4.0.1" } }, "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA=="], + + "express/cookie": ["cookie@0.7.2", "", {}, "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w=="], + + "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + + "filelist/minimatch": ["minimatch@5.1.9", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw=="], + + "form-data/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + + "glob/minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], + + "hosted-git-info/lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], + + "log-symbols/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], + + "log-symbols/is-unicode-supported": ["is-unicode-supported@1.3.0", "", {}, "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ=="], + + "lru-cache/yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], + + "micromatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="], + + "node-gyp/which": ["which@6.0.1", "", { "dependencies": { "isexe": "^4.0.0" }, "bin": { "node-which": "bin/which.js" } }, "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg=="], + + "npm-run-path/path-key": ["path-key@4.0.0", "", {}, "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="], + + "ora/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], + + "ora/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], + + "pkijs/@noble/hashes": ["@noble/hashes@1.4.0", "", {}, "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg=="], + + "postject/commander": ["commander@9.5.0", "", {}, "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ=="], + + "prompts/kleur": ["kleur@3.0.3", "", {}, "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="], + + "proper-lockfile/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], + + "qrcode/yargs": ["yargs@15.4.1", "", { "dependencies": { "cliui": "^6.0.0", "decamelize": "^1.2.0", "find-up": "^4.1.0", "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", "string-width": "^4.2.0", "which-module": "^2.0.0", "y18n": "^4.0.0", "yargs-parser": "^18.1.2" } }, "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A=="], + + "restore-cursor/onetime": ["onetime@7.0.0", "", { "dependencies": { "mimic-function": "^5.0.0" } }, "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ=="], + + "router/path-to-regexp": ["path-to-regexp@8.4.2", "", {}, "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA=="], + + "serialize-error/type-fest": ["type-fest@0.13.1", "", {}, "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg=="], + + "shadcn/fs-extra": ["fs-extra@11.3.5", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg=="], + + "shadcn/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], + + "string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "tiny-async-pool/semver": ["semver@5.7.2", "", { "bin": { "semver": "bin/semver" } }, "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="], + + "type-is/content-type": ["content-type@2.0.0", "", {}, "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ=="], + + "unzipper/fs-extra": ["fs-extra@11.3.5", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg=="], + + "wrap-ansi/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "@dotenvx/dotenvx/execa/get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="], + + "@dotenvx/dotenvx/execa/human-signals": ["human-signals@2.1.0", "", {}, "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw=="], + + "@dotenvx/dotenvx/execa/is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="], + + "@dotenvx/dotenvx/execa/npm-run-path": ["npm-run-path@4.0.1", "", { "dependencies": { "path-key": "^3.0.0" } }, "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw=="], + + "@dotenvx/dotenvx/execa/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], + + "@dotenvx/dotenvx/execa/strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="], + + "@dotenvx/dotenvx/which/isexe": ["isexe@3.1.5", "", {}, "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w=="], + + "@electron/asar/minimatch/brace-expansion": ["brace-expansion@1.1.15", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg=="], + + "@electron/get/fs-extra/jsonfile": ["jsonfile@4.0.0", "", { "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg=="], + + "@electron/get/fs-extra/universalify": ["universalify@0.1.2", "", {}, "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="], + + "@electron/universal/minimatch/brace-expansion": ["brace-expansion@2.1.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA=="], + + "@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], + + "@tailwindcss/oxide-wasm32-wasi/@emnapi/core/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w=="], + + "ajv-formats/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], + + "app-builder-lib/@electron/get/fs-extra": ["fs-extra@8.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g=="], + + "app-builder-lib/@electron/get/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "app-builder-lib/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], + + "app-builder-lib/which/isexe": ["isexe@3.1.5", "", {}, "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w=="], + + "cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "dir-compare/minimatch/brace-expansion": ["brace-expansion@1.1.15", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg=="], + + "electron-winstaller/fs-extra/jsonfile": ["jsonfile@4.0.0", "", { "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg=="], + + "electron-winstaller/fs-extra/universalify": ["universalify@0.1.2", "", {}, "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="], + + "electron/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], + + "enquirer/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "filelist/minimatch/brace-expansion": ["brace-expansion@2.1.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA=="], + + "form-data/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], + + "glob/minimatch/brace-expansion": ["brace-expansion@1.1.15", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg=="], + + "hosted-git-info/lru-cache/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], + + "node-gyp/which/isexe": ["isexe@4.0.0", "", {}, "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw=="], + + "ora/string-width/emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], + + "qrcode/yargs/cliui": ["cliui@6.0.0", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^6.2.0" } }, "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ=="], + + "qrcode/yargs/find-up": ["find-up@4.1.0", "", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="], + + "qrcode/yargs/y18n": ["y18n@4.0.3", "", {}, "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ=="], + + "qrcode/yargs/yargs-parser": ["yargs-parser@18.1.3", "", { "dependencies": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" } }, "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ=="], + + "string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "@electron/asar/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "@electron/universal/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "app-builder-lib/@electron/get/fs-extra/jsonfile": ["jsonfile@4.0.0", "", { "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg=="], + + "app-builder-lib/@electron/get/fs-extra/universalify": ["universalify@0.1.2", "", {}, "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="], + + "dir-compare/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "filelist/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "glob/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "qrcode/yargs/cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "qrcode/yargs/cliui/wrap-ansi": ["wrap-ansi@6.2.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA=="], + + "qrcode/yargs/find-up/locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="], + + "qrcode/yargs/cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "qrcode/yargs/find-up/locate-path/p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="], + + "qrcode/yargs/find-up/locate-path/p-locate/p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], + } +} diff --git a/flake.lock b/flake.lock index aeb3d70..ea7bf8c 100644 --- a/flake.lock +++ b/flake.lock @@ -2,58 +2,22 @@ "nodes": { "nixpkgs": { "locked": { - "lastModified": 1782467914, - "narHash": "sha256-pGvFkM8N0xEkIIXDe5YYfbEAvHrk4IxBrjB/x8OomhE=", + "lastModified": 1779508470, + "narHash": "sha256-Ap9KJX+5xHIn3bPIpfNgT6MEXdAECECwo4/rmlQD74M=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "e73de5be04e0eff4190a1432b946d469c794e7b4", + "rev": "29916453413845e54a65b8a1cf996842300cd299", "type": "github" }, "original": { - "owner": "NixOS", + "id": "nixpkgs", "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_2": { - "locked": { - "lastModified": 1744536153, - "narHash": "sha256-awS2zRgF4uTwrOKwwiJcByDzDOdo3Q1rPZbiHQg/N38=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "18dd725c29603f582cf1900e0d25f9f1063dbf11", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-unstable", - "repo": "nixpkgs", - "type": "github" + "type": "indirect" } }, "root": { "inputs": { - "nixpkgs": "nixpkgs", - "rust-overlay": "rust-overlay" - } - }, - "rust-overlay": { - "inputs": { - "nixpkgs": "nixpkgs_2" - }, - "locked": { - "lastModified": 1782616745, - "narHash": "sha256-NN5B1cKBXF6h1Ec681gMGZ2o/99d7vKXAAfFNEvyOKA=", - "owner": "oxalica", - "repo": "rust-overlay", - "rev": "b916d014dc57eb555f84e51172a82f7f6fb560d7", - "type": "github" - }, - "original": { - "owner": "oxalica", - "repo": "rust-overlay", - "type": "github" + "nixpkgs": "nixpkgs" } } }, diff --git a/flake.nix b/flake.nix index 11a53a2..cefe9d2 100644 --- a/flake.nix +++ b/flake.nix @@ -1,39 +1,23 @@ { - description = "Tensamin Client"; + description = "Tensamin desktop client"; - inputs = { - nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; - rust-overlay.url = "github:oxalica/rust-overlay"; - }; + inputs.nixpkgs.url = "nixpkgs/nixos-unstable"; - outputs = { - self, - nixpkgs, - rust-overlay, - ... - }: let + outputs = {nixpkgs, ...}: let systems = ["x86_64-linux"]; forAllSystems = nixpkgs.lib.genAttrs systems; - version = "0.0.10"; - x86_64DebHash = "sha256-VVKkZ9yQ7BoLnYnCf5OSHcrakoBNfUx/uWxBmm3gBZE="; + version = "0.0.9"; + x86_64DebHash = "sha256-8rVb12SGGSac6l1NVPGyRLsAKAGDAOJVUwG8l+hoRCU="; forgejoBaseUrl = "https://git.methanium.net/tensamin/client/releases/download/${version}"; in { packages = forAllSystems (system: let - pkgs = import nixpkgs { - inherit system; - overlays = [(import rust-overlay)]; - config = { - allowUnfree = true; - android_sdk.accept_license = true; - }; - }; + pkgs = import nixpkgs {inherit system;}; debArtifact = "Tensamin-${version}-linux-amd64.deb"; electronRuntimeLibs = with pkgs; [ alsa-lib at-spi2-atk at-spi2-core - atk cairo cups dbus @@ -45,7 +29,6 @@ gtk3 libdrm libgbm - libglvnd libnotify libpulseaudio libuuid @@ -54,7 +37,6 @@ nspr nss pango - pipewire systemd wayland libX11 @@ -110,236 +92,8 @@ url = "${forgejoBaseUrl}/${debArtifact}"; hash = x86_64DebHash; }); - localDebPath = builtins.getEnv "TENSAMIN_DEB"; - localPathPackage = - if localDebPath == "" - then - pkgs.writeShellScriptBin "tensamin" '' - echo "Set TENSAMIN_DEB to a local .deb path and run with --impure." >&2 - exit 1 - '' - else - packageDeb (builtins.path { - path = localDebPath; - name = debArtifact; - }); in { default = defaultPackage; - tensamin = defaultPackage; - electron = defaultPackage; - localPathForDev = localPathPackage; - }); - - devShells = forAllSystems (system: let - pkgs = import nixpkgs { - inherit system; - overlays = [(import rust-overlay)]; - config = { - allowUnfree = true; - android_sdk.accept_license = true; - }; - }; - - electronRuntimeLibs = with pkgs; [ - alsa-lib - at-spi2-atk - at-spi2-core - atk - cairo - cups - dbus - expat - fontconfig - freetype - gdk-pixbuf - glib - gtk3 - libdrm - libgbm - libglvnd - libnotify - libpulseaudio - libuuid - libxkbcommon - mesa - nspr - nss - pango - pipewire - systemd - wayland - libX11 - libXScrnSaver - libXcomposite - libXcursor - libXdamage - libXext - libXfixes - libXi - libXrandr - libXtst - libxcb - ]; - - buildToolsVersion = "35.0.0"; - ndkVersion = "29.0.14206865"; - android = pkgs.androidenv.composeAndroidPackages { - cmdLineToolsVersion = "8.0"; - toolsVersion = "26.1.1"; - platformToolsVersion = "35.0.2"; - buildToolsVersions = [buildToolsVersion]; - platformVersions = ["35" "36"]; - includeSources = false; - includeSystemImages = false; - includeNDK = true; - ndkVersions = [ndkVersion]; - useGoogleAPIs = false; - }; - rustToolchain = pkgs.rust-bin.stable.latest.default.override { - extensions = ["rust-src" "rust-analyzer"]; - targets = [ - "aarch64-linux-android" - "armv7-linux-androideabi" - "i686-linux-android" - "x86_64-linux-android" - "wasm32-unknown-unknown" - ]; - }; - - commonDeps = [rustToolchain pkgs.wasm-pack pkgs.lld]; - appImageToolsArchive = pkgs.fetchurl { - url = "https://github.com/electron-userland/electron-builder-binaries/releases/download/appimage@1.0.3/appimage-tools-runtime-20251108.tar.gz"; - hash = "sha256-hAIaeO4hSub9M6LWKpK6JVQt0QvIa/EXqbLQu6ROdmU="; - }; - appImageTools = pkgs.runCommand "electron-builder-appimage-tools-nix" {nativeBuildInputs = [pkgs.gnutar pkgs.gzip];} '' - mkdir -p "$out" - tar -xzf ${appImageToolsArchive} --strip-components=1 -C "$out" - rm -f "$out/mksquashfs" "$out/desktop-file-validate" - ln -s ${pkgs.squashfsTools}/bin/mksquashfs "$out/mksquashfs" - ln -s ${pkgs.desktop-file-utils}/bin/desktop-file-validate "$out/desktop-file-validate" - ''; - in rec { - default = electron; - - electron = pkgs.mkShell { - packages = with pkgs; - [ - nodejs_22 - corepack_22 - coreutils - pnpm - pkgs.electron - pkg-config - python3 - gcc - gnumake - git - jq - patchelf - dpkg - rpm - fpm - curl - fakeroot - rsync - xz - p7zip - ] - ++ electronRuntimeLibs ++ commonDeps; - - shellHook = '' - export LD_LIBRARY_PATH="${pkgs.lib.makeLibraryPath electronRuntimeLibs}:$LD_LIBRARY_PATH" - export ELECTRON_ENABLE_LOGGING=1 - export ELECTRON_OZONE_PLATFORM_HINT="''${ELECTRON_OZONE_PLATFORM_HINT:-auto}" - export NPM_CONFIG_TARGET_ARCH="''${NPM_CONFIG_TARGET_ARCH:-x64}" - export npm_config_build_from_source=true - export USE_SYSTEM_FPM=true - export ELECTRON_BUILDER_7ZIP_PATH="${pkgs.p7zip}/bin/7za" - export APPIMAGE_TOOLS_PATH="${appImageTools}" - - alias electron-install='cd "$(git rev-parse --show-toplevel 2>/dev/null || pwd)" && pnpm install' - alias electron-build-web='cd "$(git rev-parse --show-toplevel 2>/dev/null || pwd)" && pnpm run build:web' - alias electron-dev='pnpm run dev' - alias electron-package='pnpm run package:linux' - alias electron-validate='pnpm run validate' - ''; - }; - - tauri = pkgs.mkShell { - buildInputs = with pkgs; - [ - jdk17 - gradle - pnpm - bun - nodejs - corepack_22 - coreutils - pkg-config - git - jq - curl - ] - ++ [ - android.androidsdk - android-studio-tools - ] - ++ commonDeps; - - shellHook = '' - sdkSource="${android.androidsdk}/libexec/android-sdk" - if [ -d apps/tauri/src-tauri ]; then - projectRoot="$PWD/apps/tauri" - else - projectRoot="$PWD" - fi - androidHome="$projectRoot/.android" - sdkRoot="$androidHome/sdk" - - mkdir -p "$androidHome" - if [ -L "$sdkRoot" ]; then - rm -f "$sdkRoot" - fi - mkdir -p "$sdkRoot" - - ln -sfn "$sdkSource/build-tools" "$sdkRoot/build-tools" - ln -sfn "$sdkSource/cmake" "$sdkRoot/cmake" - ln -sfn "$sdkSource/licenses" "$sdkRoot/licenses" - ln -sfn "$sdkSource/ndk" "$sdkRoot/ndk" - ln -sfn "$sdkSource/ndk-bundle" "$sdkRoot/ndk-bundle" - ln -sfn "$sdkSource/platforms" "$sdkRoot/platforms" - ln -sfn "$sdkSource/platform-tools" "$sdkRoot/platform-tools" - ln -sfn "$sdkSource/tools" "$sdkRoot/tools" - - mkdir -p "$sdkRoot/cmdline-tools" - ln -sfn "$sdkSource/cmdline-tools/8.0" "$sdkRoot/cmdline-tools/8.0" - ln -sfn "8.0" "$sdkRoot/cmdline-tools/latest" - - sdkRootAbs="$(realpath "$sdkRoot")" - ndkRootAbs="''${sdkRootAbs}/ndk/${ndkVersion}" - - export PATH="''${sdkRootAbs}/cmdline-tools/latest/bin:''${sdkRootAbs}/platform-tools:''${ndkRootAbs}:${pkgs.android-studio-tools}/bin:$PATH" - export ANDROID_HOME="''${sdkRootAbs}" - export ANDROID_SDK_ROOT="''${sdkRootAbs}" - export ANDROID_NDK_ROOT="''${ndkRootAbs}" - export ANDROID_NDK_HOME="$ANDROID_NDK_ROOT" - export NDK_HOME="$ANDROID_NDK_ROOT" - export NDK_PATH="$ANDROID_NDK_ROOT" - export JAVA_HOME="${pkgs.jdk17}" - - aapt2Path="''${sdkRootAbs}/build-tools/${buildToolsVersion}/aapt2" - if [ -x "$aapt2Path" ]; then - mkdir -p "$HOME/.gradle" - gradleProperties="$HOME/.gradle/gradle.properties" - touch "$gradleProperties" - if grep -q '^android\.aapt2FromMavenOverride=' "$gradleProperties"; then - sed -i "s|^android\.aapt2FromMavenOverride=.*|android.aapt2FromMavenOverride=$aapt2Path|" "$gradleProperties" - else - printf '\nandroid.aapt2FromMavenOverride=%s\n' "$aapt2Path" >> "$gradleProperties" - fi - fi - ''; - }; }); }; } diff --git a/licenses/@babel_runtime@7.29.7/LICENSE b/licenses/@babel_runtime@7.29.7/LICENSE deleted file mode 100644 index f31575e..0000000 --- a/licenses/@babel_runtime@7.29.7/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -MIT License - -Copyright (c) 2014-present Sebastian McKenzie and other contributors - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/licenses/@base-ui_react@1.6.0/LICENSE b/licenses/@base-ui_react@1.6.0/LICENSE deleted file mode 100644 index 510c55e..0000000 --- a/licenses/@base-ui_react@1.6.0/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2019 Material-UI SAS - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/licenses/@base-ui_utils@0.3.1/LICENSE b/licenses/@base-ui_utils@0.3.1/LICENSE deleted file mode 100644 index 510c55e..0000000 --- a/licenses/@base-ui_utils@0.3.1/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2019 Material-UI SAS - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/licenses/@codemirror_commands@6.10.4/LICENSE b/licenses/@codemirror_commands@6.10.3/LICENSE similarity index 100% rename from licenses/@codemirror_commands@6.10.4/LICENSE rename to licenses/@codemirror_commands@6.10.3/LICENSE diff --git a/licenses/@codemirror_state@6.7.0/LICENSE b/licenses/@codemirror_state@6.6.0/LICENSE similarity index 100% rename from licenses/@codemirror_state@6.7.0/LICENSE rename to licenses/@codemirror_state@6.6.0/LICENSE diff --git a/licenses/@codemirror_view@6.43.4/LICENSE b/licenses/@codemirror_view@6.41.1/LICENSE similarity index 100% rename from licenses/@codemirror_view@6.43.4/LICENSE rename to licenses/@codemirror_view@6.41.1/LICENSE diff --git a/licenses/@floating-ui_core@1.7.5/LICENSE b/licenses/@floating-ui_core@1.7.5/LICENSE deleted file mode 100644 index 639cdc6..0000000 --- a/licenses/@floating-ui_core@1.7.5/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -MIT License - -Copyright (c) 2021-present Floating UI contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/licenses/@floating-ui_dom@1.7.6/LICENSE b/licenses/@floating-ui_dom@1.7.6/LICENSE deleted file mode 100644 index 639cdc6..0000000 --- a/licenses/@floating-ui_dom@1.7.6/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -MIT License - -Copyright (c) 2021-present Floating UI contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/licenses/@floating-ui_react-dom@2.1.8/LICENSE b/licenses/@floating-ui_react-dom@2.1.8/LICENSE deleted file mode 100644 index 639cdc6..0000000 --- a/licenses/@floating-ui_react-dom@2.1.8/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -MIT License - -Copyright (c) 2021-present Floating UI contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/licenses/@floating-ui_utils@0.2.11/LICENSE b/licenses/@floating-ui_utils@0.2.11/LICENSE deleted file mode 100644 index 639cdc6..0000000 --- a/licenses/@floating-ui_utils@0.2.11/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -MIT License - -Copyright (c) 2021-present Floating UI contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/licenses/@fontsource-variable_public-sans@5.2.7/LICENSE b/licenses/@fontsource-variable_public-sans@5.2.7/LICENSE deleted file mode 100644 index a6cb63a..0000000 --- a/licenses/@fontsource-variable_public-sans@5.2.7/LICENSE +++ /dev/null @@ -1,93 +0,0 @@ -Copyright 2015 The Public Sans Project Authors (https://github.com/uswds/public-sans) PublicSans-Italic[wght].ttf: Copyright 2015 The Public Sans Project Authors (https://github.com/uswds/public-sans) - -This Font Software is licensed under the SIL Open Font License, Version 1.1. -This license is copied below, and is also available with a FAQ at: -http://scripts.sil.org/OFL - - ------------------------------------------------------------ -SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ------------------------------------------------------------ - -PREAMBLE -The goals of the Open Font License (OFL) are to stimulate worldwide -development of collaborative font projects, to support the font creation -efforts of academic and linguistic communities, and to provide a free and -open framework in which fonts may be shared and improved in partnership -with others. - -The OFL allows the licensed fonts to be used, studied, modified and -redistributed freely as long as they are not sold by themselves. The -fonts, including any derivative works, can be bundled, embedded, -redistributed and/or sold with any software provided that any reserved -names are not used by derivative works. The fonts and derivatives, -however, cannot be released under any other type of license. The -requirement for fonts to remain under this license does not apply -to any document created using the fonts or their derivatives. - -DEFINITIONS -"Font Software" refers to the set of files released by the Copyright -Holder(s) under this license and clearly marked as such. This may -include source files, build scripts and documentation. - -"Reserved Font Name" refers to any names specified as such after the -copyright statement(s). - -"Original Version" refers to the collection of Font Software components as -distributed by the Copyright Holder(s). - -"Modified Version" refers to any derivative made by adding to, deleting, -or substituting -- in part or in whole -- any of the components of the -Original Version, by changing formats or by porting the Font Software to a -new environment. - -"Author" refers to any designer, engineer, programmer, technical -writer or other person who contributed to the Font Software. - -PERMISSION & CONDITIONS -Permission is hereby granted, free of charge, to any person obtaining -a copy of the Font Software, to use, study, copy, merge, embed, modify, -redistribute, and sell modified and unmodified copies of the Font -Software, subject to the following conditions: - -1) Neither the Font Software nor any of its individual components, -in Original or Modified Versions, may be sold by itself. - -2) Original or Modified Versions of the Font Software may be bundled, -redistributed and/or sold with any software, provided that each copy -contains the above copyright notice and this license. These can be -included either as stand-alone text files, human-readable headers or -in the appropriate machine-readable metadata fields within text or -binary files as long as those fields can be easily viewed by the user. - -3) No Modified Version of the Font Software may use the Reserved Font -Name(s) unless explicit written permission is granted by the corresponding -Copyright Holder. This restriction only applies to the primary font name as -presented to the users. - -4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font -Software shall not be used to promote, endorse or advertise any -Modified Version, except to acknowledge the contribution(s) of the -Copyright Holder(s) and the Author(s) or with their explicit written -permission. - -5) The Font Software, modified or unmodified, in part or in whole, -must be distributed entirely under this license, and must not be -distributed under any other license. The requirement for fonts to -remain under this license does not apply to any document created -using the Font Software. - -TERMINATION -This license becomes null and void if any of the above conditions are -not met. - -DISCLAIMER -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT -OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE -COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL -DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM -OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/licenses/@livekit_components-react@2.9.21/LICENSE b/licenses/@livekit_components-react@2.9.20/LICENSE similarity index 100% rename from licenses/@livekit_components-react@2.9.21/LICENSE rename to licenses/@livekit_components-react@2.9.20/LICENSE diff --git a/licenses/@noble_hashes@2.2.0/LICENSE b/licenses/@noble_hashes@2.2.0/LICENSE deleted file mode 100644 index 9297a04..0000000 --- a/licenses/@noble_hashes@2.2.0/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2022 Paul Miller (https://paulmillr.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the “Software”), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. \ No newline at end of file diff --git a/licenses/@radix-ui_primitive@1.1.4/LICENSE b/licenses/@radix-ui_primitive@1.1.4/LICENSE deleted file mode 100644 index a18858f..0000000 --- a/licenses/@radix-ui_primitive@1.1.4/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2022 WorkOS - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/licenses/@radix-ui_react-compose-refs@1.1.3/LICENSE b/licenses/@radix-ui_react-compose-refs@1.1.3/LICENSE deleted file mode 100644 index a18858f..0000000 --- a/licenses/@radix-ui_react-compose-refs@1.1.3/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2022 WorkOS - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/licenses/@radix-ui_react-context@1.1.4/LICENSE b/licenses/@radix-ui_react-context@1.1.4/LICENSE deleted file mode 100644 index a18858f..0000000 --- a/licenses/@radix-ui_react-context@1.1.4/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2022 WorkOS - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/licenses/@radix-ui_react-dialog@1.1.18/LICENSE b/licenses/@radix-ui_react-dialog@1.1.18/LICENSE deleted file mode 100644 index a18858f..0000000 --- a/licenses/@radix-ui_react-dialog@1.1.18/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2022 WorkOS - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/licenses/@radix-ui_react-dismissable-layer@1.1.14/LICENSE b/licenses/@radix-ui_react-dismissable-layer@1.1.14/LICENSE deleted file mode 100644 index a18858f..0000000 --- a/licenses/@radix-ui_react-dismissable-layer@1.1.14/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2022 WorkOS - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/licenses/@radix-ui_react-focus-guards@1.1.4/LICENSE b/licenses/@radix-ui_react-focus-guards@1.1.4/LICENSE deleted file mode 100644 index a18858f..0000000 --- a/licenses/@radix-ui_react-focus-guards@1.1.4/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2022 WorkOS - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/licenses/@radix-ui_react-focus-scope@1.1.11/LICENSE b/licenses/@radix-ui_react-focus-scope@1.1.11/LICENSE deleted file mode 100644 index a18858f..0000000 --- a/licenses/@radix-ui_react-focus-scope@1.1.11/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2022 WorkOS - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/licenses/@radix-ui_react-id@1.1.2/LICENSE b/licenses/@radix-ui_react-id@1.1.2/LICENSE deleted file mode 100644 index a18858f..0000000 --- a/licenses/@radix-ui_react-id@1.1.2/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2022 WorkOS - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/licenses/@radix-ui_react-portal@1.1.13/LICENSE b/licenses/@radix-ui_react-portal@1.1.13/LICENSE deleted file mode 100644 index a18858f..0000000 --- a/licenses/@radix-ui_react-portal@1.1.13/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2022 WorkOS - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/licenses/@radix-ui_react-presence@1.1.6/LICENSE b/licenses/@radix-ui_react-presence@1.1.6/LICENSE deleted file mode 100644 index a18858f..0000000 --- a/licenses/@radix-ui_react-presence@1.1.6/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2022 WorkOS - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/licenses/@radix-ui_react-primitive@2.1.7/LICENSE b/licenses/@radix-ui_react-primitive@2.1.7/LICENSE deleted file mode 100644 index a18858f..0000000 --- a/licenses/@radix-ui_react-primitive@2.1.7/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2022 WorkOS - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/licenses/@radix-ui_react-slot@1.3.0/LICENSE b/licenses/@radix-ui_react-slot@1.3.0/LICENSE deleted file mode 100644 index a18858f..0000000 --- a/licenses/@radix-ui_react-slot@1.3.0/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2022 WorkOS - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/licenses/@radix-ui_react-use-callback-ref@1.1.2/LICENSE b/licenses/@radix-ui_react-use-callback-ref@1.1.2/LICENSE deleted file mode 100644 index a18858f..0000000 --- a/licenses/@radix-ui_react-use-callback-ref@1.1.2/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2022 WorkOS - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/licenses/@radix-ui_react-use-controllable-state@1.2.3/LICENSE b/licenses/@radix-ui_react-use-controllable-state@1.2.3/LICENSE deleted file mode 100644 index a18858f..0000000 --- a/licenses/@radix-ui_react-use-controllable-state@1.2.3/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2022 WorkOS - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/licenses/@radix-ui_react-use-effect-event@0.0.2/LICENSE b/licenses/@radix-ui_react-use-effect-event@0.0.2/LICENSE deleted file mode 100644 index a18858f..0000000 --- a/licenses/@radix-ui_react-use-effect-event@0.0.2/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2022 WorkOS - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/licenses/@radix-ui_react-use-layout-effect@1.1.2/LICENSE b/licenses/@radix-ui_react-use-layout-effect@1.1.2/LICENSE deleted file mode 100644 index a18858f..0000000 --- a/licenses/@radix-ui_react-use-layout-effect@1.1.2/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2022 WorkOS - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/licenses/@reduxjs_toolkit@2.12.0/LICENSE b/licenses/@reduxjs_toolkit@2.12.0/LICENSE deleted file mode 100644 index 1daa252..0000000 --- a/licenses/@reduxjs_toolkit@2.12.0/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2018 Mark Erikson - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/licenses/@tailwindcss_vite@4.3.2/LICENSE b/licenses/@tailwindcss_vite@4.2.4/LICENSE similarity index 100% rename from licenses/@tailwindcss_vite@4.3.2/LICENSE rename to licenses/@tailwindcss_vite@4.2.4/LICENSE diff --git a/licenses/@tanstack_devtools-event-client@0.3.5/LICENSE b/licenses/@tanstack_devtools-event-client@0.3.5/LICENSE deleted file mode 100644 index 0ede5e8..0000000 --- a/licenses/@tanstack_devtools-event-client@0.3.5/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2025 TanStack - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/licenses/@tanstack_pacer@0.21.1/LICENSE b/licenses/@tanstack_pacer@0.21.1/LICENSE deleted file mode 100644 index 308cb68..0000000 --- a/licenses/@tanstack_pacer@0.21.1/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2025 Tanner Linsley - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/licenses/@tanstack_history@1.162.0/LICENSE b/licenses/@tanstack_react-query@5.100.8/LICENSE similarity index 100% rename from licenses/@tanstack_history@1.162.0/LICENSE rename to licenses/@tanstack_react-query@5.100.8/LICENSE diff --git a/licenses/@tanstack_query-core@5.101.2/LICENSE b/licenses/@tanstack_react-router@1.169.1/LICENSE similarity index 100% rename from licenses/@tanstack_query-core@5.101.2/LICENSE rename to licenses/@tanstack_react-router@1.169.1/LICENSE diff --git a/licenses/@tanstack_react-router@1.170.17/LICENSE b/licenses/@tanstack_react-router@1.170.17/LICENSE deleted file mode 100644 index 1869e21..0000000 --- a/licenses/@tanstack_react-router@1.170.17/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2021-present Tanner Linsley - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/licenses/@tanstack_react-store@0.9.3/LICENSE b/licenses/@tanstack_react-store@0.9.3/LICENSE deleted file mode 100644 index 77eca38..0000000 --- a/licenses/@tanstack_react-store@0.9.3/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2021 Tanner Linsley - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/licenses/@tanstack_react-query@5.101.2/LICENSE b/licenses/@tanstack_react-virtual@3.13.24/LICENSE similarity index 100% rename from licenses/@tanstack_react-query@5.101.2/LICENSE rename to licenses/@tanstack_react-virtual@3.13.24/LICENSE diff --git a/licenses/@tanstack_react-virtual@3.14.5/LICENSE b/licenses/@tanstack_react-virtual@3.14.5/LICENSE deleted file mode 100644 index 1869e21..0000000 --- a/licenses/@tanstack_react-virtual@3.14.5/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2021-present Tanner Linsley - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/licenses/@tanstack_router-core@1.171.14/LICENSE b/licenses/@tanstack_router-core@1.171.14/LICENSE deleted file mode 100644 index 1869e21..0000000 --- a/licenses/@tanstack_router-core@1.171.14/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2021-present Tanner Linsley - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/licenses/@tanstack_store@0.9.3/LICENSE b/licenses/@tanstack_store@0.9.3/LICENSE deleted file mode 100644 index 77eca38..0000000 --- a/licenses/@tanstack_store@0.9.3/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2021 Tanner Linsley - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/licenses/@tanstack_virtual-core@3.17.3/LICENSE b/licenses/@tanstack_virtual-core@3.17.3/LICENSE deleted file mode 100644 index 1869e21..0000000 --- a/licenses/@tanstack_virtual-core@3.17.3/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2021-present Tanner Linsley - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/licenses/@tauri-apps_api@2.11.1/LICENSE_APACHE-2.0 b/licenses/@tauri-apps_api@2.11.0/LICENSE_APACHE-2.0 similarity index 100% rename from licenses/@tauri-apps_api@2.11.1/LICENSE_APACHE-2.0 rename to licenses/@tauri-apps_api@2.11.0/LICENSE_APACHE-2.0 diff --git a/licenses/@tauri-apps_api@2.11.1/LICENSE_MIT b/licenses/@tauri-apps_api@2.11.0/LICENSE_MIT similarity index 100% rename from licenses/@tauri-apps_api@2.11.1/LICENSE_MIT rename to licenses/@tauri-apps_api@2.11.0/LICENSE_MIT diff --git a/licenses/@tauri-apps_cli@2.11.4/LICENSE_APACHE-2.0 b/licenses/@tauri-apps_cli@2.11.0/LICENSE_APACHE-2.0 similarity index 100% rename from licenses/@tauri-apps_cli@2.11.4/LICENSE_APACHE-2.0 rename to licenses/@tauri-apps_cli@2.11.0/LICENSE_APACHE-2.0 diff --git a/licenses/@tauri-apps_cli@2.11.4/LICENSE_MIT b/licenses/@tauri-apps_cli@2.11.0/LICENSE_MIT similarity index 100% rename from licenses/@tauri-apps_cli@2.11.4/LICENSE_MIT rename to licenses/@tauri-apps_cli@2.11.0/LICENSE_MIT diff --git a/licenses/@tauri-apps_plugin-barcode-scanner@2.4.5/LICENSE.spdx b/licenses/@tauri-apps_plugin-barcode-scanner@2.4.4/LICENSE.spdx similarity index 100% rename from licenses/@tauri-apps_plugin-barcode-scanner@2.4.5/LICENSE.spdx rename to licenses/@tauri-apps_plugin-barcode-scanner@2.4.4/LICENSE.spdx diff --git a/licenses/@tauri-apps_plugin-notification@2.3.3/LICENSE.spdx b/licenses/@tauri-apps_plugin-notification@2.3.3/LICENSE.spdx deleted file mode 100644 index cdd0df5..0000000 --- a/licenses/@tauri-apps_plugin-notification@2.3.3/LICENSE.spdx +++ /dev/null @@ -1,20 +0,0 @@ -SPDXVersion: SPDX-2.1 -DataLicense: CC0-1.0 -PackageName: tauri -DataFormat: SPDXRef-1 -PackageSupplier: Organization: The Tauri Programme in the Commons Conservancy -PackageHomePage: https://tauri.app -PackageLicenseDeclared: Apache-2.0 -PackageLicenseDeclared: MIT -PackageCopyrightText: 2019-2022, The Tauri Programme in the Commons Conservancy -PackageSummary: Tauri is a rust project that enables developers to make secure -and small desktop applications using a web frontend. - -PackageComment: The package includes the following libraries; see -Relationship information. - -Created: 2019-05-20T09:00:00Z -PackageDownloadLocation: git://github.com/tauri-apps/tauri -PackageDownloadLocation: git+https://github.com/tauri-apps/tauri.git -PackageDownloadLocation: git+ssh://github.com/tauri-apps/tauri.git -Creator: Person: Daniel Thompson-Yvetot \ No newline at end of file diff --git a/licenses/@tauri-apps_plugin-log@2.8.0/LICENSE.spdx b/licenses/@tauri-apps_plugin-opener@2.5.4/LICENSE.spdx similarity index 100% rename from licenses/@tauri-apps_plugin-log@2.8.0/LICENSE.spdx rename to licenses/@tauri-apps_plugin-opener@2.5.4/LICENSE.spdx diff --git a/licenses/@tensamin_ttp-core@0.0.19/LICENSE b/licenses/@tensamin_ttp-core@0.0.19/LICENSE new file mode 100644 index 0000000..7ba2513 --- /dev/null +++ b/licenses/@tensamin_ttp-core@0.0.19/LICENSE @@ -0,0 +1,16 @@ +Copyright (c) [2026] [Methanium] +All rights reserved. + +This software is protected by copyright. Copying, editing, +distributing, publicly performing, or any other use of this software +or its components, in source or binary form, is strictly prohibited without the express +written permission of the copyright holder. + +FUTURE LICENSE ACCEPTANCE: +It is the copyright holder's intention to release this software in the future +under a license yet to be defined, which will, among other things, +allow private, non-commercial use. This statement does not constitute +a current license grant and does not alter the above +prohibition on use, copying, or modification. Until the formal +publication of such a future license, all rights remain +reserved. diff --git a/licenses/@types_node@25.9.4/LICENSE b/licenses/@types_node@25.6.0/LICENSE similarity index 100% rename from licenses/@types_node@25.9.4/LICENSE rename to licenses/@types_node@25.6.0/LICENSE diff --git a/licenses/@types_react@19.2.17/LICENSE b/licenses/@types_react@19.2.14/LICENSE similarity index 100% rename from licenses/@types_react@19.2.17/LICENSE rename to licenses/@types_react@19.2.14/LICENSE diff --git a/licenses/@typescript-eslint_parser@8.62.1/LICENSE b/licenses/@typescript-eslint_parser@8.59.1/LICENSE similarity index 100% rename from licenses/@typescript-eslint_parser@8.62.1/LICENSE rename to licenses/@typescript-eslint_parser@8.59.1/LICENSE diff --git a/licenses/@vitejs_plugin-react@6.0.3/LICENSE b/licenses/@vitejs_plugin-react@6.0.1/LICENSE similarity index 100% rename from licenses/@vitejs_plugin-react@6.0.3/LICENSE rename to licenses/@vitejs_plugin-react@6.0.1/LICENSE diff --git a/licenses/THIRD_PARTY_NOTICES.md b/licenses/THIRD_PARTY_NOTICES.md index d17e50b..2dcc4e3 100644 --- a/licenses/THIRD_PARTY_NOTICES.md +++ b/licenses/THIRD_PARTY_NOTICES.md @@ -1,43 +1,14 @@ # Third-Party Notices -Generated from pnpm-lock.yaml and installed packages in workspace node_modules folders. +Generated from bun.lock and installed packages in workspace node_modules folders. -## @babel/runtime@7.29.7 +## @codemirror/commands@6.10.3 - License: MIT -- Homepage: https://babel.dev/docs/en/next/babel-runtime -- Repository: https://github.com/babel/babel.git -- Description: babel's modular runtime helpers -- Included files: LICENSE -- Folder: `licenses/@babel_runtime@7.29.7` -- Source package dir: `apps/web/node_modules/@babel/runtime` - -## @base-ui/react@1.6.0 - -- License: MIT -- Homepage: https://base-ui.com -- Repository: git+https://github.com/mui/base-ui.git -- Description: Base UI is a library of headless ('unstyled') React components and low-level hooks. You gain complete control over your app's CSS and accessibility features. -- Included files: LICENSE -- Folder: `licenses/@base-ui_react@1.6.0` -- Source package dir: `apps/web/node_modules/@base-ui/react` - -## @base-ui/utils@0.3.1 - -- License: MIT -- Repository: git+https://github.com/mui/base-ui.git -- Description: A collection of React utility functions for Base UI. -- Included files: LICENSE -- Folder: `licenses/@base-ui_utils@0.3.1` -- Source package dir: `apps/web/node_modules/@base-ui/utils` - -## @codemirror/commands@6.10.4 - -- License: MIT -- Repository: git+https://code.haverbeke.berlin/codemirror/commands.git +- Repository: git+https://github.com/codemirror/commands.git - Description: Collection of editing commands for the CodeMirror code editor - Included files: LICENSE -- Folder: `licenses/@codemirror_commands@6.10.4` +- Folder: `licenses/@codemirror_commands@6.10.3` - Source package dir: `packages/markdown/node_modules/@codemirror/commands` ## @codemirror/lang-markdown@6.5.0 @@ -49,22 +20,22 @@ Generated from pnpm-lock.yaml and installed packages in workspace node_modules f - Folder: `licenses/@codemirror_lang-markdown@6.5.0` - Source package dir: `packages/markdown/node_modules/@codemirror/lang-markdown` -## @codemirror/state@6.7.0 +## @codemirror/state@6.6.0 - License: MIT -- Repository: git+https://code.haverbeke.berlin/codemirror/state.git +- Repository: git+https://github.com/codemirror/state.git - Description: Editor state data structures for the CodeMirror code editor - Included files: LICENSE -- Folder: `licenses/@codemirror_state@6.7.0` +- Folder: `licenses/@codemirror_state@6.6.0` - Source package dir: `packages/markdown/node_modules/@codemirror/state` -## @codemirror/view@6.43.4 +## @codemirror/view@6.41.1 - License: MIT - Repository: git+https://code.haverbeke.berlin/codemirror/view.git - Description: DOM view component for the CodeMirror code editor - Included files: LICENSE -- Folder: `licenses/@codemirror_view@6.43.4` +- Folder: `licenses/@codemirror_view@6.41.1` - Source package dir: `packages/markdown/node_modules/@codemirror/view` ## @eslint/js@10.0.1 @@ -77,46 +48,6 @@ Generated from pnpm-lock.yaml and installed packages in workspace node_modules f - Folder: `licenses/@eslint_js@10.0.1` - Source package dir: `apps/web/node_modules/@eslint/js` -## @floating-ui/core@1.7.5 - -- License: MIT -- Homepage: https://floating-ui.com -- Repository: https://github.com/floating-ui/floating-ui.git -- Description: Positioning library for floating elements: tooltips, popovers, dropdowns, and more -- Included files: LICENSE -- Folder: `licenses/@floating-ui_core@1.7.5` -- Source package dir: `apps/web/node_modules/@floating-ui/core` - -## @floating-ui/dom@1.7.6 - -- License: MIT -- Homepage: https://floating-ui.com -- Repository: https://github.com/floating-ui/floating-ui.git -- Description: Floating UI for the web -- Included files: LICENSE -- Folder: `licenses/@floating-ui_dom@1.7.6` -- Source package dir: `apps/web/node_modules/@floating-ui/dom` - -## @floating-ui/react-dom@2.1.8 - -- License: MIT -- Homepage: https://floating-ui.com/docs/react-dom -- Repository: https://github.com/floating-ui/floating-ui.git -- Description: Floating UI for React DOM -- Included files: LICENSE -- Folder: `licenses/@floating-ui_react-dom@2.1.8` -- Source package dir: `apps/web/node_modules/@floating-ui/react-dom` - -## @floating-ui/utils@0.2.11 - -- License: MIT -- Homepage: https://floating-ui.com -- Repository: https://github.com/floating-ui/floating-ui.git -- Description: Utilities for Floating UI -- Included files: LICENSE -- Folder: `licenses/@floating-ui_utils@0.2.11` -- Source package dir: `apps/web/node_modules/@floating-ui/utils` - ## @fontsource-variable/inter@5.2.8 - License: OFL-1.1 @@ -127,22 +58,12 @@ Generated from pnpm-lock.yaml and installed packages in workspace node_modules f - Folder: `licenses/@fontsource-variable_inter@5.2.8` - Source package dir: `apps/web/node_modules/@fontsource-variable/inter` -## @fontsource-variable/public-sans@5.2.7 - -- License: OFL-1.1 -- Homepage: https://fontsource.org/fonts/public-sans -- Repository: git+https://github.com/fontsource/font-files.git -- Description: Self-host the Public Sans font in a neatly bundled NPM package. -- Included files: LICENSE -- Folder: `licenses/@fontsource-variable_public-sans@5.2.7` -- Source package dir: `apps/web/node_modules/@fontsource-variable/public-sans` - -## @livekit/components-react@2.9.21 +## @livekit/components-react@2.9.20 - License: Apache-2.0 - Repository: https://github.com/livekit/components-js.git - Included files: LICENSE -- Folder: `licenses/@livekit_components-react@2.9.21` +- Folder: `licenses/@livekit_components-react@2.9.20` - Source package dir: `packages/call/node_modules/@livekit/components-react` ## @noble/curves@2.2.0 @@ -153,319 +74,75 @@ Generated from pnpm-lock.yaml and installed packages in workspace node_modules f - Description: Audited & minimal JS implementation of elliptic curve cryptography - Included files: LICENSE - Folder: `licenses/@noble_curves@2.2.0` -- Source package dir: `packages/crypto/node_modules/@noble/curves` +- Source package dir: `apps/web/node_modules/@noble/curves` -## @noble/hashes@2.2.0 - -- License: MIT -- Homepage: https://paulmillr.com/noble/ -- Repository: git+https://github.com/paulmillr/noble-hashes.git -- Description: Audited & minimal 0-dependency JS implementation of SHA, RIPEMD, BLAKE, HMAC, HKDF, PBKDF & Scrypt -- Included files: LICENSE -- Folder: `licenses/@noble_hashes@2.2.0` -- Source package dir: `packages/crypto/node_modules/@noble/hashes` - -## @radix-ui/primitive@1.1.4 - -- License: MIT -- Homepage: https://radix-ui.com/primitives -- Repository: git+https://github.com/radix-ui/primitives.git -- Included files: LICENSE -- Folder: `licenses/@radix-ui_primitive@1.1.4` -- Source package dir: `apps/web/node_modules/@radix-ui/primitive` - -## @radix-ui/react-compose-refs@1.1.3 - -- License: MIT -- Homepage: https://radix-ui.com/primitives -- Repository: git+https://github.com/radix-ui/primitives.git -- Included files: LICENSE -- Folder: `licenses/@radix-ui_react-compose-refs@1.1.3` -- Source package dir: `apps/web/node_modules/@radix-ui/react-compose-refs` - -## @radix-ui/react-context@1.1.4 - -- License: MIT -- Homepage: https://radix-ui.com/primitives -- Repository: git+https://github.com/radix-ui/primitives.git -- Included files: LICENSE -- Folder: `licenses/@radix-ui_react-context@1.1.4` -- Source package dir: `apps/web/node_modules/@radix-ui/react-context` - -## @radix-ui/react-dialog@1.1.18 - -- License: MIT -- Homepage: https://radix-ui.com/primitives -- Repository: git+https://github.com/radix-ui/primitives.git -- Included files: LICENSE -- Folder: `licenses/@radix-ui_react-dialog@1.1.18` -- Source package dir: `apps/web/node_modules/@radix-ui/react-dialog` - -## @radix-ui/react-dismissable-layer@1.1.14 - -- License: MIT -- Homepage: https://radix-ui.com/primitives -- Repository: git+https://github.com/radix-ui/primitives.git -- Included files: LICENSE -- Folder: `licenses/@radix-ui_react-dismissable-layer@1.1.14` -- Source package dir: `apps/web/node_modules/@radix-ui/react-dismissable-layer` - -## @radix-ui/react-focus-guards@1.1.4 - -- License: MIT -- Homepage: https://radix-ui.com/primitives -- Repository: git+https://github.com/radix-ui/primitives.git -- Included files: LICENSE -- Folder: `licenses/@radix-ui_react-focus-guards@1.1.4` -- Source package dir: `apps/web/node_modules/@radix-ui/react-focus-guards` - -## @radix-ui/react-focus-scope@1.1.11 - -- License: MIT -- Homepage: https://radix-ui.com/primitives -- Repository: git+https://github.com/radix-ui/primitives.git -- Included files: LICENSE -- Folder: `licenses/@radix-ui_react-focus-scope@1.1.11` -- Source package dir: `apps/web/node_modules/@radix-ui/react-focus-scope` - -## @radix-ui/react-id@1.1.2 - -- License: MIT -- Homepage: https://radix-ui.com/primitives -- Repository: git+https://github.com/radix-ui/primitives.git -- Included files: LICENSE -- Folder: `licenses/@radix-ui_react-id@1.1.2` -- Source package dir: `apps/web/node_modules/@radix-ui/react-id` - -## @radix-ui/react-portal@1.1.13 - -- License: MIT -- Homepage: https://radix-ui.com/primitives -- Repository: git+https://github.com/radix-ui/primitives.git -- Included files: LICENSE -- Folder: `licenses/@radix-ui_react-portal@1.1.13` -- Source package dir: `apps/web/node_modules/@radix-ui/react-portal` - -## @radix-ui/react-presence@1.1.6 - -- License: MIT -- Homepage: https://radix-ui.com/primitives -- Repository: git+https://github.com/radix-ui/primitives.git -- Included files: LICENSE -- Folder: `licenses/@radix-ui_react-presence@1.1.6` -- Source package dir: `apps/web/node_modules/@radix-ui/react-presence` - -## @radix-ui/react-primitive@2.1.7 - -- License: MIT -- Homepage: https://radix-ui.com/primitives -- Repository: git+https://github.com/radix-ui/primitives.git -- Included files: LICENSE -- Folder: `licenses/@radix-ui_react-primitive@2.1.7` -- Source package dir: `apps/web/node_modules/@radix-ui/react-primitive` - -## @radix-ui/react-slot@1.3.0 - -- License: MIT -- Homepage: https://radix-ui.com/primitives -- Repository: git+https://github.com/radix-ui/primitives.git -- Included files: LICENSE -- Folder: `licenses/@radix-ui_react-slot@1.3.0` -- Source package dir: `apps/web/node_modules/@radix-ui/react-slot` - -## @radix-ui/react-use-callback-ref@1.1.2 - -- License: MIT -- Homepage: https://radix-ui.com/primitives -- Repository: git+https://github.com/radix-ui/primitives.git -- Included files: LICENSE -- Folder: `licenses/@radix-ui_react-use-callback-ref@1.1.2` -- Source package dir: `apps/web/node_modules/@radix-ui/react-use-callback-ref` - -## @radix-ui/react-use-controllable-state@1.2.3 - -- License: MIT -- Homepage: https://radix-ui.com/primitives -- Repository: git+https://github.com/radix-ui/primitives.git -- Included files: LICENSE -- Folder: `licenses/@radix-ui_react-use-controllable-state@1.2.3` -- Source package dir: `apps/web/node_modules/@radix-ui/react-use-controllable-state` - -## @radix-ui/react-use-effect-event@0.0.2 - -- License: MIT -- Homepage: https://radix-ui.com/primitives -- Repository: git+https://github.com/radix-ui/primitives.git -- Included files: LICENSE -- Folder: `licenses/@radix-ui_react-use-effect-event@0.0.2` -- Source package dir: `apps/web/node_modules/@radix-ui/react-use-effect-event` - -## @radix-ui/react-use-layout-effect@1.1.2 - -- License: MIT -- Homepage: https://radix-ui.com/primitives -- Repository: git+https://github.com/radix-ui/primitives.git -- Included files: LICENSE -- Folder: `licenses/@radix-ui_react-use-layout-effect@1.1.2` -- Source package dir: `apps/web/node_modules/@radix-ui/react-use-layout-effect` - -## @reduxjs/toolkit@2.12.0 - -- License: MIT -- Homepage: https://redux-toolkit.js.org -- Repository: git+https://github.com/reduxjs/redux-toolkit.git -- Description: The official, opinionated, batteries-included toolset for efficient Redux development -- Included files: LICENSE -- Folder: `licenses/@reduxjs_toolkit@2.12.0` -- Source package dir: `apps/web/node_modules/@reduxjs/toolkit` - -## @tailwindcss/vite@4.3.2 +## @tailwindcss/vite@4.2.4 - License: MIT - Homepage: https://tailwindcss.com - Repository: https://github.com/tailwindlabs/tailwindcss.git - Description: A utility-first CSS framework for rapidly building custom user interfaces. - Included files: LICENSE -- Folder: `licenses/@tailwindcss_vite@4.3.2` +- Folder: `licenses/@tailwindcss_vite@4.2.4` - Source package dir: `apps/web/node_modules/@tailwindcss/vite` -## @tanstack/devtools-event-client@0.3.5 - -- License: MIT -- Homepage: https://tanstack.com/devtools -- Repository: https://github.com/TanStack/devtools.git -- Description: TanStack Event Client is a lightweight event client for TanStack Devtools event bus. -- Included files: LICENSE -- Folder: `licenses/@tanstack_devtools-event-client@0.3.5` -- Source package dir: `apps/web/node_modules/@tanstack/devtools-event-client` - -## @tanstack/history@1.162.0 - -- License: MIT -- Homepage: https://tanstack.com/router -- Repository: git+https://github.com/TanStack/router.git -- Description: Modern and scalable routing for React applications -- Included files: LICENSE -- Folder: `licenses/@tanstack_history@1.162.0` -- Source package dir: `apps/web/node_modules/@tanstack/history` - -## @tanstack/pacer@0.21.1 - -- License: MIT -- Homepage: https://tanstack.com/pacer -- Repository: git+https://github.com/TanStack/pacer.git -- Description: Utilities for debouncing, throttling, rate-limiting, queuing, and more. -- Included files: LICENSE -- Folder: `licenses/@tanstack_pacer@0.21.1` -- Source package dir: `packages/chat/node_modules/@tanstack/pacer` - -## @tanstack/query-core@5.101.2 - -- License: MIT -- Homepage: https://tanstack.com/query -- Repository: git+https://github.com/TanStack/query.git -- Description: The framework agnostic core that powers TanStack Query -- Included files: LICENSE -- Folder: `licenses/@tanstack_query-core@5.101.2` -- Source package dir: `apps/web/node_modules/@tanstack/query-core` - -## @tanstack/react-query@5.101.2 +## @tanstack/react-query@5.100.8 - License: MIT - Homepage: https://tanstack.com/query - Repository: git+https://github.com/TanStack/query.git - Description: Hooks for managing, caching and syncing asynchronous and remote data in React - Included files: LICENSE -- Folder: `licenses/@tanstack_react-query@5.101.2` -- Source package dir: `packages/chat/node_modules/@tanstack/react-query` +- Folder: `licenses/@tanstack_react-query@5.100.8` +- Source package dir: `packages/call/node_modules/@tanstack/react-query` -## @tanstack/react-router@1.170.17 +## @tanstack/react-router@1.169.1 - License: MIT - Homepage: https://tanstack.com/router - Repository: git+https://github.com/TanStack/router.git - Description: Modern and scalable routing for React applications - Included files: LICENSE -- Folder: `licenses/@tanstack_react-router@1.170.17` +- Folder: `licenses/@tanstack_react-router@1.169.1` - Source package dir: `apps/web/node_modules/@tanstack/react-router` -## @tanstack/react-store@0.9.3 - -- License: MIT -- Homepage: https://tanstack.com/store -- Repository: https://github.com/TanStack/store.git -- Description: Framework agnostic type-safe store w/ reactive framework adapters -- Included files: LICENSE -- Folder: `licenses/@tanstack_react-store@0.9.3` -- Source package dir: `apps/web/node_modules/@tanstack/react-store` - -## @tanstack/react-virtual@3.14.5 +## @tanstack/react-virtual@3.13.24 - License: MIT - Homepage: https://tanstack.com/virtual - Repository: git+https://github.com/TanStack/virtual.git - Description: Headless UI for virtualizing scrollable elements in React - Included files: LICENSE -- Folder: `licenses/@tanstack_react-virtual@3.14.5` +- Folder: `licenses/@tanstack_react-virtual@3.13.24` - Source package dir: `apps/web/node_modules/@tanstack/react-virtual` -## @tanstack/router-core@1.171.14 - -- License: MIT -- Homepage: https://tanstack.com/router -- Repository: git+https://github.com/TanStack/router.git -- Description: Modern and scalable routing for React applications -- Included files: LICENSE -- Folder: `licenses/@tanstack_router-core@1.171.14` -- Source package dir: `apps/web/node_modules/@tanstack/router-core` - -## @tanstack/store@0.9.3 - -- License: MIT -- Homepage: https://tanstack.com/store -- Repository: git+https://github.com/TanStack/store.git -- Description: Framework agnostic type-safe store w/ reactive framework adapters -- Included files: LICENSE -- Folder: `licenses/@tanstack_store@0.9.3` -- Source package dir: `apps/web/node_modules/@tanstack/store` - -## @tanstack/virtual-core@3.17.3 - -- License: MIT -- Homepage: https://tanstack.com/virtual -- Repository: git+https://github.com/TanStack/virtual.git -- Description: Headless UI for virtualizing scrollable elements in TS/JS + Frameworks -- Included files: LICENSE -- Folder: `licenses/@tanstack_virtual-core@3.17.3` -- Source package dir: `apps/web/node_modules/@tanstack/virtual-core` - -## @tauri-apps/api@2.11.1 +## @tauri-apps/api@2.11.0 - License: Apache-2.0 OR MIT - Homepage: https://github.com/tauri-apps/tauri#readme - Repository: git+https://github.com/tauri-apps/tauri.git - Description: Tauri API definitions -- Included files: LICENSE_APACHE-2.0, LICENSE_MIT -- Folder: `licenses/@tauri-apps_api@2.11.1` +- Included files: LICENSE_MIT, LICENSE_APACHE-2.0 +- Folder: `licenses/@tauri-apps_api@2.11.0` - Source package dir: `apps/tauri/node_modules/@tauri-apps/api` -## @tauri-apps/cli@2.11.4 +## @tauri-apps/cli@2.11.0 - License: Apache-2.0 OR MIT - Homepage: https://github.com/tauri-apps/tauri#readme - Repository: git+https://github.com/tauri-apps/tauri.git - Description: Command line interface for building Tauri apps -- Included files: LICENSE_APACHE-2.0, LICENSE_MIT -- Folder: `licenses/@tauri-apps_cli@2.11.4` +- Included files: LICENSE_MIT, LICENSE_APACHE-2.0 +- Folder: `licenses/@tauri-apps_cli@2.11.0` - Source package dir: `apps/tauri/node_modules/@tauri-apps/cli` -## @tauri-apps/plugin-barcode-scanner@2.4.5 +## @tauri-apps/plugin-barcode-scanner@2.4.4 - License: MIT OR Apache-2.0 - Repository: https://github.com/tauri-apps/plugins-workspace - Description: Scan QR codes, EAN-13 and other kinds of barcodes on Android and iOS - Included files: LICENSE.spdx -- Folder: `licenses/@tauri-apps_plugin-barcode-scanner@2.4.5` +- Folder: `licenses/@tauri-apps_plugin-barcode-scanner@2.4.4` - Source package dir: `apps/tauri/node_modules/@tauri-apps/plugin-barcode-scanner` ## @tauri-apps/plugin-deep-link@2.4.9 @@ -477,39 +154,38 @@ Generated from pnpm-lock.yaml and installed packages in workspace node_modules f - Folder: `licenses/@tauri-apps_plugin-deep-link@2.4.9` - Source package dir: `apps/tauri/node_modules/@tauri-apps/plugin-deep-link` -## @tauri-apps/plugin-log@2.8.0 +## @tauri-apps/plugin-opener@2.5.4 - License: MIT OR Apache-2.0 - Repository: https://github.com/tauri-apps/plugins-workspace -- Description: Configurable logging for your Tauri app. +- Description: Open files and URLs using their default application. - Included files: LICENSE.spdx -- Folder: `licenses/@tauri-apps_plugin-log@2.8.0` -- Source package dir: `apps/tauri/node_modules/@tauri-apps/plugin-log` +- Folder: `licenses/@tauri-apps_plugin-opener@2.5.4` +- Source package dir: `apps/tauri/node_modules/@tauri-apps/plugin-opener` -## @tauri-apps/plugin-notification@2.3.3 +## @tensamin/ttp-core@0.0.19 -- License: MIT OR Apache-2.0 -- Repository: https://github.com/tauri-apps/plugins-workspace -- Included files: LICENSE.spdx -- Folder: `licenses/@tauri-apps_plugin-notification@2.3.3` -- Source package dir: `apps/tauri/node_modules/@tauri-apps/plugin-notification` +- License: UNKNOWN +- Included files: LICENSE +- Folder: `licenses/@tensamin_ttp-core@0.0.19` +- Source package dir: `packages/ttp/node_modules/@tensamin/ttp-core` -## @tensamin/ui@0.0.39 +## @tensamin/ui@0.0.34 - License: UNKNOWN - Included files: none found -- Folder: `licenses/@tensamin_ui@0.0.39` +- Folder: `licenses/@tensamin_ui@0.0.34` - Source package dir: `apps/tauri/node_modules/@tensamin/ui` -## @types/node@25.9.4 +## @types/node@25.6.0 - License: MIT - Homepage: https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/node - Repository: https://github.com/DefinitelyTyped/DefinitelyTyped.git - Description: TypeScript definitions for node - Included files: LICENSE -- Folder: `licenses/@types_node@25.9.4` -- Source package dir: `apps/electron/node_modules/@types/node` +- Folder: `licenses/@types_node@25.6.0` +- Source package dir: `node_modules/@types/node` ## @types/qrcode@1.5.6 @@ -521,14 +197,14 @@ Generated from pnpm-lock.yaml and installed packages in workspace node_modules f - Folder: `licenses/@types_qrcode@1.5.6` - Source package dir: `apps/web/node_modules/@types/qrcode` -## @types/react@19.2.17 +## @types/react@19.2.14 - License: MIT - Homepage: https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/react - Repository: https://github.com/DefinitelyTyped/DefinitelyTyped.git - Description: TypeScript definitions for react - Included files: LICENSE -- Folder: `licenses/@types_react@19.2.17` +- Folder: `licenses/@types_react@19.2.14` - Source package dir: `apps/web/node_modules/@types/react` ## @types/react-dom@19.2.3 @@ -541,36 +217,26 @@ Generated from pnpm-lock.yaml and installed packages in workspace node_modules f - Folder: `licenses/@types_react-dom@19.2.3` - Source package dir: `apps/web/node_modules/@types/react-dom` -## @typescript-eslint/parser@8.62.1 +## @typescript-eslint/parser@8.59.1 - License: MIT - Homepage: https://typescript-eslint.io/packages/parser - Repository: https://github.com/typescript-eslint/typescript-eslint.git - Description: An ESLint custom parser which leverages TypeScript ESTree - Included files: LICENSE -- Folder: `licenses/@typescript-eslint_parser@8.62.1` +- Folder: `licenses/@typescript-eslint_parser@8.59.1` - Source package dir: `node_modules/@typescript-eslint/parser` -## @vitejs/plugin-react@6.0.3 +## @vitejs/plugin-react@6.0.1 - License: MIT - Homepage: https://github.com/vitejs/vite-plugin-react/tree/main/packages/plugin-react#readme - Repository: git+https://github.com/vitejs/vite-plugin-react.git - Description: The default Vite plugin for React projects - Included files: LICENSE -- Folder: `licenses/@vitejs_plugin-react@6.0.3` +- Folder: `licenses/@vitejs_plugin-react@6.0.1` - Source package dir: `apps/web/node_modules/@vitejs/plugin-react` -## aria-hidden@1.2.6 - -- License: MIT -- Homepage: https://github.com/theKashey/aria-hidden#readme -- Repository: git+https://github.com/theKashey/aria-hidden.git -- Description: Cast aria-hidden to everything, except... -- Included files: LICENSE -- Folder: `licenses/aria-hidden@1.2.6` -- Source package dir: `apps/web/node_modules/aria-hidden` - ## class-variance-authority@0.7.1 - License: Apache-2.0 @@ -590,15 +256,6 @@ Generated from pnpm-lock.yaml and installed packages in workspace node_modules f - Folder: `licenses/clsx@2.1.1` - Source package dir: `apps/web/node_modules/clsx` -## cmdk@1.1.1 - -- License: MIT -- Homepage: https://github.com/pacocoursey/cmdk#readme -- Repository: git+https://github.com/pacocoursey/cmdk.git -- Included files: LICENSE.md -- Folder: `licenses/cmdk@1.1.1` -- Source package dir: `apps/web/node_modules/cmdk` - ## comlink@4.4.2 - License: Apache-2.0 @@ -606,143 +263,7 @@ Generated from pnpm-lock.yaml and installed packages in workspace node_modules f - Description: Comlink makes WebWorkers enjoyable - Included files: LICENSE - Folder: `licenses/comlink@4.4.2` -- Source package dir: `packages/crypto/node_modules/comlink` - -## cookie-es@3.1.1 - -- License: MIT -- Repository: unjs/cookie-es -- Included files: LICENSE -- Folder: `licenses/cookie-es@3.1.1` -- Source package dir: `apps/web/node_modules/cookie-es` - -## d3-array@3.2.4 - -- License: ISC -- Homepage: https://d3js.org/d3-array/ -- Repository: https://github.com/d3/d3-array.git -- Description: Array manipulation, ordering, searching, summarizing, etc. -- Included files: LICENSE -- Folder: `licenses/d3-array@3.2.4` -- Source package dir: `apps/web/node_modules/d3-array` - -## d3-color@3.1.0 - -- License: ISC -- Homepage: https://d3js.org/d3-color/ -- Repository: https://github.com/d3/d3-color.git -- Description: Color spaces! RGB, HSL, Cubehelix, Lab and HCL (Lch). -- Included files: LICENSE -- Folder: `licenses/d3-color@3.1.0` -- Source package dir: `apps/web/node_modules/d3-color` - -## d3-ease@3.0.1 - -- License: BSD-3-Clause -- Homepage: https://d3js.org/d3-ease/ -- Repository: https://github.com/d3/d3-ease.git -- Description: Easing functions for smooth animation. -- Included files: LICENSE -- Folder: `licenses/d3-ease@3.0.1` -- Source package dir: `apps/web/node_modules/d3-ease` - -## d3-format@3.1.2 - -- License: ISC -- Homepage: https://d3js.org/d3-format/ -- Repository: https://github.com/d3/d3-format.git -- Description: Format numbers for human consumption. -- Included files: LICENSE -- Folder: `licenses/d3-format@3.1.2` -- Source package dir: `apps/web/node_modules/d3-format` - -## d3-interpolate@3.0.1 - -- License: ISC -- Homepage: https://d3js.org/d3-interpolate/ -- Repository: https://github.com/d3/d3-interpolate.git -- Description: Interpolate numbers, colors, strings, arrays, objects, whatever! -- Included files: LICENSE -- Folder: `licenses/d3-interpolate@3.0.1` -- Source package dir: `apps/web/node_modules/d3-interpolate` - -## d3-path@3.1.0 - -- License: ISC -- Homepage: https://d3js.org/d3-path/ -- Repository: https://github.com/d3/d3-path.git -- Description: Serialize Canvas path commands to SVG. -- Included files: LICENSE -- Folder: `licenses/d3-path@3.1.0` -- Source package dir: `apps/web/node_modules/d3-path` - -## d3-scale@4.0.2 - -- License: ISC -- Homepage: https://d3js.org/d3-scale/ -- Repository: https://github.com/d3/d3-scale.git -- Description: Encodings that map abstract data to visual representation. -- Included files: LICENSE -- Folder: `licenses/d3-scale@4.0.2` -- Source package dir: `apps/web/node_modules/d3-scale` - -## d3-shape@3.2.0 - -- License: ISC -- Homepage: https://d3js.org/d3-shape/ -- Repository: https://github.com/d3/d3-shape.git -- Description: Graphical primitives for visualization, such as lines and areas. -- Included files: LICENSE -- Folder: `licenses/d3-shape@3.2.0` -- Source package dir: `apps/web/node_modules/d3-shape` - -## d3-time@3.1.0 - -- License: ISC -- Homepage: https://d3js.org/d3-time/ -- Repository: https://github.com/d3/d3-time.git -- Description: A calculator for humanity’s peculiar conventions of time. -- Included files: LICENSE -- Folder: `licenses/d3-time@3.1.0` -- Source package dir: `apps/web/node_modules/d3-time` - -## d3-time-format@4.1.0 - -- License: ISC -- Homepage: https://d3js.org/d3-time-format/ -- Repository: https://github.com/d3/d3-time-format.git -- Description: A JavaScript time formatter and parser inspired by strftime and strptime. -- Included files: LICENSE -- Folder: `licenses/d3-time-format@4.1.0` -- Source package dir: `apps/web/node_modules/d3-time-format` - -## d3-timer@3.0.1 - -- License: ISC -- Homepage: https://d3js.org/d3-timer/ -- Repository: https://github.com/d3/d3-timer.git -- Description: An efficient queue capable of managing thousands of concurrent animations. -- Included files: LICENSE -- Folder: `licenses/d3-timer@3.0.1` -- Source package dir: `apps/web/node_modules/d3-timer` - -## date-fns@4.4.0 - -- License: MIT -- Repository: https://github.com/date-fns/date-fns -- Description: Modern JavaScript date utility library -- Included files: LICENSE.md -- Folder: `licenses/date-fns@4.4.0` -- Source package dir: `apps/web/node_modules/date-fns` - -## decimal.js-light@2.5.1 - -- License: MIT -- Repository: https://github.com/MikeMcl/decimal.js-light.git -- Description: An arbitrary-precision Decimal type for JavaScript. -- Included files: LICENCE.md -- Folder: `licenses/decimal.js-light@2.5.1` -- Source package dir: `apps/web/node_modules/decimal.js-light` +- Source package dir: `apps/web/node_modules/comlink` ## deepfilternet3-noise-filter@1.2.1 @@ -754,85 +275,6 @@ Generated from pnpm-lock.yaml and installed packages in workspace node_modules f - Folder: `licenses/deepfilternet3-noise-filter@1.2.1` - Source package dir: `packages/call/node_modules/deepfilternet3-noise-filter` -## detect-node-es@1.1.0 - -- License: MIT -- Homepage: https://github.com/thekashey/detect-node -- Repository: https://github.com/thekashey/detect-node -- Description: Detect Node.JS (as opposite to browser environment). ESM modification -- Included files: LICENSE -- Folder: `licenses/detect-node-es@1.1.0` -- Source package dir: `apps/web/node_modules/detect-node-es` - -## dijkstrajs@1.0.3 - -- License: MIT -- Homepage: https://github.com/tcort/dijkstrajs -- Repository: git://github.com/tcort/dijkstrajs -- Description: A simple JavaScript implementation of Dijkstra's single-source shortest-paths algorithm. -- Included files: LICENSE.md -- Folder: `licenses/dijkstrajs@1.0.3` -- Source package dir: `apps/web/node_modules/dijkstrajs` - -## electron@39.8.10 - -- License: MIT -- Repository: https://github.com/electron/electron -- Description: Build cross platform desktop apps with JavaScript, HTML, and CSS -- Included files: LICENSE -- Folder: `licenses/electron@39.8.10` -- Source package dir: `apps/electron/node_modules/electron` - -## electron-builder@26.15.3 - -- License: MIT -- Homepage: https://github.com/electron-userland/electron-builder -- Repository: git+https://github.com/electron-userland/electron-builder.git -- Description: A complete solution to package and build a ready for distribution Electron app for MacOS, Windows and Linux with “auto update” support out of the box -- Included files: LICENSE -- Folder: `licenses/electron-builder@26.15.3` -- Source package dir: `apps/electron/node_modules/electron-builder` - -## embla-carousel@8.6.0 - -- License: MIT -- Homepage: https://www.embla-carousel.com -- Repository: git+https://github.com/davidjerleke/embla-carousel -- Description: A lightweight carousel library with fluid motion and great swipe precision -- Included files: none found -- Folder: `licenses/embla-carousel@8.6.0` -- Source package dir: `apps/web/node_modules/embla-carousel` - -## embla-carousel-react@8.6.0 - -- License: MIT -- Homepage: https://www.embla-carousel.com -- Repository: git+https://github.com/davidjerleke/embla-carousel -- Description: A lightweight carousel library with fluid motion and great swipe precision -- Included files: none found -- Folder: `licenses/embla-carousel-react@8.6.0` -- Source package dir: `apps/web/node_modules/embla-carousel-react` - -## embla-carousel-reactive-utils@8.6.0 - -- License: MIT -- Homepage: https://www.embla-carousel.com -- Repository: git+https://github.com/davidjerleke/embla-carousel -- Description: Reactive utilities for Embla Carousel -- Included files: none found -- Folder: `licenses/embla-carousel-reactive-utils@8.6.0` -- Source package dir: `apps/web/node_modules/embla-carousel-reactive-utils` - -## es-toolkit@1.49.0 - -- License: MIT -- Homepage: https://es-toolkit.dev -- Repository: https://github.com/toss/es-toolkit.git -- Description: A state-of-the-art, high-performance JavaScript utility library with a small bundle size and strong type annotations. -- Included files: LICENSE -- Folder: `licenses/es-toolkit@1.49.0` -- Source package dir: `apps/web/node_modules/es-toolkit` - ## esbuild@0.25.12 - License: MIT @@ -840,16 +282,16 @@ Generated from pnpm-lock.yaml and installed packages in workspace node_modules f - Description: An extremely fast JavaScript and CSS bundler and minifier. - Included files: LICENSE.md - Folder: `licenses/esbuild@0.25.12` -- Source package dir: `apps/electron/node_modules/esbuild` +- Source package dir: `apps/web/node_modules/esbuild` -## eslint@10.6.0 +## eslint@10.3.0 - License: MIT - Homepage: https://eslint.org - Repository: eslint/eslint - Description: An AST-based pattern checker for JavaScript. - Included files: LICENSE -- Folder: `licenses/eslint@10.6.0` +- Folder: `licenses/eslint@10.3.0` - Source package dir: `apps/web/node_modules/eslint` ## eslint-plugin-react-hooks@7.1.1 @@ -862,74 +304,24 @@ Generated from pnpm-lock.yaml and installed packages in workspace node_modules f - Folder: `licenses/eslint-plugin-react-hooks@7.1.1` - Source package dir: `node_modules/eslint-plugin-react-hooks` -## eventemitter3@5.0.4 +## framer-motion@12.38.0 - License: MIT -- Repository: git://github.com/primus/eventemitter3.git -- Description: EventEmitter3 focuses on performance while maintaining a Node.js AND browser compatible interface. -- Included files: LICENSE -- Folder: `licenses/eventemitter3@5.0.4` -- Source package dir: `apps/web/node_modules/eventemitter3` +- Repository: https://github.com/motiondivision/motion/ +- Description: A simple and powerful JavaScript animation library +- Included files: LICENSE.md +- Folder: `licenses/framer-motion@12.38.0` +- Source package dir: `apps/web/node_modules/framer-motion` -## fallow@2.104.0 - -- License: MIT -- Homepage: https://docs.fallow.tools -- Repository: git+https://github.com/fallow-rs/fallow.git -- Description: Deterministic codebase intelligence for TypeScript and JavaScript. Quality, risk, architecture, dependencies, duplication, and safe cleanup evidence for humans, CI, and agents. Optional runtime intelligence layer (Fallow Runtime) adds production execution evidence. Rust-native, sub-second, zero-config framework support. -- Included files: none found -- Folder: `licenses/fallow@2.104.0` -- Source package dir: `node_modules/fallow` - -## get-nonce@1.0.1 - -- License: MIT -- Homepage: https://github.com/theKashey/get-nonce -- Repository: git@github.com:theKashey/get-nonce.git -- Description: returns nonce -- Included files: LICENSE -- Folder: `licenses/get-nonce@1.0.1` -- Source package dir: `apps/web/node_modules/get-nonce` - -## globals@17.7.0 +## globals@17.6.0 - License: MIT - Repository: sindresorhus/globals - Description: Global identifiers from different JavaScript environments - Included files: license -- Folder: `licenses/globals@17.7.0` +- Folder: `licenses/globals@17.6.0` - Source package dir: `apps/web/node_modules/globals` -## immer@10.2.0 - -- License: MIT -- Homepage: https://github.com/immerjs/immer#readme -- Repository: https://github.com/immerjs/immer.git -- Description: Create your next immutable state by mutating the current one -- Included files: LICENSE -- Folder: `licenses/immer@10.2.0` -- Source package dir: `apps/web/node_modules/immer` - -## input-otp@1.4.2 - -- License: MIT -- Homepage: https://input-otp.rodz.dev/ -- Repository: git+https://github.com/guilhermerodz/input-otp.git -- Description: One-time password input component for React. -- Included files: none found -- Folder: `licenses/input-otp@1.4.2` -- Source package dir: `apps/web/node_modules/input-otp` - -## internmap@2.0.3 - -- License: ISC -- Homepage: https://github.com/mbostock/internmap/ -- Repository: https://github.com/mbostock/internmap.git -- Description: Map and Set with automatic key interning -- Included files: LICENSE -- Folder: `licenses/internmap@2.0.3` -- Source package dir: `apps/web/node_modules/internmap` - ## jsonc-parser@3.3.1 - License: MIT @@ -939,59 +331,33 @@ Generated from pnpm-lock.yaml and installed packages in workspace node_modules f - Folder: `licenses/jsonc-parser@3.3.1` - Source package dir: `node_modules/jsonc-parser` -## livekit-client@2.20.0 +## livekit-client@2.18.8 - License: Apache-2.0 - Repository: git@github.com:livekit/client-sdk-js.git - Description: JavaScript/TypeScript client SDK for LiveKit - Included files: LICENSE -- Folder: `licenses/livekit-client@2.20.0` +- Folder: `licenses/livekit-client@2.18.8` - Source package dir: `packages/call/node_modules/livekit-client` -## lucide-react@1.23.0 +## lucide-react@1.14.0 - License: ISC - Homepage: https://lucide.dev - Repository: https://github.com/lucide-icons/lucide.git - Description: A Lucide icon library package for React applications. - Included files: LICENSE -- Folder: `licenses/lucide-react@1.23.0` -- Source package dir: `apps/web/node_modules/lucide-react` +- Folder: `licenses/lucide-react@1.14.0` +- Source package dir: `apps/tauri/node_modules/lucide-react` -## mtp@0.1.0 - -- License: UNKNOWN -- Description: MTP TypeScript SDK -- Included files: none found -- Folder: `licenses/mtp@0.1.0` -- Source package dir: `packages/mtp/node_modules/mtp` - -## next-themes@0.4.6 - -- License: MIT -- Repository: https://github.com/pacocoursey/next-themes.git -- Included files: license.md -- Folder: `licenses/next-themes@0.4.6` -- Source package dir: `apps/web/node_modules/next-themes` - -## pngjs@5.0.0 - -- License: MIT -- Homepage: https://github.com/lukeapage/pngjs -- Repository: git://github.com/lukeapage/pngjs.git -- Description: PNG encoder/decoder in pure JS, supporting any bit size & interlace, async & sync with full test suite. -- Included files: LICENSE -- Folder: `licenses/pngjs@5.0.0` -- Source package dir: `apps/web/node_modules/pngjs` - -## prettier@3.9.4 +## prettier@3.8.3 - License: MIT - Homepage: https://prettier.io - Repository: prettier/prettier - Description: Prettier is an opinionated code formatter - Included files: LICENSE -- Folder: `licenses/prettier@3.9.4` +- Folder: `licenses/prettier@3.8.3` - Source package dir: `node_modules/prettier` ## qrcode@1.5.4 @@ -1004,93 +370,26 @@ Generated from pnpm-lock.yaml and installed packages in workspace node_modules f - Folder: `licenses/qrcode@1.5.4` - Source package dir: `apps/web/node_modules/qrcode` -## react@19.2.7 +## react@19.2.5 - License: MIT - Homepage: https://react.dev/ - Repository: https://github.com/facebook/react.git - Description: React is a JavaScript library for building user interfaces. - Included files: LICENSE -- Folder: `licenses/react@19.2.7` +- Folder: `licenses/react@19.2.5` - Source package dir: `apps/tauri/node_modules/react` -## react-day-picker@10.0.1 - -- License: MIT -- Homepage: https://daypicker.dev -- Repository: git+https://github.com/gpbl/react-day-picker.git -- Description: Customizable Date Picker for React -- Included files: LICENSE -- Folder: `licenses/react-day-picker@10.0.1` -- Source package dir: `apps/web/node_modules/react-day-picker` - -## react-dom@19.2.7 +## react-dom@19.2.5 - License: MIT - Homepage: https://react.dev/ - Repository: https://github.com/facebook/react.git - Description: React package for working with the DOM. - Included files: LICENSE -- Folder: `licenses/react-dom@19.2.7` +- Folder: `licenses/react-dom@19.2.5` - Source package dir: `apps/tauri/node_modules/react-dom` -## react-is@19.2.7 - -- License: MIT -- Homepage: https://react.dev/ -- Repository: https://github.com/facebook/react.git -- Description: Brand checking of React Elements. -- Included files: LICENSE -- Folder: `licenses/react-is@19.2.7` -- Source package dir: `apps/web/node_modules/react-is` - -## react-redux@9.3.0 - -- License: MIT -- Homepage: https://github.com/reduxjs/react-redux -- Repository: github:reduxjs/react-redux -- Description: Official React bindings for Redux -- Included files: LICENSE.md -- Folder: `licenses/react-redux@9.3.0` -- Source package dir: `apps/web/node_modules/react-redux` - -## react-remove-scroll@2.7.2 - -- License: MIT -- Repository: https://github.com/theKashey/react-remove-scroll -- Description: Disables scroll outside of `children` node. -- Included files: LICENSE -- Folder: `licenses/react-remove-scroll@2.7.2` -- Source package dir: `apps/web/node_modules/react-remove-scroll` - -## react-remove-scroll-bar@2.3.8 - -- License: MIT -- Repository: https://github.com/theKashey/react-remove-scroll-bar -- Description: Removes body scroll without content _shake_ -- Included files: none found -- Folder: `licenses/react-remove-scroll-bar@2.3.8` -- Source package dir: `apps/web/node_modules/react-remove-scroll-bar` - -## react-resizable-panels@4.12.0 - -- License: MIT -- Homepage: https://react-resizable-panels.vercel.app/ -- Repository: https://github.com/bvaughn/react-resizable-panels.git -- Included files: LICENSE.md -- Folder: `licenses/react-resizable-panels@4.12.0` -- Source package dir: `apps/web/node_modules/react-resizable-panels` - -## react-style-singleton@2.2.3 - -- License: MIT -- Homepage: https://github.com/theKashey/react-style-singleton#readme -- Repository: https://github.com/theKashey/react-style-singleton -- Description: Just create a single stylesheet... -- Included files: LICENSE -- Folder: `licenses/react-style-singleton@2.2.3` -- Source package dir: `apps/web/node_modules/react-style-singleton` - ## recharts@3.8.1 - License: MIT @@ -1099,74 +398,15 @@ Generated from pnpm-lock.yaml and installed packages in workspace node_modules f - Description: React charts - Included files: LICENSE - Folder: `licenses/recharts@3.8.1` -- Source package dir: `apps/web/node_modules/recharts` +- Source package dir: `packages/call/node_modules/recharts` -## redux@5.0.1 - -- License: MIT -- Homepage: http://redux.js.org -- Repository: github:reduxjs/redux -- Description: Predictable state container for JavaScript apps -- Included files: LICENSE.md -- Folder: `licenses/redux@5.0.1` -- Source package dir: `apps/web/node_modules/redux` - -## redux-thunk@3.1.0 - -- License: MIT -- Homepage: https://github.com/reduxjs/redux-thunk -- Repository: github:reduxjs/redux-thunk -- Description: Thunk middleware for Redux. -- Included files: LICENSE.md -- Folder: `licenses/redux-thunk@3.1.0` -- Source package dir: `apps/web/node_modules/redux-thunk` - -## reselect@5.1.1 - -- License: MIT -- Repository: https://github.com/reduxjs/reselect.git -- Description: Selectors for Redux. -- Included files: LICENSE -- Folder: `licenses/reselect@5.1.1` -- Source package dir: `apps/web/node_modules/reselect` - -## scheduler@0.27.0 - -- License: MIT -- Homepage: https://react.dev/ -- Repository: https://github.com/facebook/react.git -- Description: Cooperative scheduler for the browser environment. -- Included files: LICENSE -- Folder: `licenses/scheduler@0.27.0` -- Source package dir: `apps/web/node_modules/scheduler` - -## seroval@1.5.4 - -- License: MIT -- Homepage: https://github.com/lxsmnsyc/seroval/tree/main/packages/seroval -- Repository: https://github.com/lxsmnsyc/seroval.git -- Description: Stringify JS values -- Included files: LICENSE -- Folder: `licenses/seroval@1.5.4` -- Source package dir: `apps/web/node_modules/seroval` - -## seroval-plugins@1.5.4 - -- License: MIT -- Homepage: https://github.com/lxsmnsyc/seroval/tree/main/packages/plugins -- Repository: https://github.com/lxsmnsyc/seroval.git -- Description: Stringify JS values -- Included files: LICENSE -- Folder: `licenses/seroval-plugins@1.5.4` -- Source package dir: `apps/web/node_modules/seroval-plugins` - -## shadcn@4.12.0 +## shadcn@4.6.0 - License: MIT - Repository: https://github.com/shadcn-ui/ui.git - Description: Add components to your apps. - Included files: LICENSE.md -- Folder: `licenses/shadcn@4.12.0` +- Folder: `licenses/shadcn@4.6.0` - Source package dir: `apps/web/node_modules/shadcn` ## sonner@2.0.7 @@ -1179,14 +419,14 @@ Generated from pnpm-lock.yaml and installed packages in workspace node_modules f - Folder: `licenses/sonner@2.0.7` - Source package dir: `apps/web/node_modules/sonner` -## tailwind-merge@3.6.0 +## tailwind-merge@3.5.0 - License: MIT - Homepage: https://github.com/dcastil/tailwind-merge - Repository: https://github.com/dcastil/tailwind-merge.git - Description: Merge Tailwind CSS classes without style conflicts - Included files: LICENSE.md -- Folder: `licenses/tailwind-merge@3.6.0` +- Folder: `licenses/tailwind-merge@3.5.0` - Source package dir: `apps/web/node_modules/tailwind-merge` ## tailwind-scrollbar-hide@4.0.0 @@ -1199,14 +439,14 @@ Generated from pnpm-lock.yaml and installed packages in workspace node_modules f - Folder: `licenses/tailwind-scrollbar-hide@4.0.0` - Source package dir: `apps/web/node_modules/tailwind-scrollbar-hide` -## tailwindcss@4.3.2 +## tailwindcss@4.2.4 - License: MIT - Homepage: https://tailwindcss.com - Repository: https://github.com/tailwindlabs/tailwindcss.git - Description: A utility-first CSS framework for rapidly building custom user interfaces. - Included files: LICENSE -- Folder: `licenses/tailwindcss@4.3.2` +- Folder: `licenses/tailwindcss@4.2.4` - Source package dir: `apps/web/node_modules/tailwindcss` ## tauri-plugin-app-events-api@0.2.0 @@ -1217,26 +457,7 @@ Generated from pnpm-lock.yaml and installed packages in workspace node_modules f - Description: A plugin for tauri@v2 to listen some events on iOS and Android. - Included files: LICENSE - Folder: `licenses/tauri-plugin-app-events-api@0.2.0` -- Source package dir: `packages/mtp/node_modules/tauri-plugin-app-events-api` - -## tiny-invariant@1.3.3 - -- License: MIT -- Repository: https://github.com/alexreardon/tiny-invariant.git -- Description: A tiny invariant function -- Included files: LICENSE -- Folder: `licenses/tiny-invariant@1.3.3` -- Source package dir: `apps/web/node_modules/tiny-invariant` - -## tslib@2.8.1 - -- License: 0BSD -- Homepage: https://www.typescriptlang.org/ -- Repository: https://github.com/Microsoft/tslib.git -- Description: Runtime library for TypeScript helper functions -- Included files: LICENSE.txt -- Folder: `licenses/tslib@2.8.1` -- Source package dir: `apps/web/node_modules/tslib` +- Source package dir: `apps/web/node_modules/tauri-plugin-app-events-api` ## tw-animate-css@1.4.0 @@ -1256,122 +477,44 @@ Generated from pnpm-lock.yaml and installed packages in workspace node_modules f - Description: TypeScript is a language for application scale JavaScript development - Included files: LICENSE.txt - Folder: `licenses/typescript@6.0.3` -- Source package dir: `apps/electron/node_modules/typescript` +- Source package dir: `apps/web/node_modules/typescript` -## typescript-eslint@8.62.1 +## typescript-eslint@8.59.1 - License: MIT - Homepage: https://typescript-eslint.io/packages/typescript-eslint - Repository: https://github.com/typescript-eslint/typescript-eslint.git - Description: Tooling which enables you to use TypeScript with ESLint - Included files: LICENSE -- Folder: `licenses/typescript-eslint@8.62.1` +- Folder: `licenses/typescript-eslint@8.59.1` - Source package dir: `apps/web/node_modules/typescript-eslint` -## use-callback-ref@1.3.3 - -- License: MIT -- Repository: https://github.com/theKashey/use-callback-ref/ -- Description: The same useRef, but with callback -- Included files: LICENSE -- Folder: `licenses/use-callback-ref@1.3.3` -- Source package dir: `apps/web/node_modules/use-callback-ref` - -## use-sidecar@1.1.3 - -- License: MIT -- Homepage: https://github.com/theKashey/use-sidecar -- Repository: https://github.com/theKashey/use-sidecar -- Description: Sidecar code splitting utils -- Included files: LICENSE -- Folder: `licenses/use-sidecar@1.1.3` -- Source package dir: `apps/web/node_modules/use-sidecar` - -## use-sync-external-store@1.6.0 - -- License: MIT -- Repository: https://github.com/facebook/react.git -- Description: Backwards compatible shim for React's useSyncExternalStore. Works with any React that supports hooks. -- Included files: LICENSE -- Folder: `licenses/use-sync-external-store@1.6.0` -- Source package dir: `apps/web/node_modules/use-sync-external-store` - -## vaul@1.1.2 - -- License: MIT -- Homepage: https://vaul.emilkowal.ski/ -- Repository: https://github.com/emilkowalski/vaul.git -- Description: Drawer component for React. -- Included files: LICENSE.md -- Folder: `licenses/vaul@1.1.2` -- Source package dir: `apps/web/node_modules/vaul` - -## victory-vendor@37.3.6 - -- License: MIT AND ISC -- Homepage: https://commerce.nearform.com/open-source/victory -- Repository: https://github.com/FormidableLabs/victory -- Description: Vendored dependencies for Victory -- Included files: none found -- Folder: `licenses/victory-vendor@37.3.6` -- Source package dir: `apps/web/node_modules/victory-vendor` - -## vite@8.1.3 +## vite@8.0.10 - License: MIT - Homepage: https://vite.dev - Repository: git+https://github.com/vitejs/vite.git - Description: Native-ESM powered web dev build tool - Included files: LICENSE.md -- Folder: `licenses/vite@8.1.3` +- Folder: `licenses/vite@8.0.10` - Source package dir: `apps/web/node_modules/vite` -## vitest@4.1.9 - -- License: MIT -- Homepage: https://vitest.dev -- Repository: git+https://github.com/vitest-dev/vitest.git -- Description: Next generation testing framework powered by Vite -- Included files: LICENSE.md -- Folder: `licenses/vitest@4.1.9` -- Source package dir: `node_modules/vitest` - -## yaml@2.9.0 - -- License: ISC -- Homepage: https://eemeli.org/yaml/ -- Repository: github:eemeli/yaml -- Description: JavaScript parser and stringifier for YAML -- Included files: LICENSE -- Folder: `licenses/yaml@2.9.0` -- Source package dir: `node_modules/yaml` - -## yargs@15.4.1 - -- License: MIT -- Homepage: https://yargs.js.org/ -- Repository: https://github.com/yargs/yargs.git -- Description: yargs the modern, pirate-themed, successor to optimist. -- Included files: LICENSE -- Folder: `licenses/yargs@15.4.1` -- Source package dir: `apps/web/node_modules/yargs` - -## zod@4.4.3 +## zod@4.4.2 - License: MIT - Homepage: https://zod.dev - Repository: git+https://github.com/colinhacks/zod.git - Description: TypeScript-first schema declaration and validation library with static type inference - Included files: LICENSE -- Folder: `licenses/zod@4.4.3` +- Folder: `licenses/zod@4.4.2` - Source package dir: `apps/web/node_modules/zod` -## zustand@5.0.14 +## zustand@5.0.12 - License: MIT - Homepage: https://github.com/pmndrs/zustand - Repository: git+https://github.com/pmndrs/zustand.git - Description: 🐻 Bear necessities for state management in React - Included files: LICENSE -- Folder: `licenses/zustand@5.0.14` +- Folder: `licenses/zustand@5.0.12` - Source package dir: `packages/call/node_modules/zustand` diff --git a/licenses/aria-hidden@1.2.6/LICENSE b/licenses/aria-hidden@1.2.6/LICENSE deleted file mode 100644 index a194c88..0000000 --- a/licenses/aria-hidden@1.2.6/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2017 Anton Korzunov - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/licenses/cmdk@1.1.1/LICENSE.md b/licenses/cmdk@1.1.1/LICENSE.md deleted file mode 100644 index 76228cc..0000000 --- a/licenses/cmdk@1.1.1/LICENSE.md +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2022 Paco Coursey - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/licenses/cookie-es@3.1.1/LICENSE b/licenses/cookie-es@3.1.1/LICENSE deleted file mode 100644 index db7eac1..0000000 --- a/licenses/cookie-es@3.1.1/LICENSE +++ /dev/null @@ -1,28 +0,0 @@ -MIT License - -Cookie-es copyright (c) Pooya Parsa - -Cookie parsing based on https://github.com/jshttp/cookie -Copyright (c) 2012-2014 Roman Shtylman -Copyright (c) 2015 Douglas Christopher Wilson - -Set-Cookie parsing based on https://github.com/nfriedly/set-cookie-parser -Copyright (c) 2015 Nathan Friedly (http://nfriedly.com/) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/licenses/d3-array@3.2.4/LICENSE b/licenses/d3-array@3.2.4/LICENSE deleted file mode 100644 index 3594fff..0000000 --- a/licenses/d3-array@3.2.4/LICENSE +++ /dev/null @@ -1,13 +0,0 @@ -Copyright 2010-2023 Mike Bostock - -Permission to use, copy, modify, and/or distribute this software for any purpose -with or without fee is hereby granted, provided that the above copyright notice -and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS -OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER -TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF -THIS SOFTWARE. diff --git a/licenses/d3-color@3.1.0/LICENSE b/licenses/d3-color@3.1.0/LICENSE deleted file mode 100644 index fbe44bd..0000000 --- a/licenses/d3-color@3.1.0/LICENSE +++ /dev/null @@ -1,13 +0,0 @@ -Copyright 2010-2022 Mike Bostock - -Permission to use, copy, modify, and/or distribute this software for any purpose -with or without fee is hereby granted, provided that the above copyright notice -and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS -OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER -TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF -THIS SOFTWARE. diff --git a/licenses/d3-ease@3.0.1/LICENSE b/licenses/d3-ease@3.0.1/LICENSE deleted file mode 100644 index 83cc997..0000000 --- a/licenses/d3-ease@3.0.1/LICENSE +++ /dev/null @@ -1,28 +0,0 @@ -Copyright 2010-2021 Mike Bostock -Copyright 2001 Robert Penner -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -* Neither the name of the author nor the names of contributors may be used to - endorse or promote products derived from this software without specific prior - written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/licenses/d3-format@3.1.2/LICENSE b/licenses/d3-format@3.1.2/LICENSE deleted file mode 100644 index a8918c4..0000000 --- a/licenses/d3-format@3.1.2/LICENSE +++ /dev/null @@ -1,13 +0,0 @@ -Copyright 2010-2026 Mike Bostock - -Permission to use, copy, modify, and/or distribute this software for any purpose -with or without fee is hereby granted, provided that the above copyright notice -and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS -OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER -TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF -THIS SOFTWARE. diff --git a/licenses/d3-interpolate@3.0.1/LICENSE b/licenses/d3-interpolate@3.0.1/LICENSE deleted file mode 100644 index b014515..0000000 --- a/licenses/d3-interpolate@3.0.1/LICENSE +++ /dev/null @@ -1,13 +0,0 @@ -Copyright 2010-2021 Mike Bostock - -Permission to use, copy, modify, and/or distribute this software for any purpose -with or without fee is hereby granted, provided that the above copyright notice -and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS -OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER -TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF -THIS SOFTWARE. diff --git a/licenses/d3-path@3.1.0/LICENSE b/licenses/d3-path@3.1.0/LICENSE deleted file mode 100644 index ed25746..0000000 --- a/licenses/d3-path@3.1.0/LICENSE +++ /dev/null @@ -1,13 +0,0 @@ -Copyright 2015-2022 Mike Bostock - -Permission to use, copy, modify, and/or distribute this software for any purpose -with or without fee is hereby granted, provided that the above copyright notice -and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS -OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER -TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF -THIS SOFTWARE. diff --git a/licenses/d3-scale@4.0.2/LICENSE b/licenses/d3-scale@4.0.2/LICENSE deleted file mode 100644 index b014515..0000000 --- a/licenses/d3-scale@4.0.2/LICENSE +++ /dev/null @@ -1,13 +0,0 @@ -Copyright 2010-2021 Mike Bostock - -Permission to use, copy, modify, and/or distribute this software for any purpose -with or without fee is hereby granted, provided that the above copyright notice -and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS -OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER -TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF -THIS SOFTWARE. diff --git a/licenses/d3-shape@3.2.0/LICENSE b/licenses/d3-shape@3.2.0/LICENSE deleted file mode 100644 index fbe44bd..0000000 --- a/licenses/d3-shape@3.2.0/LICENSE +++ /dev/null @@ -1,13 +0,0 @@ -Copyright 2010-2022 Mike Bostock - -Permission to use, copy, modify, and/or distribute this software for any purpose -with or without fee is hereby granted, provided that the above copyright notice -and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS -OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER -TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF -THIS SOFTWARE. diff --git a/licenses/d3-time-format@4.1.0/LICENSE b/licenses/d3-time-format@4.1.0/LICENSE deleted file mode 100644 index b014515..0000000 --- a/licenses/d3-time-format@4.1.0/LICENSE +++ /dev/null @@ -1,13 +0,0 @@ -Copyright 2010-2021 Mike Bostock - -Permission to use, copy, modify, and/or distribute this software for any purpose -with or without fee is hereby granted, provided that the above copyright notice -and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS -OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER -TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF -THIS SOFTWARE. diff --git a/licenses/d3-time@3.1.0/LICENSE b/licenses/d3-time@3.1.0/LICENSE deleted file mode 100644 index fbe44bd..0000000 --- a/licenses/d3-time@3.1.0/LICENSE +++ /dev/null @@ -1,13 +0,0 @@ -Copyright 2010-2022 Mike Bostock - -Permission to use, copy, modify, and/or distribute this software for any purpose -with or without fee is hereby granted, provided that the above copyright notice -and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS -OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER -TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF -THIS SOFTWARE. diff --git a/licenses/d3-timer@3.0.1/LICENSE b/licenses/d3-timer@3.0.1/LICENSE deleted file mode 100644 index b014515..0000000 --- a/licenses/d3-timer@3.0.1/LICENSE +++ /dev/null @@ -1,13 +0,0 @@ -Copyright 2010-2021 Mike Bostock - -Permission to use, copy, modify, and/or distribute this software for any purpose -with or without fee is hereby granted, provided that the above copyright notice -and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS -OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER -TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF -THIS SOFTWARE. diff --git a/licenses/date-fns@4.4.0/LICENSE.md b/licenses/date-fns@4.4.0/LICENSE.md deleted file mode 100644 index 29c6e85..0000000 --- a/licenses/date-fns@4.4.0/LICENSE.md +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2021 Sasha Koss and Lesha Koss https://kossnocorp.mit-license.org - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/licenses/decimal.js-light@2.5.1/LICENCE.md b/licenses/decimal.js-light@2.5.1/LICENCE.md deleted file mode 100644 index 538bf23..0000000 --- a/licenses/decimal.js-light@2.5.1/LICENCE.md +++ /dev/null @@ -1,23 +0,0 @@ -The MIT Expat Licence. - -Copyright (c) 2020 Michael Mclaughlin - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - diff --git a/licenses/detect-node-es@1.1.0/LICENSE b/licenses/detect-node-es@1.1.0/LICENSE deleted file mode 100644 index 3113356..0000000 --- a/licenses/detect-node-es@1.1.0/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2017 Ilya Kantor - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/licenses/dijkstrajs@1.0.3/LICENSE.md b/licenses/dijkstrajs@1.0.3/LICENSE.md deleted file mode 100644 index b662d80..0000000 --- a/licenses/dijkstrajs@1.0.3/LICENSE.md +++ /dev/null @@ -1,19 +0,0 @@ -``` -Dijkstra path-finding functions. Adapted from the Dijkstar Python project. - -Copyright (C) 2008 - Wyatt Baldwin - All rights reserved - -Licensed under the MIT license. - - http://www.opensource.org/licenses/mit-license.php - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -``` diff --git a/licenses/electron-builder@26.15.3/LICENSE b/licenses/electron-builder@26.15.3/LICENSE deleted file mode 100644 index 7d8fa01..0000000 --- a/licenses/electron-builder@26.15.3/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2015 Loopline Systems - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - diff --git a/licenses/electron@39.8.10/LICENSE b/licenses/electron@39.8.10/LICENSE deleted file mode 100644 index 536d54e..0000000 --- a/licenses/electron@39.8.10/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -Copyright (c) Electron contributors -Copyright (c) 2013-2020 GitHub Inc. - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/licenses/es-toolkit@1.49.0/LICENSE b/licenses/es-toolkit@1.49.0/LICENSE deleted file mode 100644 index 69dc6a7..0000000 --- a/licenses/es-toolkit@1.49.0/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2024 Viva Republica, Inc. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/licenses/eslint@10.6.0/LICENSE b/licenses/eslint@10.3.0/LICENSE similarity index 100% rename from licenses/eslint@10.6.0/LICENSE rename to licenses/eslint@10.3.0/LICENSE diff --git a/licenses/eventemitter3@5.0.4/LICENSE b/licenses/eventemitter3@5.0.4/LICENSE deleted file mode 100644 index abcbd54..0000000 --- a/licenses/eventemitter3@5.0.4/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Arnout Kazemier - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/licenses/react-resizable-panels@4.12.0/LICENSE.md b/licenses/framer-motion@12.38.0/LICENSE.md similarity index 97% rename from licenses/react-resizable-panels@4.12.0/LICENSE.md rename to licenses/framer-motion@12.38.0/LICENSE.md index 0569d0a..b5b8d6a 100644 --- a/licenses/react-resizable-panels@4.12.0/LICENSE.md +++ b/licenses/framer-motion@12.38.0/LICENSE.md @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2018 Brian Vaughn +Copyright (c) 2018 Framer B.V. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/licenses/get-nonce@1.0.1/LICENSE b/licenses/get-nonce@1.0.1/LICENSE deleted file mode 100644 index 9455bf5..0000000 --- a/licenses/get-nonce@1.0.1/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2020 Anton Korzunov - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/licenses/globals@17.7.0/license b/licenses/globals@17.6.0/license similarity index 100% rename from licenses/globals@17.7.0/license rename to licenses/globals@17.6.0/license diff --git a/licenses/immer@10.2.0/LICENSE b/licenses/immer@10.2.0/LICENSE deleted file mode 100644 index c014115..0000000 --- a/licenses/immer@10.2.0/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2017 Michel Weststrate - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/licenses/internmap@2.0.3/LICENSE b/licenses/internmap@2.0.3/LICENSE deleted file mode 100644 index 6fca711..0000000 --- a/licenses/internmap@2.0.3/LICENSE +++ /dev/null @@ -1,13 +0,0 @@ -Copyright 2021 Mike Bostock - -Permission to use, copy, modify, and/or distribute this software for any purpose -with or without fee is hereby granted, provided that the above copyright notice -and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS -OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER -TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF -THIS SOFTWARE. diff --git a/licenses/livekit-client@2.20.0/LICENSE b/licenses/livekit-client@2.18.8/LICENSE similarity index 100% rename from licenses/livekit-client@2.20.0/LICENSE rename to licenses/livekit-client@2.18.8/LICENSE diff --git a/licenses/lucide-react@1.23.0/LICENSE b/licenses/lucide-react@1.14.0/LICENSE similarity index 100% rename from licenses/lucide-react@1.23.0/LICENSE rename to licenses/lucide-react@1.14.0/LICENSE diff --git a/licenses/next-themes@0.4.6/license.md b/licenses/next-themes@0.4.6/license.md deleted file mode 100644 index 76228cc..0000000 --- a/licenses/next-themes@0.4.6/license.md +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2022 Paco Coursey - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/licenses/pngjs@5.0.0/LICENSE b/licenses/pngjs@5.0.0/LICENSE deleted file mode 100644 index 6942e25..0000000 --- a/licenses/pngjs@5.0.0/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -pngjs2 original work Copyright (c) 2015 Luke Page & Original Contributors -pngjs derived work Copyright (c) 2012 Kuba Niegowski - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/licenses/prettier@3.9.4/LICENSE b/licenses/prettier@3.8.3/LICENSE similarity index 100% rename from licenses/prettier@3.9.4/LICENSE rename to licenses/prettier@3.8.3/LICENSE diff --git a/licenses/react-day-picker@10.0.1/LICENSE b/licenses/react-day-picker@10.0.1/LICENSE deleted file mode 100644 index 07372a1..0000000 --- a/licenses/react-day-picker@10.0.1/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014-2026 Giampaolo Bellavite and contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/licenses/react-dom@19.2.7/LICENSE b/licenses/react-dom@19.2.5/LICENSE similarity index 100% rename from licenses/react-dom@19.2.7/LICENSE rename to licenses/react-dom@19.2.5/LICENSE diff --git a/licenses/react-redux@9.3.0/LICENSE.md b/licenses/react-redux@9.3.0/LICENSE.md deleted file mode 100644 index 55bc8df..0000000 --- a/licenses/react-redux@9.3.0/LICENSE.md +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2015-present Dan Abramov - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/licenses/react-remove-scroll@2.7.2/LICENSE b/licenses/react-remove-scroll@2.7.2/LICENSE deleted file mode 100644 index a194c88..0000000 --- a/licenses/react-remove-scroll@2.7.2/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2017 Anton Korzunov - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/licenses/react-style-singleton@2.2.3/LICENSE b/licenses/react-style-singleton@2.2.3/LICENSE deleted file mode 100644 index a194c88..0000000 --- a/licenses/react-style-singleton@2.2.3/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2017 Anton Korzunov - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/licenses/react-is@19.2.7/LICENSE b/licenses/react@19.2.5/LICENSE similarity index 100% rename from licenses/react-is@19.2.7/LICENSE rename to licenses/react@19.2.5/LICENSE diff --git a/licenses/react@19.2.7/LICENSE b/licenses/react@19.2.7/LICENSE deleted file mode 100644 index b93be90..0000000 --- a/licenses/react@19.2.7/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) Meta Platforms, Inc. and affiliates. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/licenses/redux-thunk@3.1.0/LICENSE.md b/licenses/redux-thunk@3.1.0/LICENSE.md deleted file mode 100644 index c108bf3..0000000 --- a/licenses/redux-thunk@3.1.0/LICENSE.md +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2015-present Dan Abramov - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/licenses/redux@5.0.1/LICENSE.md b/licenses/redux@5.0.1/LICENSE.md deleted file mode 100644 index 55bc8df..0000000 --- a/licenses/redux@5.0.1/LICENSE.md +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2015-present Dan Abramov - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/licenses/reselect@5.1.1/LICENSE b/licenses/reselect@5.1.1/LICENSE deleted file mode 100644 index 2a957b4..0000000 --- a/licenses/reselect@5.1.1/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2015-2018 Reselect Contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/licenses/sbom.cyclonedx.json b/licenses/sbom.cyclonedx.json index e5f7673..4d1284c 100644 --- a/licenses/sbom.cyclonedx.json +++ b/licenses/sbom.cyclonedx.json @@ -3,11 +3,11 @@ "specVersion": "1.5", "version": 1, "metadata": { - "timestamp": "2026-07-03T19:50:00.640Z", + "timestamp": "2026-05-21T10:15:15.541Z", "tools": [ { "vendor": "OpenAI", - "name": "custom pnpm license generator" + "name": "custom bun license generator" } ], "component": { @@ -18,111 +18,10 @@ "components": [ { "type": "library", - "bomRef": "pkg:npm/%40babel/runtime@7.29.7", - "name": "@babel/runtime", - "version": "7.29.7", - "purl": "pkg:npm/%40babel/runtime@7.29.7", - "description": "babel's modular runtime helpers", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://babel.dev/docs/en/next/babel-runtime" - }, - { - "type": "vcs", - "url": "https://github.com/babel/babel.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/@babel_runtime@7.29.7" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/@babel/runtime" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/%40base-ui/react@1.6.0", - "name": "@base-ui/react", - "version": "1.6.0", - "purl": "pkg:npm/%40base-ui/react@1.6.0", - "description": "Base UI is a library of headless ('unstyled') React components and low-level hooks. You gain complete control over your app's CSS and accessibility features.", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://base-ui.com" - }, - { - "type": "vcs", - "url": "git+https://github.com/mui/base-ui.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/@base-ui_react@1.6.0" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/@base-ui/react" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/%40base-ui/utils@0.3.1", - "name": "@base-ui/utils", - "version": "0.3.1", - "purl": "pkg:npm/%40base-ui/utils@0.3.1", - "description": "A collection of React utility functions for Base UI.", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "vcs", - "url": "git+https://github.com/mui/base-ui.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/@base-ui_utils@0.3.1" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/@base-ui/utils" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/%40codemirror/commands@6.10.4", + "bomRef": "pkg:npm/%40codemirror/commands@6.10.3", "name": "@codemirror/commands", - "version": "6.10.4", - "purl": "pkg:npm/%40codemirror/commands@6.10.4", + "version": "6.10.3", + "purl": "pkg:npm/%40codemirror/commands@6.10.3", "description": "Collection of editing commands for the CodeMirror code editor", "licenses": [ { @@ -134,13 +33,13 @@ "externalReferences": [ { "type": "vcs", - "url": "git+https://code.haverbeke.berlin/codemirror/commands.git" + "url": "git+https://github.com/codemirror/commands.git" } ], "properties": [ { "name": "local:licenseFolder", - "value": "licenses/@codemirror_commands@6.10.4" + "value": "licenses/@codemirror_commands@6.10.3" }, { "name": "local:sourcePackageDir", @@ -181,10 +80,10 @@ }, { "type": "library", - "bomRef": "pkg:npm/%40codemirror/state@6.7.0", + "bomRef": "pkg:npm/%40codemirror/state@6.6.0", "name": "@codemirror/state", - "version": "6.7.0", - "purl": "pkg:npm/%40codemirror/state@6.7.0", + "version": "6.6.0", + "purl": "pkg:npm/%40codemirror/state@6.6.0", "description": "Editor state data structures for the CodeMirror code editor", "licenses": [ { @@ -196,13 +95,13 @@ "externalReferences": [ { "type": "vcs", - "url": "git+https://code.haverbeke.berlin/codemirror/state.git" + "url": "git+https://github.com/codemirror/state.git" } ], "properties": [ { "name": "local:licenseFolder", - "value": "licenses/@codemirror_state@6.7.0" + "value": "licenses/@codemirror_state@6.6.0" }, { "name": "local:sourcePackageDir", @@ -212,10 +111,10 @@ }, { "type": "library", - "bomRef": "pkg:npm/%40codemirror/view@6.43.4", + "bomRef": "pkg:npm/%40codemirror/view@6.41.1", "name": "@codemirror/view", - "version": "6.43.4", - "purl": "pkg:npm/%40codemirror/view@6.43.4", + "version": "6.41.1", + "purl": "pkg:npm/%40codemirror/view@6.41.1", "description": "DOM view component for the CodeMirror code editor", "licenses": [ { @@ -233,7 +132,7 @@ "properties": [ { "name": "local:licenseFolder", - "value": "licenses/@codemirror_view@6.43.4" + "value": "licenses/@codemirror_view@6.41.1" }, { "name": "local:sourcePackageDir", @@ -276,146 +175,6 @@ } ] }, - { - "type": "library", - "bomRef": "pkg:npm/%40floating-ui/core@1.7.5", - "name": "@floating-ui/core", - "version": "1.7.5", - "purl": "pkg:npm/%40floating-ui/core@1.7.5", - "description": "Positioning library for floating elements: tooltips, popovers, dropdowns, and more", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://floating-ui.com" - }, - { - "type": "vcs", - "url": "https://github.com/floating-ui/floating-ui.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/@floating-ui_core@1.7.5" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/@floating-ui/core" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/%40floating-ui/dom@1.7.6", - "name": "@floating-ui/dom", - "version": "1.7.6", - "purl": "pkg:npm/%40floating-ui/dom@1.7.6", - "description": "Floating UI for the web", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://floating-ui.com" - }, - { - "type": "vcs", - "url": "https://github.com/floating-ui/floating-ui.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/@floating-ui_dom@1.7.6" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/@floating-ui/dom" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/%40floating-ui/react-dom@2.1.8", - "name": "@floating-ui/react-dom", - "version": "2.1.8", - "purl": "pkg:npm/%40floating-ui/react-dom@2.1.8", - "description": "Floating UI for React DOM", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://floating-ui.com/docs/react-dom" - }, - { - "type": "vcs", - "url": "https://github.com/floating-ui/floating-ui.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/@floating-ui_react-dom@2.1.8" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/@floating-ui/react-dom" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/%40floating-ui/utils@0.2.11", - "name": "@floating-ui/utils", - "version": "0.2.11", - "purl": "pkg:npm/%40floating-ui/utils@0.2.11", - "description": "Utilities for Floating UI", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://floating-ui.com" - }, - { - "type": "vcs", - "url": "https://github.com/floating-ui/floating-ui.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/@floating-ui_utils@0.2.11" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/@floating-ui/utils" - } - ] - }, { "type": "library", "bomRef": "pkg:npm/%40fontsource-variable/inter@5.2.8", @@ -453,45 +212,10 @@ }, { "type": "library", - "bomRef": "pkg:npm/%40fontsource-variable/public-sans@5.2.7", - "name": "@fontsource-variable/public-sans", - "version": "5.2.7", - "purl": "pkg:npm/%40fontsource-variable/public-sans@5.2.7", - "description": "Self-host the Public Sans font in a neatly bundled NPM package.", - "licenses": [ - { - "license": { - "id": "OFL-1.1" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://fontsource.org/fonts/public-sans" - }, - { - "type": "vcs", - "url": "git+https://github.com/fontsource/font-files.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/@fontsource-variable_public-sans@5.2.7" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/@fontsource-variable/public-sans" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/%40livekit/components-react@2.9.21", + "bomRef": "pkg:npm/%40livekit/components-react@2.9.20", "name": "@livekit/components-react", - "version": "2.9.21", - "purl": "pkg:npm/%40livekit/components-react@2.9.21", + "version": "2.9.20", + "purl": "pkg:npm/%40livekit/components-react@2.9.20", "licenses": [ { "license": { @@ -508,7 +232,7 @@ "properties": [ { "name": "local:licenseFolder", - "value": "licenses/@livekit_components-react@2.9.21" + "value": "licenses/@livekit_components-react@2.9.20" }, { "name": "local:sourcePackageDir", @@ -547,630 +271,16 @@ }, { "name": "local:sourcePackageDir", - "value": "packages/crypto/node_modules/@noble/curves" + "value": "apps/web/node_modules/@noble/curves" } ] }, { "type": "library", - "bomRef": "pkg:npm/%40noble/hashes@2.2.0", - "name": "@noble/hashes", - "version": "2.2.0", - "purl": "pkg:npm/%40noble/hashes@2.2.0", - "description": "Audited & minimal 0-dependency JS implementation of SHA, RIPEMD, BLAKE, HMAC, HKDF, PBKDF & Scrypt", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://paulmillr.com/noble/" - }, - { - "type": "vcs", - "url": "git+https://github.com/paulmillr/noble-hashes.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/@noble_hashes@2.2.0" - }, - { - "name": "local:sourcePackageDir", - "value": "packages/crypto/node_modules/@noble/hashes" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/%40radix-ui/primitive@1.1.4", - "name": "@radix-ui/primitive", - "version": "1.1.4", - "purl": "pkg:npm/%40radix-ui/primitive@1.1.4", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://radix-ui.com/primitives" - }, - { - "type": "vcs", - "url": "git+https://github.com/radix-ui/primitives.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/@radix-ui_primitive@1.1.4" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/@radix-ui/primitive" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/%40radix-ui/react-compose-refs@1.1.3", - "name": "@radix-ui/react-compose-refs", - "version": "1.1.3", - "purl": "pkg:npm/%40radix-ui/react-compose-refs@1.1.3", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://radix-ui.com/primitives" - }, - { - "type": "vcs", - "url": "git+https://github.com/radix-ui/primitives.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/@radix-ui_react-compose-refs@1.1.3" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/@radix-ui/react-compose-refs" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/%40radix-ui/react-context@1.1.4", - "name": "@radix-ui/react-context", - "version": "1.1.4", - "purl": "pkg:npm/%40radix-ui/react-context@1.1.4", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://radix-ui.com/primitives" - }, - { - "type": "vcs", - "url": "git+https://github.com/radix-ui/primitives.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/@radix-ui_react-context@1.1.4" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/@radix-ui/react-context" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/%40radix-ui/react-dialog@1.1.18", - "name": "@radix-ui/react-dialog", - "version": "1.1.18", - "purl": "pkg:npm/%40radix-ui/react-dialog@1.1.18", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://radix-ui.com/primitives" - }, - { - "type": "vcs", - "url": "git+https://github.com/radix-ui/primitives.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/@radix-ui_react-dialog@1.1.18" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/@radix-ui/react-dialog" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/%40radix-ui/react-dismissable-layer@1.1.14", - "name": "@radix-ui/react-dismissable-layer", - "version": "1.1.14", - "purl": "pkg:npm/%40radix-ui/react-dismissable-layer@1.1.14", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://radix-ui.com/primitives" - }, - { - "type": "vcs", - "url": "git+https://github.com/radix-ui/primitives.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/@radix-ui_react-dismissable-layer@1.1.14" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/@radix-ui/react-dismissable-layer" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/%40radix-ui/react-focus-guards@1.1.4", - "name": "@radix-ui/react-focus-guards", - "version": "1.1.4", - "purl": "pkg:npm/%40radix-ui/react-focus-guards@1.1.4", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://radix-ui.com/primitives" - }, - { - "type": "vcs", - "url": "git+https://github.com/radix-ui/primitives.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/@radix-ui_react-focus-guards@1.1.4" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/@radix-ui/react-focus-guards" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/%40radix-ui/react-focus-scope@1.1.11", - "name": "@radix-ui/react-focus-scope", - "version": "1.1.11", - "purl": "pkg:npm/%40radix-ui/react-focus-scope@1.1.11", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://radix-ui.com/primitives" - }, - { - "type": "vcs", - "url": "git+https://github.com/radix-ui/primitives.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/@radix-ui_react-focus-scope@1.1.11" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/@radix-ui/react-focus-scope" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/%40radix-ui/react-id@1.1.2", - "name": "@radix-ui/react-id", - "version": "1.1.2", - "purl": "pkg:npm/%40radix-ui/react-id@1.1.2", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://radix-ui.com/primitives" - }, - { - "type": "vcs", - "url": "git+https://github.com/radix-ui/primitives.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/@radix-ui_react-id@1.1.2" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/@radix-ui/react-id" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/%40radix-ui/react-portal@1.1.13", - "name": "@radix-ui/react-portal", - "version": "1.1.13", - "purl": "pkg:npm/%40radix-ui/react-portal@1.1.13", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://radix-ui.com/primitives" - }, - { - "type": "vcs", - "url": "git+https://github.com/radix-ui/primitives.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/@radix-ui_react-portal@1.1.13" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/@radix-ui/react-portal" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/%40radix-ui/react-presence@1.1.6", - "name": "@radix-ui/react-presence", - "version": "1.1.6", - "purl": "pkg:npm/%40radix-ui/react-presence@1.1.6", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://radix-ui.com/primitives" - }, - { - "type": "vcs", - "url": "git+https://github.com/radix-ui/primitives.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/@radix-ui_react-presence@1.1.6" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/@radix-ui/react-presence" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/%40radix-ui/react-primitive@2.1.7", - "name": "@radix-ui/react-primitive", - "version": "2.1.7", - "purl": "pkg:npm/%40radix-ui/react-primitive@2.1.7", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://radix-ui.com/primitives" - }, - { - "type": "vcs", - "url": "git+https://github.com/radix-ui/primitives.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/@radix-ui_react-primitive@2.1.7" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/@radix-ui/react-primitive" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/%40radix-ui/react-slot@1.3.0", - "name": "@radix-ui/react-slot", - "version": "1.3.0", - "purl": "pkg:npm/%40radix-ui/react-slot@1.3.0", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://radix-ui.com/primitives" - }, - { - "type": "vcs", - "url": "git+https://github.com/radix-ui/primitives.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/@radix-ui_react-slot@1.3.0" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/@radix-ui/react-slot" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/%40radix-ui/react-use-callback-ref@1.1.2", - "name": "@radix-ui/react-use-callback-ref", - "version": "1.1.2", - "purl": "pkg:npm/%40radix-ui/react-use-callback-ref@1.1.2", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://radix-ui.com/primitives" - }, - { - "type": "vcs", - "url": "git+https://github.com/radix-ui/primitives.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/@radix-ui_react-use-callback-ref@1.1.2" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/@radix-ui/react-use-callback-ref" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/%40radix-ui/react-use-controllable-state@1.2.3", - "name": "@radix-ui/react-use-controllable-state", - "version": "1.2.3", - "purl": "pkg:npm/%40radix-ui/react-use-controllable-state@1.2.3", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://radix-ui.com/primitives" - }, - { - "type": "vcs", - "url": "git+https://github.com/radix-ui/primitives.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/@radix-ui_react-use-controllable-state@1.2.3" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/@radix-ui/react-use-controllable-state" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/%40radix-ui/react-use-effect-event@0.0.2", - "name": "@radix-ui/react-use-effect-event", - "version": "0.0.2", - "purl": "pkg:npm/%40radix-ui/react-use-effect-event@0.0.2", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://radix-ui.com/primitives" - }, - { - "type": "vcs", - "url": "git+https://github.com/radix-ui/primitives.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/@radix-ui_react-use-effect-event@0.0.2" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/@radix-ui/react-use-effect-event" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/%40radix-ui/react-use-layout-effect@1.1.2", - "name": "@radix-ui/react-use-layout-effect", - "version": "1.1.2", - "purl": "pkg:npm/%40radix-ui/react-use-layout-effect@1.1.2", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://radix-ui.com/primitives" - }, - { - "type": "vcs", - "url": "git+https://github.com/radix-ui/primitives.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/@radix-ui_react-use-layout-effect@1.1.2" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/@radix-ui/react-use-layout-effect" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/%40reduxjs/toolkit@2.12.0", - "name": "@reduxjs/toolkit", - "version": "2.12.0", - "purl": "pkg:npm/%40reduxjs/toolkit@2.12.0", - "description": "The official, opinionated, batteries-included toolset for efficient Redux development", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://redux-toolkit.js.org" - }, - { - "type": "vcs", - "url": "git+https://github.com/reduxjs/redux-toolkit.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/@reduxjs_toolkit@2.12.0" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/@reduxjs/toolkit" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/%40tailwindcss/vite@4.3.2", + "bomRef": "pkg:npm/%40tailwindcss/vite@4.2.4", "name": "@tailwindcss/vite", - "version": "4.3.2", - "purl": "pkg:npm/%40tailwindcss/vite@4.3.2", + "version": "4.2.4", + "purl": "pkg:npm/%40tailwindcss/vite@4.2.4", "description": "A utility-first CSS framework for rapidly building custom user interfaces.", "licenses": [ { @@ -1192,7 +302,7 @@ "properties": [ { "name": "local:licenseFolder", - "value": "licenses/@tailwindcss_vite@4.3.2" + "value": "licenses/@tailwindcss_vite@4.2.4" }, { "name": "local:sourcePackageDir", @@ -1202,150 +312,10 @@ }, { "type": "library", - "bomRef": "pkg:npm/%40tanstack/devtools-event-client@0.3.5", - "name": "@tanstack/devtools-event-client", - "version": "0.3.5", - "purl": "pkg:npm/%40tanstack/devtools-event-client@0.3.5", - "description": "TanStack Event Client is a lightweight event client for TanStack Devtools event bus.", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://tanstack.com/devtools" - }, - { - "type": "vcs", - "url": "https://github.com/TanStack/devtools.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/@tanstack_devtools-event-client@0.3.5" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/@tanstack/devtools-event-client" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/%40tanstack/history@1.162.0", - "name": "@tanstack/history", - "version": "1.162.0", - "purl": "pkg:npm/%40tanstack/history@1.162.0", - "description": "Modern and scalable routing for React applications", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://tanstack.com/router" - }, - { - "type": "vcs", - "url": "git+https://github.com/TanStack/router.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/@tanstack_history@1.162.0" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/@tanstack/history" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/%40tanstack/pacer@0.21.1", - "name": "@tanstack/pacer", - "version": "0.21.1", - "purl": "pkg:npm/%40tanstack/pacer@0.21.1", - "description": "Utilities for debouncing, throttling, rate-limiting, queuing, and more.", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://tanstack.com/pacer" - }, - { - "type": "vcs", - "url": "git+https://github.com/TanStack/pacer.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/@tanstack_pacer@0.21.1" - }, - { - "name": "local:sourcePackageDir", - "value": "packages/chat/node_modules/@tanstack/pacer" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/%40tanstack/query-core@5.101.2", - "name": "@tanstack/query-core", - "version": "5.101.2", - "purl": "pkg:npm/%40tanstack/query-core@5.101.2", - "description": "The framework agnostic core that powers TanStack Query", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://tanstack.com/query" - }, - { - "type": "vcs", - "url": "git+https://github.com/TanStack/query.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/@tanstack_query-core@5.101.2" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/@tanstack/query-core" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/%40tanstack/react-query@5.101.2", + "bomRef": "pkg:npm/%40tanstack/react-query@5.100.8", "name": "@tanstack/react-query", - "version": "5.101.2", - "purl": "pkg:npm/%40tanstack/react-query@5.101.2", + "version": "5.100.8", + "purl": "pkg:npm/%40tanstack/react-query@5.100.8", "description": "Hooks for managing, caching and syncing asynchronous and remote data in React", "licenses": [ { @@ -1367,20 +337,20 @@ "properties": [ { "name": "local:licenseFolder", - "value": "licenses/@tanstack_react-query@5.101.2" + "value": "licenses/@tanstack_react-query@5.100.8" }, { "name": "local:sourcePackageDir", - "value": "packages/chat/node_modules/@tanstack/react-query" + "value": "packages/call/node_modules/@tanstack/react-query" } ] }, { "type": "library", - "bomRef": "pkg:npm/%40tanstack/react-router@1.170.17", + "bomRef": "pkg:npm/%40tanstack/react-router@1.169.1", "name": "@tanstack/react-router", - "version": "1.170.17", - "purl": "pkg:npm/%40tanstack/react-router@1.170.17", + "version": "1.169.1", + "purl": "pkg:npm/%40tanstack/react-router@1.169.1", "description": "Modern and scalable routing for React applications", "licenses": [ { @@ -1402,7 +372,7 @@ "properties": [ { "name": "local:licenseFolder", - "value": "licenses/@tanstack_react-router@1.170.17" + "value": "licenses/@tanstack_react-router@1.169.1" }, { "name": "local:sourcePackageDir", @@ -1412,45 +382,10 @@ }, { "type": "library", - "bomRef": "pkg:npm/%40tanstack/react-store@0.9.3", - "name": "@tanstack/react-store", - "version": "0.9.3", - "purl": "pkg:npm/%40tanstack/react-store@0.9.3", - "description": "Framework agnostic type-safe store w/ reactive framework adapters", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://tanstack.com/store" - }, - { - "type": "vcs", - "url": "https://github.com/TanStack/store.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/@tanstack_react-store@0.9.3" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/@tanstack/react-store" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/%40tanstack/react-virtual@3.14.5", + "bomRef": "pkg:npm/%40tanstack/react-virtual@3.13.24", "name": "@tanstack/react-virtual", - "version": "3.14.5", - "purl": "pkg:npm/%40tanstack/react-virtual@3.14.5", + "version": "3.13.24", + "purl": "pkg:npm/%40tanstack/react-virtual@3.13.24", "description": "Headless UI for virtualizing scrollable elements in React", "licenses": [ { @@ -1472,7 +407,7 @@ "properties": [ { "name": "local:licenseFolder", - "value": "licenses/@tanstack_react-virtual@3.14.5" + "value": "licenses/@tanstack_react-virtual@3.13.24" }, { "name": "local:sourcePackageDir", @@ -1482,115 +417,10 @@ }, { "type": "library", - "bomRef": "pkg:npm/%40tanstack/router-core@1.171.14", - "name": "@tanstack/router-core", - "version": "1.171.14", - "purl": "pkg:npm/%40tanstack/router-core@1.171.14", - "description": "Modern and scalable routing for React applications", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://tanstack.com/router" - }, - { - "type": "vcs", - "url": "git+https://github.com/TanStack/router.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/@tanstack_router-core@1.171.14" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/@tanstack/router-core" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/%40tanstack/store@0.9.3", - "name": "@tanstack/store", - "version": "0.9.3", - "purl": "pkg:npm/%40tanstack/store@0.9.3", - "description": "Framework agnostic type-safe store w/ reactive framework adapters", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://tanstack.com/store" - }, - { - "type": "vcs", - "url": "git+https://github.com/TanStack/store.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/@tanstack_store@0.9.3" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/@tanstack/store" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/%40tanstack/virtual-core@3.17.3", - "name": "@tanstack/virtual-core", - "version": "3.17.3", - "purl": "pkg:npm/%40tanstack/virtual-core@3.17.3", - "description": "Headless UI for virtualizing scrollable elements in TS/JS + Frameworks", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://tanstack.com/virtual" - }, - { - "type": "vcs", - "url": "git+https://github.com/TanStack/virtual.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/@tanstack_virtual-core@3.17.3" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/@tanstack/virtual-core" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/%40tauri-apps/api@2.11.1", + "bomRef": "pkg:npm/%40tauri-apps/api@2.11.0", "name": "@tauri-apps/api", - "version": "2.11.1", - "purl": "pkg:npm/%40tauri-apps/api@2.11.1", + "version": "2.11.0", + "purl": "pkg:npm/%40tauri-apps/api@2.11.0", "description": "Tauri API definitions", "licenses": [ { @@ -1612,7 +442,7 @@ "properties": [ { "name": "local:licenseFolder", - "value": "licenses/@tauri-apps_api@2.11.1" + "value": "licenses/@tauri-apps_api@2.11.0" }, { "name": "local:sourcePackageDir", @@ -1622,10 +452,10 @@ }, { "type": "library", - "bomRef": "pkg:npm/%40tauri-apps/cli@2.11.4", + "bomRef": "pkg:npm/%40tauri-apps/cli@2.11.0", "name": "@tauri-apps/cli", - "version": "2.11.4", - "purl": "pkg:npm/%40tauri-apps/cli@2.11.4", + "version": "2.11.0", + "purl": "pkg:npm/%40tauri-apps/cli@2.11.0", "description": "Command line interface for building Tauri apps", "licenses": [ { @@ -1647,7 +477,7 @@ "properties": [ { "name": "local:licenseFolder", - "value": "licenses/@tauri-apps_cli@2.11.4" + "value": "licenses/@tauri-apps_cli@2.11.0" }, { "name": "local:sourcePackageDir", @@ -1657,10 +487,10 @@ }, { "type": "library", - "bomRef": "pkg:npm/%40tauri-apps/plugin-barcode-scanner@2.4.5", + "bomRef": "pkg:npm/%40tauri-apps/plugin-barcode-scanner@2.4.4", "name": "@tauri-apps/plugin-barcode-scanner", - "version": "2.4.5", - "purl": "pkg:npm/%40tauri-apps/plugin-barcode-scanner@2.4.5", + "version": "2.4.4", + "purl": "pkg:npm/%40tauri-apps/plugin-barcode-scanner@2.4.4", "description": "Scan QR codes, EAN-13 and other kinds of barcodes on Android and iOS", "licenses": [ { @@ -1678,7 +508,7 @@ "properties": [ { "name": "local:licenseFolder", - "value": "licenses/@tauri-apps_plugin-barcode-scanner@2.4.5" + "value": "licenses/@tauri-apps_plugin-barcode-scanner@2.4.4" }, { "name": "local:sourcePackageDir", @@ -1719,11 +549,11 @@ }, { "type": "library", - "bomRef": "pkg:npm/%40tauri-apps/plugin-log@2.8.0", - "name": "@tauri-apps/plugin-log", - "version": "2.8.0", - "purl": "pkg:npm/%40tauri-apps/plugin-log@2.8.0", - "description": "Configurable logging for your Tauri app.", + "bomRef": "pkg:npm/%40tauri-apps/plugin-opener@2.5.4", + "name": "@tauri-apps/plugin-opener", + "version": "2.5.4", + "purl": "pkg:npm/%40tauri-apps/plugin-opener@2.5.4", + "description": "Open files and URLs using their default application.", "licenses": [ { "license": { @@ -1740,55 +570,43 @@ "properties": [ { "name": "local:licenseFolder", - "value": "licenses/@tauri-apps_plugin-log@2.8.0" + "value": "licenses/@tauri-apps_plugin-opener@2.5.4" }, { "name": "local:sourcePackageDir", - "value": "apps/tauri/node_modules/@tauri-apps/plugin-log" + "value": "apps/tauri/node_modules/@tauri-apps/plugin-opener" } ] }, { "type": "library", - "bomRef": "pkg:npm/%40tauri-apps/plugin-notification@2.3.3", - "name": "@tauri-apps/plugin-notification", - "version": "2.3.3", - "purl": "pkg:npm/%40tauri-apps/plugin-notification@2.3.3", - "licenses": [ - { - "license": { - "name": "MIT OR Apache-2.0" - } - } - ], - "externalReferences": [ - { - "type": "vcs", - "url": "https://github.com/tauri-apps/plugins-workspace" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/@tauri-apps_plugin-notification@2.3.3" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/tauri/node_modules/@tauri-apps/plugin-notification" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/%40tensamin/ui@0.0.39", - "name": "@tensamin/ui", - "version": "0.0.39", - "purl": "pkg:npm/%40tensamin/ui@0.0.39", + "bomRef": "pkg:npm/%40tensamin/ttp-core@0.0.19", + "name": "@tensamin/ttp-core", + "version": "0.0.19", + "purl": "pkg:npm/%40tensamin/ttp-core@0.0.19", "externalReferences": [], "properties": [ { "name": "local:licenseFolder", - "value": "licenses/@tensamin_ui@0.0.39" + "value": "licenses/@tensamin_ttp-core@0.0.19" + }, + { + "name": "local:sourcePackageDir", + "value": "packages/ttp/node_modules/@tensamin/ttp-core" + } + ] + }, + { + "type": "library", + "bomRef": "pkg:npm/%40tensamin/ui@0.0.34", + "name": "@tensamin/ui", + "version": "0.0.34", + "purl": "pkg:npm/%40tensamin/ui@0.0.34", + "externalReferences": [], + "properties": [ + { + "name": "local:licenseFolder", + "value": "licenses/@tensamin_ui@0.0.34" }, { "name": "local:sourcePackageDir", @@ -1798,10 +616,10 @@ }, { "type": "library", - "bomRef": "pkg:npm/%40types/node@25.9.4", + "bomRef": "pkg:npm/%40types/node@25.6.0", "name": "@types/node", - "version": "25.9.4", - "purl": "pkg:npm/%40types/node@25.9.4", + "version": "25.6.0", + "purl": "pkg:npm/%40types/node@25.6.0", "description": "TypeScript definitions for node", "licenses": [ { @@ -1823,11 +641,11 @@ "properties": [ { "name": "local:licenseFolder", - "value": "licenses/@types_node@25.9.4" + "value": "licenses/@types_node@25.6.0" }, { "name": "local:sourcePackageDir", - "value": "apps/electron/node_modules/@types/node" + "value": "node_modules/@types/node" } ] }, @@ -1868,10 +686,10 @@ }, { "type": "library", - "bomRef": "pkg:npm/%40types/react@19.2.17", + "bomRef": "pkg:npm/%40types/react@19.2.14", "name": "@types/react", - "version": "19.2.17", - "purl": "pkg:npm/%40types/react@19.2.17", + "version": "19.2.14", + "purl": "pkg:npm/%40types/react@19.2.14", "description": "TypeScript definitions for react", "licenses": [ { @@ -1893,7 +711,7 @@ "properties": [ { "name": "local:licenseFolder", - "value": "licenses/@types_react@19.2.17" + "value": "licenses/@types_react@19.2.14" }, { "name": "local:sourcePackageDir", @@ -1938,10 +756,10 @@ }, { "type": "library", - "bomRef": "pkg:npm/%40typescript-eslint/parser@8.62.1", + "bomRef": "pkg:npm/%40typescript-eslint/parser@8.59.1", "name": "@typescript-eslint/parser", - "version": "8.62.1", - "purl": "pkg:npm/%40typescript-eslint/parser@8.62.1", + "version": "8.59.1", + "purl": "pkg:npm/%40typescript-eslint/parser@8.59.1", "description": "An ESLint custom parser which leverages TypeScript ESTree", "licenses": [ { @@ -1963,7 +781,7 @@ "properties": [ { "name": "local:licenseFolder", - "value": "licenses/@typescript-eslint_parser@8.62.1" + "value": "licenses/@typescript-eslint_parser@8.59.1" }, { "name": "local:sourcePackageDir", @@ -1973,10 +791,10 @@ }, { "type": "library", - "bomRef": "pkg:npm/%40vitejs/plugin-react@6.0.3", + "bomRef": "pkg:npm/%40vitejs/plugin-react@6.0.1", "name": "@vitejs/plugin-react", - "version": "6.0.3", - "purl": "pkg:npm/%40vitejs/plugin-react@6.0.3", + "version": "6.0.1", + "purl": "pkg:npm/%40vitejs/plugin-react@6.0.1", "description": "The default Vite plugin for React projects", "licenses": [ { @@ -1998,7 +816,7 @@ "properties": [ { "name": "local:licenseFolder", - "value": "licenses/@vitejs_plugin-react@6.0.3" + "value": "licenses/@vitejs_plugin-react@6.0.1" }, { "name": "local:sourcePackageDir", @@ -2006,41 +824,6 @@ } ] }, - { - "type": "library", - "bomRef": "pkg:npm/aria-hidden@1.2.6", - "name": "aria-hidden", - "version": "1.2.6", - "purl": "pkg:npm/aria-hidden@1.2.6", - "description": "Cast aria-hidden to everything, except...", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://github.com/theKashey/aria-hidden#readme" - }, - { - "type": "vcs", - "url": "git+https://github.com/theKashey/aria-hidden.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/aria-hidden@1.2.6" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/aria-hidden" - } - ] - }, { "type": "library", "bomRef": "pkg:npm/class-variance-authority@0.7.1", @@ -2107,40 +890,6 @@ } ] }, - { - "type": "library", - "bomRef": "pkg:npm/cmdk@1.1.1", - "name": "cmdk", - "version": "1.1.1", - "purl": "pkg:npm/cmdk@1.1.1", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://github.com/pacocoursey/cmdk#readme" - }, - { - "type": "vcs", - "url": "git+https://github.com/pacocoursey/cmdk.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/cmdk@1.1.1" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/cmdk" - } - ] - }, { "type": "library", "bomRef": "pkg:npm/comlink@4.4.2", @@ -2168,484 +917,7 @@ }, { "name": "local:sourcePackageDir", - "value": "packages/crypto/node_modules/comlink" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/cookie-es@3.1.1", - "name": "cookie-es", - "version": "3.1.1", - "purl": "pkg:npm/cookie-es@3.1.1", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "vcs", - "url": "unjs/cookie-es" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/cookie-es@3.1.1" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/cookie-es" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/d3-array@3.2.4", - "name": "d3-array", - "version": "3.2.4", - "purl": "pkg:npm/d3-array@3.2.4", - "description": "Array manipulation, ordering, searching, summarizing, etc.", - "licenses": [ - { - "license": { - "id": "ISC" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://d3js.org/d3-array/" - }, - { - "type": "vcs", - "url": "https://github.com/d3/d3-array.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/d3-array@3.2.4" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/d3-array" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/d3-color@3.1.0", - "name": "d3-color", - "version": "3.1.0", - "purl": "pkg:npm/d3-color@3.1.0", - "description": "Color spaces! RGB, HSL, Cubehelix, Lab and HCL (Lch).", - "licenses": [ - { - "license": { - "id": "ISC" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://d3js.org/d3-color/" - }, - { - "type": "vcs", - "url": "https://github.com/d3/d3-color.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/d3-color@3.1.0" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/d3-color" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/d3-ease@3.0.1", - "name": "d3-ease", - "version": "3.0.1", - "purl": "pkg:npm/d3-ease@3.0.1", - "description": "Easing functions for smooth animation.", - "licenses": [ - { - "license": { - "id": "BSD-3-Clause" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://d3js.org/d3-ease/" - }, - { - "type": "vcs", - "url": "https://github.com/d3/d3-ease.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/d3-ease@3.0.1" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/d3-ease" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/d3-format@3.1.2", - "name": "d3-format", - "version": "3.1.2", - "purl": "pkg:npm/d3-format@3.1.2", - "description": "Format numbers for human consumption.", - "licenses": [ - { - "license": { - "id": "ISC" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://d3js.org/d3-format/" - }, - { - "type": "vcs", - "url": "https://github.com/d3/d3-format.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/d3-format@3.1.2" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/d3-format" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/d3-interpolate@3.0.1", - "name": "d3-interpolate", - "version": "3.0.1", - "purl": "pkg:npm/d3-interpolate@3.0.1", - "description": "Interpolate numbers, colors, strings, arrays, objects, whatever!", - "licenses": [ - { - "license": { - "id": "ISC" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://d3js.org/d3-interpolate/" - }, - { - "type": "vcs", - "url": "https://github.com/d3/d3-interpolate.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/d3-interpolate@3.0.1" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/d3-interpolate" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/d3-path@3.1.0", - "name": "d3-path", - "version": "3.1.0", - "purl": "pkg:npm/d3-path@3.1.0", - "description": "Serialize Canvas path commands to SVG.", - "licenses": [ - { - "license": { - "id": "ISC" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://d3js.org/d3-path/" - }, - { - "type": "vcs", - "url": "https://github.com/d3/d3-path.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/d3-path@3.1.0" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/d3-path" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/d3-scale@4.0.2", - "name": "d3-scale", - "version": "4.0.2", - "purl": "pkg:npm/d3-scale@4.0.2", - "description": "Encodings that map abstract data to visual representation.", - "licenses": [ - { - "license": { - "id": "ISC" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://d3js.org/d3-scale/" - }, - { - "type": "vcs", - "url": "https://github.com/d3/d3-scale.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/d3-scale@4.0.2" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/d3-scale" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/d3-shape@3.2.0", - "name": "d3-shape", - "version": "3.2.0", - "purl": "pkg:npm/d3-shape@3.2.0", - "description": "Graphical primitives for visualization, such as lines and areas.", - "licenses": [ - { - "license": { - "id": "ISC" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://d3js.org/d3-shape/" - }, - { - "type": "vcs", - "url": "https://github.com/d3/d3-shape.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/d3-shape@3.2.0" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/d3-shape" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/d3-time@3.1.0", - "name": "d3-time", - "version": "3.1.0", - "purl": "pkg:npm/d3-time@3.1.0", - "description": "A calculator for humanity’s peculiar conventions of time.", - "licenses": [ - { - "license": { - "id": "ISC" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://d3js.org/d3-time/" - }, - { - "type": "vcs", - "url": "https://github.com/d3/d3-time.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/d3-time@3.1.0" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/d3-time" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/d3-time-format@4.1.0", - "name": "d3-time-format", - "version": "4.1.0", - "purl": "pkg:npm/d3-time-format@4.1.0", - "description": "A JavaScript time formatter and parser inspired by strftime and strptime.", - "licenses": [ - { - "license": { - "id": "ISC" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://d3js.org/d3-time-format/" - }, - { - "type": "vcs", - "url": "https://github.com/d3/d3-time-format.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/d3-time-format@4.1.0" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/d3-time-format" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/d3-timer@3.0.1", - "name": "d3-timer", - "version": "3.0.1", - "purl": "pkg:npm/d3-timer@3.0.1", - "description": "An efficient queue capable of managing thousands of concurrent animations.", - "licenses": [ - { - "license": { - "id": "ISC" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://d3js.org/d3-timer/" - }, - { - "type": "vcs", - "url": "https://github.com/d3/d3-timer.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/d3-timer@3.0.1" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/d3-timer" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/date-fns@4.4.0", - "name": "date-fns", - "version": "4.4.0", - "purl": "pkg:npm/date-fns@4.4.0", - "description": "Modern JavaScript date utility library", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "vcs", - "url": "https://github.com/date-fns/date-fns" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/date-fns@4.4.0" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/date-fns" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/decimal.js-light@2.5.1", - "name": "decimal.js-light", - "version": "2.5.1", - "purl": "pkg:npm/decimal.js-light@2.5.1", - "description": "An arbitrary-precision Decimal type for JavaScript.", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "vcs", - "url": "https://github.com/MikeMcl/decimal.js-light.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/decimal.js-light@2.5.1" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/decimal.js-light" + "value": "apps/web/node_modules/comlink" } ] }, @@ -2684,282 +956,6 @@ } ] }, - { - "type": "library", - "bomRef": "pkg:npm/detect-node-es@1.1.0", - "name": "detect-node-es", - "version": "1.1.0", - "purl": "pkg:npm/detect-node-es@1.1.0", - "description": "Detect Node.JS (as opposite to browser environment). ESM modification", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://github.com/thekashey/detect-node" - }, - { - "type": "vcs", - "url": "https://github.com/thekashey/detect-node" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/detect-node-es@1.1.0" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/detect-node-es" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/dijkstrajs@1.0.3", - "name": "dijkstrajs", - "version": "1.0.3", - "purl": "pkg:npm/dijkstrajs@1.0.3", - "description": "A simple JavaScript implementation of Dijkstra's single-source shortest-paths algorithm.", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://github.com/tcort/dijkstrajs" - }, - { - "type": "vcs", - "url": "git://github.com/tcort/dijkstrajs" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/dijkstrajs@1.0.3" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/dijkstrajs" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/electron@39.8.10", - "name": "electron", - "version": "39.8.10", - "purl": "pkg:npm/electron@39.8.10", - "description": "Build cross platform desktop apps with JavaScript, HTML, and CSS", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "vcs", - "url": "https://github.com/electron/electron" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/electron@39.8.10" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/electron/node_modules/electron" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/electron-builder@26.15.3", - "name": "electron-builder", - "version": "26.15.3", - "purl": "pkg:npm/electron-builder@26.15.3", - "description": "A complete solution to package and build a ready for distribution Electron app for MacOS, Windows and Linux with “auto update” support out of the box", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://github.com/electron-userland/electron-builder" - }, - { - "type": "vcs", - "url": "git+https://github.com/electron-userland/electron-builder.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/electron-builder@26.15.3" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/electron/node_modules/electron-builder" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/embla-carousel@8.6.0", - "name": "embla-carousel", - "version": "8.6.0", - "purl": "pkg:npm/embla-carousel@8.6.0", - "description": "A lightweight carousel library with fluid motion and great swipe precision", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://www.embla-carousel.com" - }, - { - "type": "vcs", - "url": "git+https://github.com/davidjerleke/embla-carousel" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/embla-carousel@8.6.0" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/embla-carousel" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/embla-carousel-react@8.6.0", - "name": "embla-carousel-react", - "version": "8.6.0", - "purl": "pkg:npm/embla-carousel-react@8.6.0", - "description": "A lightweight carousel library with fluid motion and great swipe precision", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://www.embla-carousel.com" - }, - { - "type": "vcs", - "url": "git+https://github.com/davidjerleke/embla-carousel" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/embla-carousel-react@8.6.0" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/embla-carousel-react" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/embla-carousel-reactive-utils@8.6.0", - "name": "embla-carousel-reactive-utils", - "version": "8.6.0", - "purl": "pkg:npm/embla-carousel-reactive-utils@8.6.0", - "description": "Reactive utilities for Embla Carousel", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://www.embla-carousel.com" - }, - { - "type": "vcs", - "url": "git+https://github.com/davidjerleke/embla-carousel" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/embla-carousel-reactive-utils@8.6.0" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/embla-carousel-reactive-utils" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/es-toolkit@1.49.0", - "name": "es-toolkit", - "version": "1.49.0", - "purl": "pkg:npm/es-toolkit@1.49.0", - "description": "A state-of-the-art, high-performance JavaScript utility library with a small bundle size and strong type annotations.", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://es-toolkit.dev" - }, - { - "type": "vcs", - "url": "https://github.com/toss/es-toolkit.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/es-toolkit@1.49.0" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/es-toolkit" - } - ] - }, { "type": "library", "bomRef": "pkg:npm/esbuild@0.25.12", @@ -2987,16 +983,16 @@ }, { "name": "local:sourcePackageDir", - "value": "apps/electron/node_modules/esbuild" + "value": "apps/web/node_modules/esbuild" } ] }, { "type": "library", - "bomRef": "pkg:npm/eslint@10.6.0", + "bomRef": "pkg:npm/eslint@10.3.0", "name": "eslint", - "version": "10.6.0", - "purl": "pkg:npm/eslint@10.6.0", + "version": "10.3.0", + "purl": "pkg:npm/eslint@10.3.0", "description": "An AST-based pattern checker for JavaScript.", "licenses": [ { @@ -3018,7 +1014,7 @@ "properties": [ { "name": "local:licenseFolder", - "value": "licenses/eslint@10.6.0" + "value": "licenses/eslint@10.3.0" }, { "name": "local:sourcePackageDir", @@ -3063,11 +1059,11 @@ }, { "type": "library", - "bomRef": "pkg:npm/eventemitter3@5.0.4", - "name": "eventemitter3", - "version": "5.0.4", - "purl": "pkg:npm/eventemitter3@5.0.4", - "description": "EventEmitter3 focuses on performance while maintaining a Node.js AND browser compatible interface.", + "bomRef": "pkg:npm/framer-motion@12.38.0", + "name": "framer-motion", + "version": "12.38.0", + "purl": "pkg:npm/framer-motion@12.38.0", + "description": "A simple and powerful JavaScript animation library", "licenses": [ { "license": { @@ -3078,96 +1074,26 @@ "externalReferences": [ { "type": "vcs", - "url": "git://github.com/primus/eventemitter3.git" + "url": "https://github.com/motiondivision/motion/" } ], "properties": [ { "name": "local:licenseFolder", - "value": "licenses/eventemitter3@5.0.4" + "value": "licenses/framer-motion@12.38.0" }, { "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/eventemitter3" + "value": "apps/web/node_modules/framer-motion" } ] }, { "type": "library", - "bomRef": "pkg:npm/fallow@2.104.0", - "name": "fallow", - "version": "2.104.0", - "purl": "pkg:npm/fallow@2.104.0", - "description": "Deterministic codebase intelligence for TypeScript and JavaScript. Quality, risk, architecture, dependencies, duplication, and safe cleanup evidence for humans, CI, and agents. Optional runtime intelligence layer (Fallow Runtime) adds production execution evidence. Rust-native, sub-second, zero-config framework support.", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://docs.fallow.tools" - }, - { - "type": "vcs", - "url": "git+https://github.com/fallow-rs/fallow.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/fallow@2.104.0" - }, - { - "name": "local:sourcePackageDir", - "value": "node_modules/fallow" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/get-nonce@1.0.1", - "name": "get-nonce", - "version": "1.0.1", - "purl": "pkg:npm/get-nonce@1.0.1", - "description": "returns nonce", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://github.com/theKashey/get-nonce" - }, - { - "type": "vcs", - "url": "git@github.com:theKashey/get-nonce.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/get-nonce@1.0.1" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/get-nonce" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/globals@17.7.0", + "bomRef": "pkg:npm/globals@17.6.0", "name": "globals", - "version": "17.7.0", - "purl": "pkg:npm/globals@17.7.0", + "version": "17.6.0", + "purl": "pkg:npm/globals@17.6.0", "description": "Global identifiers from different JavaScript environments", "licenses": [ { @@ -3185,7 +1111,7 @@ "properties": [ { "name": "local:licenseFolder", - "value": "licenses/globals@17.7.0" + "value": "licenses/globals@17.6.0" }, { "name": "local:sourcePackageDir", @@ -3193,111 +1119,6 @@ } ] }, - { - "type": "library", - "bomRef": "pkg:npm/immer@10.2.0", - "name": "immer", - "version": "10.2.0", - "purl": "pkg:npm/immer@10.2.0", - "description": "Create your next immutable state by mutating the current one", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://github.com/immerjs/immer#readme" - }, - { - "type": "vcs", - "url": "https://github.com/immerjs/immer.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/immer@10.2.0" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/immer" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/input-otp@1.4.2", - "name": "input-otp", - "version": "1.4.2", - "purl": "pkg:npm/input-otp@1.4.2", - "description": "One-time password input component for React.", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://input-otp.rodz.dev/" - }, - { - "type": "vcs", - "url": "git+https://github.com/guilhermerodz/input-otp.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/input-otp@1.4.2" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/input-otp" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/internmap@2.0.3", - "name": "internmap", - "version": "2.0.3", - "purl": "pkg:npm/internmap@2.0.3", - "description": "Map and Set with automatic key interning", - "licenses": [ - { - "license": { - "id": "ISC" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://github.com/mbostock/internmap/" - }, - { - "type": "vcs", - "url": "https://github.com/mbostock/internmap.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/internmap@2.0.3" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/internmap" - } - ] - }, { "type": "library", "bomRef": "pkg:npm/jsonc-parser@3.3.1", @@ -3331,10 +1152,10 @@ }, { "type": "library", - "bomRef": "pkg:npm/livekit-client@2.20.0", + "bomRef": "pkg:npm/livekit-client@2.18.8", "name": "livekit-client", - "version": "2.20.0", - "purl": "pkg:npm/livekit-client@2.20.0", + "version": "2.18.8", + "purl": "pkg:npm/livekit-client@2.18.8", "description": "JavaScript/TypeScript client SDK for LiveKit", "licenses": [ { @@ -3352,7 +1173,7 @@ "properties": [ { "name": "local:licenseFolder", - "value": "licenses/livekit-client@2.20.0" + "value": "licenses/livekit-client@2.18.8" }, { "name": "local:sourcePackageDir", @@ -3362,10 +1183,10 @@ }, { "type": "library", - "bomRef": "pkg:npm/lucide-react@1.23.0", + "bomRef": "pkg:npm/lucide-react@1.14.0", "name": "lucide-react", - "version": "1.23.0", - "purl": "pkg:npm/lucide-react@1.23.0", + "version": "1.14.0", + "purl": "pkg:npm/lucide-react@1.14.0", "description": "A Lucide icon library package for React applications.", "licenses": [ { @@ -3387,104 +1208,20 @@ "properties": [ { "name": "local:licenseFolder", - "value": "licenses/lucide-react@1.23.0" + "value": "licenses/lucide-react@1.14.0" }, { "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/lucide-react" + "value": "apps/tauri/node_modules/lucide-react" } ] }, { "type": "library", - "bomRef": "pkg:npm/mtp@0.1.0", - "name": "mtp", - "version": "0.1.0", - "purl": "pkg:npm/mtp@0.1.0", - "description": "MTP TypeScript SDK", - "externalReferences": [], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/mtp@0.1.0" - }, - { - "name": "local:sourcePackageDir", - "value": "packages/mtp/node_modules/mtp" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/next-themes@0.4.6", - "name": "next-themes", - "version": "0.4.6", - "purl": "pkg:npm/next-themes@0.4.6", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "vcs", - "url": "https://github.com/pacocoursey/next-themes.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/next-themes@0.4.6" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/next-themes" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/pngjs@5.0.0", - "name": "pngjs", - "version": "5.0.0", - "purl": "pkg:npm/pngjs@5.0.0", - "description": "PNG encoder/decoder in pure JS, supporting any bit size & interlace, async & sync with full test suite.", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://github.com/lukeapage/pngjs" - }, - { - "type": "vcs", - "url": "git://github.com/lukeapage/pngjs.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/pngjs@5.0.0" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/pngjs" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/prettier@3.9.4", + "bomRef": "pkg:npm/prettier@3.8.3", "name": "prettier", - "version": "3.9.4", - "purl": "pkg:npm/prettier@3.9.4", + "version": "3.8.3", + "purl": "pkg:npm/prettier@3.8.3", "description": "Prettier is an opinionated code formatter", "licenses": [ { @@ -3506,7 +1243,7 @@ "properties": [ { "name": "local:licenseFolder", - "value": "licenses/prettier@3.9.4" + "value": "licenses/prettier@3.8.3" }, { "name": "local:sourcePackageDir", @@ -3551,10 +1288,10 @@ }, { "type": "library", - "bomRef": "pkg:npm/react@19.2.7", + "bomRef": "pkg:npm/react@19.2.5", "name": "react", - "version": "19.2.7", - "purl": "pkg:npm/react@19.2.7", + "version": "19.2.5", + "purl": "pkg:npm/react@19.2.5", "description": "React is a JavaScript library for building user interfaces.", "licenses": [ { @@ -3576,7 +1313,7 @@ "properties": [ { "name": "local:licenseFolder", - "value": "licenses/react@19.2.7" + "value": "licenses/react@19.2.5" }, { "name": "local:sourcePackageDir", @@ -3586,45 +1323,10 @@ }, { "type": "library", - "bomRef": "pkg:npm/react-day-picker@10.0.1", - "name": "react-day-picker", - "version": "10.0.1", - "purl": "pkg:npm/react-day-picker@10.0.1", - "description": "Customizable Date Picker for React", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://daypicker.dev" - }, - { - "type": "vcs", - "url": "git+https://github.com/gpbl/react-day-picker.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/react-day-picker@10.0.1" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/react-day-picker" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/react-dom@19.2.7", + "bomRef": "pkg:npm/react-dom@19.2.5", "name": "react-dom", - "version": "19.2.7", - "purl": "pkg:npm/react-dom@19.2.7", + "version": "19.2.5", + "purl": "pkg:npm/react-dom@19.2.5", "description": "React package for working with the DOM.", "licenses": [ { @@ -3646,7 +1348,7 @@ "properties": [ { "name": "local:licenseFolder", - "value": "licenses/react-dom@19.2.7" + "value": "licenses/react-dom@19.2.5" }, { "name": "local:sourcePackageDir", @@ -3654,207 +1356,6 @@ } ] }, - { - "type": "library", - "bomRef": "pkg:npm/react-is@19.2.7", - "name": "react-is", - "version": "19.2.7", - "purl": "pkg:npm/react-is@19.2.7", - "description": "Brand checking of React Elements.", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://react.dev/" - }, - { - "type": "vcs", - "url": "https://github.com/facebook/react.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/react-is@19.2.7" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/react-is" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/react-redux@9.3.0", - "name": "react-redux", - "version": "9.3.0", - "purl": "pkg:npm/react-redux@9.3.0", - "description": "Official React bindings for Redux", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://github.com/reduxjs/react-redux" - }, - { - "type": "vcs", - "url": "github:reduxjs/react-redux" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/react-redux@9.3.0" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/react-redux" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/react-remove-scroll@2.7.2", - "name": "react-remove-scroll", - "version": "2.7.2", - "purl": "pkg:npm/react-remove-scroll@2.7.2", - "description": "Disables scroll outside of `children` node.", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "vcs", - "url": "https://github.com/theKashey/react-remove-scroll" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/react-remove-scroll@2.7.2" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/react-remove-scroll" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/react-remove-scroll-bar@2.3.8", - "name": "react-remove-scroll-bar", - "version": "2.3.8", - "purl": "pkg:npm/react-remove-scroll-bar@2.3.8", - "description": "Removes body scroll without content _shake_", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "vcs", - "url": "https://github.com/theKashey/react-remove-scroll-bar" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/react-remove-scroll-bar@2.3.8" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/react-remove-scroll-bar" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/react-resizable-panels@4.12.0", - "name": "react-resizable-panels", - "version": "4.12.0", - "purl": "pkg:npm/react-resizable-panels@4.12.0", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://react-resizable-panels.vercel.app/" - }, - { - "type": "vcs", - "url": "https://github.com/bvaughn/react-resizable-panels.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/react-resizable-panels@4.12.0" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/react-resizable-panels" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/react-style-singleton@2.2.3", - "name": "react-style-singleton", - "version": "2.2.3", - "purl": "pkg:npm/react-style-singleton@2.2.3", - "description": "Just create a single stylesheet...", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://github.com/theKashey/react-style-singleton#readme" - }, - { - "type": "vcs", - "url": "https://github.com/theKashey/react-style-singleton" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/react-style-singleton@2.2.3" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/react-style-singleton" - } - ] - }, { "type": "library", "bomRef": "pkg:npm/recharts@3.8.1", @@ -3886,222 +1387,16 @@ }, { "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/recharts" + "value": "packages/call/node_modules/recharts" } ] }, { "type": "library", - "bomRef": "pkg:npm/redux@5.0.1", - "name": "redux", - "version": "5.0.1", - "purl": "pkg:npm/redux@5.0.1", - "description": "Predictable state container for JavaScript apps", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "http://redux.js.org" - }, - { - "type": "vcs", - "url": "github:reduxjs/redux" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/redux@5.0.1" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/redux" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/redux-thunk@3.1.0", - "name": "redux-thunk", - "version": "3.1.0", - "purl": "pkg:npm/redux-thunk@3.1.0", - "description": "Thunk middleware for Redux.", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://github.com/reduxjs/redux-thunk" - }, - { - "type": "vcs", - "url": "github:reduxjs/redux-thunk" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/redux-thunk@3.1.0" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/redux-thunk" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/reselect@5.1.1", - "name": "reselect", - "version": "5.1.1", - "purl": "pkg:npm/reselect@5.1.1", - "description": "Selectors for Redux.", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "vcs", - "url": "https://github.com/reduxjs/reselect.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/reselect@5.1.1" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/reselect" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/scheduler@0.27.0", - "name": "scheduler", - "version": "0.27.0", - "purl": "pkg:npm/scheduler@0.27.0", - "description": "Cooperative scheduler for the browser environment.", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://react.dev/" - }, - { - "type": "vcs", - "url": "https://github.com/facebook/react.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/scheduler@0.27.0" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/scheduler" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/seroval@1.5.4", - "name": "seroval", - "version": "1.5.4", - "purl": "pkg:npm/seroval@1.5.4", - "description": "Stringify JS values", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://github.com/lxsmnsyc/seroval/tree/main/packages/seroval" - }, - { - "type": "vcs", - "url": "https://github.com/lxsmnsyc/seroval.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/seroval@1.5.4" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/seroval" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/seroval-plugins@1.5.4", - "name": "seroval-plugins", - "version": "1.5.4", - "purl": "pkg:npm/seroval-plugins@1.5.4", - "description": "Stringify JS values", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://github.com/lxsmnsyc/seroval/tree/main/packages/plugins" - }, - { - "type": "vcs", - "url": "https://github.com/lxsmnsyc/seroval.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/seroval-plugins@1.5.4" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/seroval-plugins" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/shadcn@4.12.0", + "bomRef": "pkg:npm/shadcn@4.6.0", "name": "shadcn", - "version": "4.12.0", - "purl": "pkg:npm/shadcn@4.12.0", + "version": "4.6.0", + "purl": "pkg:npm/shadcn@4.6.0", "description": "Add components to your apps.", "licenses": [ { @@ -4119,7 +1414,7 @@ "properties": [ { "name": "local:licenseFolder", - "value": "licenses/shadcn@4.12.0" + "value": "licenses/shadcn@4.6.0" }, { "name": "local:sourcePackageDir", @@ -4164,10 +1459,10 @@ }, { "type": "library", - "bomRef": "pkg:npm/tailwind-merge@3.6.0", + "bomRef": "pkg:npm/tailwind-merge@3.5.0", "name": "tailwind-merge", - "version": "3.6.0", - "purl": "pkg:npm/tailwind-merge@3.6.0", + "version": "3.5.0", + "purl": "pkg:npm/tailwind-merge@3.5.0", "description": "Merge Tailwind CSS classes without style conflicts", "licenses": [ { @@ -4189,7 +1484,7 @@ "properties": [ { "name": "local:licenseFolder", - "value": "licenses/tailwind-merge@3.6.0" + "value": "licenses/tailwind-merge@3.5.0" }, { "name": "local:sourcePackageDir", @@ -4234,10 +1529,10 @@ }, { "type": "library", - "bomRef": "pkg:npm/tailwindcss@4.3.2", + "bomRef": "pkg:npm/tailwindcss@4.2.4", "name": "tailwindcss", - "version": "4.3.2", - "purl": "pkg:npm/tailwindcss@4.3.2", + "version": "4.2.4", + "purl": "pkg:npm/tailwindcss@4.2.4", "description": "A utility-first CSS framework for rapidly building custom user interfaces.", "licenses": [ { @@ -4259,7 +1554,7 @@ "properties": [ { "name": "local:licenseFolder", - "value": "licenses/tailwindcss@4.3.2" + "value": "licenses/tailwindcss@4.2.4" }, { "name": "local:sourcePackageDir", @@ -4298,73 +1593,7 @@ }, { "name": "local:sourcePackageDir", - "value": "packages/mtp/node_modules/tauri-plugin-app-events-api" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/tiny-invariant@1.3.3", - "name": "tiny-invariant", - "version": "1.3.3", - "purl": "pkg:npm/tiny-invariant@1.3.3", - "description": "A tiny invariant function", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "vcs", - "url": "https://github.com/alexreardon/tiny-invariant.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/tiny-invariant@1.3.3" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/tiny-invariant" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/tslib@2.8.1", - "name": "tslib", - "version": "2.8.1", - "purl": "pkg:npm/tslib@2.8.1", - "description": "Runtime library for TypeScript helper functions", - "licenses": [ - { - "license": { - "id": "0BSD" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://www.typescriptlang.org/" - }, - { - "type": "vcs", - "url": "https://github.com/Microsoft/tslib.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/tslib@2.8.1" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/tslib" + "value": "apps/web/node_modules/tauri-plugin-app-events-api" } ] }, @@ -4434,16 +1663,16 @@ }, { "name": "local:sourcePackageDir", - "value": "apps/electron/node_modules/typescript" + "value": "apps/web/node_modules/typescript" } ] }, { "type": "library", - "bomRef": "pkg:npm/typescript-eslint@8.62.1", + "bomRef": "pkg:npm/typescript-eslint@8.59.1", "name": "typescript-eslint", - "version": "8.62.1", - "purl": "pkg:npm/typescript-eslint@8.62.1", + "version": "8.59.1", + "purl": "pkg:npm/typescript-eslint@8.59.1", "description": "Tooling which enables you to use TypeScript with ESLint", "licenses": [ { @@ -4465,7 +1694,7 @@ "properties": [ { "name": "local:licenseFolder", - "value": "licenses/typescript-eslint@8.62.1" + "value": "licenses/typescript-eslint@8.59.1" }, { "name": "local:sourcePackageDir", @@ -4475,177 +1704,10 @@ }, { "type": "library", - "bomRef": "pkg:npm/use-callback-ref@1.3.3", - "name": "use-callback-ref", - "version": "1.3.3", - "purl": "pkg:npm/use-callback-ref@1.3.3", - "description": "The same useRef, but with callback", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "vcs", - "url": "https://github.com/theKashey/use-callback-ref/" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/use-callback-ref@1.3.3" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/use-callback-ref" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/use-sidecar@1.1.3", - "name": "use-sidecar", - "version": "1.1.3", - "purl": "pkg:npm/use-sidecar@1.1.3", - "description": "Sidecar code splitting utils", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://github.com/theKashey/use-sidecar" - }, - { - "type": "vcs", - "url": "https://github.com/theKashey/use-sidecar" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/use-sidecar@1.1.3" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/use-sidecar" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/use-sync-external-store@1.6.0", - "name": "use-sync-external-store", - "version": "1.6.0", - "purl": "pkg:npm/use-sync-external-store@1.6.0", - "description": "Backwards compatible shim for React's useSyncExternalStore. Works with any React that supports hooks.", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "vcs", - "url": "https://github.com/facebook/react.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/use-sync-external-store@1.6.0" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/use-sync-external-store" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/vaul@1.1.2", - "name": "vaul", - "version": "1.1.2", - "purl": "pkg:npm/vaul@1.1.2", - "description": "Drawer component for React.", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://vaul.emilkowal.ski/" - }, - { - "type": "vcs", - "url": "https://github.com/emilkowalski/vaul.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/vaul@1.1.2" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/vaul" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/victory-vendor@37.3.6", - "name": "victory-vendor", - "version": "37.3.6", - "purl": "pkg:npm/victory-vendor@37.3.6", - "description": "Vendored dependencies for Victory", - "licenses": [ - { - "license": { - "name": "MIT AND ISC" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://commerce.nearform.com/open-source/victory" - }, - { - "type": "vcs", - "url": "https://github.com/FormidableLabs/victory" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/victory-vendor@37.3.6" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/victory-vendor" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/vite@8.1.3", + "bomRef": "pkg:npm/vite@8.0.10", "name": "vite", - "version": "8.1.3", - "purl": "pkg:npm/vite@8.1.3", + "version": "8.0.10", + "purl": "pkg:npm/vite@8.0.10", "description": "Native-ESM powered web dev build tool", "licenses": [ { @@ -4667,7 +1729,7 @@ "properties": [ { "name": "local:licenseFolder", - "value": "licenses/vite@8.1.3" + "value": "licenses/vite@8.0.10" }, { "name": "local:sourcePackageDir", @@ -4677,115 +1739,10 @@ }, { "type": "library", - "bomRef": "pkg:npm/vitest@4.1.9", - "name": "vitest", - "version": "4.1.9", - "purl": "pkg:npm/vitest@4.1.9", - "description": "Next generation testing framework powered by Vite", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://vitest.dev" - }, - { - "type": "vcs", - "url": "git+https://github.com/vitest-dev/vitest.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/vitest@4.1.9" - }, - { - "name": "local:sourcePackageDir", - "value": "node_modules/vitest" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/yaml@2.9.0", - "name": "yaml", - "version": "2.9.0", - "purl": "pkg:npm/yaml@2.9.0", - "description": "JavaScript parser and stringifier for YAML", - "licenses": [ - { - "license": { - "id": "ISC" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://eemeli.org/yaml/" - }, - { - "type": "vcs", - "url": "github:eemeli/yaml" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/yaml@2.9.0" - }, - { - "name": "local:sourcePackageDir", - "value": "node_modules/yaml" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/yargs@15.4.1", - "name": "yargs", - "version": "15.4.1", - "purl": "pkg:npm/yargs@15.4.1", - "description": "yargs the modern, pirate-themed, successor to optimist.", - "licenses": [ - { - "license": { - "id": "MIT" - } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://yargs.js.org/" - }, - { - "type": "vcs", - "url": "https://github.com/yargs/yargs.git" - } - ], - "properties": [ - { - "name": "local:licenseFolder", - "value": "licenses/yargs@15.4.1" - }, - { - "name": "local:sourcePackageDir", - "value": "apps/web/node_modules/yargs" - } - ] - }, - { - "type": "library", - "bomRef": "pkg:npm/zod@4.4.3", + "bomRef": "pkg:npm/zod@4.4.2", "name": "zod", - "version": "4.4.3", - "purl": "pkg:npm/zod@4.4.3", + "version": "4.4.2", + "purl": "pkg:npm/zod@4.4.2", "description": "TypeScript-first schema declaration and validation library with static type inference", "licenses": [ { @@ -4807,7 +1764,7 @@ "properties": [ { "name": "local:licenseFolder", - "value": "licenses/zod@4.4.3" + "value": "licenses/zod@4.4.2" }, { "name": "local:sourcePackageDir", @@ -4817,10 +1774,10 @@ }, { "type": "library", - "bomRef": "pkg:npm/zustand@5.0.14", + "bomRef": "pkg:npm/zustand@5.0.12", "name": "zustand", - "version": "5.0.14", - "purl": "pkg:npm/zustand@5.0.14", + "version": "5.0.12", + "purl": "pkg:npm/zustand@5.0.12", "description": "🐻 Bear necessities for state management in React", "licenses": [ { @@ -4842,7 +1799,7 @@ "properties": [ { "name": "local:licenseFolder", - "value": "licenses/zustand@5.0.14" + "value": "licenses/zustand@5.0.12" }, { "name": "local:sourcePackageDir", @@ -4851,4 +1808,4 @@ ] } ] -} +} \ No newline at end of file diff --git a/licenses/scheduler@0.27.0/LICENSE b/licenses/scheduler@0.27.0/LICENSE deleted file mode 100644 index b93be90..0000000 --- a/licenses/scheduler@0.27.0/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) Meta Platforms, Inc. and affiliates. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/licenses/seroval-plugins@1.5.4/LICENSE b/licenses/seroval-plugins@1.5.4/LICENSE deleted file mode 100644 index 78c9813..0000000 --- a/licenses/seroval-plugins@1.5.4/LICENSE +++ /dev/null @@ -1,7 +0,0 @@ -MIT License Copyright (c) 2025 Alexis Munsayac - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice (including the next paragraph) shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/licenses/seroval@1.5.4/LICENSE b/licenses/seroval@1.5.4/LICENSE deleted file mode 100644 index 78c9813..0000000 --- a/licenses/seroval@1.5.4/LICENSE +++ /dev/null @@ -1,7 +0,0 @@ -MIT License Copyright (c) 2025 Alexis Munsayac - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice (including the next paragraph) shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/licenses/shadcn@4.12.0/LICENSE.md b/licenses/shadcn@4.6.0/LICENSE.md similarity index 100% rename from licenses/shadcn@4.12.0/LICENSE.md rename to licenses/shadcn@4.6.0/LICENSE.md diff --git a/licenses/tailwind-merge@3.6.0/LICENSE.md b/licenses/tailwind-merge@3.5.0/LICENSE.md similarity index 100% rename from licenses/tailwind-merge@3.6.0/LICENSE.md rename to licenses/tailwind-merge@3.5.0/LICENSE.md diff --git a/licenses/tailwindcss@4.3.2/LICENSE b/licenses/tailwindcss@4.2.4/LICENSE similarity index 100% rename from licenses/tailwindcss@4.3.2/LICENSE rename to licenses/tailwindcss@4.2.4/LICENSE diff --git a/licenses/third-party-credits.json b/licenses/third-party-credits.json index 81d1ba8..bf9eab8 100644 --- a/licenses/third-party-credits.json +++ b/licenses/third-party-credits.json @@ -1,57 +1,18 @@ { - "generatedAt": "2026-07-03T19:50:00.637Z", - "packageCount": 143, + "generatedAt": "2026-05-21T10:15:15.540Z", + "packageCount": 54, "packages": [ - { - "name": "@babel/runtime", - "version": "7.29.7", - "license": "MIT", - "homepage": "https://babel.dev/docs/en/next/babel-runtime", - "repository": "https://github.com/babel/babel.git", - "description": "babel's modular runtime helpers", - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/@babel_runtime@7.29.7", - "sourcePackageDir": "apps/web/node_modules/@babel/runtime" - }, - { - "name": "@base-ui/react", - "version": "1.6.0", - "license": "MIT", - "homepage": "https://base-ui.com", - "repository": "git+https://github.com/mui/base-ui.git", - "description": "Base UI is a library of headless ('unstyled') React components and low-level hooks. You gain complete control over your app's CSS and accessibility features.", - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/@base-ui_react@1.6.0", - "sourcePackageDir": "apps/web/node_modules/@base-ui/react" - }, - { - "name": "@base-ui/utils", - "version": "0.3.1", - "license": "MIT", - "homepage": null, - "repository": "git+https://github.com/mui/base-ui.git", - "description": "A collection of React utility functions for Base UI.", - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/@base-ui_utils@0.3.1", - "sourcePackageDir": "apps/web/node_modules/@base-ui/utils" - }, { "name": "@codemirror/commands", - "version": "6.10.4", + "version": "6.10.3", "license": "MIT", "homepage": null, - "repository": "git+https://code.haverbeke.berlin/codemirror/commands.git", + "repository": "git+https://github.com/codemirror/commands.git", "description": "Collection of editing commands for the CodeMirror code editor", "files": [ "LICENSE" ], - "licenseFolder": "licenses/@codemirror_commands@6.10.4", + "licenseFolder": "licenses/@codemirror_commands@6.10.3", "sourcePackageDir": "packages/markdown/node_modules/@codemirror/commands" }, { @@ -69,20 +30,20 @@ }, { "name": "@codemirror/state", - "version": "6.7.0", + "version": "6.6.0", "license": "MIT", "homepage": null, - "repository": "git+https://code.haverbeke.berlin/codemirror/state.git", + "repository": "git+https://github.com/codemirror/state.git", "description": "Editor state data structures for the CodeMirror code editor", "files": [ "LICENSE" ], - "licenseFolder": "licenses/@codemirror_state@6.7.0", + "licenseFolder": "licenses/@codemirror_state@6.6.0", "sourcePackageDir": "packages/markdown/node_modules/@codemirror/state" }, { "name": "@codemirror/view", - "version": "6.43.4", + "version": "6.41.1", "license": "MIT", "homepage": null, "repository": "git+https://code.haverbeke.berlin/codemirror/view.git", @@ -90,7 +51,7 @@ "files": [ "LICENSE" ], - "licenseFolder": "licenses/@codemirror_view@6.43.4", + "licenseFolder": "licenses/@codemirror_view@6.41.1", "sourcePackageDir": "packages/markdown/node_modules/@codemirror/view" }, { @@ -106,58 +67,6 @@ "licenseFolder": "licenses/@eslint_js@10.0.1", "sourcePackageDir": "apps/web/node_modules/@eslint/js" }, - { - "name": "@floating-ui/core", - "version": "1.7.5", - "license": "MIT", - "homepage": "https://floating-ui.com", - "repository": "https://github.com/floating-ui/floating-ui.git", - "description": "Positioning library for floating elements: tooltips, popovers, dropdowns, and more", - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/@floating-ui_core@1.7.5", - "sourcePackageDir": "apps/web/node_modules/@floating-ui/core" - }, - { - "name": "@floating-ui/dom", - "version": "1.7.6", - "license": "MIT", - "homepage": "https://floating-ui.com", - "repository": "https://github.com/floating-ui/floating-ui.git", - "description": "Floating UI for the web", - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/@floating-ui_dom@1.7.6", - "sourcePackageDir": "apps/web/node_modules/@floating-ui/dom" - }, - { - "name": "@floating-ui/react-dom", - "version": "2.1.8", - "license": "MIT", - "homepage": "https://floating-ui.com/docs/react-dom", - "repository": "https://github.com/floating-ui/floating-ui.git", - "description": "Floating UI for React DOM", - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/@floating-ui_react-dom@2.1.8", - "sourcePackageDir": "apps/web/node_modules/@floating-ui/react-dom" - }, - { - "name": "@floating-ui/utils", - "version": "0.2.11", - "license": "MIT", - "homepage": "https://floating-ui.com", - "repository": "https://github.com/floating-ui/floating-ui.git", - "description": "Utilities for Floating UI", - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/@floating-ui_utils@0.2.11", - "sourcePackageDir": "apps/web/node_modules/@floating-ui/utils" - }, { "name": "@fontsource-variable/inter", "version": "5.2.8", @@ -171,22 +80,9 @@ "licenseFolder": "licenses/@fontsource-variable_inter@5.2.8", "sourcePackageDir": "apps/web/node_modules/@fontsource-variable/inter" }, - { - "name": "@fontsource-variable/public-sans", - "version": "5.2.7", - "license": "OFL-1.1", - "homepage": "https://fontsource.org/fonts/public-sans", - "repository": "git+https://github.com/fontsource/font-files.git", - "description": "Self-host the Public Sans font in a neatly bundled NPM package.", - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/@fontsource-variable_public-sans@5.2.7", - "sourcePackageDir": "apps/web/node_modules/@fontsource-variable/public-sans" - }, { "name": "@livekit/components-react", - "version": "2.9.21", + "version": "2.9.20", "license": "Apache-2.0", "homepage": null, "repository": "https://github.com/livekit/components-js.git", @@ -194,7 +90,7 @@ "files": [ "LICENSE" ], - "licenseFolder": "licenses/@livekit_components-react@2.9.21", + "licenseFolder": "licenses/@livekit_components-react@2.9.20", "sourcePackageDir": "packages/call/node_modules/@livekit/components-react" }, { @@ -208,245 +104,11 @@ "LICENSE" ], "licenseFolder": "licenses/@noble_curves@2.2.0", - "sourcePackageDir": "packages/crypto/node_modules/@noble/curves" - }, - { - "name": "@noble/hashes", - "version": "2.2.0", - "license": "MIT", - "homepage": "https://paulmillr.com/noble/", - "repository": "git+https://github.com/paulmillr/noble-hashes.git", - "description": "Audited & minimal 0-dependency JS implementation of SHA, RIPEMD, BLAKE, HMAC, HKDF, PBKDF & Scrypt", - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/@noble_hashes@2.2.0", - "sourcePackageDir": "packages/crypto/node_modules/@noble/hashes" - }, - { - "name": "@radix-ui/primitive", - "version": "1.1.4", - "license": "MIT", - "homepage": "https://radix-ui.com/primitives", - "repository": "git+https://github.com/radix-ui/primitives.git", - "description": null, - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/@radix-ui_primitive@1.1.4", - "sourcePackageDir": "apps/web/node_modules/@radix-ui/primitive" - }, - { - "name": "@radix-ui/react-compose-refs", - "version": "1.1.3", - "license": "MIT", - "homepage": "https://radix-ui.com/primitives", - "repository": "git+https://github.com/radix-ui/primitives.git", - "description": null, - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/@radix-ui_react-compose-refs@1.1.3", - "sourcePackageDir": "apps/web/node_modules/@radix-ui/react-compose-refs" - }, - { - "name": "@radix-ui/react-context", - "version": "1.1.4", - "license": "MIT", - "homepage": "https://radix-ui.com/primitives", - "repository": "git+https://github.com/radix-ui/primitives.git", - "description": null, - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/@radix-ui_react-context@1.1.4", - "sourcePackageDir": "apps/web/node_modules/@radix-ui/react-context" - }, - { - "name": "@radix-ui/react-dialog", - "version": "1.1.18", - "license": "MIT", - "homepage": "https://radix-ui.com/primitives", - "repository": "git+https://github.com/radix-ui/primitives.git", - "description": null, - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/@radix-ui_react-dialog@1.1.18", - "sourcePackageDir": "apps/web/node_modules/@radix-ui/react-dialog" - }, - { - "name": "@radix-ui/react-dismissable-layer", - "version": "1.1.14", - "license": "MIT", - "homepage": "https://radix-ui.com/primitives", - "repository": "git+https://github.com/radix-ui/primitives.git", - "description": null, - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/@radix-ui_react-dismissable-layer@1.1.14", - "sourcePackageDir": "apps/web/node_modules/@radix-ui/react-dismissable-layer" - }, - { - "name": "@radix-ui/react-focus-guards", - "version": "1.1.4", - "license": "MIT", - "homepage": "https://radix-ui.com/primitives", - "repository": "git+https://github.com/radix-ui/primitives.git", - "description": null, - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/@radix-ui_react-focus-guards@1.1.4", - "sourcePackageDir": "apps/web/node_modules/@radix-ui/react-focus-guards" - }, - { - "name": "@radix-ui/react-focus-scope", - "version": "1.1.11", - "license": "MIT", - "homepage": "https://radix-ui.com/primitives", - "repository": "git+https://github.com/radix-ui/primitives.git", - "description": null, - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/@radix-ui_react-focus-scope@1.1.11", - "sourcePackageDir": "apps/web/node_modules/@radix-ui/react-focus-scope" - }, - { - "name": "@radix-ui/react-id", - "version": "1.1.2", - "license": "MIT", - "homepage": "https://radix-ui.com/primitives", - "repository": "git+https://github.com/radix-ui/primitives.git", - "description": null, - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/@radix-ui_react-id@1.1.2", - "sourcePackageDir": "apps/web/node_modules/@radix-ui/react-id" - }, - { - "name": "@radix-ui/react-portal", - "version": "1.1.13", - "license": "MIT", - "homepage": "https://radix-ui.com/primitives", - "repository": "git+https://github.com/radix-ui/primitives.git", - "description": null, - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/@radix-ui_react-portal@1.1.13", - "sourcePackageDir": "apps/web/node_modules/@radix-ui/react-portal" - }, - { - "name": "@radix-ui/react-presence", - "version": "1.1.6", - "license": "MIT", - "homepage": "https://radix-ui.com/primitives", - "repository": "git+https://github.com/radix-ui/primitives.git", - "description": null, - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/@radix-ui_react-presence@1.1.6", - "sourcePackageDir": "apps/web/node_modules/@radix-ui/react-presence" - }, - { - "name": "@radix-ui/react-primitive", - "version": "2.1.7", - "license": "MIT", - "homepage": "https://radix-ui.com/primitives", - "repository": "git+https://github.com/radix-ui/primitives.git", - "description": null, - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/@radix-ui_react-primitive@2.1.7", - "sourcePackageDir": "apps/web/node_modules/@radix-ui/react-primitive" - }, - { - "name": "@radix-ui/react-slot", - "version": "1.2.1", - "license": "MIT", - "homepage": "https://radix-ui.com/primitives", - "repository": "git+https://github.com/radix-ui/primitives.git", - "description": null, - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/@radix-ui_react-slot@1.3.0", - "sourcePackageDir": "apps/web/node_modules/@radix-ui/react-slot" - }, - { - "name": "@radix-ui/react-use-callback-ref", - "version": "1.1.2", - "license": "MIT", - "homepage": "https://radix-ui.com/primitives", - "repository": "git+https://github.com/radix-ui/primitives.git", - "description": null, - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/@radix-ui_react-use-callback-ref@1.1.2", - "sourcePackageDir": "apps/web/node_modules/@radix-ui/react-use-callback-ref" - }, - { - "name": "@radix-ui/react-use-controllable-state", - "version": "1.2.3", - "license": "MIT", - "homepage": "https://radix-ui.com/primitives", - "repository": "git+https://github.com/radix-ui/primitives.git", - "description": null, - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/@radix-ui_react-use-controllable-state@1.2.3", - "sourcePackageDir": "apps/web/node_modules/@radix-ui/react-use-controllable-state" - }, - { - "name": "@radix-ui/react-use-effect-event", - "version": "0.0.2", - "license": "MIT", - "homepage": "https://radix-ui.com/primitives", - "repository": "git+https://github.com/radix-ui/primitives.git", - "description": null, - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/@radix-ui_react-use-effect-event@0.0.2", - "sourcePackageDir": "apps/web/node_modules/@radix-ui/react-use-effect-event" - }, - { - "name": "@radix-ui/react-use-layout-effect", - "version": "1.1.2", - "license": "MIT", - "homepage": "https://radix-ui.com/primitives", - "repository": "git+https://github.com/radix-ui/primitives.git", - "description": null, - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/@radix-ui_react-use-layout-effect@1.1.2", - "sourcePackageDir": "apps/web/node_modules/@radix-ui/react-use-layout-effect" - }, - { - "name": "@reduxjs/toolkit", - "version": "2.12.0", - "license": "MIT", - "homepage": "https://redux-toolkit.js.org", - "repository": "git+https://github.com/reduxjs/redux-toolkit.git", - "description": "The official, opinionated, batteries-included toolset for efficient Redux development", - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/@reduxjs_toolkit@2.12.0", - "sourcePackageDir": "apps/web/node_modules/@reduxjs/toolkit" + "sourcePackageDir": "apps/web/node_modules/@noble/curves" }, { "name": "@tailwindcss/vite", - "version": "4.3.2", + "version": "4.2.4", "license": "MIT", "homepage": "https://tailwindcss.com", "repository": "https://github.com/tailwindlabs/tailwindcss.git", @@ -454,64 +116,12 @@ "files": [ "LICENSE" ], - "licenseFolder": "licenses/@tailwindcss_vite@4.3.2", + "licenseFolder": "licenses/@tailwindcss_vite@4.2.4", "sourcePackageDir": "apps/web/node_modules/@tailwindcss/vite" }, - { - "name": "@tanstack/devtools-event-client", - "version": "0.3.5", - "license": "MIT", - "homepage": "https://tanstack.com/devtools", - "repository": "https://github.com/TanStack/devtools.git", - "description": "TanStack Event Client is a lightweight event client for TanStack Devtools event bus.", - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/@tanstack_devtools-event-client@0.3.5", - "sourcePackageDir": "apps/web/node_modules/@tanstack/devtools-event-client" - }, - { - "name": "@tanstack/history", - "version": "1.162.0", - "license": "MIT", - "homepage": "https://tanstack.com/router", - "repository": "git+https://github.com/TanStack/router.git", - "description": "Modern and scalable routing for React applications", - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/@tanstack_history@1.162.0", - "sourcePackageDir": "apps/web/node_modules/@tanstack/history" - }, - { - "name": "@tanstack/pacer", - "version": "0.21.1", - "license": "MIT", - "homepage": "https://tanstack.com/pacer", - "repository": "git+https://github.com/TanStack/pacer.git", - "description": "Utilities for debouncing, throttling, rate-limiting, queuing, and more.", - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/@tanstack_pacer@0.21.1", - "sourcePackageDir": "packages/chat/node_modules/@tanstack/pacer" - }, - { - "name": "@tanstack/query-core", - "version": "5.101.2", - "license": "MIT", - "homepage": "https://tanstack.com/query", - "repository": "git+https://github.com/TanStack/query.git", - "description": "The framework agnostic core that powers TanStack Query", - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/@tanstack_query-core@5.101.2", - "sourcePackageDir": "apps/web/node_modules/@tanstack/query-core" - }, { "name": "@tanstack/react-query", - "version": "5.101.2", + "version": "5.100.8", "license": "MIT", "homepage": "https://tanstack.com/query", "repository": "git+https://github.com/TanStack/query.git", @@ -519,12 +129,12 @@ "files": [ "LICENSE" ], - "licenseFolder": "licenses/@tanstack_react-query@5.101.2", - "sourcePackageDir": "packages/chat/node_modules/@tanstack/react-query" + "licenseFolder": "licenses/@tanstack_react-query@5.100.8", + "sourcePackageDir": "packages/call/node_modules/@tanstack/react-query" }, { "name": "@tanstack/react-router", - "version": "1.170.17", + "version": "1.169.1", "license": "MIT", "homepage": "https://tanstack.com/router", "repository": "git+https://github.com/TanStack/router.git", @@ -532,25 +142,12 @@ "files": [ "LICENSE" ], - "licenseFolder": "licenses/@tanstack_react-router@1.170.17", + "licenseFolder": "licenses/@tanstack_react-router@1.169.1", "sourcePackageDir": "apps/web/node_modules/@tanstack/react-router" }, - { - "name": "@tanstack/react-store", - "version": "0.9.3", - "license": "MIT", - "homepage": "https://tanstack.com/store", - "repository": "https://github.com/TanStack/store.git", - "description": "Framework agnostic type-safe store w/ reactive framework adapters", - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/@tanstack_react-store@0.9.3", - "sourcePackageDir": "apps/web/node_modules/@tanstack/react-store" - }, { "name": "@tanstack/react-virtual", - "version": "3.14.5", + "version": "3.13.24", "license": "MIT", "homepage": "https://tanstack.com/virtual", "repository": "git+https://github.com/TanStack/virtual.git", @@ -558,79 +155,40 @@ "files": [ "LICENSE" ], - "licenseFolder": "licenses/@tanstack_react-virtual@3.14.5", + "licenseFolder": "licenses/@tanstack_react-virtual@3.13.24", "sourcePackageDir": "apps/web/node_modules/@tanstack/react-virtual" }, - { - "name": "@tanstack/router-core", - "version": "1.171.14", - "license": "MIT", - "homepage": "https://tanstack.com/router", - "repository": "git+https://github.com/TanStack/router.git", - "description": "Modern and scalable routing for React applications", - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/@tanstack_router-core@1.171.14", - "sourcePackageDir": "apps/web/node_modules/@tanstack/router-core" - }, - { - "name": "@tanstack/store", - "version": "0.9.3", - "license": "MIT", - "homepage": "https://tanstack.com/store", - "repository": "git+https://github.com/TanStack/store.git", - "description": "Framework agnostic type-safe store w/ reactive framework adapters", - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/@tanstack_store@0.9.3", - "sourcePackageDir": "apps/web/node_modules/@tanstack/store" - }, - { - "name": "@tanstack/virtual-core", - "version": "3.17.3", - "license": "MIT", - "homepage": "https://tanstack.com/virtual", - "repository": "git+https://github.com/TanStack/virtual.git", - "description": "Headless UI for virtualizing scrollable elements in TS/JS + Frameworks", - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/@tanstack_virtual-core@3.17.3", - "sourcePackageDir": "apps/web/node_modules/@tanstack/virtual-core" - }, { "name": "@tauri-apps/api", - "version": "2.11.1", + "version": "2.11.0", "license": "Apache-2.0 OR MIT", "homepage": "https://github.com/tauri-apps/tauri#readme", "repository": "git+https://github.com/tauri-apps/tauri.git", "description": "Tauri API definitions", "files": [ - "LICENSE_APACHE-2.0", - "LICENSE_MIT" + "LICENSE_MIT", + "LICENSE_APACHE-2.0" ], - "licenseFolder": "licenses/@tauri-apps_api@2.11.1", + "licenseFolder": "licenses/@tauri-apps_api@2.11.0", "sourcePackageDir": "apps/tauri/node_modules/@tauri-apps/api" }, { "name": "@tauri-apps/cli", - "version": "2.11.4", + "version": "2.11.0", "license": "Apache-2.0 OR MIT", "homepage": "https://github.com/tauri-apps/tauri#readme", "repository": "git+https://github.com/tauri-apps/tauri.git", "description": "Command line interface for building Tauri apps", "files": [ - "LICENSE_APACHE-2.0", - "LICENSE_MIT" + "LICENSE_MIT", + "LICENSE_APACHE-2.0" ], - "licenseFolder": "licenses/@tauri-apps_cli@2.11.4", + "licenseFolder": "licenses/@tauri-apps_cli@2.11.0", "sourcePackageDir": "apps/tauri/node_modules/@tauri-apps/cli" }, { "name": "@tauri-apps/plugin-barcode-scanner", - "version": "2.4.5", + "version": "2.4.4", "license": "MIT OR Apache-2.0", "homepage": null, "repository": "https://github.com/tauri-apps/plugins-workspace", @@ -638,7 +196,7 @@ "files": [ "LICENSE.spdx" ], - "licenseFolder": "licenses/@tauri-apps_plugin-barcode-scanner@2.4.5", + "licenseFolder": "licenses/@tauri-apps_plugin-barcode-scanner@2.4.4", "sourcePackageDir": "apps/tauri/node_modules/@tauri-apps/plugin-barcode-scanner" }, { @@ -655,45 +213,45 @@ "sourcePackageDir": "apps/tauri/node_modules/@tauri-apps/plugin-deep-link" }, { - "name": "@tauri-apps/plugin-log", - "version": "2.8.0", + "name": "@tauri-apps/plugin-opener", + "version": "2.5.4", "license": "MIT OR Apache-2.0", "homepage": null, "repository": "https://github.com/tauri-apps/plugins-workspace", - "description": "Configurable logging for your Tauri app.", + "description": "Open files and URLs using their default application.", "files": [ "LICENSE.spdx" ], - "licenseFolder": "licenses/@tauri-apps_plugin-log@2.8.0", - "sourcePackageDir": "apps/tauri/node_modules/@tauri-apps/plugin-log" + "licenseFolder": "licenses/@tauri-apps_plugin-opener@2.5.4", + "sourcePackageDir": "apps/tauri/node_modules/@tauri-apps/plugin-opener" }, { - "name": "@tauri-apps/plugin-notification", - "version": "2.3.3", - "license": "MIT OR Apache-2.0", + "name": "@tensamin/ttp-core", + "version": "0.0.19", + "license": "UNKNOWN", "homepage": null, - "repository": "https://github.com/tauri-apps/plugins-workspace", + "repository": null, "description": null, "files": [ - "LICENSE.spdx" + "LICENSE" ], - "licenseFolder": "licenses/@tauri-apps_plugin-notification@2.3.3", - "sourcePackageDir": "apps/tauri/node_modules/@tauri-apps/plugin-notification" + "licenseFolder": "licenses/@tensamin_ttp-core@0.0.19", + "sourcePackageDir": "packages/ttp/node_modules/@tensamin/ttp-core" }, { "name": "@tensamin/ui", - "version": "0.0.39", + "version": "0.0.34", "license": "UNKNOWN", "homepage": null, "repository": null, "description": null, "files": [], - "licenseFolder": "licenses/@tensamin_ui@0.0.39", + "licenseFolder": "licenses/@tensamin_ui@0.0.34", "sourcePackageDir": "apps/tauri/node_modules/@tensamin/ui" }, { "name": "@types/node", - "version": "25.9.4", + "version": "25.6.0", "license": "MIT", "homepage": "https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/node", "repository": "https://github.com/DefinitelyTyped/DefinitelyTyped.git", @@ -701,8 +259,8 @@ "files": [ "LICENSE" ], - "licenseFolder": "licenses/@types_node@25.9.4", - "sourcePackageDir": "apps/electron/node_modules/@types/node" + "licenseFolder": "licenses/@types_node@25.6.0", + "sourcePackageDir": "node_modules/@types/node" }, { "name": "@types/qrcode", @@ -719,7 +277,7 @@ }, { "name": "@types/react", - "version": "19.2.17", + "version": "19.2.14", "license": "MIT", "homepage": "https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/react", "repository": "https://github.com/DefinitelyTyped/DefinitelyTyped.git", @@ -727,7 +285,7 @@ "files": [ "LICENSE" ], - "licenseFolder": "licenses/@types_react@19.2.17", + "licenseFolder": "licenses/@types_react@19.2.14", "sourcePackageDir": "apps/web/node_modules/@types/react" }, { @@ -745,7 +303,7 @@ }, { "name": "@typescript-eslint/parser", - "version": "8.62.1", + "version": "8.59.1", "license": "MIT", "homepage": "https://typescript-eslint.io/packages/parser", "repository": "https://github.com/typescript-eslint/typescript-eslint.git", @@ -753,12 +311,12 @@ "files": [ "LICENSE" ], - "licenseFolder": "licenses/@typescript-eslint_parser@8.62.1", + "licenseFolder": "licenses/@typescript-eslint_parser@8.59.1", "sourcePackageDir": "node_modules/@typescript-eslint/parser" }, { "name": "@vitejs/plugin-react", - "version": "6.0.3", + "version": "6.0.1", "license": "MIT", "homepage": "https://github.com/vitejs/vite-plugin-react/tree/main/packages/plugin-react#readme", "repository": "git+https://github.com/vitejs/vite-plugin-react.git", @@ -766,22 +324,9 @@ "files": [ "LICENSE" ], - "licenseFolder": "licenses/@vitejs_plugin-react@6.0.3", + "licenseFolder": "licenses/@vitejs_plugin-react@6.0.1", "sourcePackageDir": "apps/web/node_modules/@vitejs/plugin-react" }, - { - "name": "aria-hidden", - "version": "1.2.6", - "license": "MIT", - "homepage": "https://github.com/theKashey/aria-hidden#readme", - "repository": "git+https://github.com/theKashey/aria-hidden.git", - "description": "Cast aria-hidden to everything, except...", - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/aria-hidden@1.2.6", - "sourcePackageDir": "apps/web/node_modules/aria-hidden" - }, { "name": "class-variance-authority", "version": "0.7.1", @@ -808,19 +353,6 @@ "licenseFolder": "licenses/clsx@2.1.1", "sourcePackageDir": "apps/web/node_modules/clsx" }, - { - "name": "cmdk", - "version": "1.1.1", - "license": "MIT", - "homepage": "https://github.com/pacocoursey/cmdk#readme", - "repository": "git+https://github.com/pacocoursey/cmdk.git", - "description": null, - "files": [ - "LICENSE.md" - ], - "licenseFolder": "licenses/cmdk@1.1.1", - "sourcePackageDir": "apps/web/node_modules/cmdk" - }, { "name": "comlink", "version": "4.4.2", @@ -832,193 +364,11 @@ "LICENSE" ], "licenseFolder": "licenses/comlink@4.4.2", - "sourcePackageDir": "packages/crypto/node_modules/comlink" - }, - { - "name": "cookie-es", - "version": "3.1.1", - "license": "MIT", - "homepage": null, - "repository": "unjs/cookie-es", - "description": null, - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/cookie-es@3.1.1", - "sourcePackageDir": "apps/web/node_modules/cookie-es" - }, - { - "name": "d3-array", - "version": "3.2.4", - "license": "ISC", - "homepage": "https://d3js.org/d3-array/", - "repository": "https://github.com/d3/d3-array.git", - "description": "Array manipulation, ordering, searching, summarizing, etc.", - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/d3-array@3.2.4", - "sourcePackageDir": "apps/web/node_modules/d3-array" - }, - { - "name": "d3-color", - "version": "3.1.0", - "license": "ISC", - "homepage": "https://d3js.org/d3-color/", - "repository": "https://github.com/d3/d3-color.git", - "description": "Color spaces! RGB, HSL, Cubehelix, Lab and HCL (Lch).", - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/d3-color@3.1.0", - "sourcePackageDir": "apps/web/node_modules/d3-color" - }, - { - "name": "d3-ease", - "version": "3.0.1", - "license": "BSD-3-Clause", - "homepage": "https://d3js.org/d3-ease/", - "repository": "https://github.com/d3/d3-ease.git", - "description": "Easing functions for smooth animation.", - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/d3-ease@3.0.1", - "sourcePackageDir": "apps/web/node_modules/d3-ease" - }, - { - "name": "d3-format", - "version": "3.1.2", - "license": "ISC", - "homepage": "https://d3js.org/d3-format/", - "repository": "https://github.com/d3/d3-format.git", - "description": "Format numbers for human consumption.", - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/d3-format@3.1.2", - "sourcePackageDir": "apps/web/node_modules/d3-format" - }, - { - "name": "d3-interpolate", - "version": "3.0.1", - "license": "ISC", - "homepage": "https://d3js.org/d3-interpolate/", - "repository": "https://github.com/d3/d3-interpolate.git", - "description": "Interpolate numbers, colors, strings, arrays, objects, whatever!", - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/d3-interpolate@3.0.1", - "sourcePackageDir": "apps/web/node_modules/d3-interpolate" - }, - { - "name": "d3-path", - "version": "3.1.0", - "license": "ISC", - "homepage": "https://d3js.org/d3-path/", - "repository": "https://github.com/d3/d3-path.git", - "description": "Serialize Canvas path commands to SVG.", - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/d3-path@3.1.0", - "sourcePackageDir": "apps/web/node_modules/d3-path" - }, - { - "name": "d3-scale", - "version": "4.0.2", - "license": "ISC", - "homepage": "https://d3js.org/d3-scale/", - "repository": "https://github.com/d3/d3-scale.git", - "description": "Encodings that map abstract data to visual representation.", - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/d3-scale@4.0.2", - "sourcePackageDir": "apps/web/node_modules/d3-scale" - }, - { - "name": "d3-shape", - "version": "3.2.0", - "license": "ISC", - "homepage": "https://d3js.org/d3-shape/", - "repository": "https://github.com/d3/d3-shape.git", - "description": "Graphical primitives for visualization, such as lines and areas.", - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/d3-shape@3.2.0", - "sourcePackageDir": "apps/web/node_modules/d3-shape" - }, - { - "name": "d3-time", - "version": "3.1.0", - "license": "ISC", - "homepage": "https://d3js.org/d3-time/", - "repository": "https://github.com/d3/d3-time.git", - "description": "A calculator for humanity’s peculiar conventions of time.", - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/d3-time@3.1.0", - "sourcePackageDir": "apps/web/node_modules/d3-time" - }, - { - "name": "d3-time-format", - "version": "4.1.0", - "license": "ISC", - "homepage": "https://d3js.org/d3-time-format/", - "repository": "https://github.com/d3/d3-time-format.git", - "description": "A JavaScript time formatter and parser inspired by strftime and strptime.", - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/d3-time-format@4.1.0", - "sourcePackageDir": "apps/web/node_modules/d3-time-format" - }, - { - "name": "d3-timer", - "version": "3.0.1", - "license": "ISC", - "homepage": "https://d3js.org/d3-timer/", - "repository": "https://github.com/d3/d3-timer.git", - "description": "An efficient queue capable of managing thousands of concurrent animations.", - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/d3-timer@3.0.1", - "sourcePackageDir": "apps/web/node_modules/d3-timer" - }, - { - "name": "date-fns", - "version": "4.4.0", - "license": "MIT", - "homepage": null, - "repository": "https://github.com/date-fns/date-fns", - "description": "Modern JavaScript date utility library", - "files": [ - "LICENSE.md" - ], - "licenseFolder": "licenses/date-fns@4.4.0", - "sourcePackageDir": "apps/web/node_modules/date-fns" - }, - { - "name": "decimal.js-light", - "version": "2.5.1", - "license": "MIT", - "homepage": null, - "repository": "https://github.com/MikeMcl/decimal.js-light.git", - "description": "An arbitrary-precision Decimal type for JavaScript.", - "files": [ - "LICENCE.md" - ], - "licenseFolder": "licenses/decimal.js-light@2.5.1", - "sourcePackageDir": "apps/web/node_modules/decimal.js-light" + "sourcePackageDir": "apps/web/node_modules/comlink" }, { "name": "deepfilternet3-noise-filter", - "version": "1.3.0", + "version": "1.2.1", "license": "(Apache-2.0 OR MIT)", "homepage": "https://github.com/mezonai/mezon-noise-suppression#readme", "repository": "git+https://github.com/mezonai/mezon-noise-suppression.git", @@ -1030,104 +380,6 @@ "licenseFolder": "licenses/deepfilternet3-noise-filter@1.2.1", "sourcePackageDir": "packages/call/node_modules/deepfilternet3-noise-filter" }, - { - "name": "detect-node-es", - "version": "1.1.0", - "license": "MIT", - "homepage": "https://github.com/thekashey/detect-node", - "repository": "https://github.com/thekashey/detect-node", - "description": "Detect Node.JS (as opposite to browser environment). ESM modification", - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/detect-node-es@1.1.0", - "sourcePackageDir": "apps/web/node_modules/detect-node-es" - }, - { - "name": "dijkstrajs", - "version": "1.0.3", - "license": "MIT", - "homepage": "https://github.com/tcort/dijkstrajs", - "repository": "git://github.com/tcort/dijkstrajs", - "description": "A simple JavaScript implementation of Dijkstra's single-source shortest-paths algorithm.", - "files": [ - "LICENSE.md" - ], - "licenseFolder": "licenses/dijkstrajs@1.0.3", - "sourcePackageDir": "apps/web/node_modules/dijkstrajs" - }, - { - "name": "electron", - "version": "39.8.10", - "license": "MIT", - "homepage": null, - "repository": "https://github.com/electron/electron", - "description": "Build cross platform desktop apps with JavaScript, HTML, and CSS", - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/electron@39.8.10", - "sourcePackageDir": "apps/electron/node_modules/electron" - }, - { - "name": "electron-builder", - "version": "26.15.3", - "license": "MIT", - "homepage": "https://github.com/electron-userland/electron-builder", - "repository": "git+https://github.com/electron-userland/electron-builder.git", - "description": "A complete solution to package and build a ready for distribution Electron app for MacOS, Windows and Linux with “auto update” support out of the box", - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/electron-builder@26.15.3", - "sourcePackageDir": "apps/electron/node_modules/electron-builder" - }, - { - "name": "embla-carousel", - "version": "8.6.0", - "license": "MIT", - "homepage": "https://www.embla-carousel.com", - "repository": "git+https://github.com/davidjerleke/embla-carousel", - "description": "A lightweight carousel library with fluid motion and great swipe precision", - "files": [], - "licenseFolder": "licenses/embla-carousel@8.6.0", - "sourcePackageDir": "apps/web/node_modules/embla-carousel" - }, - { - "name": "embla-carousel-react", - "version": "8.6.0", - "license": "MIT", - "homepage": "https://www.embla-carousel.com", - "repository": "git+https://github.com/davidjerleke/embla-carousel", - "description": "A lightweight carousel library with fluid motion and great swipe precision", - "files": [], - "licenseFolder": "licenses/embla-carousel-react@8.6.0", - "sourcePackageDir": "apps/web/node_modules/embla-carousel-react" - }, - { - "name": "embla-carousel-reactive-utils", - "version": "8.6.0", - "license": "MIT", - "homepage": "https://www.embla-carousel.com", - "repository": "git+https://github.com/davidjerleke/embla-carousel", - "description": "Reactive utilities for Embla Carousel", - "files": [], - "licenseFolder": "licenses/embla-carousel-reactive-utils@8.6.0", - "sourcePackageDir": "apps/web/node_modules/embla-carousel-reactive-utils" - }, - { - "name": "es-toolkit", - "version": "1.49.0", - "license": "MIT", - "homepage": "https://es-toolkit.dev", - "repository": "https://github.com/toss/es-toolkit.git", - "description": "A state-of-the-art, high-performance JavaScript utility library with a small bundle size and strong type annotations.", - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/es-toolkit@1.49.0", - "sourcePackageDir": "apps/web/node_modules/es-toolkit" - }, { "name": "esbuild", "version": "0.25.12", @@ -1139,11 +391,11 @@ "LICENSE.md" ], "licenseFolder": "licenses/esbuild@0.25.12", - "sourcePackageDir": "apps/electron/node_modules/esbuild" + "sourcePackageDir": "apps/web/node_modules/esbuild" }, { "name": "eslint", - "version": "10.6.0", + "version": "10.3.0", "license": "MIT", "homepage": "https://eslint.org", "repository": "eslint/eslint", @@ -1151,7 +403,7 @@ "files": [ "LICENSE" ], - "licenseFolder": "licenses/eslint@10.6.0", + "licenseFolder": "licenses/eslint@10.3.0", "sourcePackageDir": "apps/web/node_modules/eslint" }, { @@ -1168,45 +420,21 @@ "sourcePackageDir": "node_modules/eslint-plugin-react-hooks" }, { - "name": "eventemitter3", - "version": "5.0.4", + "name": "framer-motion", + "version": "12.38.0", "license": "MIT", "homepage": null, - "repository": "git://github.com/primus/eventemitter3.git", - "description": "EventEmitter3 focuses on performance while maintaining a Node.js AND browser compatible interface.", + "repository": "https://github.com/motiondivision/motion/", + "description": "A simple and powerful JavaScript animation library", "files": [ - "LICENSE" + "LICENSE.md" ], - "licenseFolder": "licenses/eventemitter3@5.0.4", - "sourcePackageDir": "apps/web/node_modules/eventemitter3" - }, - { - "name": "fallow", - "version": "2.104.0", - "license": "MIT", - "homepage": "https://docs.fallow.tools", - "repository": "git+https://github.com/fallow-rs/fallow.git", - "description": "Deterministic codebase intelligence for TypeScript and JavaScript. Quality, risk, architecture, dependencies, duplication, and safe cleanup evidence for humans, CI, and agents. Optional runtime intelligence layer (Fallow Runtime) adds production execution evidence. Rust-native, sub-second, zero-config framework support.", - "files": [], - "licenseFolder": "licenses/fallow@2.104.0", - "sourcePackageDir": "node_modules/fallow" - }, - { - "name": "get-nonce", - "version": "1.0.1", - "license": "MIT", - "homepage": "https://github.com/theKashey/get-nonce", - "repository": "git@github.com:theKashey/get-nonce.git", - "description": "returns nonce", - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/get-nonce@1.0.1", - "sourcePackageDir": "apps/web/node_modules/get-nonce" + "licenseFolder": "licenses/framer-motion@12.38.0", + "sourcePackageDir": "apps/web/node_modules/framer-motion" }, { "name": "globals", - "version": "17.7.0", + "version": "17.6.0", "license": "MIT", "homepage": null, "repository": "sindresorhus/globals", @@ -1214,46 +442,9 @@ "files": [ "license" ], - "licenseFolder": "licenses/globals@17.7.0", + "licenseFolder": "licenses/globals@17.6.0", "sourcePackageDir": "apps/web/node_modules/globals" }, - { - "name": "immer", - "version": "10.2.0", - "license": "MIT", - "homepage": "https://github.com/immerjs/immer#readme", - "repository": "https://github.com/immerjs/immer.git", - "description": "Create your next immutable state by mutating the current one", - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/immer@10.2.0", - "sourcePackageDir": "apps/web/node_modules/immer" - }, - { - "name": "input-otp", - "version": "1.4.2", - "license": "MIT", - "homepage": "https://input-otp.rodz.dev/", - "repository": "git+https://github.com/guilhermerodz/input-otp.git", - "description": "One-time password input component for React.", - "files": [], - "licenseFolder": "licenses/input-otp@1.4.2", - "sourcePackageDir": "apps/web/node_modules/input-otp" - }, - { - "name": "internmap", - "version": "2.0.3", - "license": "ISC", - "homepage": "https://github.com/mbostock/internmap/", - "repository": "https://github.com/mbostock/internmap.git", - "description": "Map and Set with automatic key interning", - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/internmap@2.0.3", - "sourcePackageDir": "apps/web/node_modules/internmap" - }, { "name": "jsonc-parser", "version": "3.3.1", @@ -1269,7 +460,7 @@ }, { "name": "livekit-client", - "version": "2.20.0", + "version": "2.18.8", "license": "Apache-2.0", "homepage": null, "repository": "git@github.com:livekit/client-sdk-js.git", @@ -1277,12 +468,12 @@ "files": [ "LICENSE" ], - "licenseFolder": "licenses/livekit-client@2.20.0", + "licenseFolder": "licenses/livekit-client@2.18.8", "sourcePackageDir": "packages/call/node_modules/livekit-client" }, { "name": "lucide-react", - "version": "1.23.0", + "version": "1.14.0", "license": "ISC", "homepage": "https://lucide.dev", "repository": "https://github.com/lucide-icons/lucide.git", @@ -1290,49 +481,12 @@ "files": [ "LICENSE" ], - "licenseFolder": "licenses/lucide-react@1.23.0", - "sourcePackageDir": "apps/web/node_modules/lucide-react" - }, - { - "name": "mtp", - "version": "0.1.0", - "license": "UNKNOWN", - "homepage": null, - "repository": null, - "description": "MTP TypeScript SDK", - "files": [], - "licenseFolder": "licenses/mtp@0.1.0", - "sourcePackageDir": "packages/mtp/node_modules/mtp" - }, - { - "name": "next-themes", - "version": "0.4.6", - "license": "MIT", - "homepage": null, - "repository": "https://github.com/pacocoursey/next-themes.git", - "description": null, - "files": [ - "license.md" - ], - "licenseFolder": "licenses/next-themes@0.4.6", - "sourcePackageDir": "apps/web/node_modules/next-themes" - }, - { - "name": "pngjs", - "version": "5.0.0", - "license": "MIT", - "homepage": "https://github.com/lukeapage/pngjs", - "repository": "git://github.com/lukeapage/pngjs.git", - "description": "PNG encoder/decoder in pure JS, supporting any bit size & interlace, async & sync with full test suite.", - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/pngjs@5.0.0", - "sourcePackageDir": "apps/web/node_modules/pngjs" + "licenseFolder": "licenses/lucide-react@1.14.0", + "sourcePackageDir": "apps/tauri/node_modules/lucide-react" }, { "name": "prettier", - "version": "3.9.4", + "version": "3.8.3", "license": "MIT", "homepage": "https://prettier.io", "repository": "prettier/prettier", @@ -1340,7 +494,7 @@ "files": [ "LICENSE" ], - "licenseFolder": "licenses/prettier@3.9.4", + "licenseFolder": "licenses/prettier@3.8.3", "sourcePackageDir": "node_modules/prettier" }, { @@ -1358,7 +512,7 @@ }, { "name": "react", - "version": "19.2.7", + "version": "19.2.5", "license": "MIT", "homepage": "https://react.dev/", "repository": "https://github.com/facebook/react.git", @@ -1366,25 +520,12 @@ "files": [ "LICENSE" ], - "licenseFolder": "licenses/react@19.2.7", + "licenseFolder": "licenses/react@19.2.5", "sourcePackageDir": "apps/tauri/node_modules/react" }, - { - "name": "react-day-picker", - "version": "10.0.1", - "license": "MIT", - "homepage": "https://daypicker.dev", - "repository": "git+https://github.com/gpbl/react-day-picker.git", - "description": "Customizable Date Picker for React", - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/react-day-picker@10.0.1", - "sourcePackageDir": "apps/web/node_modules/react-day-picker" - }, { "name": "react-dom", - "version": "19.2.7", + "version": "19.2.5", "license": "MIT", "homepage": "https://react.dev/", "repository": "https://github.com/facebook/react.git", @@ -1392,85 +533,9 @@ "files": [ "LICENSE" ], - "licenseFolder": "licenses/react-dom@19.2.7", + "licenseFolder": "licenses/react-dom@19.2.5", "sourcePackageDir": "apps/tauri/node_modules/react-dom" }, - { - "name": "react-is", - "version": "19.2.7", - "license": "MIT", - "homepage": "https://react.dev/", - "repository": "https://github.com/facebook/react.git", - "description": "Brand checking of React Elements.", - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/react-is@19.2.7", - "sourcePackageDir": "apps/web/node_modules/react-is" - }, - { - "name": "react-redux", - "version": "9.3.0", - "license": "MIT", - "homepage": "https://github.com/reduxjs/react-redux", - "repository": "github:reduxjs/react-redux", - "description": "Official React bindings for Redux", - "files": [ - "LICENSE.md" - ], - "licenseFolder": "licenses/react-redux@9.3.0", - "sourcePackageDir": "apps/web/node_modules/react-redux" - }, - { - "name": "react-remove-scroll", - "version": "2.7.2", - "license": "MIT", - "homepage": null, - "repository": "https://github.com/theKashey/react-remove-scroll", - "description": "Disables scroll outside of `children` node.", - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/react-remove-scroll@2.7.2", - "sourcePackageDir": "apps/web/node_modules/react-remove-scroll" - }, - { - "name": "react-remove-scroll-bar", - "version": "2.3.8", - "license": "MIT", - "homepage": null, - "repository": "https://github.com/theKashey/react-remove-scroll-bar", - "description": "Removes body scroll without content _shake_", - "files": [], - "licenseFolder": "licenses/react-remove-scroll-bar@2.3.8", - "sourcePackageDir": "apps/web/node_modules/react-remove-scroll-bar" - }, - { - "name": "react-resizable-panels", - "version": "4.12.0", - "license": "MIT", - "homepage": "https://react-resizable-panels.vercel.app/", - "repository": "https://github.com/bvaughn/react-resizable-panels.git", - "description": null, - "files": [ - "LICENSE.md" - ], - "licenseFolder": "licenses/react-resizable-panels@4.12.0", - "sourcePackageDir": "apps/web/node_modules/react-resizable-panels" - }, - { - "name": "react-style-singleton", - "version": "2.2.3", - "license": "MIT", - "homepage": "https://github.com/theKashey/react-style-singleton#readme", - "repository": "https://github.com/theKashey/react-style-singleton", - "description": "Just create a single stylesheet...", - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/react-style-singleton@2.2.3", - "sourcePackageDir": "apps/web/node_modules/react-style-singleton" - }, { "name": "recharts", "version": "3.8.1", @@ -1482,89 +547,11 @@ "LICENSE" ], "licenseFolder": "licenses/recharts@3.8.1", - "sourcePackageDir": "apps/web/node_modules/recharts" - }, - { - "name": "redux", - "version": "5.0.1", - "license": "MIT", - "homepage": "http://redux.js.org", - "repository": "github:reduxjs/redux", - "description": "Predictable state container for JavaScript apps", - "files": [ - "LICENSE.md" - ], - "licenseFolder": "licenses/redux@5.0.1", - "sourcePackageDir": "apps/web/node_modules/redux" - }, - { - "name": "redux-thunk", - "version": "3.1.0", - "license": "MIT", - "homepage": "https://github.com/reduxjs/redux-thunk", - "repository": "github:reduxjs/redux-thunk", - "description": "Thunk middleware for Redux.", - "files": [ - "LICENSE.md" - ], - "licenseFolder": "licenses/redux-thunk@3.1.0", - "sourcePackageDir": "apps/web/node_modules/redux-thunk" - }, - { - "name": "reselect", - "version": "5.1.1", - "license": "MIT", - "homepage": null, - "repository": "https://github.com/reduxjs/reselect.git", - "description": "Selectors for Redux.", - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/reselect@5.1.1", - "sourcePackageDir": "apps/web/node_modules/reselect" - }, - { - "name": "scheduler", - "version": "0.27.0", - "license": "MIT", - "homepage": "https://react.dev/", - "repository": "https://github.com/facebook/react.git", - "description": "Cooperative scheduler for the browser environment.", - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/scheduler@0.27.0", - "sourcePackageDir": "apps/web/node_modules/scheduler" - }, - { - "name": "seroval", - "version": "1.5.4", - "license": "MIT", - "homepage": "https://github.com/lxsmnsyc/seroval/tree/main/packages/seroval", - "repository": "https://github.com/lxsmnsyc/seroval.git", - "description": "Stringify JS values", - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/seroval@1.5.4", - "sourcePackageDir": "apps/web/node_modules/seroval" - }, - { - "name": "seroval-plugins", - "version": "1.5.4", - "license": "MIT", - "homepage": "https://github.com/lxsmnsyc/seroval/tree/main/packages/plugins", - "repository": "https://github.com/lxsmnsyc/seroval.git", - "description": "Stringify JS values", - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/seroval-plugins@1.5.4", - "sourcePackageDir": "apps/web/node_modules/seroval-plugins" + "sourcePackageDir": "packages/call/node_modules/recharts" }, { "name": "shadcn", - "version": "4.12.0", + "version": "4.6.0", "license": "MIT", "homepage": null, "repository": "https://github.com/shadcn-ui/ui.git", @@ -1572,7 +559,7 @@ "files": [ "LICENSE.md" ], - "licenseFolder": "licenses/shadcn@4.12.0", + "licenseFolder": "licenses/shadcn@4.6.0", "sourcePackageDir": "apps/web/node_modules/shadcn" }, { @@ -1590,7 +577,7 @@ }, { "name": "tailwind-merge", - "version": "3.6.0", + "version": "3.5.0", "license": "MIT", "homepage": "https://github.com/dcastil/tailwind-merge", "repository": "https://github.com/dcastil/tailwind-merge.git", @@ -1598,7 +585,7 @@ "files": [ "LICENSE.md" ], - "licenseFolder": "licenses/tailwind-merge@3.6.0", + "licenseFolder": "licenses/tailwind-merge@3.5.0", "sourcePackageDir": "apps/web/node_modules/tailwind-merge" }, { @@ -1616,7 +603,7 @@ }, { "name": "tailwindcss", - "version": "4.3.2", + "version": "4.2.4", "license": "MIT", "homepage": "https://tailwindcss.com", "repository": "https://github.com/tailwindlabs/tailwindcss.git", @@ -1624,7 +611,7 @@ "files": [ "LICENSE" ], - "licenseFolder": "licenses/tailwindcss@4.3.2", + "licenseFolder": "licenses/tailwindcss@4.2.4", "sourcePackageDir": "apps/web/node_modules/tailwindcss" }, { @@ -1638,33 +625,7 @@ "LICENSE" ], "licenseFolder": "licenses/tauri-plugin-app-events-api@0.2.0", - "sourcePackageDir": "packages/mtp/node_modules/tauri-plugin-app-events-api" - }, - { - "name": "tiny-invariant", - "version": "1.3.3", - "license": "MIT", - "homepage": null, - "repository": "https://github.com/alexreardon/tiny-invariant.git", - "description": "A tiny invariant function", - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/tiny-invariant@1.3.3", - "sourcePackageDir": "apps/web/node_modules/tiny-invariant" - }, - { - "name": "tslib", - "version": "2.8.1", - "license": "0BSD", - "homepage": "https://www.typescriptlang.org/", - "repository": "https://github.com/Microsoft/tslib.git", - "description": "Runtime library for TypeScript helper functions", - "files": [ - "LICENSE.txt" - ], - "licenseFolder": "licenses/tslib@2.8.1", - "sourcePackageDir": "apps/web/node_modules/tslib" + "sourcePackageDir": "apps/web/node_modules/tauri-plugin-app-events-api" }, { "name": "tw-animate-css", @@ -1690,11 +651,11 @@ "LICENSE.txt" ], "licenseFolder": "licenses/typescript@6.0.3", - "sourcePackageDir": "apps/electron/node_modules/typescript" + "sourcePackageDir": "apps/web/node_modules/typescript" }, { "name": "typescript-eslint", - "version": "8.62.1", + "version": "8.59.1", "license": "MIT", "homepage": "https://typescript-eslint.io/packages/typescript-eslint", "repository": "https://github.com/typescript-eslint/typescript-eslint.git", @@ -1702,75 +663,12 @@ "files": [ "LICENSE" ], - "licenseFolder": "licenses/typescript-eslint@8.62.1", + "licenseFolder": "licenses/typescript-eslint@8.59.1", "sourcePackageDir": "apps/web/node_modules/typescript-eslint" }, - { - "name": "use-callback-ref", - "version": "1.3.3", - "license": "MIT", - "homepage": null, - "repository": "https://github.com/theKashey/use-callback-ref/", - "description": "The same useRef, but with callback", - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/use-callback-ref@1.3.3", - "sourcePackageDir": "apps/web/node_modules/use-callback-ref" - }, - { - "name": "use-sidecar", - "version": "1.1.3", - "license": "MIT", - "homepage": "https://github.com/theKashey/use-sidecar", - "repository": "https://github.com/theKashey/use-sidecar", - "description": "Sidecar code splitting utils", - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/use-sidecar@1.1.3", - "sourcePackageDir": "apps/web/node_modules/use-sidecar" - }, - { - "name": "use-sync-external-store", - "version": "1.6.0", - "license": "MIT", - "homepage": null, - "repository": "https://github.com/facebook/react.git", - "description": "Backwards compatible shim for React's useSyncExternalStore. Works with any React that supports hooks.", - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/use-sync-external-store@1.6.0", - "sourcePackageDir": "apps/web/node_modules/use-sync-external-store" - }, - { - "name": "vaul", - "version": "1.1.2", - "license": "MIT", - "homepage": "https://vaul.emilkowal.ski/", - "repository": "https://github.com/emilkowalski/vaul.git", - "description": "Drawer component for React.", - "files": [ - "LICENSE.md" - ], - "licenseFolder": "licenses/vaul@1.1.2", - "sourcePackageDir": "apps/web/node_modules/vaul" - }, - { - "name": "victory-vendor", - "version": "37.3.6", - "license": "MIT AND ISC", - "homepage": "https://commerce.nearform.com/open-source/victory", - "repository": "https://github.com/FormidableLabs/victory", - "description": "Vendored dependencies for Victory", - "files": [], - "licenseFolder": "licenses/victory-vendor@37.3.6", - "sourcePackageDir": "apps/web/node_modules/victory-vendor" - }, { "name": "vite", - "version": "8.1.3", + "version": "8.0.10", "license": "MIT", "homepage": "https://vite.dev", "repository": "git+https://github.com/vitejs/vite.git", @@ -1778,51 +676,12 @@ "files": [ "LICENSE.md" ], - "licenseFolder": "licenses/vite@8.1.3", + "licenseFolder": "licenses/vite@8.0.10", "sourcePackageDir": "apps/web/node_modules/vite" }, - { - "name": "vitest", - "version": "4.1.9", - "license": "MIT", - "homepage": "https://vitest.dev", - "repository": "git+https://github.com/vitest-dev/vitest.git", - "description": "Next generation testing framework powered by Vite", - "files": [ - "LICENSE.md" - ], - "licenseFolder": "licenses/vitest@4.1.9", - "sourcePackageDir": "node_modules/vitest" - }, - { - "name": "yaml", - "version": "2.9.0", - "license": "ISC", - "homepage": "https://eemeli.org/yaml/", - "repository": "github:eemeli/yaml", - "description": "JavaScript parser and stringifier for YAML", - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/yaml@2.9.0", - "sourcePackageDir": "node_modules/yaml" - }, - { - "name": "yargs", - "version": "15.4.1", - "license": "MIT", - "homepage": "https://yargs.js.org/", - "repository": "https://github.com/yargs/yargs.git", - "description": "yargs the modern, pirate-themed, successor to optimist.", - "files": [ - "LICENSE" - ], - "licenseFolder": "licenses/yargs@15.4.1", - "sourcePackageDir": "apps/web/node_modules/yargs" - }, { "name": "zod", - "version": "4.4.3", + "version": "4.4.2", "license": "MIT", "homepage": "https://zod.dev", "repository": "git+https://github.com/colinhacks/zod.git", @@ -1830,12 +689,12 @@ "files": [ "LICENSE" ], - "licenseFolder": "licenses/zod@4.4.3", + "licenseFolder": "licenses/zod@4.4.2", "sourcePackageDir": "apps/web/node_modules/zod" }, { "name": "zustand", - "version": "5.0.14", + "version": "5.0.12", "license": "MIT", "homepage": "https://github.com/pmndrs/zustand", "repository": "git+https://github.com/pmndrs/zustand.git", @@ -1843,8 +702,8 @@ "files": [ "LICENSE" ], - "licenseFolder": "licenses/zustand@5.0.14", + "licenseFolder": "licenses/zustand@5.0.12", "sourcePackageDir": "packages/call/node_modules/zustand" } ] -} +} \ No newline at end of file diff --git a/licenses/tiny-invariant@1.3.3/LICENSE b/licenses/tiny-invariant@1.3.3/LICENSE deleted file mode 100644 index f3dcb58..0000000 --- a/licenses/tiny-invariant@1.3.3/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2019 Alexander Reardon - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file diff --git a/licenses/tslib@2.8.1/LICENSE.txt b/licenses/tslib@2.8.1/LICENSE.txt deleted file mode 100644 index bfe6430..0000000 --- a/licenses/tslib@2.8.1/LICENSE.txt +++ /dev/null @@ -1,12 +0,0 @@ -Copyright (c) Microsoft Corporation. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. \ No newline at end of file diff --git a/licenses/typescript-eslint@8.62.1/LICENSE b/licenses/typescript-eslint@8.59.1/LICENSE similarity index 100% rename from licenses/typescript-eslint@8.62.1/LICENSE rename to licenses/typescript-eslint@8.59.1/LICENSE diff --git a/licenses/use-callback-ref@1.3.3/LICENSE b/licenses/use-callback-ref@1.3.3/LICENSE deleted file mode 100644 index a194c88..0000000 --- a/licenses/use-callback-ref@1.3.3/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2017 Anton Korzunov - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/licenses/use-sidecar@1.1.3/LICENSE b/licenses/use-sidecar@1.1.3/LICENSE deleted file mode 100644 index a194c88..0000000 --- a/licenses/use-sidecar@1.1.3/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2017 Anton Korzunov - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/licenses/use-sync-external-store@1.6.0/LICENSE b/licenses/use-sync-external-store@1.6.0/LICENSE deleted file mode 100644 index b93be90..0000000 --- a/licenses/use-sync-external-store@1.6.0/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) Meta Platforms, Inc. and affiliates. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/licenses/vaul@1.1.2/LICENSE.md b/licenses/vaul@1.1.2/LICENSE.md deleted file mode 100644 index 03986c1..0000000 --- a/licenses/vaul@1.1.2/LICENSE.md +++ /dev/null @@ -1,9 +0,0 @@ -MIT License - -Copyright (c) 2023 Emil Kowalski - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/licenses/vite@8.1.3/LICENSE.md b/licenses/vite@8.0.10/LICENSE.md similarity index 97% rename from licenses/vite@8.1.3/LICENSE.md rename to licenses/vite@8.0.10/LICENSE.md index ccf4c21..0aabee5 100644 --- a/licenses/vite@8.1.3/LICENSE.md +++ b/licenses/vite@8.0.10/LICENSE.md @@ -369,34 +369,6 @@ Repository: https://github.com/vitest-dev/vitest --------------------------------------- -## @voidzero-dev/vite-task-client -License: MIT -Repository: https://github.com/voidzero-dev/vite-task - -> MIT License -> -> Copyright (c) 2026-present, VoidZero Inc. -> -> Permission is hereby granted, free of charge, to any person obtaining a copy -> of this software and associated documentation files (the "Software"), to deal -> in the Software without restriction, including without limitation the rights -> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -> copies of the Software, and to permit persons to whom the Software is -> furnished to do so, subject to the following conditions: -> -> The above copyright notice and this permission notice shall be included in all -> copies or substantial portions of the Software. -> -> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -> SOFTWARE. - ---------------------------------------- - ## anymatch License: ISC By: Elan Shanker @@ -990,35 +962,6 @@ Repository: https://github.com/follow-redirects/follow-redirects --------------------------------------- -## fresh-import -License: MIT -By: sapphi-red -Repository: https://github.com/sapphi-red/fresh-import - -> MIT License -> -> Copyright (c) 2026 sapphi-red -> -> Permission is hereby granted, free of charge, to any person obtaining a copy -> of this software and associated documentation files (the "Software"), to deal -> in the Software without restriction, including without limitation the rights -> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -> copies of the Software, and to permit persons to whom the Software is -> furnished to do so, subject to the following conditions: -> -> The above copyright notice and this permission notice shall be included in all -> copies or substantial portions of the Software. -> -> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -> SOFTWARE. - ---------------------------------------- - ## generic-names License: MIT By: Alexey Litvinov @@ -1274,7 +1217,7 @@ Repository: https://github.com/lydell/js-tokens ## launch-editor, launch-editor-middleware License: MIT By: Evan You -Repositories: https://github.com/vitejs/launch-editor, https://github.com/vitejs/launch-editor +Repositories: https://github.com/yyx990803/launch-editor, https://github.com/yyx990803/launch-editor > The MIT License (MIT) > diff --git a/licenses/vitest@4.1.9/LICENSE.md b/licenses/vitest@4.1.9/LICENSE.md deleted file mode 100644 index d2883c9..0000000 --- a/licenses/vitest@4.1.9/LICENSE.md +++ /dev/null @@ -1,811 +0,0 @@ -# Vitest core license -Vitest is released under the MIT license: - -MIT License - -Copyright (c) 2021-Present VoidZero Inc. and Vitest contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -# Licenses of bundled dependencies -The published Vitest artifact additionally contains code with the following licenses: -BSD-3-Clause, ISC, MIT - -# Bundled dependencies: -## @antfu/install-pkg -License: MIT -By: Anthony Fu -Repository: git+https://github.com/antfu/install-pkg.git - -> MIT License -> -> Copyright (c) 2021 Anthony Fu -> -> Permission is hereby granted, free of charge, to any person obtaining a copy -> of this software and associated documentation files (the "Software"), to deal -> in the Software without restriction, including without limitation the rights -> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -> copies of the Software, and to permit persons to whom the Software is -> furnished to do so, subject to the following conditions: -> -> The above copyright notice and this permission notice shall be included in all -> copies or substantial portions of the Software. -> -> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -> SOFTWARE. - ---------------------------------------- - -## @bomb.sh/tab -License: MIT -By: Bombshell Authors -Repository: git+https://github.com/bombshell-dev/tab.git - ---------------------------------------- - -## @jridgewell/resolve-uri -License: MIT -By: Justin Ridgewell -Repository: https://github.com/jridgewell/resolve-uri - -> Copyright 2019 Justin Ridgewell -> -> Permission is hereby granted, free of charge, to any person obtaining a copy -> of this software and associated documentation files (the "Software"), to deal -> in the Software without restriction, including without limitation the rights -> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -> copies of the Software, and to permit persons to whom the Software is -> furnished to do so, subject to the following conditions: -> -> The above copyright notice and this permission notice shall be included in -> all copies or substantial portions of the Software. -> -> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -> SOFTWARE. - ---------------------------------------- - -## @jridgewell/sourcemap-codec -License: MIT -By: Justin Ridgewell -Repository: git+https://github.com/jridgewell/sourcemaps.git - -> Copyright 2024 Justin Ridgewell -> -> Permission is hereby granted, free of charge, to any person obtaining a copy -> of this software and associated documentation files (the "Software"), to deal -> in the Software without restriction, including without limitation the rights -> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -> copies of the Software, and to permit persons to whom the Software is -> furnished to do so, subject to the following conditions: -> -> The above copyright notice and this permission notice shall be included in -> all copies or substantial portions of the Software. -> -> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -> SOFTWARE. - ---------------------------------------- - -## @jridgewell/trace-mapping -License: MIT -By: Justin Ridgewell -Repository: git+https://github.com/jridgewell/sourcemaps.git - -> Copyright 2024 Justin Ridgewell -> -> Permission is hereby granted, free of charge, to any person obtaining a copy -> of this software and associated documentation files (the "Software"), to deal -> in the Software without restriction, including without limitation the rights -> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -> copies of the Software, and to permit persons to whom the Software is -> furnished to do so, subject to the following conditions: -> -> The above copyright notice and this permission notice shall be included in -> all copies or substantial portions of the Software. -> -> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -> SOFTWARE. - ---------------------------------------- - -## @sinonjs/commons -License: BSD-3-Clause -Repository: git+https://github.com/sinonjs/commons.git - -> BSD 3-Clause License -> -> Copyright (c) 2018, Sinon.JS -> All rights reserved. -> -> Redistribution and use in source and binary forms, with or without -> modification, are permitted provided that the following conditions are met: -> -> * Redistributions of source code must retain the above copyright notice, this -> list of conditions and the following disclaimer. -> -> * Redistributions in binary form must reproduce the above copyright notice, -> this list of conditions and the following disclaimer in the documentation -> and/or other materials provided with the distribution. -> -> * Neither the name of the copyright holder nor the names of its -> contributors may be used to endorse or promote products derived from -> this software without specific prior written permission. -> -> THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -> AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -> IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -> DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -> FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -> DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -> SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -> CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -> OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -> OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ---------------------------------------- - -## @sinonjs/fake-timers -License: BSD-3-Clause -By: Christian Johansen -Repository: git+https://github.com/sinonjs/fake-timers.git - -> Copyright (c) 2010-2014, Christian Johansen, christian@cjohansen.no. All rights reserved. -> -> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: -> -> 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. -> -> 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -> -> 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. -> -> THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ---------------------------------------- - -## acorn -License: MIT -By: Marijn Haverbeke, Ingvar Stepanyan, Adrian Heine -Repository: https://github.com/acornjs/acorn.git - -> MIT License -> -> Copyright (C) 2012-2022 by various contributors (see AUTHORS) -> -> Permission is hereby granted, free of charge, to any person obtaining a copy -> of this software and associated documentation files (the "Software"), to deal -> in the Software without restriction, including without limitation the rights -> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -> copies of the Software, and to permit persons to whom the Software is -> furnished to do so, subject to the following conditions: -> -> The above copyright notice and this permission notice shall be included in -> all copies or substantial portions of the Software. -> -> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -> THE SOFTWARE. - ---------------------------------------- - -## acorn-walk -License: MIT -By: Marijn Haverbeke, Ingvar Stepanyan, Adrian Heine -Repository: https://github.com/acornjs/acorn.git - -> MIT License -> -> Copyright (C) 2012-2020 by various contributors (see AUTHORS) -> -> Permission is hereby granted, free of charge, to any person obtaining a copy -> of this software and associated documentation files (the "Software"), to deal -> in the Software without restriction, including without limitation the rights -> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -> copies of the Software, and to permit persons to whom the Software is -> furnished to do so, subject to the following conditions: -> -> The above copyright notice and this permission notice shall be included in -> all copies or substantial portions of the Software. -> -> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -> THE SOFTWARE. - ---------------------------------------- - -## birpc -License: MIT -By: Anthony Fu -Repository: git+https://github.com/antfu-collective/birpc.git - -> MIT License -> -> Copyright (c) 2021 Anthony Fu -> -> Permission is hereby granted, free of charge, to any person obtaining a copy -> of this software and associated documentation files (the "Software"), to deal -> in the Software without restriction, including without limitation the rights -> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -> copies of the Software, and to permit persons to whom the Software is -> furnished to do so, subject to the following conditions: -> -> The above copyright notice and this permission notice shall be included in all -> copies or substantial portions of the Software. -> -> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -> SOFTWARE. - ---------------------------------------- - -## cac -License: MIT -By: egoist -Repository: egoist/cac - -> The MIT License (MIT) -> -> Copyright (c) EGOIST <0x142857@gmail.com> (https://github.com/egoist) -> -> Permission is hereby granted, free of charge, to any person obtaining a copy -> of this software and associated documentation files (the "Software"), to deal -> in the Software without restriction, including without limitation the rights -> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -> copies of the Software, and to permit persons to whom the Software is -> furnished to do so, subject to the following conditions: -> -> The above copyright notice and this permission notice shall be included in -> all copies or substantial portions of the Software. -> -> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -> THE SOFTWARE. - ---------------------------------------- - -## empathic -License: MIT -By: Luke Edwards -Repository: lukeed/empathic - -> MIT License -> -> Copyright (c) Luke Edwards (lukeed.com) -> -> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -> -> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -> -> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ---------------------------------------- - -## flatted -License: ISC -By: Andrea Giammarchi -Repository: git+https://github.com/WebReflection/flatted.git - -> ISC License -> -> Copyright (c) 2018-2020, Andrea Giammarchi, @WebReflection -> -> Permission to use, copy, modify, and/or distribute this software for any -> purpose with or without fee is hereby granted, provided that the above -> copyright notice and this permission notice appear in all copies. -> -> THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -> REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -> AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -> INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -> LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE -> OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -> PERFORMANCE OF THIS SOFTWARE. - ---------------------------------------- - -## js-tokens -License: MIT -By: Simon Lydell -Repository: lydell/js-tokens - -> The MIT License (MIT) -> -> Copyright (c) 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023 Simon Lydell -> -> Permission is hereby granted, free of charge, to any person obtaining a copy -> of this software and associated documentation files (the "Software"), to deal -> in the Software without restriction, including without limitation the rights -> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -> copies of the Software, and to permit persons to whom the Software is -> furnished to do so, subject to the following conditions: -> -> The above copyright notice and this permission notice shall be included in -> all copies or substantial portions of the Software. -> -> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -> THE SOFTWARE. - ---------------------------------------- - -## kleur -License: MIT -By: Luke Edwards -Repository: lukeed/kleur - -> The MIT License (MIT) -> -> Copyright (c) Luke Edwards (lukeed.com) -> -> Permission is hereby granted, free of charge, to any person obtaining a copy -> of this software and associated documentation files (the "Software"), to deal -> in the Software without restriction, including without limitation the rights -> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -> copies of the Software, and to permit persons to whom the Software is -> furnished to do so, subject to the following conditions: -> -> The above copyright notice and this permission notice shall be included in -> all copies or substantial portions of the Software. -> -> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -> THE SOFTWARE. - ---------------------------------------- - -## local-pkg -License: MIT -By: Anthony Fu -Repository: git+https://github.com/antfu-collective/local-pkg.git - -> MIT License -> -> Copyright (c) 2021 Anthony Fu -> -> Permission is hereby granted, free of charge, to any person obtaining a copy -> of this software and associated documentation files (the "Software"), to deal -> in the Software without restriction, including without limitation the rights -> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -> copies of the Software, and to permit persons to whom the Software is -> furnished to do so, subject to the following conditions: -> -> The above copyright notice and this permission notice shall be included in all -> copies or substantial portions of the Software. -> -> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -> SOFTWARE. - ---------------------------------------- - -## mime -License: MIT -By: Robert Kieffer -Repository: https://github.com/broofa/mime - -> MIT License -> -> Copyright (c) 2023 Robert Kieffer -> -> Permission is hereby granted, free of charge, to any person obtaining a copy -> of this software and associated documentation files (the "Software"), to deal -> in the Software without restriction, including without limitation the rights -> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -> copies of the Software, and to permit persons to whom the Software is -> furnished to do so, subject to the following conditions: -> -> The above copyright notice and this permission notice shall be included in all -> copies or substantial portions of the Software. -> -> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -> SOFTWARE. - ---------------------------------------- - -## mlly -License: MIT -Repository: unjs/mlly - -> MIT License -> -> Copyright (c) Pooya Parsa -> -> Permission is hereby granted, free of charge, to any person obtaining a copy -> of this software and associated documentation files (the "Software"), to deal -> in the Software without restriction, including without limitation the rights -> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -> copies of the Software, and to permit persons to whom the Software is -> furnished to do so, subject to the following conditions: -> -> The above copyright notice and this permission notice shall be included in all -> copies or substantial portions of the Software. -> -> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -> SOFTWARE. - ---------------------------------------- - -## package-manager-detector -License: MIT -By: Anthony Fu -Repository: git+https://github.com/antfu-collective/package-manager-detector.git - -> MIT License -> -> Copyright (c) 2020-PRESENT Anthony Fu -> -> Permission is hereby granted, free of charge, to any person obtaining a copy -> of this software and associated documentation files (the "Software"), to deal -> in the Software without restriction, including without limitation the rights -> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -> copies of the Software, and to permit persons to whom the Software is -> furnished to do so, subject to the following conditions: -> -> The above copyright notice and this permission notice shall be included in all -> copies or substantial portions of the Software. -> -> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -> SOFTWARE. - ---------------------------------------- - -## prompts -License: MIT -By: Terkel Gjervig -Repository: terkelg/prompts - -> MIT License -> -> Copyright (c) 2018 Terkel Gjervig Nielsen -> -> Permission is hereby granted, free of charge, to any person obtaining a copy -> of this software and associated documentation files (the "Software"), to deal -> in the Software without restriction, including without limitation the rights -> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -> copies of the Software, and to permit persons to whom the Software is -> furnished to do so, subject to the following conditions: -> -> The above copyright notice and this permission notice shall be included in all -> copies or substantial portions of the Software. -> -> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -> SOFTWARE. - ---------------------------------------- - -## quansync -License: MIT -By: Anthony Fu, 三咲智子 Kevin Deng -Repository: git+https://github.com/quansync-dev/quansync.git - -> MIT License -> -> Copyright (c) 2025-PRESENT Anthony Fu and Kevin Deng -> -> Permission is hereby granted, free of charge, to any person obtaining a copy -> of this software and associated documentation files (the "Software"), to deal -> in the Software without restriction, including without limitation the rights -> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -> copies of the Software, and to permit persons to whom the Software is -> furnished to do so, subject to the following conditions: -> -> The above copyright notice and this permission notice shall be included in all -> copies or substantial portions of the Software. -> -> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -> SOFTWARE. - ---------------------------------------- - -## sisteransi -License: MIT -By: Terkel Gjervig -Repository: https://github.com/terkelg/sisteransi - -> MIT License -> -> Copyright (c) 2018 Terkel Gjervig Nielsen -> -> Permission is hereby granted, free of charge, to any person obtaining a copy -> of this software and associated documentation files (the "Software"), to deal -> in the Software without restriction, including without limitation the rights -> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -> copies of the Software, and to permit persons to whom the Software is -> furnished to do so, subject to the following conditions: -> -> The above copyright notice and this permission notice shall be included in all -> copies or substantial portions of the Software. -> -> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -> SOFTWARE. - ---------------------------------------- - -## strip-literal -License: MIT -By: Anthony Fu -Repository: git+https://github.com/antfu/strip-literal.git - -> MIT License -> -> Copyright (c) 2022 Anthony Fu -> -> Permission is hereby granted, free of charge, to any person obtaining a copy -> of this software and associated documentation files (the "Software"), to deal -> in the Software without restriction, including without limitation the rights -> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -> copies of the Software, and to permit persons to whom the Software is -> furnished to do so, subject to the following conditions: -> -> The above copyright notice and this permission notice shall be included in all -> copies or substantial portions of the Software. -> -> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -> SOFTWARE. - ---------------------------------------- - -## tinyhighlight -License: MIT -Repository: git+https://github.com/tinylibs/tinyhighlight.git - -> # Tinyhighlight core license -> -> MIT License -> -> Copyright (c) 2023 Tinylibs -> -> Permission is hereby granted, free of charge, to any person obtaining a copy -> of this software and associated documentation files (the "Software"), to deal -> in the Software without restriction, including without limitation the rights -> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -> copies of the Software, and to permit persons to whom the Software is -> furnished to do so, subject to the following conditions: -> -> The above copyright notice and this permission notice shall be included in all -> copies or substantial portions of the Software. -> -> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -> SOFTWARE. -> -> # Additionaly Tinyhighlight modifies code with the following licenses: -> -> MIT -> -> ## @babel/highlight -> -> MIT License -> -> Copyright (c) 2014-present Sebastian McKenzie and other contributors -> -> Permission is hereby granted, free of charge, to any person obtaining -> a copy of this software and associated documentation files (the -> "Software"), to deal in the Software without restriction, including -> without limitation the rights to use, copy, modify, merge, publish, -> distribute, sublicense, and/or sell copies of the Software, and to -> permit persons to whom the Software is furnished to do so, subject to -> the following conditions: -> -> The above copyright notice and this permission notice shall be -> included in all copies or substantial portions of the Software. -> -> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -> NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -> LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -> OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -> WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -> -> ## @babel/helper-validator-identifier -> -> MIT License -> -> Copyright (c) 2014-present Sebastian McKenzie and other contributors -> -> Permission is hereby granted, free of charge, to any person obtaining -> a copy of this software and associated documentation files (the -> "Software"), to deal in the Software without restriction, including -> without limitation the rights to use, copy, modify, merge, publish, -> distribute, sublicense, and/or sell copies of the Software, and to -> permit persons to whom the Software is furnished to do so, subject to -> the following conditions: -> -> The above copyright notice and this permission notice shall be -> included in all copies or substantial portions of the Software. -> -> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -> NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -> LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -> OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -> WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ---------------------------------------- - -## type-detect -License: MIT -By: Jake Luer, Keith Cirkel, David Losert, Aleksey Shvayka, Lucas Fernandes da Costa, Grant Snodgrass, Jeremy Tice, Edward Betts, dvlsg, Amila Welihinda, Jake Champion, Miroslav Bajtoš -Repository: git+ssh://git@github.com/chaijs/type-detect.git - -> Copyright (c) 2013 Jake Luer (http://alogicalparadox.com) -> -> Permission is hereby granted, free of charge, to any person obtaining a copy -> of this software and associated documentation files (the "Software"), to deal -> in the Software without restriction, including without limitation the rights -> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -> copies of the Software, and to permit persons to whom the Software is -> furnished to do so, subject to the following conditions: -> -> The above copyright notice and this permission notice shall be included in -> all copies or substantial portions of the Software. -> -> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -> THE SOFTWARE. - ---------------------------------------- - -## ufo -License: MIT -Repository: unjs/ufo - -> MIT License -> -> Copyright (c) Pooya Parsa -> -> Permission is hereby granted, free of charge, to any person obtaining a copy -> of this software and associated documentation files (the "Software"), to deal -> in the Software without restriction, including without limitation the rights -> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -> copies of the Software, and to permit persons to whom the Software is -> furnished to do so, subject to the following conditions: -> -> The above copyright notice and this permission notice shall be included in all -> copies or substantial portions of the Software. -> -> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -> SOFTWARE. - ---------------------------------------- - -## ws -License: MIT -By: Einar Otto Stangvik -Repository: git+https://github.com/websockets/ws.git - -> Copyright (c) 2011 Einar Otto Stangvik -> Copyright (c) 2013 Arnout Kazemier and contributors -> Copyright (c) 2016 Luigi Pinca and contributors -> -> Permission is hereby granted, free of charge, to any person obtaining a copy of -> this software and associated documentation files (the "Software"), to deal in -> the Software without restriction, including without limitation the rights to -> use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -> the Software, and to permit persons to whom the Software is furnished to do so, -> subject to the following conditions: -> -> The above copyright notice and this permission notice shall be included in all -> copies or substantial portions of the Software. -> -> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -> FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -> COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -> IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -> CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/licenses/yaml@2.9.0/LICENSE b/licenses/yaml@2.9.0/LICENSE deleted file mode 100644 index e060aaa..0000000 --- a/licenses/yaml@2.9.0/LICENSE +++ /dev/null @@ -1,13 +0,0 @@ -Copyright Eemeli Aro - -Permission to use, copy, modify, and/or distribute this software for any purpose -with or without fee is hereby granted, provided that the above copyright notice -and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS -OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER -TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF -THIS SOFTWARE. diff --git a/licenses/yargs@15.4.1/LICENSE b/licenses/yargs@15.4.1/LICENSE deleted file mode 100644 index b0145ca..0000000 --- a/licenses/yargs@15.4.1/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright 2010 James Halliday (mail@substack.net); Modified work Copyright 2014 Contributors (ben@npmjs.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/licenses/zod@4.4.3/LICENSE b/licenses/zod@4.4.2/LICENSE similarity index 100% rename from licenses/zod@4.4.3/LICENSE rename to licenses/zod@4.4.2/LICENSE diff --git a/licenses/zustand@5.0.14/LICENSE b/licenses/zustand@5.0.12/LICENSE similarity index 100% rename from licenses/zustand@5.0.14/LICENSE rename to licenses/zustand@5.0.12/LICENSE diff --git a/package.json b/package.json index 3765f87..5256dcd 100644 --- a/package.json +++ b/package.json @@ -2,35 +2,35 @@ "name": "tensamin", "version": "0.0.10", "private": true, - "packageManager": "pnpm@11.8.0", "workspaces": [ "packages/*", "apps/*" ], "type": "module", "scripts": { - "format": "pnpm exec prettier --write .", - "lint": "node scripts/lint-packages.ts", - "check": "fallow && pnpm run lint", - "copy-licenses": "node scripts/copy-licenses.ts", - "copy-releases": "node scripts/copy-releases.ts", - "pre-build": "pnpm run lint && pnpm run build:packages", - "build:apps": "pnpm run copy-licenses && pnpm run pre-build && pnpm run build:mobile && pnpm run build:desktop && pnpm run copy-releases", - "build:packages": "node scripts/build-packages.ts", - "update:packages": "node scripts/update-packages.ts", - "dev:web": "cd apps/web && pnpm dev", - "build:web": "cd apps/web && pnpm run build", - "preview:web": "cd apps/web && pnpm run preview", - "dev:mobile": "cd apps/tauri && pnpm dev:mobile", - "build:mobile": "cd apps/tauri && pnpm run build:mobile", - "start-adb:mobile": "cd apps/tauri && pnpm run start-adb:mobile", - "dev:desktop": "cd apps/electron && pnpm run dev", - "build:desktop": "cd apps/electron && pnpm run package", - "delete:mobile": "cd apps/tauri && nix develop ../..#tauri --command adb uninstall net.tensamin.client" + "format": "bunx prettier --write .", + "lint": "bun scripts/lint-packages.ts", + "check": "fallow && bun run lint", + "copy-licenses": "bun scripts/copy-licenses.ts", + "copy-releases": "bun scripts/copy-releases.ts", + "pre-build": "bun run lint && bun run build:packages", + "build:apps": "bun run copy-licenses && bun run pre-build && bun run build:mobile && bun run build:desktop && bun --bun run copy-releases", + "build:packages": "bun scripts/build-packages.ts", + "update:packages": "bun scripts/update-packages.ts", + "dev:web": "cd apps/web && bun dev", + "build:web": "cd apps/web && bun run build", + "preview:web": "cd apps/web && bun run preview", + "dev:mobile": "cd apps/tauri && bun dev:mobile", + "build:mobile": "cd apps/tauri && bun run build:mobile", + "start-adb:mobile": "cd apps/tauri && bun run start-adb:mobile", + "dev:desktop": "cd apps/electron && bun run dev", + "build:desktop": "cd apps/electron && bun run package", + "run:desktop": "TENSAMIN_DEB=\"$PWD/apps/electron/release/Tensamin-$(node -p \\\"require('./package.json').version\\\")-linux-amd64.deb\" nix run .#localPathForDev --impure", + "delete:mobile": "cd apps/tauri && nix develop --command adb uninstall net.tensamin.client" }, "devDependencies": { "@eslint/js": "^10.0.1", - "@types/node": "^26.1.0", + "@types/node": "^25.6.0", "@types/react": "^19.2.14", "@types/react-dom": "^19.2.3", "@typescript-eslint/parser": "^8.59.1", @@ -41,13 +41,15 @@ "jsonc-parser": "^3.3.1", "prettier": "^3.8.3", "typescript": "^6.0.3", - "typescript-eslint": "^8.59.1", - "vitest": "^4.0.8", - "yaml": "^2.8.2" + "typescript-eslint": "^8.59.1" + }, + "overrides": { + "@tensamin/ui": "https://git.methanium.net/tensamin/ui/archive/0.0.37.tar.gz", + "@tensamin/ttp-core": "https://git.methanium.net/tensamin/ttp/archive/0.0.24.tar.gz" }, "dependencies": { + "@tensamin/ttp-core": "*", "@tensamin/ui": "*", - "mtp": "*", "sonner": "^2.0.7" } } diff --git a/packages/cache/package.json b/packages/cache/package.json deleted file mode 100644 index b8397ed..0000000 --- a/packages/cache/package.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "name": "@tensamin/cache", - "private": true, - "version": "0.0.0", - "type": "module", - "exports": { - ".": "./src/index.ts", - "./helpers": "./src/helpers.ts", - "./schemas": "./src/schemas.ts", - "./sync": "./src/sync.tsx" - }, - "scripts": { - "format": "pnpm exec prettier --write .", - "lint": "eslint src", - "test": "vitest run", - "build": "pnpm run test && tsc -p tsconfig.json --noEmit" - }, - "dependencies": { - "@tensamin/mtp": "workspace:*", - "@tensamin/shared": "workspace:*", - "@tensamin/storage": "workspace:*", - "react": "^19.2.0", - "zod": "^4.3.6" - } -} diff --git a/packages/cache/src/helpers.test.ts b/packages/cache/src/helpers.test.ts deleted file mode 100644 index 035c285..0000000 --- a/packages/cache/src/helpers.test.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { describe, expect, it } from "vitest"; -import { - replaceConversation, - selectConversationWindows, - trimMessages, -} from "./helpers"; -import type { CachedMessage, ConversationWindow } from "./schemas"; - -const message = (SendTime: number): CachedMessage => ({ - SenderId: 1, - SendTime, - Content: "Y2lwaGVydGV4dA==", - MessageState: "received", -}); -const window = (UserId: number, LastMessageAt: number): ConversationWindow => ({ - UserId, - LastMessageAt, - Messages: [], -}); - -describe("conversation cache helpers", () => { - it("selects the five most recent windows", () => { - const selected = selectConversationWindows( - [ - window(1, 1), - window(2, 6), - window(3, 3), - window(4, 4), - window(5, 5), - window(6, 2), - ], - 5, - ); - expect(selected.map(({ UserId }) => UserId)).toEqual([2, 5, 4, 3, 6]); - }); - - it("replaces only the matching conversation", () => { - expect( - replaceConversation([window(1, 1), window(2, 2)], window(1, 9)), - ).toEqual([window(1, 9), window(2, 2)]); - }); - - it("retains the newest messages in chronological order", () => { - expect( - trimMessages([message(2), message(3), message(1)], 2).map( - (item) => item.SendTime, - ), - ).toEqual([2, 3]); - }); -}); diff --git a/packages/cache/src/helpers.ts b/packages/cache/src/helpers.ts deleted file mode 100644 index b7ec58a..0000000 --- a/packages/cache/src/helpers.ts +++ /dev/null @@ -1,30 +0,0 @@ -import type { CachedMessage, ConversationWindow } from "./schemas"; - -export function trimMessages( - messages: readonly CachedMessage[], - limit: number, -): CachedMessage[] { - return [...messages] - .sort((a, b) => b.SendTime - a.SendTime) - .slice(0, limit) - .sort((a, b) => a.SendTime - b.SendTime); -} - -export function replaceConversation( - windows: readonly ConversationWindow[], - replacement: ConversationWindow, -): ConversationWindow[] { - return [ - replacement, - ...windows.filter((item) => item.UserId !== replacement.UserId), - ]; -} - -export function selectConversationWindows( - windows: readonly ConversationWindow[], - limit: number, -): ConversationWindow[] { - return [...windows] - .sort((a, b) => b.LastMessageAt - a.LastMessageAt || a.UserId - b.UserId) - .slice(0, limit); -} diff --git a/packages/cache/src/index.ts b/packages/cache/src/index.ts deleted file mode 100644 index cd78102..0000000 --- a/packages/cache/src/index.ts +++ /dev/null @@ -1,276 +0,0 @@ -import type { z } from "zod"; -import { storageDefaults } from "@tensamin/shared/data"; -import { - deleteDatabaseEntry, - getDatabaseEntry, - listDatabaseEntries, - setDatabaseEntry, -} from "@tensamin/shared/indexedDb"; -import { - replaceConversation, - selectConversationWindows, - trimMessages, -} from "./helpers"; -import { - accountIdSchema, - contactsSchema, - conversationWindowSchema, - userProfileSchema, - type Contact, - type ConversationWindow, - type UserProfile, -} from "./schemas"; - -export * from "./helpers"; -export * from "./schemas"; - -type CacheStore = "contacts" | "profiles" | "conversations"; - -export interface SecureValueCodec { - encode(value: unknown): unknown | Promise; - decode(value: unknown): unknown | Promise; -} - -export interface CacheOptions { - codec?: SecureValueCodec; - contacts?: number; - messagesPerChat?: number; -} - -export interface CacheLifecycle { - clearAccount(): Promise; - close(): Promise; -} - -const identityCodec: SecureValueCodec = { - encode: (value) => value, - decode: (value) => value, -}; - -export function createCache(accountId: string, options: CacheOptions = {}) { - const account = accountIdSchema.parse(accountId); - const codec = options.codec ?? identityCodec; - const getLimits = async () => { - const [storedContacts, storedMessagesPerChat] = await Promise.all([ - getDatabaseEntry("storage", "cache_contacts"), - getDatabaseEntry("storage", "cache_messages_per_chat"), - ]); - return { - contacts: Math.max( - 0, - Math.floor( - options.contacts ?? - (typeof storedContacts === "number" - ? storedContacts - : storageDefaults.cache_contacts), - ), - ), - messagesPerChat: Math.max( - 0, - Math.floor( - options.messagesPerChat ?? - (typeof storedMessagesPerChat === "number" - ? storedMessagesPerChat - : storageDefaults.cache_messages_per_chat), - ), - ), - }; - }; - const prefix = `${account}:`; - const storedPrefix = (store: CacheStore) => `${store}:${prefix}`; - const storedKey = (store: CacheStore, key: string) => - `${storedPrefix(store)}${key}`; - const entries = async (store: CacheStore) => { - const storePrefix = storedPrefix(store); - return (await listDatabaseEntries("cache", storePrefix)).map( - ([key, value]) => [key.slice(storePrefix.length), value] as const, - ); - }; - let closed = false; - const ensureOpen = () => { - if (closed) throw new Error("Cache is closed"); - }; - const read = async ( - store: CacheStore, - key: string, - schema: z.ZodType, - ) => { - ensureOpen(); - const value = await getDatabaseEntry("cache", storedKey(store, key)); - return value === undefined - ? undefined - : schema.parse(await codec.decode(value)); - }; - const write = async ( - store: CacheStore, - key: string, - schema: z.ZodType, - value: T, - ) => { - ensureOpen(); - await setDatabaseEntry( - "cache", - storedKey(store, key), - await codec.encode(schema.parse(value)), - ); - }; - const remove = async (store: CacheStore, key: string) => { - ensureOpen(); - await deleteDatabaseEntry("cache", storedKey(store, key)); - }; - const listConversations = async () => { - ensureOpen(); - const storedEntries = await entries("conversations"); - const windows = await Promise.all( - storedEntries.map(async ([, value]) => - conversationWindowSchema.parse(await codec.decode(value)), - ), - ); - const { contacts } = await getLimits(); - return selectConversationWindows(windows, contacts); - }; - - return { - contacts: { - get: () => read("contacts", "authoritative", contactsSchema), - replace: (contacts: Contact[]) => - write("contacts", "authoritative", contactsSchema, contacts), - clear: () => remove("contacts", "authoritative"), - }, - profiles: { - get: (userId: number) => - read("profiles", String(userId), userProfileSchema), - put: (profile: UserProfile) => - write("profiles", String(profile.UserId), userProfileSchema, profile), - delete: (userId: number) => remove("profiles", String(userId)), - }, - conversations: { - list: listConversations, - get: (userId: number) => - read("conversations", String(userId), conversationWindowSchema), - replace: async (window: ConversationWindow) => { - const { contacts, messagesPerChat } = await getLimits(); - const candidate = conversationWindowSchema.parse({ - ...window, - Messages: trimMessages(window.Messages, messagesPerChat), - }); - const selected = selectConversationWindows( - replaceConversation(await listConversations(), candidate), - contacts, - ); - await Promise.all( - selected.map((item) => - write( - "conversations", - String(item.UserId), - conversationWindowSchema, - item, - ), - ), - ); - const retained = new Set(selected.map((item) => item.UserId)); - const storedEntries = await entries("conversations"); - await Promise.all( - storedEntries.flatMap(([key]) => { - const userId = Number(key); - return retained.has(userId) - ? [] - : [ - deleteDatabaseEntry( - "cache", - storedKey("conversations", key), - ), - ]; - }), - ); - }, - replaceSelected: async (windows: ConversationWindow[]) => { - const { contacts, messagesPerChat } = await getLimits(); - const selected = selectConversationWindows( - windows.map((window) => ({ - ...window, - Messages: trimMessages(window.Messages, messagesPerChat), - })), - contacts, - ); - await Promise.all( - selected.map((item) => - write( - "conversations", - String(item.UserId), - conversationWindowSchema, - item, - ), - ), - ); - const retained = new Set(selected.map((item) => item.UserId)); - const storedEntries = await entries("conversations"); - await Promise.all( - storedEntries.flatMap(([key]) => { - const userId = Number(key); - return retained.has(userId) - ? [] - : [ - deleteDatabaseEntry( - "cache", - storedKey("conversations", key), - ), - ]; - }), - ); - }, - prune: async () => { - const { messagesPerChat } = await getLimits(); - const windows = await listConversations(); - await Promise.all( - windows.map((window) => - write( - "conversations", - String(window.UserId), - conversationWindowSchema, - { - ...window, - Messages: trimMessages(window.Messages, messagesPerChat), - }, - ), - ), - ); - const retained = new Set(windows.map((window) => window.UserId)); - const storedEntries = await entries("conversations"); - await Promise.all( - storedEntries.flatMap(([key]) => - retained.has(Number(key)) - ? [] - : [ - deleteDatabaseEntry( - "cache", - storedKey("conversations", key), - ), - ], - ), - ); - }, - delete: (userId: number) => remove("conversations", String(userId)), - }, - clearAccount: async () => { - ensureOpen(); - await Promise.all( - (["contacts", "profiles", "conversations"] as CacheStore[]).map( - async (store) => { - const storedEntries = await entries(store); - await Promise.all( - storedEntries.map(([key]) => - deleteDatabaseEntry("cache", storedKey(store, key)), - ), - ); - }, - ), - ); - }, - close: async () => { - closed = true; - }, - }; -} - -export type Cache = ReturnType; diff --git a/packages/cache/src/schemas.ts b/packages/cache/src/schemas.ts deleted file mode 100644 index 268988c..0000000 --- a/packages/cache/src/schemas.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { mtp } from "@tensamin/shared/data"; -import { z } from "zod"; - -export const accountIdSchema = z.string().min(1); -export const contactSchema = z.object({ - LastMessageAt: z.number(), - UserId: z.number(), - LastMessage: z - .object({ Content: z.base64(), SenderId: z.number() }) - .optional(), - Messages: z.array(mtp.MessageGet.response), -}); -export const contactsSchema = z.array(contactSchema); -export const userProfileSchema = mtp.GetUserData.response; - -// Content remains the protocol base64 ciphertext. This package never decrypts messages. -export const cachedMessageSchema = mtp.MessageGet.response; -export const conversationWindowSchema = z.object({ - UserId: z.number(), - LastMessageAt: z.number(), - Messages: z.array(cachedMessageSchema), -}); - -export type Contact = z.infer; -export type UserProfile = z.infer; -export type CachedMessage = z.infer; -export type ConversationWindow = z.infer; diff --git a/packages/cache/src/sync.tsx b/packages/cache/src/sync.tsx deleted file mode 100644 index b1c7a84..0000000 --- a/packages/cache/src/sync.tsx +++ /dev/null @@ -1,279 +0,0 @@ -import { useCallback, useEffect, useRef, useState } from "react"; -import { - createCache, - type CachedMessage, - type UserProfile, -} from "@tensamin/cache"; -import { useMTP, type MTPExchange, type ProtocolMessage } from "@tensamin/mtp"; -import { useStorage } from "@tensamin/storage/context"; -import { secureValueCodec } from "@tensamin/storage/secure"; - -function isError(message: ProtocolMessage) { - return message.type.startsWith("Error"); -} - -export default function CacheSync() { - const { addInterceptor, contextReady, freshContacts, subscribePush } = - useMTP(); - const { load } = useStorage(); - const [accountId, setAccountId] = useState(0); - const queueRef = useRef(Promise.resolve()); - const reactionPartnersRef = useRef(new Map()); - - useEffect(() => { - void load("user_id").then(setAccountId); - }, [load]); - - const enqueue = useCallback((operation: () => Promise) => { - const next = queueRef.current.then(operation); - queueRef.current = next.catch(() => undefined); - return next; - }, []); - - const secureCache = useCallback( - () => - createCache(String(accountId), { - codec: secureValueCodec, - }), - [accountId], - ); - - const replaceMessage = useCallback( - async ( - partnerId: number, - sendTime: number, - edit: Partial, - ) => { - const cache = secureCache(); - const window = await cache.conversations.get(partnerId); - if (!window) return; - await cache.conversations.replace({ - ...window, - Messages: window.Messages.map((message) => - message.SendTime === sendTime ? { ...message, ...edit } : message, - ), - }); - }, - [secureCache], - ); - - const insertMessage = useCallback( - async (partnerId: number, message: CachedMessage) => { - const cache = secureCache(); - const window = await cache.conversations.get(partnerId); - await cache.conversations.replace({ - UserId: partnerId, - LastMessageAt: Math.max(window?.LastMessageAt ?? 0, message.SendTime), - Messages: [ - ...(window?.Messages ?? []).filter( - (cached) => cached.SendTime !== message.SendTime, - ), - message, - ], - }); - }, - [secureCache], - ); - - const removeMessage = useCallback( - async (partnerId: number, sendTime: number) => { - const cache = secureCache(); - const window = await cache.conversations.get(partnerId); - if (!window) return; - await cache.conversations.replace({ - ...window, - Messages: window.Messages.filter( - (message) => message.SendTime !== sendTime, - ), - }); - }, - [secureCache], - ); - - useEffect(() => { - if (!accountId || !contextReady) return; - void enqueue(async () => { - const cache = secureCache(); - await cache.contacts.replace(freshContacts); - await cache.conversations.replaceSelected( - freshContacts.map((contact) => ({ - UserId: contact.UserId, - LastMessageAt: contact.LastMessageAt, - Messages: contact.Messages, - })), - ); - }); - }, [accountId, contextReady, enqueue, freshContacts, secureCache]); - - const synchronizeExchange = useCallback( - async ({ type, data, response }: MTPExchange) => { - if (!accountId || isError(response)) return; - const request = (data ?? {}) as Record; - const result = response.data as Record; - - if (type === "GetUserData") { - await createCache(String(accountId)).profiles.put( - result as unknown as UserProfile, - ); - return; - } - - if (type === "MessagesGet" && Number(request.Offset) === 0) { - const partnerId = Number(request.UserId); - const messages = result.Messages as CachedMessage[]; - const cache = secureCache(); - const previous = await cache.conversations.get(partnerId); - await cache.conversations.replace({ - UserId: partnerId, - LastMessageAt: Math.max( - previous?.LastMessageAt ?? 0, - ...messages.map((message) => message.SendTime), - ), - // This replacement is authoritative: absent server messages are deleted. - Messages: messages, - }); - return; - } - - if (type === "MessageSend") { - const partnerId = Number(request.ReceiverId); - await insertMessage(partnerId, { - Content: String(request.Content), - Files: request.Files as CachedMessage["Files"], - MessageState: "sent", - SenderId: accountId, - SendTime: Number(request.SendTime), - }); - return; - } - - if (type === "MessageEdit") { - await replaceMessage( - Number(request.ChatPartnerId), - Number(request.SendTime), - { Content: String(request.Content), Edited: true }, - ); - return; - } - - if (type === "MessageDelete") { - await removeMessage( - Number(request.ChatPartnerId), - Number(request.SendTime), - ); - return; - } - - if (type === "MessageReactionAdd" || type === "MessageReactionRemove") { - const partnerId = Number(request.ChatPartnerId); - const sendTime = Number(request.SendTime); - const reaction = String(request.Reaction); - const cache = secureCache(); - const window = await cache.conversations.get(partnerId); - const message = window?.Messages.find( - (candidate) => candidate.SendTime === sendTime, - ); - if (!message) return; - const reactions = (message.Reactions ?? []).filter( - (candidate) => - candidate.SenderId !== accountId || candidate.Reaction !== reaction, - ); - if (type === "MessageReactionAdd") { - reactions.push({ SenderId: accountId, Reaction: reaction }); - } - await replaceMessage(partnerId, sendTime, { Reactions: reactions }); - return; - } - - if (type === "MessageState") { - await replaceMessage( - Number(result.ChatPartnerId), - Number(result.SendTime), - { - MessageState: result.MessageState as CachedMessage["MessageState"], - }, - ); - return; - } - - if (type === "MessageGet") { - const message = result as unknown as CachedMessage; - const mappedPartner = reactionPartnersRef.current.get(message.SendTime); - reactionPartnersRef.current.delete(message.SendTime); - if (mappedPartner) { - await insertMessage(mappedPartner, message); - return; - } - const windows = await secureCache().conversations.list(); - const window = windows.find((candidate) => - candidate.Messages.some( - (cached) => cached.SendTime === message.SendTime, - ), - ); - if (window) await insertMessage(window.UserId, message); - } - }, - [accountId, insertMessage, removeMessage, replaceMessage, secureCache], - ); - - useEffect(() => { - if (!accountId) return; - return addInterceptor((exchange) => - enqueue(() => synchronizeExchange(exchange)), - ); - }, [accountId, addInterceptor, enqueue, synchronizeExchange]); - - const synchronizePush = useCallback( - async (message: ProtocolMessage) => { - if (!accountId || isError(message)) return; - const data = message.data as Record; - if (message.type === "MessageLive") { - await insertMessage( - Number(data.SenderId), - data.Message as CachedMessage, - ); - return; - } - if (message.type === "MessageEditLive") { - await replaceMessage( - Number(data.ChatPartnerId), - Number(data.SendTime), - { Content: String(data.Content), Edited: true }, - ); - return; - } - if (message.type === "MessageDeleteLive") { - const deleteData = message.data as { - ChatPartnerId: number; - SendTime: number; - }; - await removeMessage(deleteData.ChatPartnerId, deleteData.SendTime); - return; - } - if (message.type === "MessageState") { - await replaceMessage( - Number(data.ChatPartnerId), - Number(data.SendTime), - { MessageState: data.MessageState as CachedMessage["MessageState"] }, - ); - return; - } - if (message.type === "MessageReactionLive") { - reactionPartnersRef.current.set( - Number(data.SendTime), - Number(data.ChatPartnerId), - ); - } - }, - [accountId, insertMessage, removeMessage, replaceMessage], - ); - - useEffect(() => { - if (!accountId || !contextReady) return; - return subscribePush((message) => { - void enqueue(() => synchronizePush(message)); - }); - }, [accountId, contextReady, enqueue, subscribePush, synchronizePush]); - - return null; -} diff --git a/packages/call/package.json b/packages/call/package.json index 576caa1..d3b5827 100644 --- a/packages/call/package.json +++ b/packages/call/package.json @@ -5,14 +5,13 @@ "type": "module", "exports": { "./store": "./src/store.tsx", - "./speakingState": "./src/speakingState.ts", "./screen": "./src/screen.tsx", "./utils": "./src/utils.ts", "./sidebarBox": "./src/components/sidebarBox.tsx", "./popout": "./src/components/popout.tsx" }, "scripts": { - "format": "pnpm exec prettier --write .", + "format": "bunx prettier --write .", "lint": "eslint src", "build": "tsc -p tsconfig.json --noEmit" }, @@ -23,10 +22,10 @@ "@tensamin/crypto": "workspace:*", "@tensamin/shared": "workspace:*", "@tensamin/storage": "workspace:*", - "@tensamin/mtp": "workspace:*", + "@tensamin/ttp": "workspace:*", "@tensamin/ui": "*", "@tensamin/user": "workspace:*", - "deepfilternet3-noise-filter": "1.2.1", + "deepfilternet3-noise-filter": "^1.2.1", "livekit-client": "^2.18.8", "lucide-react": "^1.14.0", "react": "^19.2.0", diff --git a/packages/call/src/components/buttons/invite.tsx b/packages/call/src/components/buttons/invite.tsx index d049a5a..d3a6d8e 100644 --- a/packages/call/src/components/buttons/invite.tsx +++ b/packages/call/src/components/buttons/invite.tsx @@ -61,15 +61,15 @@ export default function InviteButton({ > {contacts.map((contact) => ( Loading...
} component={(user) => ( )} /> diff --git a/packages/call/src/components/invitePopup.tsx b/packages/call/src/components/invitePopup.tsx index 15d9b1a..579d87d 100644 --- a/packages/call/src/components/invitePopup.tsx +++ b/packages/call/src/components/invitePopup.tsx @@ -28,12 +28,12 @@ export default function InvitePopup({ - + - {user.Display.slice(0, 2).toUpperCase()} + {user.display.slice(0, 2).toUpperCase()} -

{user.Display}

+

{user.display}

); @@ -171,7 +171,7 @@ export default function Base({ const [avatarBackgroundColor, setAvatarBackgroundColor] = useState< string | undefined >(undefined); - const isSpeaking = useIsSpeaking(user?.UserId ?? -1); + const isSpeaking = useIsSpeaking(user?.user_id ?? -1); const screenSharePublication = getTrackPublicationBySource( participant, Track.Source.ScreenShare, @@ -209,14 +209,14 @@ export default function Base({ }, [participant, get]); useEffect(() => { - if (type !== "user" || !user?.Avatar) { + if (type !== "user" || !user?.avatar) { setAvatarBackgroundColor(undefined); return; } let active = true; - void getAverageImageColor(user.Avatar).then((color) => { + void getAverageImageColor(user.avatar).then((color) => { if (active) { setAvatarBackgroundColor(color); } @@ -225,7 +225,7 @@ export default function Base({ return () => { active = false; }; - }, [type, user?.Avatar]); + }, [type, user?.avatar]); // Avatar calc const currentCard = useRef(null); @@ -242,12 +242,12 @@ export default function Base({ const onClick = () => { if (view === "grid") { - focusParticipant(user.UserId, type); + focusParticipant(user.user_id, type); } else { - if (user.UserId === focusedParticipantId) { + if (user.user_id === focusedParticipantId) { setCallView("grid"); } else { - focusParticipant(user.UserId, type); + focusParticipant(user.user_id, type); } } }; @@ -256,7 +256,7 @@ export default function Base({ screenSharePublication?.isSubscribed && screenSharePublication.track; const isFocusedInFocusedView = - view === "focused" && user.UserId === focusedParticipantId; + view === "focused" && user.user_id === focusedParticipantId; return ( @@ -276,7 +276,7 @@ export default function Base({ variant="outline" onClick={(event) => { if (isFocusedInFocusedView) event.stopPropagation(); - startWatchingStream(user.UserId); + startWatchingStream(user.user_id); }} > Watch Stream @@ -286,7 +286,7 @@ export default function Base({ variant="outline" onClick={(event) => { event.stopPropagation(); - startWatchingStream(user.UserId); + startWatchingStream(user.user_id); }} > @@ -295,7 +295,8 @@ export default function Base({
)} {view === "grid" || - (view === "focused" && user.UserId !== focusedParticipantId) ? ( + (view === "focused" && + user.user_id !== focusedParticipantId) ? ( ) : null} @@ -342,13 +343,13 @@ export default function Base({ height: "32cqh", }} > - + - {user.Display.slice(0, 2).toUpperCase()} + {user.display.slice(0, 2).toUpperCase()} )} diff --git a/packages/call/src/components/modals/contextMenu.tsx b/packages/call/src/components/modals/contextMenu.tsx index a3d2261..82f79c8 100644 --- a/packages/call/src/components/modals/contextMenu.tsx +++ b/packages/call/src/components/modals/contextMenu.tsx @@ -36,8 +36,8 @@ export default function ContextMenu({ return ( - {watchedStreamParticipantIds.includes(user.UserId) && - user.UserId !== ownId ? ( + {watchedStreamParticipantIds.includes(user.user_id) && + user.user_id !== ownId ? ( Stop Watching ) : null} Profile diff --git a/packages/call/src/components/top.tsx b/packages/call/src/components/top.tsx index f573dc4..4da11db 100644 --- a/packages/call/src/components/top.tsx +++ b/packages/call/src/components/top.tsx @@ -70,14 +70,14 @@ export default function TopBar() {
{users.map((user) => ( -
+
- + - {user.Display.slice(0, 2).toUpperCase()} + {user.display.slice(0, 2).toUpperCase()} } @@ -86,7 +86,7 @@ export default function TopBar() { side="bottom" portalProps={{ container: portalContainer }} > - {user.Display} + {user.display}
diff --git a/packages/call/src/screenshare.ts b/packages/call/src/screenshare.ts index 416b750..8911a71 100644 --- a/packages/call/src/screenshare.ts +++ b/packages/call/src/screenshare.ts @@ -1,5 +1,4 @@ import { log } from "@tensamin/shared/log"; -import type {} from "@tensamin/shared/desktopMedia"; import { type LocalTrack, Room, @@ -22,6 +21,39 @@ type ScreenShareStoreSetState = ( | ((state: ScreenShareStoreState) => Partial), ) => void; +declare global { + interface Window { + tensaminDesktop?: { + media?: { + getScreenShareCapabilities?: () => Promise<{ + runtime?: "electron" | "tauri"; + platform: "linux" | "macos" | "windows" | "other"; + showAudioOutputSelector: boolean; + showAudioSwitch: boolean; + hasReliableSystemAudio: boolean; + }>; + listScreenShareSources?: () => Promise< + Array<{ + id: string; + kind: "screen" | "window"; + name: string; + subtitle?: string | null; + thumbnail?: string | null; + }> + >; + listScreenShareAudioOutputs?: () => Promise< + Array<{ + id: string; + name: string; + isDefault: boolean; + }> + >; + selectScreenShareSource?: (sourceId: string) => Promise; + }; + }; + } +} + type ScreenShareControllerOptions = { room: Room; getState: () => ScreenShareStoreState; diff --git a/packages/call/src/speakingIndicator.ts b/packages/call/src/speakingIndicator.ts index a887516..8f05eb8 100644 --- a/packages/call/src/speakingIndicator.ts +++ b/packages/call/src/speakingIndicator.ts @@ -1,3 +1,4 @@ +import { log } from "@tensamin/shared/log"; import { clearSpeakingParticipants, removeSpeakingParticipant, @@ -137,8 +138,10 @@ class SpeakingDetector { const db = 20 * Math.log10(Math.max(rms, 0.0001)); if (!this.localMicGateClosed && db < this.gateThresholdStart) { + log(3, "noise gate", "purple", "closed"); this.muteLocalTrack(true); } else if (this.localMicGateClosed && db > this.gateThresholdEnd) { + log(3, "noise gate", "purple", "opened"); this.muteLocalTrack(false); } } diff --git a/packages/call/src/store.tsx b/packages/call/src/store.tsx index b5da895..a5b4b83 100644 --- a/packages/call/src/store.tsx +++ b/packages/call/src/store.tsx @@ -1,16 +1,10 @@ import { useCallback, useEffect, useMemo, useRef } from "react"; import { create } from "zustand"; import { useLocation, useNavigate } from "@tanstack/react-router"; -import { useMTP } from "@tensamin/mtp"; +import { useTTP } from "@tensamin/ttp"; import { log, toast } from "@tensamin/shared/log"; -import { mtp } from "@tensamin/shared/data"; -import { bytesToBase64 } from "mtp"; -import { - deriveCallSecretId, - kemPublicKeyFromPublicKeyBundle, - unwrapCallSecret, - wrapCallSecret, -} from "@tensamin/crypto/callSecret"; +import { ttp } from "@tensamin/shared/data"; +import { useCrypto } from "@tensamin/crypto/context"; import { useStorage } from "@tensamin/storage/context"; import { useSession } from "@tensamin/storage/session"; import { useUser } from "@tensamin/user/context"; @@ -52,23 +46,14 @@ setLogExtension( type CallState = "closed" | "closing" | "connecting" | "open" | "encrypting"; type CallView = "preview" | "focused" | "grid"; -type ProtocolCallSecret = NonNullable< - z.infer["CallSecret"] ->; -type WrappedCallSecret = { - secretId: string; - versionNumber: number; - encryptedSecret: Uint8Array; - kemCiphertext: Uint8Array; - wrappingScheme: string; -}; type IncomingCallInvite = { callId: string; - callSecret: WrappedCallSecret; + callSecret: string; senderId: number; }; type CurrentCallData = - (z.infer & { exists: boolean }) | null; + | (z.infer & { exists: boolean }) + | null; type NavigateFn = (options: { to: string; @@ -78,13 +63,23 @@ type SendFn = ( type: string, data: Record, ) => Promise<{ data: unknown }>; +type GetSharedSecretFn = ( + privateKey: unknown, + ownPublicKey: string, + remotePublicKey: string, +) => Promise; +type DecryptTextFn = (sharedSecret: string, text: string) => Promise; +type EncryptTextFn = (sharedSecret: string, text: string) => Promise; type LoadFn = (key: string) => Promise; -type GetUserFn = (userId: number) => Promise<{ PublicKey: string }>; +type GetUserFn = (userId: number) => Promise<{ public_key: string }>; type RemoteVideoTrackSelector = Track.Kind | Track.Source; type Runtime = { navigate: NavigateFn; send: SendFn; + getSharedSecret: GetSharedSecretFn; + decryptText: DecryptTextFn; + encryptText: EncryptTextFn; load: LoadFn; getUser: GetUserFn; }; @@ -109,7 +104,6 @@ type CallStore = { pendingWatchedParticipantIds: number[]; activeScreenShareParticipantIds: number[]; isEncrypted: boolean; - ownCallSecretInvitePending: boolean; callIsFullscreen: boolean; callIsPopout: boolean; layoutVersion: number; @@ -155,46 +149,11 @@ export function getRoom(): Room { const remoteAudioElements = new Map(); -const CALL_SECRET_VERSION = 1; const SCREEN_SHARE_PREVIEW_MAX_WIDTH = 320; const SCREEN_SHARE_PREVIEW_MAX_HEIGHT = 180; const SCREEN_SHARE_PREVIEW_QUALITY = 0.7; const SCREEN_SHARE_PREVIEW_TIMEOUT_MS = 5000; -function protocolBytes(bytes: Uint8Array): Uint8Array { - return new Uint8Array(bytes); -} - -function normalizeWrappedCallSecret( - callSecret: WrappedCallSecret | ProtocolCallSecret, -): WrappedCallSecret { - if ("secretId" in callSecret) { - return callSecret; - } - - return { - secretId: callSecret.SecretId, - versionNumber: callSecret.VersionNumber, - encryptedSecret: callSecret.EncryptedSecret, - kemCiphertext: callSecret.KemCiphertext, - wrappingScheme: callSecret.WrappingScheme, - }; -} - -function protocolCallSecret(callSecret: WrappedCallSecret): ProtocolCallSecret { - return { - SecretId: callSecret.secretId, - VersionNumber: callSecret.versionNumber, - EncryptedSecret: protocolBytes(callSecret.encryptedSecret), - KemCiphertext: protocolBytes(callSecret.kemCiphertext), - WrappingScheme: callSecret.wrappingScheme, - }; -} - -function randomCallSecret(): string { - return bytesToBase64(globalThis.crypto.getRandomValues(new Uint8Array(32))); -} - // audio helpers function attachRemoteAudio(trackSid: string, element: HTMLMediaElement) { const existingElement = remoteAudioElements.get(trackSid); @@ -646,16 +605,16 @@ export async function openCallPage(callId: string) { // Request the LiveKit token that authorizes this client to join a call. export async function getCallToken(callId: string): Promise { const response = await requireRuntime(useCall.getState().runtime) - .send("CallToken", { - CallId: callId, + .send("call_token", { + call_id: callId, }) .catch((err) => { log(1, "call", "red", "Failed to get call secret", err); throw err; }); - const data = response.data as { CallToken: string }; - return data.CallToken; + const data = response.data as { call_token: string }; + return data.call_token; } // Encrypt the active call secret for a recipient and send the call invite. @@ -667,28 +626,28 @@ export async function sendCallInvite(userId: number) { throw new Error("Cannot send call invite without an active call."); } + const ownUserId = (await runtime.load("user_id")) as number; + const privateKey = await runtime.load("private_key"); + const ownPublicKey = await runtime + .getUser(ownUserId) + .then((data) => data.public_key); const remotePublicKey = await runtime .getUser(userId) - .then((data) => data.PublicKey); - const secretId = deriveCallSecretId(callId); - const wrapped = await wrapCallSecret({ + .then((data) => data.public_key); + const sharedSecret = await runtime.getSharedSecret( + privateKey, + ownPublicKey, + remotePublicKey, + ); + const encryptedCallSecret = await runtime.encryptText( + sharedSecret, callSecret, - recipientKemPublicKey: kemPublicKeyFromPublicKeyBundle(remotePublicKey), - callId, - secretId, - version: CALL_SECRET_VERSION, - }); + ); - await runtime.send("CallInvite", { - ReceiverId: userId, - CallId: callId, - CallSecret: { - SecretId: secretId, - VersionNumber: CALL_SECRET_VERSION, - EncryptedSecret: protocolBytes(wrapped.encryptedSecret), - KemCiphertext: protocolBytes(wrapped.kemCiphertext), - WrappingScheme: wrapped.wrappingScheme, - }, + await runtime.send("call_invite", { + receiver_id: userId, + call_id: callId, + call_secret: encryptedCallSecret, }); } @@ -898,7 +857,6 @@ export async function disconnect() { watchedStreamParticipantIds: [], pendingWatchedParticipantIds: [], activeScreenShareParticipantIds: [], - ownCallSecretInvitePending: false, callIsFullscreen: false, lastFocusedParticipantId: null, }); @@ -920,7 +878,7 @@ export async function disconnect() { // Prepare encryption and join or create a call with another user. export async function joinCall( userId: number, - callSecret?: WrappedCallSecret | ProtocolCallSecret, + callSecret?: string, existingCallId?: string, sendInvite = true, ) { @@ -932,29 +890,24 @@ export async function joinCall( } log(2, "call", "purple", "Call creation initialised"); - const isNewCall = !callSecret && !existingCallId; useCall.setState({ state: "encrypting", invitedUserId: sendInvite && !existingCallId ? userId : null, - ownCallSecretInvitePending: isNewCall, }); if (callSecret) { try { - if (!existingCallId) { - throw new Error("Cannot unwrap call secret without a call id"); - } - - const wrappedCallSecret = normalizeWrappedCallSecret(callSecret); - const decryptedSecret = await unwrapCallSecret({ - encryptedSecret: wrappedCallSecret.encryptedSecret, - kemCiphertext: wrappedCallSecret.kemCiphertext, - keyring: String(await runtime.load("mtp_keyring")), - callId: existingCallId, - secretId: wrappedCallSecret.secretId, - version: wrappedCallSecret.versionNumber, - wrappingScheme: wrappedCallSecret.wrappingScheme, - }); + const sharedSecret = await runtime.getSharedSecret( + await runtime.load("private_key"), + await runtime + .getUser((await runtime.load("user_id")) as number) + .then((res) => res.public_key), + await runtime.getUser(userId).then((res) => res.public_key), + ); + const decryptedSecret = await runtime.decryptText( + sharedSecret, + callSecret, + ); await getKeyProvider().setKey(decryptedSecret); await getRoom().setE2EEEnabled(true); @@ -965,7 +918,7 @@ export async function joinCall( return; } } else { - const random = randomCallSecret(); + const random = crypto.randomUUID(); await getKeyProvider().setKey(random); await getRoom().setE2EEEnabled(true); @@ -1123,7 +1076,6 @@ export const useCall = create(() => ({ pendingWatchedParticipantIds: [], activeScreenShareParticipantIds: [], isEncrypted: false, - ownCallSecretInvitePending: false, callIsFullscreen: false, callIsPopout: false, layoutVersion: 0, @@ -1136,7 +1088,8 @@ export const useCall = create(() => ({ export function useInitializeCall() { const navigate = useNavigate(); const location = useLocation(); - const { send, subscribePush } = useMTP(); + const { send, subscribePush } = useTTP(); + const { getSharedSecret, decryptText, encryptText } = useCrypto(); const { load } = useStorage(); const { insertCall } = useSession(); const { get } = useUser(); @@ -1164,13 +1117,16 @@ export function useInitializeCall() { setCallRuntime({ navigate, send: send as SendFn, + getSharedSecret: getSharedSecret as GetSharedSecretFn, + decryptText: decryptText as DecryptTextFn, + encryptText: encryptText as EncryptTextFn, load: load as LoadFn, getUser: get as GetUserFn, }); - }, [get, load, navigate, send]); + }, [decryptText, encryptText, get, getSharedSecret, load, navigate, send]); const showCallingScreen = useCallback( - (callId: string, callSecret: WrappedCallSecret, senderId: number) => { + (callId: string, callSecret: string, senderId: number) => { useCall.setState({ incomingCallInvite: { callId, callSecret, senderId }, }); @@ -1195,9 +1151,9 @@ export function useInitializeCall() { } insertCall({ - CallId: invite.callId, - CallSecret: protocolCallSecret(invite.callSecret), - CallMembers: [invite.senderId], + call_id: invite.callId, + call_secret: invite.callSecret, + call_members: [invite.senderId], }); if (accepted) { @@ -1222,26 +1178,18 @@ export function useInitializeCall() { // listen to call invites useEffect(() => { - return subscribePush(async (message) => { - if (message.type !== "CallInvite") return; + subscribePush(async (message) => { + if (message.type !== "call_invite") return; - const { CallId, CallSecret, SenderId } = message.data as { - CallId: string; - CallSecret: ProtocolCallSecret; - SenderId: number; + const { call_id, call_secret, sender_id } = message.data as { + call_id: string; + call_secret: string; + sender_id: number; }; - if (SenderId === Number(await load("user_id"))) { - return; - } - - showCallingScreen( - CallId, - normalizeWrappedCallSecret(CallSecret), - SenderId, - ); + showCallingScreen(call_id, call_secret, sender_id); }); - }, [load, subscribePush, showCallingScreen]); + }, [subscribePush, showCallingScreen]); // get callId from url useEffect(() => { @@ -1342,23 +1290,6 @@ export function useInitializeCall() { } const invitedUserId = useCall.getState().invitedUserId; - const ownCallSecretInvitePending = - useCall.getState().ownCallSecretInvitePending; - - if (ownCallSecretInvitePending) { - useCall.setState({ ownCallSecretInvitePending: false }); - void load("user_id") - .then((ownUserId) => sendCallInvite(Number(ownUserId))) - .catch((error) => { - log( - 1, - "call", - "red", - "Failed to send own call secret invite", - error, - ); - }); - } if (invitedUserId != null) { setTimeout(async () => { @@ -1570,22 +1501,10 @@ export function useInitializeCall() { return; } - send("CallData", { CallId: callId }) + send("call_data", { call_id: callId }) .then((data) => { - if (data.type === "ErrorNotFound") { - setCurrentCallData({ - UserIds: [], - exists: false, - }); - return; - } - - if (data.type.startsWith("Error")) { - throw new Error(`CallData failed: ${data.type}`); - } - setCurrentCallData({ - ...(data.data as z.infer), + ...(data.data as z.infer), exists: true, }); }) @@ -1595,7 +1514,7 @@ export function useInitializeCall() { error: err, }); setCurrentCallData({ - UserIds: [], + user_ids: [], exists: false, }); }); diff --git a/packages/call/src/views/preview.tsx b/packages/call/src/views/preview.tsx index 401332d..bc4b574 100644 --- a/packages/call/src/views/preview.tsx +++ b/packages/call/src/views/preview.tsx @@ -17,7 +17,7 @@ export default function Preview() { }; } - void Promise.all(currentCallData.UserIds.map((id) => get(id))) + void Promise.all(currentCallData.user_ids.map((id) => get(id))) .then((users) => { if (!active) { return; @@ -44,8 +44,8 @@ export default function Preview() {
{data.map((user) => { return ( -

- User: {user.Display} +

+ User: {user.display}

); })} diff --git a/packages/call/todo.md b/packages/call/todo.md index beb0e48..4d00174 100644 --- a/packages/call/todo.md +++ b/packages/call/todo.md @@ -7,4 +7,3 @@ - Implement context menu features - Add quality selection - Good preview page -- Settings page diff --git a/packages/chat/package.json b/packages/chat/package.json index f98e87d..a4b9b86 100644 --- a/packages/chat/package.json +++ b/packages/chat/package.json @@ -7,29 +7,26 @@ "./context": "./src/context.tsx", "./screen": "./src/screen.tsx", "./behaviour-conversation": "./src/behaviour/conversation.ts", - "./behaviour-community": "./src/behaviour/community.ts", - "./values": "./src/values.ts" + "./behaviour-community": "./src/behaviour/community.ts" }, "scripts": { - "format": "pnpm exec prettier --write .", + "format": "bunx prettier --write .", "lint": "eslint src", "build": "tsc -p tsconfig.json --noEmit" }, "dependencies": { - "@tensamin/cache": "workspace:*", "@tanstack/pacer": "^0.21.1", "@tanstack/react-query": "^5.0.0", "@tanstack/react-router": "^1.0.0", "@tanstack/react-virtual": "^3.0.0", "@tensamin/crypto": "workspace:*", "@tensamin/markdown": "workspace:*", - "@tensamin/mtp": "workspace:*", "@tensamin/shared": "workspace:*", "@tensamin/storage": "workspace:*", + "@tensamin/ttp": "workspace:*", "@tensamin/ui": "*", "@tensamin/user": "workspace:*", "lucide-react": "^1.14.0", - "motion": "^12.42.2", "react": "^19.2.0", "react-dom": "^19.2.0", "zod": "^4.3.6" diff --git a/packages/chat/src/behaviour/conversation.ts b/packages/chat/src/behaviour/conversation.ts index 1cf6bc8..67e77ee 100644 --- a/packages/chat/src/behaviour/conversation.ts +++ b/packages/chat/src/behaviour/conversation.ts @@ -1,4 +1,5 @@ -import type { BoundSendFn } from "@tensamin/mtp"; +import type { BoundSendFn } from "@tensamin/ttp"; +import type { TTP } from "@tensamin/shared/data"; import type { RawMessages } from "../values"; /** @@ -6,24 +7,24 @@ import type { RawMessages } from "../values"; * @param send Parameter send. * @param amount Parameter amount. * @param offset Parameter offset. - * @param UserId Parameter UserId. + * @param user_id Parameter user_id. * @returns Promise. */ export async function getMessages( - send: BoundSendFn, - Amount: number, - Offset: number, - UserId: number, + send: BoundSendFn, + amount: number, + offset: number, + user_id: number, ): Promise { - const messages = await send("MessagesGet", { - Amount, - Offset, - UserId, + const messages = await send("messages_get", { + amount: amount, + offset: offset, + user_id: user_id, }); if (messages.type.startsWith("error")) { throw new Error(messages.type); } - return messages.data.Messages; + return messages.data.messages; } diff --git a/packages/chat/src/components/emojiPicker.tsx b/packages/chat/src/components/emojiPicker.tsx deleted file mode 100644 index 1cc5574..0000000 --- a/packages/chat/src/components/emojiPicker.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import { Button } from "@tensamin/ui"; -import Emoji from "@tensamin/markdown/emoji"; -import { getRecentEmojis, useEmojiRanks } from "./emojiRanks"; - -export default function EmojiPicker({ - onSelect, -}: { - onSelect: (emoji: string) => void; -}) { - const { ranks } = useEmojiRanks(); - const emojis = getRecentEmojis(ranks, 3); - - return ( -
- {emojis.map((emoji) => ( - - ))} -
- ); -} diff --git a/packages/chat/src/components/emojiRanks.ts b/packages/chat/src/components/emojiRanks.ts deleted file mode 100644 index 874c125..0000000 --- a/packages/chat/src/components/emojiRanks.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { useStorage } from "@tensamin/storage/context"; -import { useCallback, useEffect, useState } from "react"; -import { normalizeShortcode } from "@tensamin/markdown/emoji"; - -const RANKS_CHANGED_EVENT = "tensamin-reaction-ranks-changed"; -let recordQueue = Promise.resolve(); - -function normalizeRanks(ranks: Record) { - return Object.entries(ranks).reduce>( - (normalized, [value, frequency]) => { - const shortcode = normalizeShortcode(value); - if (!shortcode || !Number.isFinite(frequency) || frequency <= 0) { - return normalized; - } - - normalized[shortcode] = (normalized[shortcode] ?? 0) + frequency; - return normalized; - }, - {}, - ); -} - -function rankedEmojis(ranks: Record) { - return Object.entries(ranks) - .filter( - ([emoji, frequency]) => - normalizeShortcode(emoji) !== undefined && - Number.isFinite(frequency) && - frequency > 0, - ) - .sort(([emojiA, frequencyA], [emojiB, frequencyB]) => - frequencyB === frequencyA - ? emojiA.localeCompare(emojiB) - : frequencyB - frequencyA, - ) - .flatMap(([emoji]) => { - const shortcode = normalizeShortcode(emoji); - return shortcode ? [shortcode] : []; - }); -} - -export function getRecentEmojis(ranks: Record, amount: number) { - return rankedEmojis(ranks).slice(0, amount); -} - -export function useEmojiRanks() { - const { load, save } = useStorage(); - const [ranks, setRanks] = useState>({}); - - useEffect(() => { - void load("reactions").then((storedRanks) => { - const normalized = normalizeRanks(storedRanks); - setRanks(normalized); - if (JSON.stringify(normalized) !== JSON.stringify(storedRanks)) { - void save("reactions", normalized); - } - }); - - function handleRanksChanged(event: Event) { - setRanks((event as CustomEvent>).detail); - } - - window.addEventListener(RANKS_CHANGED_EVENT, handleRanksChanged); - return () => - window.removeEventListener(RANKS_CHANGED_EVENT, handleRanksChanged); - }, [load, save]); - - return { ranks }; -} - -export function useRecordEmojiUse() { - const { load, save } = useStorage(); - - return useCallback( - (emoji: string) => { - const shortcode = normalizeShortcode(emoji); - if (!shortcode) return; - - recordQueue = recordQueue - .catch(() => undefined) - .then(async () => { - const normalized = normalizeRanks(await load("reactions")); - const next = { - ...normalized, - [shortcode]: (normalized[shortcode] ?? 0) + 1, - }; - await save("reactions", next); - window.dispatchEvent( - new CustomEvent(RANKS_CHANGED_EVENT, { detail: next }), - ); - }); - }, - [load, save], - ); -} diff --git a/packages/chat/src/components/input.tsx b/packages/chat/src/components/input.tsx index fe26bda..ae27596 100644 --- a/packages/chat/src/components/input.tsx +++ b/packages/chat/src/components/input.tsx @@ -1,32 +1,23 @@ import Input from "@tensamin/markdown/input"; import { - Avatar, - AvatarFallback, - AvatarImage, Card, CardHeader, Popover, PopoverContent, PopoverTrigger, - Skeleton, } from "@tensamin/ui"; import { useStorage } from "@tensamin/storage/context"; -import React, { useEffect, useState, useRef } from "react"; +import * as React from "react"; import { Button } from "@tensamin/ui"; -import { Plus, Laugh, FileVideo, Forward, X } from "lucide-react"; -import { useChat, useReplyMessage } from "../context"; -import { useMTP } from "@tensamin/mtp"; +import { Plus, Laugh, FileVideo } from "lucide-react"; +import { useChat } from "../context"; +import { useTTP } from "@tensamin/ttp"; import { log, toast } from "@tensamin/shared/log"; import { cn, useIsMobile } from "@tensamin/ui"; -import { encryptChatText } from "@tensamin/crypto/chatSecret"; - +import { encryptText } from "@tensamin/crypto/worker"; import { useSession } from "@tensamin/storage/session"; import GifPicker from "./gifPicker"; -import EmojiPicker from "./emojiPicker"; -import { useEmojiRanks, useRecordEmojiUse } from "./emojiRanks"; -import Wrapper from "@tensamin/user/wrapper"; -import Text from "@tensamin/markdown/text"; export default function InputComponent({ value, @@ -35,36 +26,26 @@ export default function InputComponent({ value: string; setValue: (value: string) => void; }) { - const [invertEnterBehavior, setInvertEnterBehavior] = useState(false); + const [invertEnterBehavior, setInvertEnterBehavior] = React.useState(false); - const { send } = useMTP(); - const { - addLiveMessage, - chatSecret, - userId, - inputBoxRef, - replyTo, - setReplyTo, - } = useChat(); + const { send } = useTTP(); + const { addLiveMessage, sharedSecret, userId, inputBoxRef } = useChat(); const { load, save } = useStorage(); const { moveUserIdToTop } = useSession(); - const gifPopoverRef = useRef(null); - const [gifPopoverOpen, setGifPopoverOpen] = useState(false); - const [emojiPopoverOpen, setEmojiPopoverOpen] = useState(false); - const recordUse = useRecordEmojiUse(); - const { ranks: emojiFrequencies } = useEmojiRanks(); - const [gifPopoverSize, setGifPopoverSize] = useState<{ + const gifPopoverRef = React.useRef(null); + const [gifPopoverOpen, setGifPopoverOpen] = React.useState(false); + const [gifPopoverSize, setGifPopoverSize] = React.useState<{ width: number; height: number; }>(); - useEffect(() => { + React.useEffect(() => { void load("settings.reverse_enter_behavior").then((shouldInvert) => { setInvertEnterBehavior(shouldInvert); }); }, [load]); - useEffect(() => { + React.useEffect(() => { void load("chat_picker_size").then((size) => { if (size) { setGifPopoverSize(size); @@ -75,7 +56,7 @@ export default function InputComponent({ async function handleSubmit(content = value, preserveContent = false) { if (content.trim() === "") return; - const time = new Date().getTime(); + const time = Date.now(); const currentValue = content; if (!Number.isSafeInteger(userId) || userId <= 0) { @@ -83,55 +64,38 @@ export default function InputComponent({ return; } - if (!chatSecret) { - toast("error", "Still getting chat secret..."); + if (!sharedSecret) { + toast("error", "Still getting shared secret..."); return; } - log(3, "chat", "purple", "Message send init, adding live message ..."); - const reference = addLiveMessage({ - NotEncrypted: true, - SendTime: time, - Content: currentValue, - SenderId: ownId, - MessageState: "awaiting", - ...(replyTo && { ReplyId: replyTo }), + height: 0, + not_encrypted: true, + send_time: time, + content: currentValue, + sent_by_self: true, + message_state: "awaiting", }); - log(3, "chat", "purple", "Live message added, encrypting..."); + const encryptedContext = await encryptText(sharedSecret, currentValue); - const encryptedContent = await encryptChatText( - chatSecret, - currentValue, - ).catch((err) => { - toast("error", "Failed to encrypt message", String(err)); - reference.setFailed(true); - }); - - if (!encryptedContent) return; - - log(3, "chat", "purple", "Content encrypted, sending message..."); - - send("MessageSend", { - Content: encryptedContent, - ReceiverId: userId, - SendTime: time, + send("message_send", { + height: 0, + content: encryptedContext, + receiver_id: userId, + send_time: time, }).catch((e) => { log(0, "Chat", "red", "Failed to send message", e, { - ReceiverId: userId, - SendTime: time, + content: currentValue, + encryptedContext, + receiver_id: userId, + send_time: time, }); reference.setFailed(true); toast("error", "Failed to send message"); }); - if (replyTo) { - setReplyTo(undefined); - } - - log(3, "chat", "purple", "Message sent"); - moveUserIdToTop(userId); if (!preserveContent) { @@ -192,150 +156,73 @@ export default function InputComponent({ window.addEventListener("pointerup", handlePointerUp); } - const { ownId, replyMessage, replyUserId } = useReplyMessage(); - return ( -
- {replyTo !== undefined && ( -
-
- - {replyMessage ? ( - <> - } - component={(user) => ( - - - - {user.Display.slice(2, 0).toUpperCase()} - - - )} - /> -
- -
- - ) : ( - <> - - - - )} - +
+

Files list

+
+
+
+ + + + + + } + /> + event.stopPropagation()} + onWheelCapture={(event) => event.stopPropagation()} + style={{ + ...gifPopoverSize, + maxHeight: gifPopoverSize?.height, + }} + > +
+ { + void handleSubmit(url, true); + setGifPopoverOpen(false); + }} + /> + +
- )} - - - -
-
- -
-

Files list

-
-
-
- - - - - } - /> - - { - setValue(`${value}${shortcode} `); - recordUse(shortcode); - setEmojiPopoverOpen(false); - }} - /> - - - - - - - } - /> - event.stopPropagation()} - onWheelCapture={(event) => event.stopPropagation()} - style={{ - ...gifPopoverSize, - maxHeight: gifPopoverSize?.height, - }} - > -
- { - void handleSubmit(url, true); - setGifPopoverOpen(false); - }} - /> - - -
-
- - -
+
+
); } diff --git a/packages/chat/src/components/mediaSaveButton.tsx b/packages/chat/src/components/mediaSaveButton.tsx index 3f5d588..5179aac 100644 --- a/packages/chat/src/components/mediaSaveButton.tsx +++ b/packages/chat/src/components/mediaSaveButton.tsx @@ -39,20 +39,25 @@ export default function MediaSaveButton({ } return ( - + +
); } diff --git a/packages/chat/src/components/message.tsx b/packages/chat/src/components/message.tsx index 11fbefb..51705ff 100644 --- a/packages/chat/src/components/message.tsx +++ b/packages/chat/src/components/message.tsx @@ -1,28 +1,21 @@ import * as React from "react"; import type { RawMessage } from "../values"; import Text from "@tensamin/markdown/text"; -import { AlertTriangle, Check, Ellipse, RefreshCw } from "lucide-react"; -import { useCallback, useEffect, useState } from "react"; +import { AlertTriangle } from "lucide-react"; +import { useEffect, useState } from "react"; import type { User } from "@tensamin/user/context"; import { Avatar, AvatarFallback, AvatarImage, - Button, cn, - Skeleton, + Tooltip, + TooltipContent, + TooltipTrigger, } from "@tensamin/ui"; import MessageContextMenu from "./messageContextMenu"; import Media from "./media"; -import { useStorage } from "@tensamin/storage/context"; -import { useMTP } from "@tensamin/mtp"; -import Input from "@tensamin/markdown/input"; -import { useChat } from "../context"; -import { encryptChatText } from "@tensamin/crypto/chatSecret"; -import { log, toast } from "@tensamin/shared/log"; -import Emoji, { normalizeShortcode } from "@tensamin/markdown/emoji"; -import { useRecordEmojiUse } from "./emojiRanks"; function MessageComponent({ grouped, @@ -32,21 +25,18 @@ function MessageComponent({ grouped: boolean; message: RawMessage & { failed?: boolean; - decryptionFailed?: boolean; }; user: User | null; }) { - const actuallyFailed = - (message.failed && message.MessageState === "awaiting") || - message.decryptionFailed; - - // Fade-in + const actuallyFailed = message.failed && message.message_state === "awaiting"; const [hasFadedIn, setHasFadedIn] = useState(false); const opacityClass = !hasFadedIn ? "opacity-0" - : message.MessageState === "awaiting" + : actuallyFailed || message.message_state === "awaiting" ? "opacity-50" : "opacity-100"; + + const [isValidURL, setIsValidURL] = useState(false); useEffect(() => { const timeout = window.setTimeout(() => { setHasFadedIn(true); @@ -57,343 +47,96 @@ function MessageComponent({ }; }, []); - // Message states - const { load } = useStorage(); - const { send } = useMTP(); - const [ownId, setOwnId] = useState(0); - useEffect(() => { - load("user_id").then(setOwnId); - }, [load]); - const messageStateReadUpdate = useCallback(async () => { - const readConfirmations = await load("settings.read_confirmations"); - - if (readConfirmations) { - if (!user?.UserId) return; - - await send("MessageState", { - ChatPartnerId: user?.UserId, - SendTime: message.SendTime, - MessageState: "read", - }); - } else { - await send("MessageState", { - ChatPartnerId: user?.UserId, - SendTime: message.SendTime, - MessageState: "received", - }); - } - }, [load, message.SendTime, user?.UserId, send]); - useEffect(() => { - if (message.SenderId === ownId || ownId === 0) return; - - let cancelled = false; - - async function run() { - const receiveConfirmations = await load("settings.receive_confirmations"); - if (cancelled) return; - - switch (message.MessageState) { - case "sent": - if (receiveConfirmations) { - messageStateReadUpdate(); - } - break; - - case "received": - messageStateReadUpdate(); - break; - - default: - break; - } - } - - run(); - - return () => { - cancelled = true; - }; - }, [ - message.MessageState, - load, - messageStateReadUpdate, - message.SenderId, - ownId, - ]); - - // Check if message is a url - const [isValidURL, setIsValidURL] = useState(false); useEffect(() => { try { - if (message.Content.split(" ").length > 1) throw new Error(); + if (message.content.split(" ").length > 1) throw new Error(); - new URL(message.Content); + new URL(message.content); setIsValidURL(true); } catch { setIsValidURL(false); } - }, [message.Content]); - - // Message editing - const { - addReaction, - chatSecret, - editMessage, - userId, - deleteMessage, - removeReaction, - } = useChat(); - const recordUse = useRecordEmojiUse(); - const [editing, setEditing] = useState(false); - const [editDraft, setEditDraft] = useState(message.Content); - useEffect(() => { - if (!editing) { - setEditDraft(message.Content); - } - }, [editing, message.Content]); - const submitEditMessage = useCallback( - async (newContent: string) => { - if (!chatSecret) return; - - const encryptedContent = await encryptChatText( - chatSecret, - newContent, - ).catch((err) => { - toast("error", "Failed to encrypt edit", String(err)); - }); - - if (!encryptedContent) return; - - const previousContent = message.Content; - editMessage(message.SendTime, { Content: newContent, Edited: true }); - - try { - const response = await send("MessageEdit", { - ChatPartnerId: userId, - Content: encryptedContent, - SendTime: message.SendTime, - }); - - if (response.type.startsWith("Error")) { - throw new Error(response.type); - } - } catch (err) { - editMessage(message.SendTime, { - Content: previousContent, - Edited: message.Edited ?? false, - }); - log(1, "chat", "red", "Failed to edit message", err); - toast("error", "Failed to edit message", String(err)); - } - }, - [ - chatSecret, - editMessage, - userId, - message.Content, - message.Edited, - message.SendTime, - send, - ], - ); - - const groupedReactions = Object.entries( - (message.Reactions ?? []).reduce< - Record - >((groups, item) => { - const reaction = normalizeShortcode(item.Reaction); - if (!reaction) return groups; - - const group = groups[reaction] ?? { - count: 0, - reactedByMe: false, - }; - group.count += 1; - group.reactedByMe ||= item.SenderId === ownId; - groups[reaction] = group; - return groups; - }, {}), - ); - - function toggleReaction(reaction: string) { - const reactedByMe = message.Reactions?.some( - (item) => - normalizeShortcode(item.Reaction) === reaction && - item.SenderId === ownId, - ); - - if (reactedByMe) { - return removeReaction(message.SendTime, reaction); - } - - recordUse(reaction); - return addReaction(message.SendTime, reaction); - } + }, [message.content]); return (
- {user && message.Content ? ( - +
-
+ {user ? ( <> {grouped ? (

- {new Date(message.SendTime).toLocaleString([], { + {new Date(message.send_time).toLocaleString([], { hour: "2-digit", minute: "2-digit", })}

) : ( - + - {user.Display.slice(0, 2).toUpperCase()} + {user.display.slice(0, 2).toUpperCase()} )} -
+ {message.failed && message.message_state === "awaiting" && ( + + +

Failed to send message

+
+ } /> +
+ )} +
{!grouped && (
-

{user.Display}

+

{user.display}

- {new Date(message.SendTime).toLocaleString([], { + {new Date(message.send_time).toLocaleString([], { hour: "2-digit", minute: "2-digit", })}

-
- {message.MessageState === "read" ? ( - - ) : message.MessageState === "received" ? ( - - ) : message.MessageState === "sent" ? ( - - ) : message.MessageState === "sending" ? ( - - ) : null} - {actuallyFailed && ( - - )} -
)} - {editing ? ( -
- { - submitEditMessage(editDraft); - setEditing(false); - }} - /> -
- - -
-
- ) : isValidURL ? ( - + {isValidURL ? ( + ) : ( - - )} - {groupedReactions.length > 0 && ( -
- {groupedReactions.map( - ([reaction, { count, reactedByMe }]) => ( - - ), - )} -
+ )}
-
- - ) : ( - - )} + ) : ( + "Loading" + )} +
+
); } export default React.memo(MessageComponent, (prev, next) => { return ( - prev.message.SendTime === next.message.SendTime && - prev.message.Content === next.message.Content && - prev.message.SenderId === next.message.SenderId && - prev.message.MessageState === next.message.MessageState && + prev.message.send_time === next.message.send_time && + prev.message.content === next.message.content && + prev.message.height === next.message.height && + prev.message.sent_by_self === next.message.sent_by_self && + prev.message.message_state === next.message.message_state && prev.message.failed === next.message.failed && - prev.message.decryptionFailed === next.message.decryptionFailed && - JSON.stringify(prev.message.Reactions) === - JSON.stringify(next.message.Reactions) && prev.grouped === next.grouped && prev.user === next.user ); diff --git a/packages/chat/src/components/messageContextMenu.tsx b/packages/chat/src/components/messageContextMenu.tsx index dc3c4cc..fb7d6ff 100644 --- a/packages/chat/src/components/messageContextMenu.tsx +++ b/packages/chat/src/components/messageContextMenu.tsx @@ -1,6 +1,4 @@ import { - Button, - Card, cn, ContextMenu, ContextMenuContent, @@ -15,36 +13,12 @@ import { DrawerContent, DrawerDescription, DrawerTitle, - Popover, - PopoverContent, - PopoverTrigger, - Separator, - Tooltip, - TooltipContent, - TooltipTrigger, + DrawerTrigger, useIsMobile, } from "@tensamin/ui"; -import { - Clipboard, - Ellipsis, - Forward, - Laugh, - Plus, - Pen, - Pin, - Reply, - Trash, -} from "lucide-react"; -import { cloneElement, useMemo, useState, useSyncExternalStore } from "react"; -import type { - MouseEvent as ReactMouseEvent, - ReactElement, - ReactNode, -} from "react"; -import { useChat } from "../context"; -import Emoji from "@tensamin/markdown/emoji"; -import EmojiPicker from "./emojiPicker"; -import { getRecentEmojis, useEmojiRanks } from "./emojiRanks"; +import { Pin, Clipboard, Pen, Reply, Forward, Trash } from "lucide-react"; +import { useMemo, useState } from "react"; +import type { ReactElement, ReactNode } from "react"; async function copyText(text: string) { await navigator.clipboard.writeText(text); @@ -150,300 +124,36 @@ function getMobileMenuComponents({ }; } -function ReactionItems({ - Item, - emojis, - onMore, - onSelect, -}: { - Item: MenuComponents["Item"]; - emojis: string[]; - onMore: () => void; - onSelect: (emoji: string) => void; -}) { - return ( - <> - {emojis.map((emoji) => ( - onSelect(emoji)}> - - {emoji} - - ))} - - - More reactions - - - ); -} - -let shiftPressed = false; -const shiftListeners = new Set<() => void>(); - -function setShiftPressed(value: boolean) { - if (shiftPressed === value) return; - - shiftPressed = value; - shiftListeners.forEach((listener) => listener()); -} - -function subscribeToShift(listener: () => void) { - shiftListeners.add(listener); - - if (shiftListeners.size === 1) { - window.addEventListener("keydown", handleShiftKey); - window.addEventListener("keyup", handleShiftKey); - window.addEventListener("blur", handleWindowBlur); - } - - return () => { - shiftListeners.delete(listener); - if (shiftListeners.size === 0) { - window.removeEventListener("keydown", handleShiftKey); - window.removeEventListener("keyup", handleShiftKey); - window.removeEventListener("blur", handleWindowBlur); - shiftPressed = false; - } - }; -} - -function handleShiftKey(event: KeyboardEvent) { - setShiftPressed(event.shiftKey); -} - -function handleWindowBlur() { - setShiftPressed(false); -} - -function useShiftPressed() { - return useSyncExternalStore( - subscribeToShift, - () => shiftPressed, - () => false, - ); -} - -let activeMiniMenuId: number | null = null; -let clearMiniMenuTimeout: ReturnType | undefined; -const miniMenuListeners = new Set<() => void>(); - -function setActiveMiniMenu(messageId: number | null) { - if (clearMiniMenuTimeout !== undefined) { - clearTimeout(clearMiniMenuTimeout); - clearMiniMenuTimeout = undefined; - } - if (activeMiniMenuId === messageId) return; - - activeMiniMenuId = messageId; - miniMenuListeners.forEach((listener) => listener()); -} - -function scheduleMiniMenuClose() { - clearMiniMenuTimeout = setTimeout(() => { - clearMiniMenuTimeout = undefined; - setActiveMiniMenu(null); - }, 80); -} - -function useActiveMiniMenuId() { - return useSyncExternalStore( - (listener) => { - miniMenuListeners.add(listener); - return () => miniMenuListeners.delete(listener); - }, - () => activeMiniMenuId, - () => null, - ); -} - -function MiniMenuTooltip({ - children, - label, -}: { - children: ReactElement; - label: string; -}) { - return ( - - - {label} - - ); -} - -function MiniMessageMenu({ - isOwnMessage, - onDelete, - onEdit, - onOpenMenu, - onOpenPicker, - usePickerTrigger, - onReact, - quickReactions, - onReply, - shiftIsPressed, -}: { - isOwnMessage: boolean; - onDelete: () => void; - onEdit: () => void; - onOpenMenu: (event: ReactMouseEvent) => void; - onOpenPicker: () => void; - usePickerTrigger: boolean; - onReact: (emoji: string) => void; - quickReactions: string[]; - onReply: () => void; - shiftIsPressed: boolean; -}) { - return ( -
- - {quickReactions.map((emoji) => ( - onReact(emoji)} - > - - - } - /> - ))} - - - - - } - /> - ) : ( - - ) - } - /> - - {isOwnMessage ? : } - - } - /> - - - - } - /> - - {isOwnMessage && shiftIsPressed ? ( - - - - } - /> - ) : ( - - - - } - /> - )} - -
- ); +function ReactionItems({ Item }: { Item: MenuComponents["Item"] }) { + return Cool item; } function MessageMenuContent({ components, content, devEnabled, - isOwnMessage, messageId, onAddReaction, - reactionEmojis, - onReact, showReactionItems = true, - onSetEditing, }: { components: MenuComponents; content: string; devEnabled: boolean; - isOwnMessage: boolean; messageId: number; onAddReaction?: () => void | Promise; - reactionEmojis: string[]; - onReact: (emoji: string) => void; showReactionItems?: boolean; - onSetEditing: (value: boolean) => void; }) { const { Content, Group, Item, Separator, Sub, SubContent, SubTrigger } = components; - const { deleteMessage, setReplyTo } = useChat(); - return ( - - Add Reaction - + Add Reaction {showReactionItems && ( - void onAddReaction?.()} - onSelect={onReact} - /> + )} @@ -459,42 +169,22 @@ function MessageMenuContent({ - {isOwnMessage && ( - { - onSetEditing(true); - }} - > -

Edit Message

-
- )} - { - setReplyTo(messageId); - }} - > + +

Edit Message

+
+

Reply

Forward

- {isOwnMessage && ( - <> - - - deleteMessage(messageId)} - > -

Delete Message

-
-
- - )} + + + +

Delete Message

+
+
{devEnabled && ( <> @@ -515,40 +205,19 @@ function MessageMenuContent({ export default function MessageContextMenu({ children, content, - hideMiniMenu = false, - isOwnMessage, messageId, - onReact, - onSetEditing, }: { children: ReactElement; content: string; - hideMiniMenu?: boolean; - isOwnMessage: boolean; messageId: number; - onReact: (emoji: string) => void | Promise; - onSetEditing: (value: boolean) => void; }) { const isMobile = useIsMobile(); - const shiftIsPressed = useShiftPressed(); - const activeMenuId = useActiveMiniMenuId(); - const { deleteMessage, setReplyTo } = useChat(); const devEnabled = useMemo( () => Number(localStorage.getItem("log_level")) >= 3, [], ); const [mainDrawerOpen, setMainDrawerOpen] = useState(false); const [reactionDrawerOpen, setReactionDrawerOpen] = useState(false); - const [pickerOpen, setPickerOpen] = useState(false); - const { ranks } = useEmojiRanks(); - const quickReactions = getRecentEmojis(ranks, 3); - const menuReactions = getRecentEmojis(ranks, 5); - - function selectReaction(emoji: string) { - void onReact(emoji); - setReactionDrawerOpen(false); - setPickerOpen(false); - } const mainDrawerComponents = useMemo( () => getMobileMenuComponents({ @@ -568,60 +237,18 @@ export default function MessageContextMenu({ [], ); - function renderMessage( - openMenu: (event: ReactMouseEvent) => void, - ) { - return ( -
setActiveMiniMenu(messageId)} - onPointerLeave={scheduleMiniMenuClose} - > - {children} - {!isMobile && !hideMiniMenu && activeMenuId === messageId && ( - deleteMessage(messageId)} - onEdit={() => onSetEditing(true)} - onOpenMenu={openMenu} - onOpenPicker={() => setPickerOpen(true)} - usePickerTrigger={!isMobile} - onReact={selectReaction} - quickReactions={quickReactions} - onReply={() => setReplyTo(messageId)} - shiftIsPressed={shiftIsPressed} - /> - )} -
- ); - } - if (isMobile) { - const child = renderMessage(() => setMainDrawerOpen(true)); - return ( <> - {cloneElement(child, { - onContextMenu: (event: ReactMouseEvent) => { - child.props.onContextMenu?.(event); - if (event.defaultPrevented) return; - - event.preventDefault(); - setMainDrawerOpen(true); - }, - })} + {children} setReactionDrawerOpen(true)} - onReact={selectReaction} - reactionEmojis={menuReactions} showReactionItems={false} - onSetEditing={onSetEditing} /> @@ -631,26 +258,7 @@ export default function MessageContextMenu({ Choose a reaction to add to this message.
- { - setReactionDrawerOpen(false); - setPickerOpen(true); - }} - onSelect={selectReaction} - /> -
- -
- - - Choose an emoji - - Choose an emoji to react with. - -
- +
@@ -658,38 +266,15 @@ export default function MessageContextMenu({ ); } - const child = renderMessage((event) => { - event.preventDefault(); - event.stopPropagation(); - event.currentTarget.dispatchEvent( - new MouseEvent("contextmenu", { - bubbles: true, - button: 2, - clientX: event.clientX, - clientY: event.clientY, - }), - ); - }); - return ( - - - - setPickerOpen(true)} - onReact={selectReaction} - reactionEmojis={menuReactions} - onSetEditing={onSetEditing} - /> - - - - - + + + + ); } diff --git a/packages/chat/src/context.tsx b/packages/chat/src/context.tsx index c69cd9c..09d65c3 100644 --- a/packages/chat/src/context.tsx +++ b/packages/chat/src/context.tsx @@ -12,87 +12,35 @@ import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import { useRouterState } from "@tanstack/react-router"; import type { InfiniteData } from "@tanstack/react-query"; import type { LiveMessage, RawMessage, RawMessages } from "./values"; -import { - deriveChatId, - deriveChatSecretId, - decryptChatText, - kemPublicKeyFromPublicKeyBundle, - ownKemPublicKeyFromKeyring, - randomChatSecret, - unwrapChatSecret, - wrapChatSecret, -} from "@tensamin/crypto/chatSecret"; -import { useStorage } from "@tensamin/storage/context"; -import { useMTP } from "@tensamin/mtp"; -import { log, toast } from "@tensamin/shared/log"; -import { useSession } from "@tensamin/storage/session"; +import { useCrypto } from "@tensamin/crypto/context"; import { useUser } from "@tensamin/user/context"; -import { createCache } from "@tensamin/cache"; -import { secureValueCodec } from "@tensamin/storage/secure"; +import { useStorage } from "@tensamin/storage/context"; +import { useTTP } from "@tensamin/ttp"; +import { log } from "@tensamin/shared/log"; +import { useSession } from "@tensamin/storage/session"; export const context = createContext(undefined); const queryClient = new QueryClient(); -const CHAT_SECRET_VERSION = 1; -function bytesFromProtocol(value: unknown): Uint8Array { - if (value instanceof Uint8Array) return value; - if (value instanceof ArrayBuffer) return new Uint8Array(value); - if (ArrayBuffer.isView(value)) { - return new Uint8Array(value.buffer, value.byteOffset, value.byteLength); - } - if (Array.isArray(value)) return new Uint8Array(value); - if (typeof value === "string") { - const bin = atob(value); - const out = new Uint8Array(bin.length); - for (let i = 0; i < bin.length; i++) out[i] = bin.charCodeAt(i); - return out; - } - if (typeof value === "object" && value !== null) { - const entries = Object.entries(value); - if ( - entries.every( - ([key, item]) => /^\d+$/.test(key) && typeof item === "number", - ) - ) { - return new Uint8Array(entries.map(([, item]) => item as number)); - } - } - throw new Error("expected protocol bytes"); -} - -type EditableMessage = RawMessage & { failed?: boolean }; -type MessageEdit = Partial< - Pick< - EditableMessage, - "Content" | "Edited" | "MessageState" | "Reactions" | "failed" - > ->; - -function updateMessagesBySendTime( +function updateMessageStateBySendTime< + T extends { send_time: number; message_state: RawMessage["message_state"] }, +>( messages: T[], sendTime: number, - edit: MessageEdit, + messageState: RawMessage["message_state"], ): { next: T[]; updated: boolean } { let updated = false; const next = messages.map((item) => { - if (item.SendTime !== sendTime) { - return item; - } - - const entries = Object.entries(edit) as Array< - [keyof MessageEdit, MessageEdit[keyof MessageEdit]] - >; - - if (entries.every(([key, value]) => item[key] === value)) { + if (item.send_time !== sendTime || item.message_state === messageState) { return item; } updated = true; return { ...item, - ...edit, + message_state: messageState, }; }); @@ -102,71 +50,25 @@ function updateMessagesBySendTime( }; } -function assertProtocolSuccess(type: string, response: { type: string }) { - if (response.type.startsWith("Error")) { - throw new Error(`${type} failed: ${response.type}`); - } -} - -function protocolBytes(bytes: Uint8Array): Uint8Array { - return new Uint8Array(bytes); -} - -type SendMessageGet = ( - type: "MessageGet", - data: { SendTime: number }, -) => Promise<{ data: RawMessage }>; - -type GetChatSecret = (userId: number) => Promise; - -export async function fetchReplyMessage({ - replyTo, - send, - getChatSecret, -}: { - replyTo: number; - ownId: number; - chatUserId: number; - send: SendMessageGet; - getChatSecret: GetChatSecret; -}) { - const value = await send("MessageGet", { - SendTime: replyTo, - }); - const chatSecret = await getChatSecret(value.data.SenderId); - - if (!chatSecret) { - throw new Error("Missing chat secret"); - } - - const decryptedContent = await decryptChatText( - chatSecret, - value.data.Content, - ); - - return { - ...value.data, - Content: decryptedContent, - }; -} - -export default function Provider({ children }: { children: ReactNode }) { +/** + * Executes Provider. + * @param props Parameter props. + * @returns unknown. + */ +export default function Provider(props: { children: ReactNode }) { + const { getSharedSecret, decryptText } = useCrypto(); + const { get } = useUser(); const { load } = useStorage(); - const { send, subscribePush } = useMTP(); - const { get: getUser } = useUser(); + const { send, subscribePush } = useTTP(); const { moveUserIdToTop } = useSession(); - const [error, setError] = useState(""); - const [errorDescription, setErrorDescription] = useState(""); - const [liveMessagesState, setLiveMessagesState] = useState([]); - const [ownId, setOwnId] = useState(0); - const [currentChatSecretState, setCurrentChatSecretState] = useState<{ + const [currentSharedSecretState, setCurrentSharedSecretState] = useState<{ userId: number; - value: Uint8Array | null; + value: string; }>({ userId: 0, - value: null, + value: "", }); const inputBoxRef = useRef(null); @@ -181,18 +83,15 @@ export default function Provider({ children }: { children: ReactNode }) { return Number(rawId ?? 0); }, [locationSearch]); - const currentChatSecret = useMemo(() => { - if (currentChatSecretState.userId !== userIdValue) { - return null; + const currentSharedSecret = useMemo(() => { + if (currentSharedSecretState.userId !== userIdValue) { + return ""; } - return currentChatSecretState.value; - }, [currentChatSecretState, userIdValue]); - - useEffect(() => { - load("user_id").then(setOwnId); - }, [load]); + return currentSharedSecretState.value; + }, [currentSharedSecretState, userIdValue]); + // Load shared secret useEffect(() => { if (!userIdValue) return; @@ -200,93 +99,28 @@ export default function Provider({ children }: { children: ReactNode }) { void (async () => { try { - setError(""); - setErrorDescription(""); - - const ownUserId = Number(await load("user_id")); - const keyring = await load("mtp_keyring"); - const chatId = deriveChatId(ownUserId, userIdValue); - const secretId = deriveChatSecretId(chatId); - - const existing = await send("GetChatSecret", { - UserId: String(ownUserId), - ChatId: chatId, - SecretId: secretId, - }); - - if (!existing.type.startsWith("Error")) { - const data = existing.data as Record; - const secret = await unwrapChatSecret({ - encryptedSecret: bytesFromProtocol(data.EncryptedSecret), - kemCiphertext: bytesFromProtocol(data.KemCiphertext), - keyring, - chatId: String(data.ChatId), - secretId: String(data.SecretId), - version: Number(data.VersionNumber), - wrappingScheme: String(data.WrappingScheme), - }); - - if (active) { - setCurrentChatSecretState({ userId: userIdValue, value: secret }); - } - return; - } - - if (existing.type !== "ErrorNotSet") { - throw new Error(`GetChatSecret failed: ${existing.type}`); - } - - const rawSecret = randomChatSecret(); - const ownWrapped = await wrapChatSecret({ - chatSecret: rawSecret, - recipientKemPublicKey: ownKemPublicKeyFromKeyring(keyring), - chatId, - secretId, - version: CHAT_SECRET_VERSION, - }); - const peerUser = await getUser(userIdValue); - const peerWrapped = await wrapChatSecret({ - chatSecret: rawSecret, - recipientKemPublicKey: kemPublicKeyFromPublicKeyBundle( - peerUser.PublicKey, - ), - chatId, - secretId, - version: CHAT_SECRET_VERSION, - }); - - assertProtocolSuccess( - "SetChatSecret", - await send("SetChatSecret", { - ChatId: chatId, - SecretId: secretId, - VersionNumber: CHAT_SECRET_VERSION, - WrappingScheme: ownWrapped.wrappingScheme, - CreatedAt: Date.now(), - Recipients: [ - { - UserId: String(ownUserId), - EncryptedSecret: protocolBytes(ownWrapped.encryptedSecret), - KemCiphertext: protocolBytes(ownWrapped.kemCiphertext), - }, - { - UserId: String(userIdValue), - EncryptedSecret: protocolBytes(peerWrapped.encryptedSecret), - KemCiphertext: protocolBytes(peerWrapped.kemCiphertext), - }, - ], - }), + const recipientData = await get(userIdValue); + const ownId = await load("user_id"); + const privateKey = await load("private_key"); + const ownData = await get(ownId); + const sharedSecret = await getSharedSecret( + privateKey, + ownData.public_key, + recipientData.public_key, ); if (active) { - setCurrentChatSecretState({ userId: userIdValue, value: rawSecret }); + setCurrentSharedSecretState({ + userId: userIdValue, + value: sharedSecret, + }); } - } catch (err) { - log(1, "chat", "red", "Failed to initialize chat secret", err); + } catch { if (active) { - setError(err instanceof Error ? err.name : "Unknown Error"); - setErrorDescription(err instanceof Error ? err.message : String(err)); - setCurrentChatSecretState({ userId: userIdValue, value: null }); + setCurrentSharedSecretState({ + userId: userIdValue, + value: "", + }); } } })(); @@ -294,140 +128,140 @@ export default function Provider({ children }: { children: ReactNode }) { return () => { active = false; }; - }, [getUser, load, send, userIdValue]); - - const getChatSecret = useCallback( - async (userId: number): Promise => { - if (!Number.isSafeInteger(userId) || userId <= 0) { - throw new Error("Invalid chat user id"); - } - - const ownUserId = Number(await load("user_id")); - const keyring = await load("mtp_keyring"); - const chatId = deriveChatId(ownUserId, userId); - const secretId = deriveChatSecretId(chatId); - - const response = await send("GetChatSecret", { - UserId: String(ownUserId), - ChatId: chatId, - SecretId: secretId, - }); - - if (response.type === "ErrorNotSet") { - return null; - } - - if (response.type.startsWith("Error")) { - throw new Error(`GetChatSecret failed: ${response.type}`); - } - - const data = response.data as Record; - return await unwrapChatSecret({ - encryptedSecret: bytesFromProtocol(data.EncryptedSecret), - kemCiphertext: bytesFromProtocol(data.KemCiphertext), - keyring, - chatId: String(data.ChatId), - secretId: String(data.SecretId), - version: Number(data.VersionNumber), - wrappingScheme: String(data.WrappingScheme), - }); - }, - [load, send], - ); - - const decryptMessages = useCallback( - async (messages: RawMessages) => { - if (!currentChatSecret) return []; - return Promise.all( - messages.map(async (message) => { - try { - return { - ...message, - Content: await decryptChatText( - currentChatSecret, - message.Content, - ), - }; - } catch (err) { - log(1, "chat", "red", "Failed to decrypt historical message", err, { - SendTime: message.SendTime, - }); - return { - ...message, - Content: "Failed to decrypt message", - decryptionFailed: true, - }; - } - }), - ); - }, - [currentChatSecret], - ); - - const getCachedMessages = useCallback(async () => { - if (!ownId || !userIdValue || !currentChatSecret) return []; - const cache = createCache(String(ownId), { - codec: secureValueCodec, - }); - const window = await cache.conversations.get(userIdValue); - return decryptMessages(window?.Messages ?? []); - }, [currentChatSecret, decryptMessages, ownId, userIdValue]); + }, [get, getSharedSecret, load, userIdValue]); const getMessages = useCallback( async (amount: number, offset: number) => { - if (!currentChatSecret) { - return []; - } - - const messages = await send("MessagesGet", { - Amount: amount, - Offset: offset, - UserId: userIdValue, + const messages = await send("messages_get", { + amount, + offset, + user_id: userIdValue, }); if (messages.type.startsWith("error")) { throw new Error(messages.type); } - const rawMessages = messages.data.Messages; - const sorted = [...rawMessages].sort((a, b) => a.SendTime - b.SendTime); + const rawMessages = messages.data.messages; + const sorted = [...rawMessages].sort((a, b) => a.send_time - b.send_time); if (sorted.length > 0) { - const fetchedSendTimes = new Set(sorted.map((item) => item.SendTime)); + const fetchedSendTimes = new Set(sorted.map((item) => item.send_time)); setLiveMessagesState((prev) => { const filtered = prev.filter( - (liveMessage) => !fetchedSendTimes.has(liveMessage.SendTime), + (liveMessage) => !fetchedSendTimes.has(liveMessage.send_time), ); return filtered.length === prev.length ? prev : filtered; }); } - return decryptMessages(sorted); + return await Promise.all( + sorted.map(async (message) => { + try { + return { + ...message, + content: await decryptText(currentSharedSecret, message.content), + }; + } catch { + return message; + } + }), + ); }, - [currentChatSecret, decryptMessages, send, userIdValue], + [send, userIdValue, currentSharedSecret, decryptText], ); + const addLiveMessage = useCallback( + (message: RawMessage) => { + const localId = + globalThis.crypto?.randomUUID?.() ?? + `${Date.now()}-${Math.random().toString(36).slice(2)}`; + + if (!message.sent_by_self) { + moveUserIdToTop(userIdValue); + } + + setLiveMessagesState((prev) => [ + ...prev, + { + ...message, + localId, + failed: false, + }, + ]); + + return { + setFailed: (failed: boolean) => { + setLiveMessagesState((prev) => + prev.map((liveMessage) => + liveMessage.localId === localId + ? { ...liveMessage, failed } + : liveMessage, + ), + ); + }, + }; + }, + [userIdValue, moveUserIdToTop], + ); + + const clearLiveMessages = useCallback(() => { + setLiveMessagesState([]); + }, []); + + // Get live updates for message states useEffect(() => { - if (!currentChatSecret || !ownId || !userIdValue) return; - const queryKey = ["chat-messages", String(userIdValue), true] as const; - void getCachedMessages().then((messages) => { - if (messages.length === 0 || queryClient.getQueryData(queryKey)) return; - queryClient.setQueryData>(queryKey, { - pages: [messages], - pageParams: [0], - }); - }); - }, [currentChatSecret, getCachedMessages, ownId, userIdValue]); + return subscribePush((message) => { + if (message.type !== "message_state") { + return; + } + + const rawData = message.data as { + chat_partner_id: unknown; + send_time: unknown; + message_state: RawMessage["message_state"]; + }; + + const nextState = { + chat_partner_id: Number(rawData.chat_partner_id), + send_time: Number(rawData.send_time), + message_state: rawData.message_state, + }; + + if ( + !Number.isFinite(nextState.chat_partner_id) || + !Number.isFinite(nextState.send_time) + ) { + log( + 3, + "chat", + "yellow", + "Cancel message state update due to invalid data", + ); + return; + } + + if (nextState.chat_partner_id !== userIdValue) { + log( + 3, + "chat", + "yellow", + "Cancel message state update due to user ID mismatch", + { + expected: userIdValue, + received: nextState.chat_partner_id, + }, + ); + return; + } - const editMessage = useCallback( - (sendTime: number, edit: MessageEdit) => { setLiveMessagesState((prev) => { - const { next, updated } = updateMessagesBySendTime( + const { next, updated } = updateMessageStateBySendTime( prev, - sendTime, - edit, + nextState.send_time, + nextState.message_state, ); return updated ? next : prev; }); @@ -435,7 +269,7 @@ export default function Provider({ children }: { children: ReactNode }) { const queryKey = [ "chat-messages", String(userIdValue), - currentChatSecret !== null, + currentSharedSecret.length > 0, ] as const; queryClient.setQueryData>( queryKey, @@ -447,7 +281,11 @@ export default function Provider({ children }: { children: ReactNode }) { let updated = false; const pages = current.pages.map((page) => { - const nextPage = updateMessagesBySendTime(page, sendTime, edit); + const nextPage = updateMessageStateBySendTime( + page, + nextState.send_time, + nextState.message_state, + ); if (nextPage.updated) { updated = true; @@ -466,355 +304,23 @@ export default function Provider({ children }: { children: ReactNode }) { }; }, ); - }, - [currentChatSecret, userIdValue], - ); - - const removeMessage = useCallback( - (sendTime: number) => { - setLiveMessagesState((prev) => - prev.filter((message) => message.SendTime !== sendTime), - ); - const queryKey = [ - "chat-messages", - String(userIdValue), - currentChatSecret !== null, - ] as const; - - queryClient.setQueryData>( - queryKey, - (current) => { - if (!current) { - return current; - } - - let updated = false; - - const pages = current.pages.map((page) => { - const nextPage = page.filter((message) => { - const keep = message.SendTime !== sendTime; - if (!keep) { - updated = true; - } - return keep; - }); - - return nextPage; - }); - - if (!updated) { - return current; - } - - return { - ...current, - pages, - }; - }, - ); - }, - [currentChatSecret, userIdValue], - ); - - const deleteMessage = useCallback( - async (sendTime: number) => { - try { - const response = await send("MessageDelete", { - ChatPartnerId: userIdValue, - SendTime: sendTime, - }); - - assertProtocolSuccess("MessageDelete", response); - removeMessage(sendTime); - } catch (err) { - log(1, "chat", "red", "Failed to delete message", err); - toast("error", "Failed to delete message", String(err)); - } - }, - [removeMessage, send, userIdValue], - ); - - const setReaction = useCallback( - async (sendTime: number, reaction: string, add: boolean) => { - let previousReactions: RawMessage["Reactions"]; - let foundMessage = false; - - const applyOptimisticUpdate = (message: EditableMessage) => { - const current = message.Reactions ?? []; - previousReactions = current; - foundMessage = true; - - return add - ? [...current, { Reaction: reaction, SenderId: ownId }] - : current.filter( - (item) => item.Reaction !== reaction || item.SenderId !== ownId, - ); - }; - - setLiveMessagesState((current) => - current.map((message) => - message.SendTime === sendTime - ? { ...message, Reactions: applyOptimisticUpdate(message) } - : message, - ), - ); - - const queryKey = [ - "chat-messages", - String(userIdValue), - currentChatSecret !== null, - ] as const; - queryClient.setQueryData>( - queryKey, - (current) => - current - ? { - ...current, - pages: current.pages.map((page) => - page.map((message) => - message.SendTime === sendTime - ? { - ...message, - Reactions: applyOptimisticUpdate(message), - } - : message, - ), - ), - } - : current, - ); - - try { - const response = await send( - add ? "MessageReactionAdd" : "MessageReactionRemove", - { - ChatPartnerId: userIdValue, - Reaction: reaction, - SendTime: sendTime, - }, - ); - assertProtocolSuccess( - add ? "MessageReactionAdd" : "MessageReactionRemove", - response, - ); - } catch (err) { - if (foundMessage) { - editMessage(sendTime, { Reactions: previousReactions }); - } - log(1, "chat", "red", "Failed to update reaction", err); - toast("error", "Failed to update reaction", String(err)); - } - }, - [currentChatSecret, editMessage, ownId, send, userIdValue], - ); - - const addReaction = useCallback( - (sendTime: number, reaction: string) => - setReaction(sendTime, reaction, true), - [setReaction], - ); - const removeReaction = useCallback( - (sendTime: number, reaction: string) => - setReaction(sendTime, reaction, false), - [setReaction], - ); - - const addLiveMessage = useCallback( - (message: RawMessage) => { - const localId = - globalThis.crypto?.randomUUID?.() ?? - `${Date.now()}-${Math.random().toString(36).slice(2)}`; - - if (message.SenderId !== ownId) { - moveUserIdToTop(userIdValue); - } - - setLiveMessagesState((prev) => [ - ...prev, - { - ...message, - localId, - failed: false, - }, - ]); - - return { - setFailed: (failed: boolean) => { - editMessage(message.SendTime, { failed }); - }, - }; - }, - [editMessage, userIdValue, moveUserIdToTop, ownId], - ); - - const clearLiveMessages = useCallback(() => { - setLiveMessagesState([]); - }, []); - - // Get live updates for message states - useEffect(() => { - return subscribePush((message) => { - if (message.type === "MessageEditLive") { - if (!currentChatSecret) return; - - const rawData = message.data as { - ChatPartnerId: unknown; - SendTime: unknown; - Content: string; - }; - - const chatPartnerId = Number(rawData.ChatPartnerId); - const sendTime = Number(rawData.SendTime); - - if (!Number.isFinite(chatPartnerId) || !Number.isFinite(sendTime)) { - log( - 3, - "chat", - "yellow", - "Cancel message edit update due to invalid data", - ); - return; - } - - if (chatPartnerId !== userIdValue) { - log( - 3, - "chat", - "yellow", - "Cancel message edit update due to user ID mismatch", - { - expected: userIdValue, - received: chatPartnerId, - }, - ); - return; - } - - void decryptChatText(currentChatSecret, rawData.Content) - .then((content) => { - editMessage(sendTime, { Content: content, Edited: true }); - }) - .catch((err) => { - log(1, "chat", "red", "Failed to decrypt message edit", err, { - SendTime: sendTime, - }); - }); - return; - } - - if (message.type === "MessageReactionLive") { - const rawData = message.data as { - ChatPartnerId: unknown; - SendTime: unknown; - }; - const chatPartnerId = Number(rawData.ChatPartnerId); - const sendTime = Number(rawData.SendTime); - - if (chatPartnerId !== userIdValue || !Number.isFinite(sendTime)) return; - - void send("MessageGet", { SendTime: sendTime }) - .then((response) => { - assertProtocolSuccess("MessageGet", response); - editMessage(sendTime, { Reactions: response.data.Reactions ?? [] }); - }) - .catch((err) => { - log(1, "chat", "red", "Failed to refresh message reactions", err); - }); - return; - } - - if (message.type === "MessageDeleteLive") { - const data = message.data as { - ChatPartnerId: number; - SendTime: number; - }; - - if (data.ChatPartnerId !== userIdValue) return; - - removeMessage(data.SendTime); - return; - } - - if (message.type !== "MessageState") return; - - const rawData = message.data as { - ChatPartnerId: unknown; - SendTime: unknown; - MessageState: RawMessage["MessageState"]; - }; - - const nextState = { - ChatPartnerId: Number(rawData.ChatPartnerId), - SendTime: Number(rawData.SendTime), - MessageState: rawData.MessageState, - }; - - if ( - !Number.isFinite(nextState.ChatPartnerId) || - !Number.isFinite(nextState.SendTime) - ) { - log( - 3, - "chat", - "yellow", - "Cancel message state update due to invalid data", - ); - return; - } - - if (nextState.ChatPartnerId !== userIdValue) { - log( - 3, - "chat", - "yellow", - "Cancel message state update due to user ID mismatch", - { - expected: userIdValue, - received: nextState.ChatPartnerId, - }, - ); - return; - } - - editMessage(nextState.SendTime, { - MessageState: nextState.MessageState, - }); }); - }, [ - currentChatSecret, - editMessage, - removeMessage, - send, - subscribePush, - userIdValue, - ]); - - // Replys - const [replyTo, setReplyTo] = useState(undefined); + }, [currentSharedSecret, subscribePush, userIdValue]); return ( liveMessagesState, addLiveMessage, - editMessage, - deleteMessage, - addReaction, - removeReaction, clearLiveMessages, - chatSecret: currentChatSecret, + sharedSecret: currentSharedSecret, userId: userIdValue, inputBoxRef, - error, - errorDescription, - replyTo, - setReplyTo, }} > - {children} + {props.children} ); @@ -822,25 +328,21 @@ export default function Provider({ children }: { children: ReactNode }) { type contextType = { getMessages: (amount: number, offset: number) => Promise; - getChatSecret: (userId: number) => Promise; liveMessages: () => LiveMessage[]; addLiveMessage: (message: RawMessage) => { setFailed: (failed: boolean) => void; }; - editMessage: (sendTime: number, edit: MessageEdit) => void; - deleteMessage: (sendTime: number) => void; - addReaction: (sendTime: number, reaction: string) => Promise; - removeReaction: (sendTime: number, reaction: string) => Promise; clearLiveMessages: () => void; - chatSecret: Uint8Array | null; + sharedSecret: string; userId: number; inputBoxRef: React.RefObject; - error: string; - errorDescription: string; - replyTo: number | undefined; - setReplyTo: (value: number | undefined) => void; }; +/** + * Executes useChat. + * @param none This function has no parameters. + * @returns contextType. + */ export function useChat(): contextType { const ctx = useContext(context); if (!ctx) { @@ -848,66 +350,3 @@ export function useChat(): contextType { } return ctx; } - -export function useReplyMessage() { - const { send } = useMTP(); - const { load } = useStorage(); - const { replyTo, setReplyTo, getChatSecret, userId } = useChat(); - const [ownId, setOwnId] = useState(0); - const [replyMessage, setReplyMessage] = useState(); - - const handleReplyError = useCallback( - (err: unknown) => { - log(1, "chat", "red", "Failed to get reply message", err); - toast("error", "Failed to get reply message", String(err)); - setReplyTo(undefined); - setReplyMessage(undefined); - }, - [setReplyTo], - ); - - useEffect(() => { - void load("user_id").then((value) => { - setOwnId(Number(value)); - }); - }, [load]); - - useEffect(() => { - if (!replyTo || !ownId) { - setReplyMessage(undefined); - return; - } - - let active = true; - setReplyMessage(undefined); - - void fetchReplyMessage({ - replyTo, - ownId, - chatUserId: userId, - send, - getChatSecret, - }) - .then((message) => { - if (active) { - setReplyMessage(message); - } - }) - .catch((err) => { - if (active) { - handleReplyError(err); - } - }); - - return () => { - active = false; - }; - }, [replyTo, ownId, userId, send, getChatSecret, handleReplyError]); - - return { - ownId, - replyTo, - replyMessage, - replyUserId: replyMessage?.SenderId, - }; -} diff --git a/packages/chat/src/screen.tsx b/packages/chat/src/screen.tsx index 707177e..f6bcff5 100644 --- a/packages/chat/src/screen.tsx +++ b/packages/chat/src/screen.tsx @@ -1,6 +1,9 @@ import * as React from "react"; import { useInfiniteQuery } from "@tanstack/react-query"; import { useVirtualizer } from "@tanstack/react-virtual"; +import { failedUser } from "@tensamin/shared/data"; +import { useStorage } from "@tensamin/storage/context"; +import { useUser, type User } from "@tensamin/user/context"; import InputComponent from "./components/input"; import Message from "./components/message"; @@ -12,8 +15,6 @@ import { type LiveMessage, type RawMessage, } from "./values"; -import Wrapper from "@tensamin/user/wrapper"; -import { Skeleton } from "@tensamin/ui"; type MessageChunk = { key: string; @@ -21,6 +22,12 @@ type MessageChunk = { startIndex: number; }; +function getEstimatedMessageHeight(message: { height?: number }) { + return typeof message.height === "number" && Number.isFinite(message.height) + ? Math.max(1, Math.ceil(message.height)) + : FALLBACK_MESSAGE_HEIGHT; +} + function shouldFetchPreviousPage({ entry, hasNextPage, @@ -41,7 +48,7 @@ function shouldFetchPreviousPage({ } function getMessageRenderKey(message: RawMessage | LiveMessage) { - return "localId" in message ? message.localId : String(message.SendTime); + return "localId" in message ? message.localId : String(message.send_time); } function buildMessageChunks( @@ -73,15 +80,11 @@ function buildMessageChunks( * @returns Chat screen JSX. */ export default function Screen() { - const { - getMessages, - liveMessages, - clearLiveMessages, - userId, - chatSecret, - error, - errorDescription, - } = useChat(); + const { getMessages, liveMessages, clearLiveMessages, userId, sharedSecret } = + useChat(); + const { get: getUser } = useUser(); + const { load } = useStorage(); + const scrollRef = React.useRef(null); const topSentinelRef = React.useRef(null); const didInitialScrollRef = React.useRef(false); @@ -93,19 +96,22 @@ export default function Screen() { const isFetchingNextPageRef = React.useRef(false); const fetchNextPageRef = React.useRef<(() => void) | null>(null); + const [messageUsers, setMessageUsers] = React.useState< + Record + >({}); const [lastLiveMessageCount, setLastLiveMessageCount] = React.useState(0); const [didInitialScroll, setDidInitialScroll] = React.useState(false); const [viewportHeight, setViewportHeight] = React.useState(0); const [value, setValue] = React.useState(""); const hasValidChatUser = Number.isSafeInteger(userId) && userId > 0; - const hasChatSecret = chatSecret !== null; + const hasSharedSecret = sharedSecret.length > 0; const messagesQuery = useInfiniteQuery({ - queryKey: ["chat-messages", String(userId), hasChatSecret], + queryKey: ["chat-messages", String(userId), hasSharedSecret], initialPageParam: 0, queryFn: ({ pageParam }) => getMessages(PAGE_SIZE, Number(pageParam)), - enabled: hasValidChatUser && hasChatSecret, + enabled: hasValidChatUser && hasSharedSecret, getNextPageParam: (lastPage, allPages) => { if (lastPage.length < PAGE_SIZE) { return undefined; @@ -126,7 +132,11 @@ export default function Screen() { fetchNextPageRef.current = () => { void fetchMessagesNextPage(); }; - }, [fetchMessagesNextPage, hasMessagesNextPage, isFetchingMessagesNextPage]); + }, [ + fetchMessagesNextPage, + hasMessagesNextPage, + isFetchingMessagesNextPage, + ]); React.useEffect(() => { clearLiveMessages(); @@ -137,17 +147,52 @@ export default function Screen() { setLastLiveMessageCount(0); }, [clearLiveMessages, userId]); + React.useEffect(() => { + if (!hasValidChatUser) { + setMessageUsers({}); + return; + } + + let active = true; + + const loadMessageUser = async ( + key: string, + resolveUserId: () => Promise, + ) => { + try { + const resolvedUserId = await resolveUserId(); + const value = await getUser(resolvedUserId); + + if (active) { + setMessageUsers((prev) => ({ ...prev, [key]: value })); + } + } catch { + if (active) { + setMessageUsers((prev) => ({ ...prev, [key]: failedUser })); + } + } + }; + + setMessageUsers({}); + void loadMessageUser("peer", async () => userId); + void loadMessageUser("own", async () => Number(await load("user_id"))); + + return () => { + active = false; + }; + }, [getUser, hasValidChatUser, load, userId]); + const historicalMessages = React.useMemo(() => { const pages = messagesQuery.data?.pages ?? []; const seenSendTimes = new Set(); const dedupedMessages: RawMessage[] = []; for (const message of [...pages].reverse().flat()) { - if (seenSendTimes.has(message.SendTime)) { + if (seenSendTimes.has(message.send_time)) { continue; } - seenSendTimes.add(message.SendTime); + seenSendTimes.add(message.send_time); dedupedMessages.push(message); } @@ -158,11 +203,11 @@ export default function Screen() { const liveWithoutDuplicates = React.useMemo(() => { const historicalSendTimes = new Set( - historicalMessages.map((message) => message.SendTime), + historicalMessages.map((message) => message.send_time), ); return liveMessagesSnapshot.filter( - (message) => !historicalSendTimes.has(message.SendTime), + (message) => !historicalSendTimes.has(message.send_time), ); }, [historicalMessages, liveMessagesSnapshot]); @@ -186,14 +231,43 @@ export default function Screen() { return [...liveMessageChunks, ...historicalMessageChunks]; }, [historicalMessageChunks, liveMessageChunks]); - const virtualRowCount = messageChunks.length; + const shouldShowConversationStart = + !!messagesQuery.data && !messagesQuery.hasNextPage; + const virtualRowCount = + messageChunks.length + (shouldShowConversationStart ? 1 : 0); const getItemKey = React.useCallback( - (index: number) => messageChunks[index]?.key ?? index, - [messageChunks], + (index: number) => { + if (shouldShowConversationStart && index === messageChunks.length) { + return "conversation-start"; + } + + return messageChunks[index]?.key ?? index; + }, + [messageChunks, shouldShowConversationStart], ); - const estimateSize = React.useCallback(() => FALLBACK_MESSAGE_HEIGHT, []); + const estimateSize = React.useCallback( + (index: number) => { + const isConversationStart = + shouldShowConversationStart && index === messageChunks.length; + if (isConversationStart) { + return FALLBACK_MESSAGE_HEIGHT; + } + + const chunk = messageChunks[index]; + + if (!chunk) { + return FALLBACK_MESSAGE_HEIGHT; + } + + return chunk.messages.reduce( + (total, message) => total + getEstimatedMessageHeight(message), + 0, + ); + }, + [messageChunks, shouldShowConversationStart], + ); // eslint-disable-next-line react-hooks/incompatible-library const virtualizer = useVirtualizer({ @@ -409,98 +483,112 @@ export default function Screen() { if (!hasValidChatUser) { return ( -
-

Invalid User

+
+ Invalid user
); } return (
- {error !== "" && errorDescription !== "" ? ( -
-

{error}

-

{errorDescription}

-
- ) : ( - <> +
+
-
-
- {virtualizer.getVirtualItems().map((virtualRow) => { - const chunkIndex = virtualRow.index; - const chunk = messageChunks[chunkIndex]; - if (!chunk) { - return null; - } - - return ( -
-
- {chunk.messages.map((message, chunkMessageIndex) => { - const messageIndex = - chunk.startIndex + chunkMessageIndex; - const lastMessage = messages[messageIndex - 1]; - const isGrouped = - lastMessage && - lastMessage.SenderId === message.SenderId && - Math.round(lastMessage.SendTime / 10000) === - Math.round(message.SendTime / 10000); - - return ( - } - component={(user) => ( - - )} - /> - ); - })} + ref={topSentinelRef} + className="absolute bottom-0 left-0 h-px w-full" + /> + {virtualizer.getVirtualItems().map((virtualRow) => { + if ( + shouldShowConversationStart && + virtualRow.index === messageChunks.length + ) { + return ( +
+
+
+ Conversation start
- ); - })} -
-
-
- -
- - )} +
+ ); + } + + const chunkIndex = virtualRow.index; + const chunk = messageChunks[chunkIndex]; + if (!chunk) { + return null; + } + + return ( +
+
+ {chunk.messages.map((message, chunkMessageIndex) => { + const messageIndex = chunk.startIndex + chunkMessageIndex; + const lastMessage = messages[messageIndex - 1]; + const isGrouped = + lastMessage && + lastMessage.sent_by_self === message.sent_by_self && + Math.round(lastMessage.send_time / 10000) === + Math.round(message.send_time / 10000); + + return ( + + ); + })} +
+
+ ); + })} +
+
+
+ +
); } diff --git a/packages/chat/src/values.ts b/packages/chat/src/values.ts index c269cc4..8a97ef0 100644 --- a/packages/chat/src/values.ts +++ b/packages/chat/src/values.ts @@ -1,11 +1,9 @@ import { z } from "zod"; -import { mtp } from "@tensamin/shared/data"; +import { ttp } from "@tensamin/shared/data"; -export type RawMessages = z.infer["Messages"]; +export type RawMessages = z.infer["messages"]; -export type RawMessage = RawMessages[number] & { - decryptionFailed?: boolean; -}; +export type RawMessage = RawMessages[number]; export type LiveMessage = RawMessage & { failed?: boolean; diff --git a/packages/chat/todo.md b/packages/chat/todo.md index 2ce0e5f..63466f3 100644 --- a/packages/chat/todo.md +++ b/packages/chat/todo.md @@ -1,12 +1,2 @@ - Implement context menu features - - Forward - - Pin Message - - Reply -- Add default-emoji-hotkey -- Placeholder image if media fails to load -- Signature verifications via ed25519 key -- Confirmation when exiting with text in the input box. -- Add arrow up hotkey to edit last message (req: packages/hotkeys) -- Drop any unique reactions above 10 -- Make the emoji picker not get moved with the mini context menu -- Add proper loading skeleton +- Add default-emoji-hotkey in settings diff --git a/packages/crypto/package.json b/packages/crypto/package.json index d5ce7d2..705faa0 100644 --- a/packages/crypto/package.json +++ b/packages/crypto/package.json @@ -5,16 +5,17 @@ "type": "module", "exports": { "./context": "./src/context.tsx", - "./chatSecret": "./src/chatSecret.ts", - "./callSecret": "./src/callSecret.ts" + "./worker": "./src/worker.ts" }, "scripts": { - "format": "pnpm exec prettier --write .", + "format": "bunx prettier --write .", "lint": "eslint src", - "test": "vitest run", - "build": "pnpm run test && tsc -p tsconfig.json --noEmit" + "test": "bun test", + "build": "bun run test && tsc -p tsconfig.json --noEmit" }, "dependencies": { + "@noble/curves": "^2.0.1", + "comlink": "^4.4.2", "react": "^19.2.0", "react-dom": "^19.2.0" } diff --git a/packages/crypto/src/bun-test.d.ts b/packages/crypto/src/bun-test.d.ts new file mode 100644 index 0000000..4ac4faa --- /dev/null +++ b/packages/crypto/src/bun-test.d.ts @@ -0,0 +1,11 @@ +declare module "bun:test" { + export const describe: (...args: unknown[]) => unknown; + export const test: (...args: unknown[]) => unknown; + export const it: (...args: unknown[]) => unknown; + export const expect: (value: unknown) => { + toBe: (expected: unknown) => void; + toEqual: (expected: unknown) => void; + toContain: (expected: unknown) => void; + toThrow: (expected?: unknown) => void; + }; +} diff --git a/packages/crypto/src/callSecret.ts b/packages/crypto/src/callSecret.ts deleted file mode 100644 index 97ef318..0000000 --- a/packages/crypto/src/callSecret.ts +++ /dev/null @@ -1,112 +0,0 @@ -import { crypto } from "mtp"; - -const textEncoder = new TextEncoder(); -const textDecoder = new TextDecoder(); - -export const CALL_SECRET_WRAPPING_SCHEME = - "mtp-call-secret-kem-chacha20poly1305-hkdf-sha256-v1"; - -const CALL_SECRET_SALT = textEncoder.encode("tensamin-call-secret-v1"); - -export function deriveCallSecretId(callId: string): string { - return `call:${callId}:main`; -} - -export function ownKemPublicKeyFromKeyring(keyring: string): Uint8Array { - return crypto.keyringToKeys(keyring).kemPublicKey; -} - -export function kemPublicKeyFromPublicKeyBundle(publicKey: string): Uint8Array { - return crypto.publicKeyBundleToKeys(publicKey).kemPublicKey; -} - -export async function wrapCallSecret(args: { - callSecret: string; - recipientKemPublicKey: Uint8Array; - callId: string; - secretId: string; - version: number; -}): Promise<{ - encryptedSecret: Uint8Array; - kemCiphertext: Uint8Array; - wrappingScheme: string; -}> { - const enc = crypto.encapsulate(args.recipientKemPublicKey); - try { - const wrappingKey = deriveWrappingKey({ - sharedSecret: enc.shared_secret, - callId: args.callId, - secretId: args.secretId, - version: args.version, - }); - - try { - return { - encryptedSecret: await crypto.encrypt( - wrappingKey, - textEncoder.encode(args.callSecret), - ), - kemCiphertext: enc.ciphertext, - wrappingScheme: CALL_SECRET_WRAPPING_SCHEME, - }; - } finally { - wrappingKey.fill(0); - } - } finally { - enc.shared_secret.fill(0); - } -} - -export async function unwrapCallSecret(args: { - encryptedSecret: Uint8Array; - kemCiphertext: Uint8Array; - keyring: string; - callId: string; - secretId: string; - version: number; - wrappingScheme: string; -}): Promise { - if (args.wrappingScheme !== CALL_SECRET_WRAPPING_SCHEME) { - throw new Error( - `Unsupported call secret wrapping scheme: ${args.wrappingScheme}`, - ); - } - - const ownKeys = crypto.keyringToKeys(args.keyring); - const sharedSecret = crypto.decapsulate( - ownKeys.kemSecretKey, - args.kemCiphertext, - ); - - try { - const wrappingKey = deriveWrappingKey({ - sharedSecret, - callId: args.callId, - secretId: args.secretId, - version: args.version, - }); - - try { - return textDecoder.decode( - await crypto.decrypt(wrappingKey, args.encryptedSecret), - ); - } finally { - wrappingKey.fill(0); - } - } finally { - sharedSecret.fill(0); - } -} - -function deriveWrappingKey(args: { - sharedSecret: Uint8Array; - callId: string; - secretId: string; - version: number; -}): Uint8Array { - return crypto.deriveEncryptionKey( - args.sharedSecret, - CALL_SECRET_SALT, - textEncoder.encode(`${args.callId}:${args.secretId}:${args.version}`), - ); -} diff --git a/packages/crypto/src/chatSecret.ts b/packages/crypto/src/chatSecret.ts deleted file mode 100644 index e6e836c..0000000 --- a/packages/crypto/src/chatSecret.ts +++ /dev/null @@ -1,153 +0,0 @@ -import { base64ToBytes, bytesToBase64, crypto } from "mtp"; - -const textEncoder = new TextEncoder(); -const textDecoder = new TextDecoder(); - -export const CHAT_SECRET_WRAPPING_SCHEME = - "mtp-chat-secret-kem-chacha20poly1305-hkdf-sha256-v1"; - -const CHAT_SECRET_SALT = textEncoder.encode("tensamin-chat-secret-v1"); -const CHAT_MESSAGE_SALT = textEncoder.encode("tensamin-chat-message-v1"); - -export function deriveChatId(ownUserId: number, peerUserId: number): string { - const ids = [ownUserId, peerUserId].sort((a, b) => a - b); - return `${ids[0]}:${ids[1]}`; -} - -export function deriveChatSecretId(chatId: string): string { - return `chat:${chatId}:main`; -} - -export function randomChatSecret(): Uint8Array { - return globalThis.crypto.getRandomValues(new Uint8Array(32)); -} - -export function ownKemPublicKeyFromKeyring(keyring: string): Uint8Array { - return crypto.keyringToKeys(keyring).kemPublicKey; -} - -export function kemPublicKeyFromPublicKeyBundle(publicKey: string): Uint8Array { - return crypto.publicKeyBundleToKeys(publicKey).kemPublicKey; -} - -export async function wrapChatSecret(args: { - chatSecret: Uint8Array; - recipientKemPublicKey: Uint8Array; - chatId: string; - secretId: string; - version: number; -}): Promise<{ - encryptedSecret: Uint8Array; - kemCiphertext: Uint8Array; - wrappingScheme: string; -}> { - const enc = crypto.encapsulate(args.recipientKemPublicKey); - try { - const wrappingKey = deriveWrappingKey({ - sharedSecret: enc.shared_secret, - chatId: args.chatId, - secretId: args.secretId, - version: args.version, - }); - - try { - return { - encryptedSecret: await crypto.encrypt(wrappingKey, args.chatSecret), - kemCiphertext: enc.ciphertext, - wrappingScheme: CHAT_SECRET_WRAPPING_SCHEME, - }; - } finally { - wrappingKey.fill(0); - } - } finally { - enc.shared_secret.fill(0); - } -} - -export async function unwrapChatSecret(args: { - encryptedSecret: Uint8Array; - kemCiphertext: Uint8Array; - keyring: string; - chatId: string; - secretId: string; - version: number; - wrappingScheme: string; -}): Promise { - if (args.wrappingScheme !== CHAT_SECRET_WRAPPING_SCHEME) { - throw new Error( - `Unsupported chat secret wrapping scheme: ${args.wrappingScheme}`, - ); - } - - const ownKeys = crypto.keyringToKeys(args.keyring); - const sharedSecret = crypto.decapsulate( - ownKeys.kemSecretKey, - args.kemCiphertext, - ); - - try { - const wrappingKey = deriveWrappingKey({ - sharedSecret, - chatId: args.chatId, - secretId: args.secretId, - version: args.version, - }); - - try { - return await crypto.decrypt(wrappingKey, args.encryptedSecret); - } finally { - wrappingKey.fill(0); - } - } finally { - sharedSecret.fill(0); - } -} - -export async function encryptChatText( - chatSecret: Uint8Array, - plaintext: string, -): Promise { - const key = deriveMessageKey(chatSecret); - try { - return bytesToBase64( - await crypto.encrypt(key, textEncoder.encode(plaintext)), - ); - } finally { - key.fill(0); - } -} - -export async function decryptChatText( - chatSecret: Uint8Array, - ciphertext: string, -): Promise { - const key = deriveMessageKey(chatSecret); - try { - return textDecoder.decode( - await crypto.decrypt(key, base64ToBytes(ciphertext)), - ); - } finally { - key.fill(0); - } -} - -function deriveWrappingKey(args: { - sharedSecret: Uint8Array; - chatId: string; - secretId: string; - version: number; -}): Uint8Array { - return crypto.deriveEncryptionKey( - args.sharedSecret, - CHAT_SECRET_SALT, - textEncoder.encode(`${args.chatId}:${args.secretId}:${args.version}`), - ); -} - -function deriveMessageKey(chatSecret: Uint8Array): Uint8Array { - return crypto.deriveEncryptionKey( - chatSecret, - CHAT_MESSAGE_SALT, - textEncoder.encode("message-content"), - ); -} diff --git a/packages/crypto/src/context.test.ts b/packages/crypto/src/context.test.ts index e6c2178..9494caa 100644 --- a/packages/crypto/src/context.test.ts +++ b/packages/crypto/src/context.test.ts @@ -1,9 +1,4 @@ -import { describe, expect, test, vi } from "vitest"; - -vi.mock("mtp", () => ({ - crypto: {}, -})); - +import { describe, expect, test } from "bun:test"; import { createCryptoActions } from "./context"; /** @@ -49,6 +44,12 @@ describe("createCryptoActions", () => { secret: string, ciphertext: string, ): Promise => `${secret}|${ciphertext}`, + getSharedSecret: async ( + ownPrivateKey: string, + ownPublicKey: string, + otherPublicKey: string, + ): Promise => + `${ownPrivateKey}.${ownPublicKey}.${otherPublicKey}`, }; const actions = createCryptoActions(() => api); @@ -61,5 +62,6 @@ describe("createCryptoActions", () => { ).toBe("s|c"); expect(await actions.encryptText("s", "p")).toBe("s:p"); expect(await actions.decryptText("s", "c")).toBe("s|c"); + expect(await actions.getSharedSecret("a", "b", "c")).toBe("a.b.c"); }); }); diff --git a/packages/crypto/src/context.tsx b/packages/crypto/src/context.tsx index b9ca137..6275de6 100644 --- a/packages/crypto/src/context.tsx +++ b/packages/crypto/src/context.tsx @@ -1,5 +1,5 @@ -import { createContext, useContext } from "react"; -import { base64ToBytes, crypto } from "mtp"; +import * as React from "react"; +import * as Comlink from "comlink"; type CryptoContextType = { decrypt: ( @@ -12,62 +12,205 @@ type CryptoContextType = { input: Uint8Array, ) => Promise>; encryptText: (secret: string, plaintext: string) => Promise; + getSharedSecret: ( + ownPrivateKey: string, + ownPublicKey: string, + otherPublicKey: string, + ) => Promise; }; -export const context = createContext(undefined); +type ApiRef = { + encrypt: ( + secret: string, + input: Uint8Array, + ) => Promise>; + decrypt: ( + secret: string, + input: Uint8Array, + ) => Promise>; + decryptText: (secret: string, ciphertext: string) => Promise; + encryptText: (secret: string, plaintext: string) => Promise; + getSharedSecret: ( + ownPrivateKey: string, + ownPublicKey: string, + otherPublicKey: string, + ) => Promise; +}; -export function createCryptoActions( - getApi: () => CryptoContextType | null | undefined, -): CryptoContextType { - const requireApi = () => { - const api = getApi(); - if (!api) { - throw new Error("Crypto API not initialized"); - } - return api; - }; - - return { - decrypt: (secret, input) => requireApi().decrypt(secret, input), - decryptText: (secret, ciphertext) => - requireApi().decryptText(secret, ciphertext), - encrypt: (secret, input) => requireApi().encrypt(secret, input), - encryptText: (secret, plaintext) => - requireApi().encryptText(secret, plaintext), - }; +export function bytesToBase64(bytes: Uint8Array): string { + let binary = ""; + for (const b of bytes) binary += String.fromCharCode(b); + return btoa(binary); } -function ownedBytes(bytes: Uint8Array): Uint8Array { - const out = new Uint8Array(bytes.byteLength); - out.set(bytes); - return out; +export function base64ToBytes(base64: string): Uint8Array { + const binary = atob(base64); + const bytes = new Uint8Array(binary.length); + for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i); + return bytes; } -function secretKeyFromString(secret: string): Uint8Array { - return crypto.deriveEncryptionKey( - base64ToBytes(secret), - new Uint8Array(0), - new TextEncoder().encode("tensamin:shared-secret-text"), - ); -} +export const context = React.createContext( + undefined, +); +/** + * Provides cryptographic actions backed by a worker without coupling to UI state. + * @param props Component props with children. + * @returns Crypto context provider JSX. + */ export default function Provider(props: { children: React.ReactNode }) { - const actions = createCryptoActions(() => ({ - decrypt: async (secret, input) => - ownedBytes(await crypto.decrypt(secretKeyFromString(secret), input)), - decryptText: (secret, ciphertext) => - crypto.decryptText(secretKeyFromString(secret), ciphertext), - encrypt: async (secret, input) => - ownedBytes(await crypto.encrypt(secretKeyFromString(secret), input)), - encryptText: (secret, plaintext) => - crypto.encryptText(secretKeyFromString(secret), plaintext), - })); + const apiRef = React.useRef(null); - return {props.children}; + const value = React.useMemo( + () => ({ + encrypt: async (secret, plaintext) => { + const api = apiRef.current; + if (!api) throw new Error("API not initialized"); + return await api.encrypt(secret, plaintext); + }, + decrypt: async (secret, ciphertext) => { + const api = apiRef.current; + if (!api) throw new Error("API not initialized"); + return await api.decrypt(secret, ciphertext); + }, + encryptText: async (secret, plaintext) => { + const api = apiRef.current; + if (!api) throw new Error("API not initialized"); + return await api.encryptText(secret, plaintext); + }, + decryptText: async (secret, ciphertext) => { + const api = apiRef.current; + if (!api) throw new Error("API not initialized"); + return await api.decryptText(secret, ciphertext); + }, + getSharedSecret: async (ownPrivateKey, ownPublicKey, otherPublicKey) => { + const api = apiRef.current; + if (!api) throw new Error("API not initialized"); + return await api.getSharedSecret( + ownPrivateKey, + ownPublicKey, + otherPublicKey, + ); + }, + }), + [], + ); + + React.useEffect(() => { + const worker = new Worker(new URL("./worker.ts", import.meta.url), { + type: "module", + }); + + apiRef.current = Comlink.wrap(worker); + + return () => { + apiRef.current = null; + worker.terminate(); + }; + }, []); + + return {props.children}; } +/** + * Creates crypto action functions that safely delegate to the worker API. + * @param getApiRef Function that returns the worker API reference. + * @returns Typed crypto action functions. + */ +export function createCryptoActions( + getApiRef: () => ApiRef | null, +): CryptoContextType { + /** + * Encrypts bytes by delegating to the crypto worker API. + * @param secret Hex-encoded shared secret. + * @param input Plaintext bytes to encrypt. + * @returns Ciphertext bytes. + */ + const encrypt = async ( + secret: string, + input: Uint8Array, + ): Promise> => { + const api = getApiRef(); + if (!api) throw new Error("API not initialized"); + return await api.encrypt(secret, input); + }; + + /** + * Decrypts bytes by delegating to the crypto worker API. + * @param secret Hex-encoded shared secret. + * @param input Ciphertext bytes to decrypt. + * @returns Plaintext bytes. + */ + const decrypt = async ( + secret: string, + input: Uint8Array, + ): Promise> => { + const api = getApiRef(); + if (!api) throw new Error("API not initialized"); + return await api.decrypt(secret, input); + }; + + /** + * Encrypts plaintext text by delegating to the crypto worker API. + * @param secret Hex-encoded shared secret. + * @param plaintext Plaintext to encrypt. + * @returns Base64 ciphertext. + */ + const encryptText = async ( + secret: string, + plaintext: string, + ): Promise => { + const api = getApiRef(); + if (!api) throw new Error("API not initialized"); + return await api.encryptText(secret, plaintext); + }; + + /** + * Decrypts base64 ciphertext text by delegating to the crypto worker API. + * @param secret Hex-encoded shared secret. + * @param ciphertext Base64 ciphertext to decrypt. + * @returns Decrypted plaintext. + */ + const decryptText = async ( + secret: string, + ciphertext: string, + ): Promise => { + const api = getApiRef(); + if (!api) throw new Error("API not initialized"); + return await api.decryptText(secret, ciphertext); + }; + + /** + * Derives a shared secret from local and peer key material via the worker API. + * @param ownPrivateKey Local private key. + * @param ownPublicKey Local public key. + * @param otherPublicKey Peer public key. + * @returns Hex-encoded shared secret. + */ + const getSharedSecret = async ( + ownPrivateKey: string, + ownPublicKey: string, + otherPublicKey: string, + ): Promise => { + const api = getApiRef(); + if (!api) throw new Error("API not initialized"); + return await api.getSharedSecret( + ownPrivateKey, + ownPublicKey, + otherPublicKey, + ); + }; + + return { encrypt, decrypt, encryptText, decryptText, getSharedSecret }; +} + +/** + * Returns the crypto actions from the nearest provider. + * Throws when used outside of the crypto provider tree. + */ export function useCrypto(): CryptoContextType { - const ctx = useContext(context); + const ctx = React.useContext(context); if (!ctx) { throw new Error("useCrypto must be used within a CryptoProvider"); } diff --git a/packages/crypto/src/worker.test.ts b/packages/crypto/src/worker.test.ts new file mode 100644 index 0000000..4157039 --- /dev/null +++ b/packages/crypto/src/worker.test.ts @@ -0,0 +1,123 @@ +import { describe, expect, test } from "bun:test"; +import { x448 } from "@noble/curves/ed448.js"; +import { + decrypt, + decryptText, + encrypt, + encryptText, + getSharedSecret, +} from "./worker"; + +/** + * Encodes bytes to URL-safe base64 without padding. + * @param value Input bytes. + * @returns Base64url string. + */ +function bytesToB64u(value: Uint8Array): string { + const alphabet = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + + let output = ""; + + for (let index = 0; index < value.length; index += 3) { + const first = value[index] ?? 0; + const second = value[index + 1] ?? 0; + const third = value[index + 2] ?? 0; + const chunk = (first << 16) | (second << 8) | third; + + output += alphabet[(chunk >> 18) & 63]; + output += alphabet[(chunk >> 12) & 63]; + output += index + 1 < value.length ? alphabet[(chunk >> 6) & 63] : "="; + output += index + 2 < value.length ? alphabet[chunk & 63] : "="; + } + + return output.replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/g, ""); +} + +/** + * Converts bytes to lowercase hex. + * @param value Input bytes. + * @returns Hex string. + */ +function bytesToHex(value: Uint8Array): string { + return Array.from(value, (byte) => byte.toString(16).padStart(2, "0")).join( + "", + ); +} + +/** + * Creates deterministic 56-byte private key material for tests. + * @param seed Offset seed used to vary generated bytes. + * @returns Deterministic private key bytes. + */ +function createPrivateKey(seed: number): Uint8Array { + const output = new Uint8Array(56); + + for (let index = 0; index < output.length; index += 1) { + output[index] = (seed + index) % 255; + } + + return output; +} + +describe("crypto worker", () => { + const textEncoder = new TextEncoder(); + const textDecoder = new TextDecoder(); + + test("encrypt/decrypt byte round-trip returns original plaintext", async () => { + const secret = "0f".repeat(56); + const input = "hello encrypted world"; + + const encryptedContent = await encrypt(secret, textEncoder.encode(input)); + const decryptedContent = await decrypt(secret, encryptedContent); + + expect(textDecoder.decode(decryptedContent)).toBe(input); + }); + + test("encryptText/decryptText round-trip returns original plaintext", async () => { + const secret = "0f".repeat(56); + const input = "hello encrypted world"; + + const ciphertext = await encryptText(secret, input); + const plaintext = await decryptText(secret, ciphertext); + + expect(plaintext).toBe(input); + }); + + test("decrypt fails with wrong shared secret", async () => { + const secret = "0f".repeat(56); + const wrongSecret = "f0".repeat(56); + const input = "sensitive"; + + const ciphertext = await encrypt(secret, textEncoder.encode(input)); + + let failed = false; + try { + await decrypt(wrongSecret, ciphertext); + } catch { + failed = true; + } + + expect(failed).toBe(true); + }); + + test("getSharedSecret matches noble x448 derivation", async () => { + const ownPrivateBytes = createPrivateKey(7); + const peerPrivateBytes = createPrivateKey(23); + + const ownPublicBytes = x448.getPublicKey(ownPrivateBytes); + const peerPublicBytes = x448.getPublicKey(peerPrivateBytes); + + const expected = bytesToHex( + new Uint8Array(x448.getSharedSecret(ownPrivateBytes, peerPublicBytes)), + ); + + const actual = await getSharedSecret( + bytesToB64u(ownPrivateBytes), + bytesToB64u(ownPublicBytes), + bytesToB64u(peerPublicBytes), + ); + + expect(actual).toBe(expected); + }); +}); diff --git a/packages/crypto/src/worker.ts b/packages/crypto/src/worker.ts new file mode 100644 index 0000000..f22fe42 --- /dev/null +++ b/packages/crypto/src/worker.ts @@ -0,0 +1,482 @@ +import * as Comlink from "comlink"; + +type Base64URLString = string; + +type JWK = { + kty: string; + crv: string; + x?: string; + d?: string; +}; + +const textEncoder = new TextEncoder(); +const textDecoder = new TextDecoder(); +const crypto = globalThis.crypto; + +/** + * Encodes bytes as standard base64 text. + * @param bytes Bytes to encode. + * @returns Base64 string. + */ +function bytesToBase64(bytes: Uint8Array): string { + let binary = ""; + for (const byte of bytes) binary += String.fromCharCode(byte); + return btoa(binary); +} + +/** + * Decodes standard base64 text into bytes. + * @param base64 Base64 string. + * @returns Decoded bytes. + */ +function base64ToBytes(base64: string): Uint8Array { + const binary = atob(base64); + const bytes = new Uint8Array(binary.length); + for (let index = 0; index < binary.length; index += 1) { + bytes[index] = binary.charCodeAt(index); + } + return bytes; +} + +/** + * Encrypts bytes with a symmetric key derived from a hex shared secret. + * @param secret Hex-encoded shared secret. + * @param input Plaintext bytes to encrypt. + * @returns Ciphertext bytes. + */ +export async function encrypt( + secret: string, + input: Uint8Array, +): Promise> { + const sharedSecret = new Uint8Array( + secret.match(/.{1,2}/g)!.map((byte) => parseInt(byte, 16)), + ); + + const hkdfKey = await crypto.subtle.importKey( + "raw", + sharedSecret, + "HKDF", + false, + ["deriveBits"], + ); + + const okm = await crypto.subtle.deriveBits( + { + name: "HKDF", + hash: "SHA-256", + salt: new Uint8Array([]), + info: textEncoder.encode("x448-aes-gcm-no-overhead"), + }, + hkdfKey, + 44 * 8, + ); + + const okmBytes = new Uint8Array(okm); + const keyBytes = okmBytes.slice(0, 32); + const nonce = okmBytes.slice(32, 44); + + const aesKey = await crypto.subtle.importKey( + "raw", + keyBytes, + { name: "AES-GCM" }, + false, + ["encrypt"], + ); + + const encryptedBuffer = await crypto.subtle.encrypt( + { name: "AES-GCM", iv: nonce }, + aesKey, + input, + ); + + return new Uint8Array(encryptedBuffer); +} + +/** + * Decrypts bytes with a symmetric key derived from a hex shared secret. + * @param secret Hex-encoded shared secret. + * @param input Ciphertext bytes to decrypt. + * @returns Plaintext bytes. + */ +export async function decrypt( + secret: string, + input: Uint8Array, +): Promise> { + const sharedSecret = new Uint8Array( + secret.match(/.{1,2}/g)!.map((byte) => parseInt(byte, 16)), + ); + + const hkdfKey = await crypto.subtle.importKey( + "raw", + sharedSecret, + "HKDF", + false, + ["deriveBits"], + ); + + const okm = await crypto.subtle.deriveBits( + { + name: "HKDF", + hash: "SHA-256", + salt: new Uint8Array([]), + info: textEncoder.encode("x448-aes-gcm-no-overhead"), + }, + hkdfKey, + 44 * 8, + ); + + const okmBytes = new Uint8Array(okm); + const keyBytes = okmBytes.slice(0, 32); + const nonce = okmBytes.slice(32, 44); + + const aesKey = await crypto.subtle.importKey( + "raw", + keyBytes, + { name: "AES-GCM" }, + false, + ["decrypt"], + ); + + const decryptedBuffer = await crypto.subtle.decrypt( + { + name: "AES-GCM", + iv: nonce, + }, + aesKey, + input, + ); + + return new Uint8Array(decryptedBuffer); +} + +/** + * Encrypts UTF-8 text and returns base64 ciphertext for easy transport/storage. + * @param secret Hex-encoded shared secret. + * @param plaintext Text to encrypt. + * @returns Base64 ciphertext. + */ +export async function encryptText( + secret: string, + plaintext: string, +): Promise { + const encrypted = await encrypt(secret, textEncoder.encode(plaintext)); + return bytesToBase64(encrypted); +} + +/** + * Decrypts base64 ciphertext into UTF-8 text. + * @param secret Hex-encoded shared secret. + * @param ciphertext Base64 ciphertext. + * @returns Decrypted text. + */ +export async function decryptText( + secret: string, + ciphertext: string, +): Promise { + const decrypted = await decrypt(secret, base64ToBytes(ciphertext)); + return textDecoder.decode(decrypted); +} + +/** + * Computes an X448 shared secret from local and peer key material. + * @param ownPrivateKey Local private key in raw/base64/base64url or PKCS#8-wrapped form. + * @param ownPublicKey Local public key in raw/base64/base64url or SPKI-wrapped form. + * @param otherPublicKey Peer public key in raw/base64/base64url or SPKI-wrapped form. + * @returns Hex-encoded shared secret, or a failure message when key material is missing/invalid. + */ +export async function getSharedSecret( + ownPrivateKey: string, + ownPublicKey: string, + otherPublicKey: string, +): Promise { + const otherJwk: JWK = { kty: "OKP", crv: "X448", x: otherPublicKey }; + const ownJwk: JWK = { + kty: "OKP", + crv: "X448", + x: ownPublicKey, + d: ownPrivateKey, + }; + + /** + * Converts bytes to a lowercase hex string. + * @param u8 Byte array. + * @returns Hex string. + */ + const bytesToHex = (u8: Uint8Array): string => + Array.from(u8, (b) => b.toString(16).padStart(2, "0")).join(""); + + /** + * Decodes standard base64 text into bytes. + * @param s Base64 string. + * @returns Decoded bytes. + */ + const b64ToBytes = (s: Base64URLString): Uint8Array => { + const bin = atob(s); + const out = new Uint8Array(bin.length); + for (let i = 0; i < bin.length; i++) out[i] = bin.charCodeAt(i); + return out; + }; + + /** + * Decodes URL-safe base64 text into bytes. + * @param s Base64url string. + * @returns Decoded bytes. + */ + const b64uToBytes = (s: Base64URLString): Uint8Array => { + const b64 = + s.replace(/-/g, "+").replace(/_/g, "/") + "===".slice((s.length + 3) % 4); + return b64ToBytes(b64); + }; + + /** + * Encodes bytes as URL-safe base64 without padding. + * @param u8 Byte array. + * @returns Base64url string. + */ + const bytesToB64u = (u8: Uint8Array): string => { + const b64 = btoa(String.fromCharCode(...u8)); + return b64.replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/g, ""); + }; + + /** + * Decodes either base64 or base64url text into bytes. + * @param s Base64/base64url string. + * @returns Decoded bytes. + */ + const decodeBase64Auto = (s: string): Uint8Array => + /[-_]/.test(s) ? b64uToBytes(s) : b64ToBytes(s); + + /** + * Reads a DER TLV item from the provided offset. + * @param view DER-encoded bytes. + * @param off Start offset. + * @returns Parsed TLV metadata with tag, length, and boundaries. + */ + const readTLV = (view: Uint8Array, off: number) => { + const tag = view[off++]; + if (off >= view.length) throw new Error("DER: truncated"); + let len = view[off++]; + if (len & 0x80) { + const n = len & 0x7f; + if (n === 0) throw new Error("DER: indefinite length not supported"); + if (off + n > view.length) throw new Error("DER: truncated length"); + len = 0; + for (let i = 0; i < n; i++) len = (len << 8) | view[off++]; + } + const start = off; + const end = off + len; + if (end > view.length) throw new Error("DER: content truncated"); + return { tag, len, start, end }; + }; + + /** + * Validates that a DER OID matches X448. + * @param view DER-encoded bytes. + * @param start Offset of the OID TLV. + * @returns True when the OID is X448. + */ + const ensureOidX448 = (view: Uint8Array, start: number): boolean => { + const oid = readTLV(view, start); + if (oid.tag !== 0x06) return false; + const len = oid.end - oid.start; + if (len !== 3) return false; + return ( + view[oid.start] === 0x2b && + view[oid.start + 1] === 0x65 && + view[oid.start + 2] === 0x6f + ); + }; + + /** + * Extracts raw 56-byte X448 public key material from SPKI bytes. + * @param spkiBytes DER-encoded SPKI bytes. + * @returns Raw X448 public key bytes. + */ + const extractRawX448FromSPKI = (spkiBytes: Uint8Array): Uint8Array => { + const view = spkiBytes; + const outer = readTLV(view, 0); + if (outer.tag !== 0x30) throw new Error("SPKI: expected SEQUENCE"); + const alg = readTLV(view, outer.start); + if (alg.tag !== 0x30) throw new Error("SPKI: expected AlgorithmIdentifier"); + if (!ensureOidX448(view, alg.start)) throw new Error("SPKI: not X448"); + const bitstr = readTLV(view, alg.end); + if (bitstr.tag !== 0x03) throw new Error("SPKI: expected BIT STRING"); + const unusedBits = view[bitstr.start]; + if (unusedBits !== 0x00) throw new Error("SPKI: unexpected unused bits"); + const raw = view.subarray(bitstr.start + 1, bitstr.end); + if (raw.length !== 56) + throw new Error("SPKI: X448 public key must be 56 bytes"); + return raw; + }; + + /** + * Extracts raw 56-byte X448 private key material from PKCS#8 bytes. + * @param pkcs8Bytes DER-encoded PKCS#8 bytes. + * @returns Raw X448 private key bytes. + */ + const extractRawX448FromPKCS8 = (pkcs8Bytes: Uint8Array): Uint8Array => { + const view = pkcs8Bytes; + const outer = readTLV(view, 0); + if (outer.tag !== 0x30) throw new Error("PKCS8: expected SEQUENCE"); + let off = outer.start; + + const version = readTLV(view, off); + if (version.tag !== 0x02) + throw new Error("PKCS8: expected version INTEGER"); + off = version.end; + + const alg = readTLV(view, off); + if (alg.tag !== 0x30) + throw new Error("PKCS8: expected AlgorithmIdentifier"); + if (!ensureOidX448(view, alg.start)) throw new Error("PKCS8: not X448"); + off = alg.end; + + const priv = readTLV(view, off); + if (priv.tag !== 0x04) + throw new Error("PKCS8: expected privateKey OCTET STRING"); + let raw = view.subarray(priv.start, priv.end); + + // Some encoders nest another OCTET STRING inside + if (raw[0] === 0x04) { + const inner = readTLV(raw, 0); + if (inner.tag === 0x04) { + raw = raw.subarray(inner.start, inner.end); + } + } + if (raw.length !== 56) + throw new Error("PKCS8: X448 private key must be 56 bytes"); + return raw; + }; + + /** + * Normalizes X448 JWK fields into raw base64url key material. + * @param jwk Candidate JWK. + * @param label Error label for diagnostics. + * @returns Normalized JWK suitable for WebCrypto import. + */ + const normalizeOkpX448Jwk = (jwk: JWK, label: string): JWK => { + if (!jwk || jwk.kty !== "OKP" || jwk.crv !== "X448") { + throw new Error(`${label}: expected OKP JWK with crv "X448"`); + } + const out = { ...jwk }; + + if (out.x) { + const xBytes = decodeBase64Auto(out.x); + let rawX: Uint8Array; + try { + rawX = extractRawX448FromSPKI(xBytes); + } catch { + if (xBytes.length !== 56) { + throw new Error( + `${label}: "x" is not a valid X448 SPKI or raw 56-byte key`, + ); + } + rawX = xBytes; + } + out.x = bytesToB64u(rawX); + } + + if (out.d) { + const dBytes = decodeBase64Auto(out.d); + let rawD: Uint8Array; + try { + rawD = extractRawX448FromPKCS8(dBytes); + } catch { + if (dBytes.length !== 56) { + throw new Error( + `${label}: "d" is not a valid X448 PKCS#8 or raw 56-byte key`, + ); + } + rawD = dBytes; + } + out.d = bytesToB64u(rawD); + } + + return out; + }; + + const getSubtle = () => globalThis.crypto?.subtle; + + const myJwk: JWK = normalizeOkpX448Jwk(ownJwk, "own_jwk"); + const peerJwk: JWK = normalizeOkpX448Jwk(otherJwk, "other_jwk"); + + const subtle = getSubtle(); + + if (subtle) { + const algorithms = [{ name: "ECDH", namedCurve: "X448" }, { name: "X448" }]; + + for (const algorithm of algorithms) { + try { + const [myPriv, peerPub] = await Promise.all([ + subtle.importKey("jwk", myJwk, algorithm, false, ["deriveBits"]), + subtle.importKey("jwk", peerJwk, algorithm, false, []), + ]); + + const sharedBits = await subtle.deriveBits( + { name: algorithm.name, public: peerPub }, + myPriv, + 448, + ); + + const sharedSecret = new Uint8Array(sharedBits); + //const aeadKey = await hkdfAesGcmFromShared(sharedSecret, infoStr); + + return bytesToHex(sharedSecret); + } catch { + // Browser doesn't support this algorithm, try next or fall through to software fallback + } + } + } + + const { d: dMyB64u } = myJwk; + //const { x: xMyB64u, d: dMyB64u } = myJwk; + const { x: xPeerB64u } = peerJwk; + + if (!dMyB64u || !xPeerB64u) { + return "Failed to get shared secret due to missing keys"; + } + + const [dRaw, xRawPeer] = [b64uToBytes(dMyB64u), b64uToBytes(xPeerB64u)]; + if (dRaw.length !== 56 || xRawPeer.length !== 56) { + return "Failed to get shared secret due to invalid key lengths"; + } + + const { x448 } = await import("@noble/curves/ed448.js"); + const sharedSecret = new Uint8Array(x448.getSharedSecret(dRaw, xRawPeer)); + //const aeadKey = await hkdfAesGcmFromShared(sharedSecret, infoStr); + + return bytesToHex(sharedSecret); +} + +/** + * @deprecated Use getSharedSecret instead. + * @param ownPrivateKey Local private key. + * @param ownPublicKey Local public key. + * @param otherPublicKey Peer public key. + * @returns Shared secret derived by getSharedSecret. + */ +export async function get_shared_secret( + ownPrivateKey: string, + ownPublicKey: string, + otherPublicKey: string, +): Promise { + return await getSharedSecret(ownPrivateKey, ownPublicKey, otherPublicKey); +} + +/** + * Checks whether the current runtime context is a worker global scope. + * @returns True when executed inside a worker-like runtime. + */ +function isWorkerRuntime(): boolean { + return "postMessage" in globalThis && "importScripts" in globalThis; +} + +if (isWorkerRuntime()) { + Comlink.expose({ + encrypt, + decrypt, + encryptText, + decryptText, + getSharedSecret, + }); +} diff --git a/packages/markdown/package.json b/packages/markdown/package.json index 5d3066c..b82d265 100644 --- a/packages/markdown/package.json +++ b/packages/markdown/package.json @@ -5,24 +5,18 @@ "type": "module", "exports": { "./text": "./src/text.tsx", - "./input": "./src/input.tsx", - "./emoji": "./src/emoji.tsx" + "./input": "./src/input.tsx" }, "scripts": { - "format": "pnpm exec prettier --write .", + "format": "bunx prettier --write .", "lint": "eslint src", "build": "tsc -p tsconfig.json --noEmit" }, "dependencies": { - "@codemirror/autocomplete": "^6.20.3", "@codemirror/commands": "^6.10.2", "@codemirror/lang-markdown": "^6.5.0", - "@codemirror/language": "^6.12.4", "@codemirror/state": "^6.5.4", "@codemirror/view": "^6.41.1", - "@tensamin/ui": "*", - "@twemoji/api": "^17.0.3", - "emojibase-data": "^17.0.0", "react": "^19.2.0", "react-dom": "^19.2.0" } diff --git a/packages/markdown/src/emoji.test.ts b/packages/markdown/src/emoji.test.ts deleted file mode 100644 index 4eafaac..0000000 --- a/packages/markdown/src/emoji.test.ts +++ /dev/null @@ -1,138 +0,0 @@ -import { describe, expect, it, vi } from "vitest"; -import type { ReactNode } from "react"; - -vi.mock("@tensamin/ui", () => ({ - Tooltip: ({ children }: { children: ReactNode }) => children, - TooltipContent: ({ children }: { children: ReactNode }) => children, - TooltipTrigger: ({ render }: { render: ReactNode }) => render, -})); -import { EditorState } from "@codemirror/state"; -import { CompletionContext } from "@codemirror/autocomplete"; -import { markdown } from "@codemirror/lang-markdown"; -import { normalizeShortcode, resolveEmoji, searchEmojis } from "./emojiData"; -import { parseEmojiText, parseInlineNodes } from "./markdown"; -import { - createEmojiCompletionSource, - findEmojiRanges, - MAX_RENDERED_EMOJI_OPTIONS, -} from "./input"; - -describe("emoji shortcodes", () => { - it("normalizes aliases to their canonical shortcode", () => { - expect(normalizeShortcode(":flame:")).toBe(":fire:"); - expect(normalizeShortcode("+1")).toBe(":thumbsup:"); - }); - - it("resolves every search result to a Twemoji hexcode", () => { - const results = searchEmojis("fire"); - expect(results[0]?.shortcode).toBe(":fire:"); - expect(results.every((emoji) => emoji.hexcode.length > 0)).toBe(true); - }); - - it("shows all emojis for an empty query", () => { - expect(searchEmojis("").length).toBeGreaterThan(1000); - }); - - it("bounds the number of mounted autocomplete rows", () => { - expect(MAX_RENDERED_EMOJI_OPTIONS).toBeLessThanOrEqual(100); - }); - - it("parses known shortcodes and preserves unknown ones", () => { - expect(parseEmojiText("a :fire: b :not_an_emoji:")).toEqual([ - { type: "text", value: "a " }, - { type: "emoji", shortcode: ":fire:" }, - { type: "text", value: " b :not_an_emoji:" }, - ]); - }); - - it("recognizes a valid shortcode sharing an unknown closing colon", () => { - expect(parseEmojiText(":bla:thumbsup:")).toEqual([ - { type: "text", value: ":bla" }, - { type: "emoji", shortcode: ":thumbsup:" }, - ]); - - const state = EditorState.create({ - doc: ":bla:thumbsup:", - extensions: [markdown()], - }); - expect(findEmojiRanges(state)[0]?.from).toBe(4); - }); - - it("does not parse underscores inside emoji shortcodes as emphasis", () => { - expect(parseInlineNodes("before :white_check_mark: after")).toEqual([ - { type: "text", value: "before " }, - { type: "emoji", shortcode: ":white_check_mark:" }, - { type: "text", value: " after" }, - ]); - }); - - it("contains the picker defaults", () => { - expect(resolveEmoji(":thumbsup:")).toBeDefined(); - expect(resolveEmoji(":white_check_mark:")).toBeDefined(); - }); - - it("finds completed emoji shortcodes in editor state", () => { - const state = EditorState.create({ - doc: "before :fire: after :not_an_emoji:", - extensions: [markdown()], - }); - - expect( - findEmojiRanges(state).map(({ from, shortcode, to }) => ({ - from, - shortcode, - to, - })), - ).toEqual([{ from: 7, shortcode: ":fire:", to: 13 }]); - }); - - it("does not replace emoji shortcodes inside code", () => { - const state = EditorState.create({ - doc: "`:fire:`\n\n```\n:fire:\n```\n\n:fire:", - extensions: [markdown()], - }); - - expect(findEmojiRanges(state)).toHaveLength(1); - expect(findEmojiRanges(state)[0]?.from).toBe(26); - }); - - it("ranks frequently used emojis first for a bare colon", async () => { - const state = EditorState.create({ doc: ":", extensions: [markdown()] }); - const result = await createEmojiCompletionSource({ - ":fire:": 50, - ":thumbsup:": 2, - })(new CompletionContext(state, 1, false)); - - expect(result?.options[0]?.displayLabel).toBe(":fire:"); - expect(result?.options[1]?.displayLabel).toBe(":thumbsup:"); - }); - - it("keeps typed relevance above usage frequency", async () => { - const state = EditorState.create({ - doc: ":fire", - extensions: [markdown()], - }); - const result = await createEmojiCompletionSource({ - ":fire_engine:": 10000, - ":fire:": 1, - })(new CompletionContext(state, 5, false)); - - expect(result?.options[0]?.displayLabel).toBe(":fire:"); - expect(result?.options[0]?.boost).toBeGreaterThan( - result?.options[1]?.boost ?? 0, - ); - }); - - it("merges alias frequencies into canonical completions", async () => { - const state = EditorState.create({ doc: ":", extensions: [markdown()] }); - const result = await createEmojiCompletionSource({ - ":fire:": 2, - ":flame:": 3, - })(new CompletionContext(state, 1, false)); - const fire = result?.options.find( - (option) => option.displayLabel === ":fire:", - ); - - expect(fire?.boost).toBe(15); - }); -}); diff --git a/packages/markdown/src/emoji.tsx b/packages/markdown/src/emoji.tsx deleted file mode 100644 index f86e145..0000000 --- a/packages/markdown/src/emoji.tsx +++ /dev/null @@ -1,50 +0,0 @@ -import twemoji from "@twemoji/api"; -import { Tooltip, TooltipContent, TooltipTrigger } from "@tensamin/ui"; -import { resolveEmoji } from "./emojiData"; - -export { - emojis, - findEmojiShortcodes, - normalizeShortcode, - resolveEmoji, - searchEmojis, -} from "./emojiData"; -export type { EmojiDefinition } from "./emojiData"; - -export function getEmojiUrl(shortcode: string): string | undefined { - const emoji = resolveEmoji(shortcode); - return emoji ? `${twemoji.base}svg/${emoji.hexcode}.svg` : undefined; -} - -export default function Emoji({ - className = "h-6 w-6", - shortcode, - tooltip = true, -}: { - className?: string; - shortcode: string; - tooltip?: boolean; -}) { - const emoji = resolveEmoji(shortcode); - if (!emoji) return {shortcode}; - - const image = ( - {emoji.shortcode} - ); - - if (!tooltip) return image; - - return ( - - - {emoji.shortcode} - - ); -} diff --git a/packages/markdown/src/emojiData.ts b/packages/markdown/src/emojiData.ts deleted file mode 100644 index f1ed5ab..0000000 --- a/packages/markdown/src/emojiData.ts +++ /dev/null @@ -1,96 +0,0 @@ -import shortcodeData from "emojibase-data/en/shortcodes/joypixels.json"; - -type ShortcodeValue = string | string[]; - -export type EmojiDefinition = { - aliases: readonly string[]; - hexcode: string; - name: string; - shortcode: string; -}; - -function normalizeName(value: string) { - return value - .trim() - .replace(/^:+|:+$/g, "") - .toLowerCase(); -} - -export const emojis: readonly EmojiDefinition[] = Object.entries( - shortcodeData as Record, -).map(([hexcode, value]) => { - const aliases = Array.isArray(value) ? value : [value]; - const name = aliases[0]; - - return { - aliases, - hexcode: hexcode.toLowerCase().replaceAll("_", "-"), - name, - shortcode: `:${name}:`, - }; -}); - -const emojiByName = new Map(); -for (const emoji of emojis) { - for (const alias of emoji.aliases) { - emojiByName.set(normalizeName(alias), emoji); - } -} - -export function resolveEmoji(value: string): EmojiDefinition | undefined { - return emojiByName.get(normalizeName(value)); -} - -export function normalizeShortcode(value: string): string | undefined { - return resolveEmoji(value)?.shortcode; -} - -export function findEmojiShortcodes(value: string) { - const matches: Array<{ - emoji: EmojiDefinition; - from: number; - to: number; - }> = []; - let searchFrom = 0; - - while (searchFrom < value.length) { - const from = value.indexOf(":", searchFrom); - if (from === -1) break; - - const candidate = value.slice(from).match(/^:([a-z0-9_+-]+):/i); - if (!candidate) { - searchFrom = from + 1; - continue; - } - - const emoji = resolveEmoji(candidate[1]); - if (!emoji) { - // The closing colon may also open the next valid shortcode. - searchFrom = from + candidate[0].length - 1; - continue; - } - - const to = from + candidate[0].length; - matches.push({ emoji, from, to }); - searchFrom = to; - } - - return matches; -} - -export function searchEmojis(query: string): EmojiDefinition[] { - const normalizedQuery = normalizeName(query); - if (!normalizedQuery) return [...emojis]; - - return emojis - .map((emoji) => { - const names = emoji.aliases.map(normalizeName); - const exact = names.includes(normalizedQuery); - const prefix = names.some((name) => name.startsWith(normalizedQuery)); - const contains = names.some((name) => name.includes(normalizedQuery)); - return { emoji, rank: exact ? 0 : prefix ? 1 : contains ? 2 : 3 }; - }) - .filter(({ rank }) => rank < 3) - .sort((a, b) => a.rank - b.rank || a.emoji.name.localeCompare(b.emoji.name)) - .map(({ emoji }) => emoji); -} diff --git a/packages/markdown/src/input.tsx b/packages/markdown/src/input.tsx index 6b141e0..3222ddf 100644 --- a/packages/markdown/src/input.tsx +++ b/packages/markdown/src/input.tsx @@ -1,22 +1,7 @@ import { markdown } from "@codemirror/lang-markdown"; -import { syntaxTree } from "@codemirror/language"; -import { - acceptCompletion, - autocompletion, - completionStatus, - pickedCompletion, - startCompletion, - type Completion, - type CompletionContext, - type CompletionResult, -} from "@codemirror/autocomplete"; import { EditorState, - EditorSelection, - Annotation, - Compartment, Prec, - Transaction, type Extension, type Range, type SelectionRange, @@ -27,7 +12,6 @@ import { keymap, placeholder, ViewPlugin, - WidgetType, type DecorationSet, type KeyBinding, type ViewUpdate, @@ -40,17 +24,8 @@ import { } from "@codemirror/commands"; import { useEffect, useRef } from "react"; import type { CSSProperties } from "react"; -import { createRoot, type Root } from "react-dom/client"; import { collectInlineRanges, ensureMarkdownStyles } from "./markdown"; -import Emoji, { - findEmojiShortcodes, - getEmojiUrl, - resolveEmoji, - searchEmojis, -} from "./emoji"; - -export const MAX_RENDERED_EMOJI_OPTIONS = 100; export type InputProps = { ref?: HTMLDivElement; @@ -64,8 +39,6 @@ export type InputProps = { paddingX?: CSSProperties["padding"]; paddingY?: CSSProperties["padding"]; className?: string; - emojiFrequencies?: Readonly>; - onEmojiSelect?: (shortcode: string) => void; }; type InputStyle = CSSProperties & { @@ -103,180 +76,6 @@ const delDecoration = Decoration.mark({ class: "tm-md-del" }); const codeDecoration = Decoration.mark({ class: "tm-md-code" }); const linkDecoration = Decoration.mark({ class: "tm-md-link" }); const codeLineDecoration = Decoration.line({ class: "tm-md-code-line" }); -const externalValueSync = Annotation.define(); -const widgetRoots = new WeakMap(); - -type EmojiRange = { - from: number; - shortcode: string; - to: number; - url: string; -}; - -class EmojiWidget extends WidgetType { - readonly shortcode: string; - readonly url: string; - - constructor(shortcode: string, url: string) { - super(); - this.shortcode = shortcode; - this.url = url; - } - - eq(other: EmojiWidget) { - return other.shortcode === this.shortcode && other.url === this.url; - } - - toDOM() { - const container = document.createElement("span"); - const root = createRoot(container); - root.render( - , - ); - widgetRoots.set(container, root); - return container; - } - - destroy(dom: HTMLElement) { - widgetRoots.get(dom)?.unmount(); - widgetRoots.delete(dom); - } - - ignoreEvent() { - return true; - } -} - -function codeRanges(state: EditorState) { - const ranges: Array<{ from: number; to: number }> = []; - - syntaxTree(state).iterate({ - enter(node) { - if ( - node.name === "InlineCode" || - node.name === "FencedCode" || - node.name === "CodeBlock" - ) { - ranges.push({ from: node.from, to: node.to }); - return false; - } - }, - }); - - return ranges; -} - -export function findEmojiRanges(state: EditorState): EmojiRange[] { - const document = state.doc.toString(); - const excluded = codeRanges(state); - const ranges: EmojiRange[] = []; - - for (const match of findEmojiShortcodes(document)) { - const { from, to } = match; - const inCode = excluded.some((range) => from < range.to && to > range.from); - const emoji = inCode ? undefined : match.emoji; - const url = emoji ? getEmojiUrl(emoji.shortcode) : undefined; - - if (emoji && url) { - ranges.push({ from, shortcode: emoji.shortcode, to, url }); - } - } - - return ranges; -} - -class EmojiPluginValue { - decorations: DecorationSet; - ranges: EmojiRange[]; - - constructor(view: EditorView) { - this.ranges = findEmojiRanges(view.state); - this.decorations = this.buildDecorations(); - } - - update(update: ViewUpdate) { - if ( - update.docChanged || - syntaxTree(update.startState) !== syntaxTree(update.state) - ) { - this.ranges = findEmojiRanges(update.state); - this.decorations = this.buildDecorations(); - } - } - - private buildDecorations() { - return Decoration.set( - this.ranges.map((range) => - Decoration.replace({ - inclusive: false, - widget: new EmojiWidget(range.shortcode, range.url), - }).range(range.from, range.to), - ), - true, - ); - } -} - -const emojiDecorations = ViewPlugin.fromClass(EmojiPluginValue, { - decorations: (instance) => instance.decorations, - provide: (plugin) => - EditorView.atomicRanges.of( - (view) => view.plugin(plugin)?.decorations ?? Decoration.none, - ), -}); - -function deleteEmoji(view: EditorView, direction: "backward" | "forward") { - const ranges = view.plugin(emojiDecorations)?.ranges ?? []; - const deletions: Array<{ from: number; to: number }> = []; - - for (const selection of view.state.selection.ranges) { - if (selection.empty) { - const emoji = ranges.find((range) => - direction === "backward" - ? selection.from > range.from && selection.from <= range.to - : selection.from >= range.from && selection.from < range.to, - ); - if (emoji) deletions.push({ from: emoji.from, to: emoji.to }); - continue; - } - - let from = selection.from; - let to = selection.to; - let changed = false; - - for (const emoji of ranges) { - if (from < emoji.to && to > emoji.from) { - from = Math.min(from, emoji.from); - to = Math.max(to, emoji.to); - changed = true; - } - } - - if (changed) deletions.push({ from, to }); - } - - if (deletions.length === 0) return false; - - const merged = deletions - .sort((a, b) => a.from - b.from) - .reduce>((result, deletion) => { - const previous = result.at(-1); - if (previous && deletion.from <= previous.to) { - previous.to = Math.max(previous.to, deletion.to); - } else { - result.push({ ...deletion }); - } - return result; - }, []); - - view.dispatch({ - changes: merged.map((range) => ({ from: range.from, to: range.to })), - selection: EditorSelection.cursor(merged[0].from), - scrollIntoView: true, - userEvent: direction === "backward" ? "delete.backward" : "delete.forward", - }); - return true; -} /** * Builds markdown styling decorations every time the document or cursor selection changes. @@ -316,20 +115,14 @@ export default function Input(props: InputProps) { const elementRef = useRef(null); const viewRef = useRef(undefined); + const ignoreSyncRef = useRef(false); const onSubmitRef = useRef(props.onSubmit); - const onEmojiSelectRef = useRef( - props.onEmojiSelect, - ); const invertEnterBehaviorRef = useRef(Boolean(props.invertEnterBehavior)); - const completionCompartmentRef = useRef(null); - completionCompartmentRef.current ??= new Compartment(); - const completionCompartment = completionCompartmentRef.current; useEffect(() => { onSubmitRef.current = props.onSubmit; - onEmojiSelectRef.current = props.onEmojiSelect; invertEnterBehaviorRef.current = Boolean(props.invertEnterBehavior); - }, [props.onEmojiSelect, props.onSubmit, props.invertEnterBehavior]); + }, [props.onSubmit, props.invertEnterBehavior]); useEffect(() => { if (!elementRef.current) return; @@ -338,14 +131,12 @@ export default function Input(props: InputProps) { doc: props.value, extensions: createEditorExtensions( (value) => { + ignoreSyncRef.current = true; props.setValue(value); }, () => props.placeholder, () => invertEnterBehaviorRef.current, () => onSubmitRef.current?.(), - completionCompartment, - props.emojiFrequencies, - (shortcode) => onEmojiSelectRef.current?.(shortcode), ), }); @@ -369,6 +160,11 @@ export default function Input(props: InputProps) { const next = props.value; const current = editor.state.doc.toString(); + if (ignoreSyncRef.current) { + ignoreSyncRef.current = false; + return; + } + if (next === current) return; editor.dispatch({ @@ -377,30 +173,9 @@ export default function Input(props: InputProps) { to: current.length, insert: next, }, - annotations: [ - externalValueSync.of(true), - Transaction.addToHistory.of(false), - ], - filter: false, }); }, [props.value]); - useEffect(() => { - const editor = viewRef.current; - const compartment = completionCompartmentRef.current; - if (!editor || !compartment) return; - - const wasActive = completionStatus(editor.state) === "active"; - editor.dispatch({ - effects: compartment.reconfigure( - createEmojiAutocomplete(props.emojiFrequencies, (shortcode) => - onEmojiSelectRef.current?.(shortcode), - ), - ), - }); - if (wasActive) startCompletion(editor); - }, [props.emojiFrequencies]); - return (
string | undefined, getInvertEnterBehavior: () => boolean, onSubmit: () => void, - completionCompartment: Compartment, - emojiFrequencies: Readonly> | undefined, - onEmojiSelect: (shortcode: string) => void, ): Extension[] { const editorKeymap = [ ...defaultKeymap, @@ -445,10 +217,7 @@ function createEditorExtensions( const customEnterKeymap = keymap.of([ { key: "Shift-Enter", - run: (view) => { - if (completionStatus(view.state) === "active") { - return acceptCompletion(view); - } + run: () => { if (!getInvertEnterBehavior()) { return false; } @@ -459,10 +228,7 @@ function createEditorExtensions( }, { key: "Enter", - run: (view) => { - if (completionStatus(view.state) === "active") { - return acceptCompletion(view); - } + run: () => { if (getInvertEnterBehavior()) { return false; } @@ -472,48 +238,16 @@ function createEditorExtensions( }, }, ]); - const completionTabKeymap = keymap.of([ - { - key: "Tab", - run: (view) => - completionStatus(view.state) === "active" - ? acceptCompletion(view) - : false, - }, - ]); - const emojiDeletionKeymap = keymap.of([ - { - key: "Backspace", - run: (view) => deleteEmoji(view, "backward"), - }, - { - key: "Delete", - run: (view) => deleteEmoji(view, "forward"), - }, - ]); return [ history(), markdown(), - completionCompartment.of( - createEmojiAutocomplete(emojiFrequencies, onEmojiSelect), - ), - emojiDecorations, keymap.of(editorKeymap), - Prec.highest(completionTabKeymap), - Prec.highest(emojiDeletionKeymap), Prec.highest(customEnterKeymap), EditorView.lineWrapping, placeholder(getPlaceholder() ?? ""), EditorView.updateListener.of((update: ViewUpdate) => { if (!update.docChanged) return; - if ( - update.transactions.some( - (transaction) => transaction.annotation(externalValueSync) === true, - ) - ) { - return; - } onChange(update.state.doc.toString()); }), EditorView.theme({ @@ -533,126 +267,6 @@ function createEditorExtensions( ]; } -function createEmojiAutocomplete( - frequencies: Readonly> | undefined, - onEmojiSelect: (shortcode: string) => void, -) { - return autocompletion({ - activateOnTyping: true, - addToOptions: [ - { - position: 20, - render(completion) { - const container = document.createElement("span"); - createRoot(container).render( - , - ); - return container; - }, - }, - ], - maxRenderedOptions: MAX_RENDERED_EMOJI_OPTIONS, - override: [createEmojiCompletionSource(frequencies, onEmojiSelect)], - }); -} - -function normalizedFrequencies( - frequencies: Readonly> | undefined, -) { - const normalized = new Map(); - for (const [value, frequency] of Object.entries(frequencies ?? {})) { - const shortcode = resolveEmoji(value)?.shortcode; - if (!shortcode || !Number.isFinite(frequency) || frequency <= 0) continue; - normalized.set(shortcode, (normalized.get(shortcode) ?? 0) + frequency); - } - return normalized; -} - -export function createEmojiCompletionSource( - frequencies?: Readonly>, - onEmojiSelect: (shortcode: string) => void = () => undefined, -) { - const normalized = normalizedFrequencies(frequencies); - const maxFrequency = Math.max(0, ...normalized.values()); - - return (context: CompletionContext): CompletionResult | null => { - const token = context.matchBefore(/:[a-z0-9_+-]*$/i); - if (!token) return null; - if ( - codeRanges(context.state).some( - (range) => token.from < range.to && token.to > range.from, - ) - ) { - return null; - } - - const characterBefore = context.state.sliceDoc( - Math.max(0, token.from - 1), - token.from, - ); - if (characterBefore && /[a-z0-9_]/i.test(characterBefore)) return null; - - const query = token.text.slice(1).toLowerCase(); - const options: Completion[] = searchEmojis(query) - .map((emoji) => { - const aliases = emoji.aliases.map((alias) => alias.toLowerCase()); - const matchedAlias = - aliases.find((alias) => alias === query) ?? - aliases.find((alias) => alias.startsWith(query)) ?? - aliases.find((alias) => alias.includes(query)) ?? - emoji.name; - const relevance = !query - ? 0 - : matchedAlias === query - ? 80 - : matchedAlias.startsWith(query) - ? 40 - : 0; - const frequency = normalized.get(emoji.shortcode) ?? 0; - const usage = - maxFrequency > 0 - ? (15 * Math.log1p(frequency)) / Math.log1p(maxFrequency) - : 0; - - return { - apply(view, completion, from, to) { - view.dispatch({ - annotations: pickedCompletion.of(completion), - changes: { from, insert: `${emoji.shortcode} `, to }, - selection: EditorSelection.cursor( - from + emoji.shortcode.length + 1, - ), - }); - onEmojiSelect(emoji.shortcode); - }, - boost: relevance + usage, - displayLabel: emoji.shortcode, - label: `:${matchedAlias}:`, - type: "text", - frequency, - relevance, - } satisfies Completion & { frequency: number; relevance: number }; - }) - .sort( - (a, b) => - b.relevance - a.relevance || - b.frequency - a.frequency || - (a.displayLabel ?? a.label).localeCompare(b.displayLabel ?? b.label), - ); - - return { - from: token.from, - options, - validFor: /^:[a-z0-9_+-]*$/i, - }; - }; -} - -export const emojiCompletionSource = createEmojiCompletionSource(); - /** * Executes buildDecorations. * @param view Parameter view. diff --git a/packages/markdown/src/markdown.tsx b/packages/markdown/src/markdown.tsx index d98e36b..976301a 100644 --- a/packages/markdown/src/markdown.tsx +++ b/packages/markdown/src/markdown.tsx @@ -1,10 +1,7 @@ import * as React from "react"; -import Emoji from "./emoji"; -import { findEmojiShortcodes } from "./emojiData"; type InlineNode = | { type: "text"; value: string } - | { type: "emoji"; shortcode: string } | { type: "strong"; value: string } | { type: "em"; value: string } | { type: "del"; value: string } @@ -76,14 +73,14 @@ type MarkdownBlock = | TableBlock; const INLINE_TOKEN_REGEX = - /!\[([^\]]*)\]\(([^)\s]+(?:\s+"[^"]*")?)\)|\[([^\]]+)\]\(([^)\s]+(?:\s+"[^"]*")?)\)|`([^`\n]+)`|~~([^~\n]+)~~|\*\*([^*\n]+)\*\*|__([^_\n]+)__|\*([^*\n]+)\*|(? cursor) { - nodes.push(...parseEmojiText(input.slice(cursor, index))); + nodes.push({ type: "text", value: input.slice(cursor, index) }); } if (match[1] !== undefined && match[2] !== undefined) { @@ -114,38 +111,18 @@ export function parseInlineNodes(input: string): InlineNode[] { } else if (match[9] !== undefined || match[10] !== undefined) { nodes.push({ type: "em", value: match[9] ?? match[10] ?? "" }); } else { - nodes.push(...parseEmojiText(raw)); + nodes.push({ type: "text", value: raw }); } cursor = index + raw.length; match = INLINE_TOKEN_REGEX.exec(input); } - if (cursor < input.length) { - nodes.push(...parseEmojiText(input.slice(cursor))); - } - - INLINE_TOKEN_REGEX.lastIndex = 0; - return nodes; -} - -export function parseEmojiText(input: string): InlineNode[] { - const nodes: InlineNode[] = []; - let cursor = 0; - - for (const match of findEmojiShortcodes(input)) { - if (match.from > cursor) { - nodes.push({ type: "text", value: input.slice(cursor, match.from) }); - } - - nodes.push({ type: "emoji", shortcode: match.emoji.shortcode }); - cursor = match.to; - } - if (cursor < input.length) { nodes.push({ type: "text", value: input.slice(cursor) }); } + INLINE_TOKEN_REGEX.lastIndex = 0; return nodes; } @@ -398,16 +375,10 @@ function renderInline(nodes: InlineNode[]): React.ReactNode[] { return node.value; } - if (node.type === "emoji") { - return ( - - ); - } - if (node.type === "strong") { return ( - {renderInline(parseEmojiText(node.value))} + {node.value} ); } @@ -415,7 +386,7 @@ function renderInline(nodes: InlineNode[]): React.ReactNode[] { if (node.type === "em") { return ( - {renderInline(parseEmojiText(node.value))} + {node.value} ); } @@ -423,7 +394,7 @@ function renderInline(nodes: InlineNode[]): React.ReactNode[] { if (node.type === "del") { return ( - {renderInline(parseEmojiText(node.value))} + {node.value} ); } @@ -445,7 +416,7 @@ function renderInline(nodes: InlineNode[]): React.ReactNode[] { target="_blank" rel="noreferrer" > - {renderInline(parseEmojiText(node.label))} + {node.label} ); } @@ -666,7 +637,7 @@ function readTable( } const markdownStyles = ` -.tm-md-root { color: hsl(var(--foreground)); line-height: 1.65; font-size: 1rem; } +.tm-md-root { color: hsl(var(--foreground)); line-height: 1.55; font-size: 0.95rem; } .tm-md-heading { margin: 0.2rem 0 0.35rem; font-weight: 700; line-height: 1.25; } .tm-md-h1 { font-size: 1.65rem; } .tm-md-h2 { font-size: 1.45rem; } @@ -684,7 +655,6 @@ const markdownStyles = ` .tm-md-del { text-decoration: line-through; } .tm-md-link { color: hsl(var(--primary)); text-decoration: underline; text-underline-offset: 0.14rem; } .tm-md-image { display: block; max-width: 100%; border-radius: 0.4rem; margin: 0.5rem 0; } -.tm-md-emoji { display: inline-block; width: 1.15em; height: 1.15em; vertical-align: -0.18em; } .tm-md-ul, .tm-md-ol { margin: 0.3rem 0 0.35rem 1.2rem; padding: 0; } .tm-md-li { margin: 0.2rem 0; } .tm-md-checkbox { margin-right: 0.5rem; vertical-align: middle; } @@ -700,21 +670,8 @@ const markdownStyles = ` .cm-editor.tm-md-editor .cm-content { caret-color: var(--foreground); } .cm-editor.tm-md-editor .cm-content { padding: var(--tm-md-content-padding, 0.25rem 0.625rem); min-height: 2rem; } .cm-editor.tm-md-editor .cm-line { padding: 0; color: hsl(var(--foreground)); } -.cm-editor.tm-md-editor .tm-md-editor-emoji { display: inline-block; width: 1.15em; height: 1.15em; vertical-align: -0.18em; object-fit: contain; pointer-events: none; } .cm-editor.tm-md-editor .tm-md-hidden-token { color: transparent; opacity: 0; font-size: inherit; } .cm-editor.tm-md-editor .tm-md-code-line { font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; background: hsl(var(--muted)); border-radius: 0.3rem; } -.cm-tooltip.cm-tooltip-autocomplete { min-width: 18rem; max-width: min(26rem, calc(100vw - 1rem)); overflow: hidden; border: 1px solid var(--border); border-radius: var(--radius); background: var(--popover); color: var(--popover-foreground); box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); font-family: "Public Sans Variable", sans-serif; font-size: 0.875rem; } -.cm-editor.tm-md-editor .cm-tooltip.cm-tooltip-autocomplete > ul { max-height: min(20rem, 45vh); padding: 0.25rem; font-family: "Public Sans Variable", sans-serif; scrollbar-width: thin; scrollbar-color: var(--border) transparent; } -.cm-tooltip.cm-tooltip-autocomplete > ul::-webkit-scrollbar { width: 6px; height: 6px; } -.cm-tooltip.cm-tooltip-autocomplete > ul::-webkit-scrollbar-track { background: transparent; } -.cm-tooltip.cm-tooltip-autocomplete > ul::-webkit-scrollbar-thumb { border-radius: 9999px; background: var(--border); } -.cm-tooltip.cm-tooltip-autocomplete > ul > li { display: flex; min-height: 2.25rem; align-items: center; border-radius: calc(var(--radius) * 0.8); padding: 0.3rem 0.5rem; color: var(--popover-foreground); } -.cm-tooltip.cm-tooltip-autocomplete > ul > li:hover, -.cm-tooltip.cm-tooltip-autocomplete > ul > li[aria-selected] { background: var(--accent); color: var(--accent-foreground); } -.cm-tooltip.cm-tooltip-autocomplete .cm-completionIcon { display: none; } -.cm-tooltip.cm-tooltip-autocomplete .cm-completionLabel { overflow: hidden; text-overflow: ellipsis; } -.cm-tooltip.cm-tooltip-autocomplete .cm-completionMatchedText { color: inherit; text-decoration: none; font-weight: 600; } -.cm-tooltip-autocomplete .tm-md-completion-emoji { display: inline-block; width: 1.35rem; height: 1.35rem; flex: 0 0 auto; margin-right: 0.5rem; vertical-align: middle; } `; /** diff --git a/packages/markdown/src/text.tsx b/packages/markdown/src/text.tsx index 2add8d7..07e1bb8 100644 --- a/packages/markdown/src/text.tsx +++ b/packages/markdown/src/text.tsx @@ -22,7 +22,6 @@ export default function Text(props: TextProps) { () => parseMarkdownBlocks(props.value), [props.value], ); - const renderedBlocks = React.useMemo(() => renderBlocks(blocks), [blocks]); - return
{renderedBlocks}
; + return
{renderBlocks(blocks)}
; } diff --git a/packages/mtp/src/context.tsx b/packages/mtp/src/context.tsx deleted file mode 100644 index bb6c925..0000000 --- a/packages/mtp/src/context.tsx +++ /dev/null @@ -1,634 +0,0 @@ -import { - createContext, - type ReactNode, - useCallback, - useContext, - useEffect, - useMemo, - useRef, - useState, -} from "react"; -import { isTauri } from "@tauri-apps/api/core"; -import { onResume } from "tauri-plugin-app-events-api"; -import { MTPClient } from "mtp"; -import { type z } from "zod"; -import { ConnectionState } from "mtp"; -import createAsyncQueue from "@tensamin/shared/asyncQueue"; -import { toast as sonnerToast } from "@tensamin/ui"; - -import { - type Calls, - type Communities, - type Contacts, - mtp as schemas, - type MTP as Schemas, -} from "@tensamin/shared/data"; -import { log } from "@tensamin/shared/log"; -import { useStorage } from "@tensamin/storage/context"; - -import { - PING_INTERVAL, - RECONNECT_RESET, - RECONNECT_TRIES, - RETRY_INTERVAL, -} from "./values"; - -function base64ToUint8Array(b64: string) { - const bin = atob(b64); - const out = new Uint8Array(bin.length); - - for (let i = 0; i < bin.length; i++) { - out[i] = bin.charCodeAt(i); - } - - return out; -} - -export type ProtocolMessage< - T extends keyof Schemas & string = keyof Schemas & string, -> = { - id?: number; - type: T | string; - data: z.infer; -}; - -export type BoundSendFn = ( - type: T, - data?: z.infer, - options?: { id?: number }, -) => Promise>; - -export type PushHandler = (message: ProtocolMessage) => void; - -export type MTPExchange = { - type: keyof Schemas & string; - data: unknown; - response: ProtocolMessage; -}; - -export type MTPInterceptor = (exchange: MTPExchange) => void | Promise; - -type ContextType = { - send: BoundSendFn; - subscribe: ( - type: T, - handler: (message: ProtocolMessage) => void, - ) => () => void; - subscribePush: (handler: PushHandler) => () => void; - addInterceptor: (interceptor: MTPInterceptor) => () => void; - readyState: number; - ownPing: number; - iotaPing: number; - identified: boolean; - freshContacts: Contacts; - freshCommunities: Communities; - freshCalls: Calls; - contextReady: boolean; - loadingDescription: string; -}; - -const MTPContext = createContext(undefined); - -function isTauriMobile() { - return isTauri() && /Android|iPhone|iPad|iPod/.test(navigator.userAgent); -} - -function getProtocolErrorDetails(error: unknown) { - if (typeof error !== "object" || error === null || !("type" in error)) { - return null; - } - - const protocolError = error as { - id?: unknown; - type?: unknown; - data?: unknown; - }; - return { - id: protocolError.id, - type: protocolError.type, - data: protocolError.data, - }; -} - -// Zod schema validation -function validateResponse( - type: T, - message: { id?: number; type: string; data: unknown }, -): ProtocolMessage { - if (message.type.startsWith("Error")) { - return message as ProtocolMessage; - } - - const schema = - schemas[message.type as keyof Schemas & string]?.response ?? - schemas[type]?.response; - if (!schema) { - return message as ProtocolMessage; - } - - const parsed = schema.safeParse(message.data); - if (!parsed.success) { - throw new Error( - `Response validation failed for ${type}: ${parsed.error.message}`, - ); - } - - return { - id: message.id, - type: message.type, - data: parsed.data, - } as ProtocolMessage; -} - -export function Provider(props: { - children: ReactNode; - blockConnection?: boolean; -}) { - const { load } = useStorage(); - - const [readyState, setReadyState] = useState( - ConnectionState.Disconnected, - ); - const [identified, setIdentified] = useState(false); - const [identifying, setIdentifying] = useState(false); - - const [ownPing, setOwnPing] = useState(0); - const [iotaPing, setIotaPing] = useState(0); - - const [freshCommunities, setFreshCommunities] = useState([]); - const [freshContacts, setFreshContacts] = useState([]); - const [freshCalls, setFreshCalls] = useState([]); - - const clientRef = useRef> | null>( - null, - ); - const interceptorsRef = useRef(new Set()); - - const connected = readyState === ConnectionState.Connected; - - // MTP url - const [mtpUrl, setMtpUrl] = useState(null); - useEffect(() => { - load("omega_url").then(setMtpUrl); - }, [load]); - - // Validation override functions - const send: BoundSendFn = useMemo( - () => async (type, data, options) => { - const client = clientRef.current; - - if (!client) { - throw new Error("mtp is not connected"); - } - - const message = await client.request( - type, - (data ?? {}) as Record, - options, - ); - return validateResponse(type, message); - }, - [], - ); - - const subscribe = useCallback((type, handler) => { - const client = clientRef.current; - if (!client) { - return () => {}; - } - - return client.subscribe(type, (message) => { - handler(validateResponse(type, message)); - }); - }, []); - - const subscribePush = useCallback((handler: PushHandler) => { - const client = clientRef.current; - if (!client) { - return () => {}; - } - - const unsubscribers = [ - "MessageLive", - "MessageEditLive", - "MessageReactionLive", - "MessageDeleteLive", - "MessageState", - "CallInvite", - "ErrorNoIota", - ].map((type) => - client.subscribe(type, (message) => { - handler(validateResponse(type as keyof Schemas & string, message)); - }), - ); - - return () => { - unsubscribers.forEach((unsubscribe) => unsubscribe()); - }; - }, []); - - const addInterceptor = useCallback((interceptor: MTPInterceptor) => { - interceptorsRef.current.add(interceptor); - return () => interceptorsRef.current.delete(interceptor); - }, []); - - // Custom Pings - useEffect(() => { - if (!connected || !identified) { - return; - } - - const interval = setInterval(async () => { - try { - const originalNow = Date.now(); - const data = await send("Ping", { LastPing: originalNow }); - setOwnPing(Date.now() - originalNow); - - const remotePing = data.data.PingIota; - if (typeof remotePing === "number") { - setIotaPing(remotePing); - } - } catch (intervalError) { - log(1, "mtp", "yellow", "Ping failed", intervalError); - } - }, PING_INTERVAL); - - return () => { - clearInterval(interval); - }; - }, [connected, identified, send]); - - // Reconnect stuff - const resolveConnectionRef = useRef(() => {}); - useEffect(() => { - if (!mtpUrl) return; - - let attempts = 0; - let reconnectTimer: ReturnType | null = null; - let reconnectResetTimer: ReturnType | null = null; - let reconnectScheduled = false; - let disposed = false; - let resumeListenerRegistered = false; - - const clearReconnectTimer = () => { - if (!reconnectTimer) return; - clearTimeout(reconnectTimer); - reconnectTimer = null; - reconnectScheduled = false; - }; - - const clearReconnectResetTimer = () => { - if (!reconnectResetTimer) return; - clearTimeout(reconnectResetTimer); - reconnectResetTimer = null; - }; - - async function connect() { - if (disposed || props.blockConnection) return; - - const cleanup = () => { - clientRef.current?.disconnect(); - clientRef.current = null; - clearReconnectResetTimer(); - setReadyState(ConnectionState.Disconnected); - setIdentified(false); - setIdentifying(false); - }; - try { - setIdentified(false); - setIdentifying(false); - - await MTPClient.init(); - - const [userId, keyring] = await Promise.all([ - load("user_id"), - load("mtp_keyring"), - ]); - if (!userId || !keyring) { - throw new Error("Missing login credentials"); - } - const forcedOmikronUrl = await load("forced_omikron_url"); - const forcedOmikronPublicKey = await load("forced_omikron_public_key"); - - let url = null; - let omikronPublicKey = null; - if (forcedOmikronUrl && forcedOmikronPublicKey) { - url = forcedOmikronUrl; - omikronPublicKey = forcedOmikronPublicKey; - } else { - log(2, "mtp", "purple", "Fetching Omikron data."); - const data = await fetch(`${mtpUrl}api/get/omikron/${userId}`); - - if (data.status === 404) { - sonnerToast.error("We couldn't reach your Iota", { - description: - "Check your network connection and try restarting your Iota", - icon: null, - duration: Infinity, - closeButton: true, - }); - resolveConnectionRef.current?.(); - cleanup(); - return; - } - const omikronData = (await data.json()) as { - id: number; - ip_address: string; - port: number; - public_key: string; - status: string; - }; - - if ( - !omikronData.ip_address || - !omikronData.port || - !omikronData.public_key - ) - throw new Error("Invalid Omikron data"); - - url = `https://${omikronData.ip_address}:${omikronData.port}`; - omikronPublicKey = omikronData.public_key; - } - //codec.decode(new Uint8Array(await res.arrayBuffer())), - - if (!url || !omikronPublicKey) - throw new Error("Missing Omikron URL or Public Key"); - - log(2, "mtp", "green", "Connecting to: " + url); - - const client = await MTPClient.create({ - url, - credentials: { - clientId: userId, - keyring: base64ToUint8Array(keyring), - }, - hostPublicKey: omikronPublicKey, - descriptor: "client", - pings: true, - logger: (event) => { - if (event.type === "state") { - setReadyState( - clientRef.current?.state ?? ConnectionState.Disconnected, - ); - } - - if (event.type !== "Pong" && event.type !== "Ping") { - log( - 2, - "mtp", - event.type === "state" - ? "purple" - : event.direction === "recv" - ? "cyan" - : event.direction === "send" - ? "gray" - : "blue", - event.type === "state" - ? event.data - : event.direction === "recv" - ? "< " + event.type - : event.direction === "send" - ? "> " + event.type - : event.type, - event, - ); - } - }, - }); - - if (disposed) { - client.disconnect(); - return; - } - - clientRef.current = client; - setReadyState(client.state); - await client.connect(); - - if (disposed) { - client.disconnect(); - return; - } - - const authPayload = new Promise< - ProtocolMessage<"IdentificationResponse"> - >((resolve, reject) => { - const unsubscribe = client.subscribe( - "IdentificationResponse", - (message) => { - try { - unsubscribe(); - if (message.type.startsWith("Error")) { - reject(new Error(`Authentication failed: ${message.type}`)); - return; - } - resolve(validateResponse("IdentificationResponse", message)); - } catch (authPayloadError) { - unsubscribe(); - reject(authPayloadError); - } - }, - ); - }); - - clearReconnectTimer(); - - // Schedule reconnect reset - clearReconnectResetTimer(); - reconnectResetTimer = setTimeout(() => { - attempts = 0; - reconnectResetTimer = null; - }, RECONNECT_RESET * 1_000); - - setReadyState(client.state); - setIdentifying(true); - - await client.auth(); - const finalResponse = await authPayload; - - if (disposed || clientRef.current !== client) return; - - setFreshContacts(finalResponse.data.Contacts); - setFreshCommunities(finalResponse.data.Communities); - setFreshCalls(finalResponse.data.Calls); - setIdentifying(false); - setIdentified(true); - resolveConnectionRef.current?.(); - } catch (connectError) { - if (disposed) return; - cleanup(); - log( - 0, - "mtp", - "red", - "Connection/authentication attempt failed", - getProtocolErrorDetails(connectError) ?? connectError, - ); - - // Schedule reconnect - if (disposed || reconnectScheduled) return; - if (attempts >= RECONNECT_TRIES) { - log(0, "mtp", "red", "Reconnection attempts exhausted", connectError); - sonnerToast.error("Connection failed", { - id: "mtp-connection-toast", - description: - connectError instanceof Error - ? connectError.message.split(":")[0] - : String(connectError ?? "Unknown error"), - icon: null, - duration: Infinity, - closeButton: true, - promise: null, - } as unknown as Parameters[1]); - return; - } - - attempts += 1; - - // Show loading toast - sonnerToast.loading( - `Reconnecting to server... (attempt ${attempts} of ${RECONNECT_TRIES})`, - { id: "mtp-connection-toast" }, - ); - - reconnectScheduled = true; - reconnectTimer = setTimeout(() => { - reconnectScheduled = false; - reconnectTimer = null; - void connect(); - }, RETRY_INTERVAL); - } - } - - async function reconnectAfterResume() { - if (disposed) return; - - clientRef.current?.disconnect(); - clientRef.current = null; - clearReconnectTimer(); - clearReconnectResetTimer(); - attempts = 0; - reconnectScheduled = false; - await connect(); - } - - void connect(); - - if (!props.blockConnection && isTauriMobile()) { - resumeListenerRegistered = true; - onResume(() => { - void reconnectAfterResume(); - }); - } - - return () => { - disposed = true; - clearReconnectTimer(); - clearReconnectResetTimer(); - - if (resumeListenerRegistered) { - onResume(); - } - - clientRef.current?.disconnect(); - clientRef.current = null; - setReadyState(ConnectionState.Disconnected); - setIdentified(false); - setIdentifying(false); - sonnerToast.dismiss("mtp-connection-toast"); - }; - }, [mtpUrl, props.blockConnection, load]); - - // No Iota check - useEffect(() => { - if (!connected) return; - - return subscribe("ErrorNoIota", () => { - setIdentified(false); - setIdentifying(false); - sonnerToast.error("We couldn't reach your Iota", { - description: - "Check your network connection and try restarting your Iota", - icon: null, - duration: Infinity, - closeButton: true, - }); - resolveConnectionRef.current?.(); - }); - }, [connected, subscribe]); - - // Async queue - const loadingDescription = useMemo(() => { - if (!mtpUrl) return "Loading connection details"; - if (readyState === ConnectionState.Connecting || !connected) { - return "Establishing transport channel"; - } - if (identifying || !identified) return "Waiting for authenticated session"; - return "Loading..."; - }, [connected, identified, identifying, readyState, mtpUrl]); - const contextReady = connected && identified && mtpUrl !== null; - const mtpRef = useMemo( - () => - createAsyncQueue<{ - send: typeof send; - subscribe: typeof subscribe; - subscribePush: typeof subscribePush; - }>(), - [], - ); - useEffect(() => { - if (connected && identified && mtpUrl) { - mtpRef.set({ - send, - subscribe, - subscribePush, - }); - } - }, [connected, identified, mtpUrl, send, subscribe, subscribePush, mtpRef]); - - const sendQueued: BoundSendFn = useMemo( - () => async (type, data, options) => { - const mtp = await mtpRef.get(); - const response = await mtp.send(type, data, options); - for (const interceptor of interceptorsRef.current) { - void Promise.resolve( - interceptor({ type, data, response: response as ProtocolMessage }), - ).catch((error) => { - log(1, "mtp", "yellow", "MTP interceptor failed", error, { type }); - }); - } - return response; - }, - [mtpRef], - ); - - return ( - - {props.children} - - ); -} - -export function useMTP(): ContextType { - const context = useContext(MTPContext); - if (!context) { - throw new Error("useMTP must be used within an MTPProvider"); - } - return context; -} diff --git a/packages/mtp/src/index.ts b/packages/mtp/src/index.ts deleted file mode 100644 index 39bce46..0000000 --- a/packages/mtp/src/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -export { Provider, useMTP } from "./context"; -export type { - BoundSendFn, - MTPExchange, - MTPInterceptor, - PushHandler, - ProtocolMessage, -} from "./context"; diff --git a/packages/mtp/tsconfig.json b/packages/mtp/tsconfig.json deleted file mode 100644 index f456417..0000000 --- a/packages/mtp/tsconfig.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "compilerOptions": { - "jsx": "react-jsx", - "module": "ESNext", - "target": "ES2020", - "moduleResolution": "Bundler", - "strict": true, - "skipLibCheck": true, - "noEmit": true, - "esModuleInterop": true, - "allowSyntheticDefaultImports": true - }, - "include": ["src"] -} diff --git a/packages/notifications/package.json b/packages/notifications/package.json index 8f87973..cfd540a 100644 --- a/packages/notifications/package.json +++ b/packages/notifications/package.json @@ -7,7 +7,7 @@ "./context": "./src/context.tsx" }, "scripts": { - "format": "pnpm exec prettier --write .", + "format": "bunx prettier --write .", "lint": "eslint src", "build": "tsc -p tsconfig.json --noEmit" }, @@ -18,7 +18,7 @@ "@tensamin/shared": "workspace:*", "@tensamin/chat": "workspace:*", "@tensamin/storage": "workspace:*", - "@tensamin/mtp": "workspace:*", + "@tensamin/ttp": "workspace:*", "@tensamin/ui": "*", "@tensamin/user": "workspace:*", "react": "^19.2.0", diff --git a/packages/notifications/src/context.tsx b/packages/notifications/src/context.tsx index 12283c3..8da45f4 100644 --- a/packages/notifications/src/context.tsx +++ b/packages/notifications/src/context.tsx @@ -1,16 +1,16 @@ +import { useCrypto } from "@tensamin/crypto/context"; import { useStorage } from "@tensamin/storage/context"; import { useUser } from "@tensamin/user/context"; import { useChat } from "@tensamin/chat/context"; -import { useMTP } from "@tensamin/mtp"; +import { useTTP } from "@tensamin/ttp"; import { createContext, useEffect, useContext } from "react"; +import z from "zod"; import { toast as sonnerToast } from "sonner"; +import { message as messageSchema } from "@tensamin/shared/data"; import { Avatar, AvatarFallback, AvatarImage } from "@tensamin/ui"; import { isTauri } from "@tauri-apps/api/core"; import { useSession } from "@tensamin/storage/session"; import { useNavigate } from "@tanstack/react-router"; -import { decryptChatText } from "@tensamin/crypto/chatSecret"; -import { log } from "@tensamin/shared/log"; -import { type RawMessage } from "@tensamin/chat/values"; export const context = createContext(undefined); @@ -24,115 +24,125 @@ async function requestNotificationPermission() { } export default function Provider(props: { children: React.ReactNode }) { - const { subscribePush, send } = useMTP(); + const { subscribePush, send } = useTTP(); const { load } = useStorage(); const { get } = useUser(); - const { addLiveMessage, getChatSecret, userId } = useChat(); + const { decryptText, getSharedSecret } = useCrypto(); + const { addLiveMessage, userId } = useChat(); const { moveUserIdToTop } = useSession(); const navigate = useNavigate(); useEffect(() => { - return subscribePush(async (message) => { - if (message.type === "MessageLive") { - const data = message.data as { - Message?: RawMessage; - SenderId?: number; + return subscribePush(async (ttpMessage) => { + if (ttpMessage.type === "message_live") { + const { message, sender_id } = ttpMessage.data as { + message: z.infer; + sender_id: number; }; - if (!data.SenderId) return; + const user = await get(sender_id); - const chatSecret = await getChatSecret(data.SenderId); + const decryptedContent = await decryptText( + await getSharedSecret( + await load("private_key"), + await get(await load("user_id")).then((data) => data.public_key), + user.public_key, + ), + message.content, + ); - if (!data.Message || !chatSecret) return; - const user = await get(data.SenderId); + // Update message state + if ( + (await load("settings.read_confirmations")) && + userId === sender_id + ) { + void send( + "message_state", + { + message_state: "read", + }, + { + id: ttpMessage.id, + }, + ); + } else { + void send( + "message_state", + { + message_state: "received", + }, + { + id: ttpMessage.id, + }, + ); + } - void decryptChatText(chatSecret, data.Message.Content) - .catch((err) => { - log(1, "chat", "red", "Failed to decrypt live message", err, { - SendTime: data.Message?.SendTime, - }); - return null; - }) - .then(async (content) => { - if (!data.Message || !content || !data.SenderId) return; - - if (userId === data.SenderId) { - addLiveMessage({ - ...data.Message, - Content: content ?? "Failed to decrypt message", - decryptionFailed: content === null, - }); - return; - } - - // todo: add notification symbol to conversation cards (incl. message start) - moveUserIdToTop(data.SenderId); - - if (await load("settings.receive_confirmations")) { - void send( - "MessageState", - { - MessageState: "received", - }, - { - id: data.Message.SendTime, - }, - ); - } - - if (isTauri()) { - console.log("weewoo"); - } else { - const hasPermissions = await requestNotificationPermission(); - - if (hasPermissions) { - const notification = new Notification(user.Display, { - body: content, - icon: user.Avatar || user.Display.slice(0, 2).toUpperCase(), - badge: user.Avatar || user.Display.slice(0, 2).toUpperCase(), - tag: `message-${user.UserId}`, - silent: true, - }); - - notification.onclick = () => { - window.focus(); - navigate({ - to: `/chat?id=${user.UserId}`, - }); - - notification.close(); - }; - } else { - sonnerToast(user.Display, { - classNames: { - content: "pl-4", - }, - description: content, - icon: ( - - - - {user.Display.slice(0, 2).toUpperCase()} - - - ), - }); - } - } + if (userId === sender_id) { + addLiveMessage({ + ...message, + content: decryptedContent, + sent_by_self: false, }); - return; + + return; + } + + // todo: add notification symbol to conversation cards (incl. message start) + + moveUserIdToTop(sender_id); + + if (isTauri()) { + console.log("weewoo"); + } else { + const hasPermissions = await requestNotificationPermission(); + + if (hasPermissions) { + const notification = new Notification(user.display, { + body: decryptedContent, + icon: user.avatar || user.display.slice(0, 2).toUpperCase(), + badge: user.avatar || user.display.slice(0, 2).toUpperCase(), + tag: `message-${user.user_id}`, + silent: true, + }); + + notification.onclick = () => { + window.focus(); + navigate({ + to: `/chat?id=${user.user_id}`, + }); + + notification.close(); + }; + } else { + sonnerToast(user.display, { + classNames: { + content: "pl-4", + }, + description: decryptedContent, + icon: ( + + + + {user.display.slice(0, 2).toUpperCase()} + + + ), + }); + } + } } }); }, [ - addLiveMessage, - get, - load, - navigate, - send, - moveUserIdToTop, subscribePush, - getChatSecret, + decryptText, + getSharedSecret, + load, + get, + addLiveMessage, userId, + moveUserIdToTop, + send, + navigate, ]); return ( diff --git a/packages/settings/package.json b/packages/settings/package.json deleted file mode 100644 index ec935a1..0000000 --- a/packages/settings/package.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "name": "@tensamin/settings", - "private": true, - "version": "0.0.0", - "type": "module", - "exports": { - ".": "./src/index.tsx" - }, - "scripts": { - "format": "pnpm exec prettier --write .", - "lint": "eslint src", - "build": "tsc -p tsconfig.json --noEmit" - }, - "dependencies": { - "@tanstack/react-router": "^1.169.1", - "@tensamin/cache": "workspace:*", - "@tensamin/markdown": "workspace:*", - "@tensamin/mtp": "workspace:*", - "@tensamin/shared": "workspace:*", - "@tensamin/storage": "workspace:*", - "@tensamin/ui": "*", - "@tensamin/user": "workspace:*", - "lucide-react": "^1.14.0", - "react": "^19.2.0", - "react-dom": "^19.2.0" - }, - "devDependencies": { - "vite": "^8.0.10" - } -} diff --git a/packages/settings/src/index.tsx b/packages/settings/src/index.tsx deleted file mode 100644 index 9315658..0000000 --- a/packages/settings/src/index.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import { createRoute, type AnyRoute } from "@tanstack/react-router"; - -import SettingsLayout from "./layout"; -import { settingsPages } from "./manifest"; - -export function createSettingsRoute(parentRoute: AnyRoute) { - const settingsRoute = createRoute({ - getParentRoute: () => parentRoute, - path: "settings", - component: SettingsLayout, - staticData: { showMobileNavbar: true }, - }); - - return settingsRoute.addChildren( - settingsPages.map((page) => - createRoute({ - getParentRoute: () => settingsRoute, - path: page.path, - component: page.component, - staticData: { showMobileNavbar: true }, - }), - ), - ); -} diff --git a/packages/settings/src/manifest.ts b/packages/settings/src/manifest.ts deleted file mode 100644 index 38a404f..0000000 --- a/packages/settings/src/manifest.ts +++ /dev/null @@ -1,37 +0,0 @@ -import Cache from "./pages/cache"; -import Chat from "./pages/chat"; -import Index from "./pages/index"; -import Licenses from "./pages/licenses"; -import Profile from "./pages/profile"; -import Security from "./pages/security"; -import Theme from "./pages/theme"; - -export const settingsPages = [ - { path: "/", component: Index }, - { category: "general", path: "chat", label: "Chat", component: Chat }, - { - category: "account", - path: "profile", - label: "Profile", - component: Profile, - }, - { - category: "account", - path: "security", - label: "Security", - component: Security, - }, - { category: "application", path: "cache", label: "Cache", component: Cache }, - { category: "application", path: "theme", label: "Theme", component: Theme }, - { - category: "application", - path: "licenses", - label: "Licenses", - component: Licenses, - }, -] as const; - -export const settingsNavigation = settingsPages.filter( - (page): page is Exclude<(typeof settingsPages)[number], { path: "/" }> => - page.path !== "/", -); diff --git a/packages/settings/src/pages/cache.tsx b/packages/settings/src/pages/cache.tsx deleted file mode 100644 index 2d189ec..0000000 --- a/packages/settings/src/pages/cache.tsx +++ /dev/null @@ -1,101 +0,0 @@ -import { createCache } from "@tensamin/cache"; -import { storageDefaults } from "@tensamin/shared/data"; -import { useStorage } from "@tensamin/storage/context"; -import { secureValueCodec } from "@tensamin/storage/secure"; -import { Button, Input, Label } from "@tensamin/ui"; -import { useEffect, useState } from "react"; - -const validLimit = (value: number) => Number.isSafeInteger(value) && value >= 0; - -export default function Page() { - const { load, save } = useStorage(); - const [contacts, setContacts] = useState(storageDefaults.cache_contacts); - const [messagesPerChat, setMessagesPerChat] = useState( - storageDefaults.cache_messages_per_chat, - ); - const [savedContacts, setSavedContacts] = useState(contacts); - const [savedMessagesPerChat, setSavedMessagesPerChat] = - useState(messagesPerChat); - const [saving, setSaving] = useState(false); - useEffect(() => { - void Promise.all([ - load("cache_contacts"), - load("cache_messages_per_chat"), - ]).then(([nextContacts, nextMessages]) => { - setContacts(nextContacts); - setSavedContacts(nextContacts); - setMessagesPerChat(nextMessages); - setSavedMessagesPerChat(nextMessages); - }); - }, [load]); - const valid = validLimit(contacts) && validLimit(messagesPerChat); - const changed = - contacts !== savedContacts || messagesPerChat !== savedMessagesPerChat; - async function persist() { - if (!valid || saving) return; - setSaving(true); - try { - await Promise.all([ - save("cache_contacts", contacts), - save("cache_messages_per_chat", messagesPerChat), - ]); - const accountId = await load("user_id"); - if (accountId) - await createCache(String(accountId), { - codec: secureValueCodec, - }).conversations.prune(); - setSavedContacts(contacts); - setSavedMessagesPerChat(messagesPerChat); - } finally { - setSaving(false); - } - } - return ( -
-
- - setContacts(event.currentTarget.valueAsNumber)} - /> -
-
- - - setMessagesPerChat(event.currentTarget.valueAsNumber) - } - /> -
- {!valid && ( -

- Cache limits must be whole numbers greater than or equal to 0. -

- )} -
- - -
-
- ); -} diff --git a/packages/settings/src/pages/licenses.tsx b/packages/settings/src/pages/licenses.tsx deleted file mode 100644 index c1a06d2..0000000 --- a/packages/settings/src/pages/licenses.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import { Badge, Button, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Dialog, DialogContent, DialogTrigger } from "@tensamin/ui"; -import { generatedAt, packageCount, packages } from "../../../../licenses/third-party-credits.json"; - -const licenseTexts = import.meta.glob("../../../../licenses/**/*", { eager: true, import: "default", query: "?raw" }) as Record; - -function getLicenseFiles(licensePackage: (typeof packages)[number]) { - return licensePackage.files.map((fileName) => ({ - fileName, - text: licenseTexts["../../../../" + licensePackage.licenseFolder + "/" + fileName], - })); -} - -export default function Page() { - return
-

Last generated: {generatedAt}

Package Count: {packageCount}

-
- {packages.map((licensePackage) => - {licensePackage.license} {licensePackage.name} {licensePackage.version} - {licensePackage.description && {licensePackage.description}} - - {licensePackage.repository ? : } - {licensePackage.homepage ? : } - - )} -
-
; -} - -function LicenseDialog({ licensePackage }: { licensePackage: (typeof packages)[number] }) { - const licenseFiles = getLicenseFiles(licensePackage); - return text)} className="cursor-pointer">Open License} />
{licenseFiles.map(({ fileName, text }, index) =>

= 1 && "pt-2"}`}>{fileName}

{text || "License text could not be loaded. Please contact support@tensamin.net"}
)}
; -} diff --git a/packages/settings/src/pages/profile.tsx b/packages/settings/src/pages/profile.tsx deleted file mode 100644 index 8e33dec..0000000 --- a/packages/settings/src/pages/profile.tsx +++ /dev/null @@ -1,67 +0,0 @@ -import MDInput from "@tensamin/markdown/input"; -import { useMTP } from "@tensamin/mtp"; -import { mtp } from "@tensamin/shared/data"; -import { useStorage } from "@tensamin/storage/context"; -import { Avatar, AvatarFallback, AvatarImage, Button, cn, Input, useIsMobile } from "@tensamin/ui"; -import { useUser, type User } from "@tensamin/user/context"; -import { Check } from "lucide-react"; -import { useEffect, useRef, useState } from "react"; - -async function prepImage(file: File, size = 300, quality = 0.8): Promise { - const bitmap = await createImageBitmap(file); - const canvas = document.createElement("canvas"); - canvas.width = size; canvas.height = size; - const context = canvas.getContext("2d"); - if (!context) throw new Error("Could not get canvas context"); - const scale = Math.max(size / bitmap.width, size / bitmap.height); - const width = bitmap.width * scale; - const height = bitmap.height * scale; - context.drawImage(bitmap, (size - width) / 2, (size - height) / 2, width, height); - return canvas.toDataURL("image/webp", quality); -} - -export default function Page() { - const { get } = useUser(); - const { load } = useStorage(); - const { send } = useMTP(); - const isMobile = useIsMobile(); - const [currentUser, setCurrentUser] = useState(null); - const [draftUser, setDraftUser] = useState>({}); - const [errorMessage, setErrorMessage] = useState(""); - const [saveSucceeded, setSaveSucceeded] = useState(false); - const avatarUploadRef = useRef(null); - const draftInitializedRef = useRef(false); - const effectiveAvatar = draftUser.Avatar === "none" ? undefined : draftUser.Avatar; - const updateDraftUser = (updater: (previous: Partial) => Partial) => { - setSaveSucceeded(false); setErrorMessage(""); setDraftUser(updater); - }; - useEffect(() => { void (async () => setCurrentUser(await get(await load("user_id"))))(); }, [get, load]); - useEffect(() => { - if (!currentUser || draftInitializedRef.current) return; - setDraftUser(currentUser); draftInitializedRef.current = true; - }, [currentUser]); - async function handleAvatarUpload(file: File) { - const avatar = await prepImage(file); - updateDraftUser((previous) => ({ ...previous, avatar })); - if (avatarUploadRef.current) avatarUploadRef.current.value = ""; - } - if (!currentUser) return

Loading...

; - return <> - event.target.files?.[0] && handleAvatarUpload(event.target.files[0])} type="file" /> -
-
{draftUser.Display?.slice(0, 2).toUpperCase() || currentUser.Display.slice(0, 2).toUpperCase()}

Avatar

GIFs are supported in decentralised mode or with Tensamin Premium.
Maximum file size is 16mb.

- updateDraftUser((previous) => ({ ...previous, display: event.target.value }))} placeholder="Display Name" value={draftUser.Display || ""} /> - updateDraftUser((previous) => ({ ...previous, username: event.target.value }))} placeholder="Username" value={draftUser.Username || ""} /> - updateDraftUser((previous) => ({ ...previous, about: value }))} value={draftUser.About || ""} /> - - {errorMessage &&

{errorMessage}

} -
- ; -} diff --git a/packages/settings/src/pages/security.tsx b/packages/settings/src/pages/security.tsx deleted file mode 100644 index d339b3a..0000000 --- a/packages/settings/src/pages/security.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import { useStorage } from "@tensamin/storage/context"; -import { Button, Input, Label } from "@tensamin/ui"; -import { useEffect, useState } from "react"; - -export default function Page() { - const { save, load } = useStorage(); - const [draftOmegaUrl, setDraftOmegaUrl] = useState(""); - const [currentOmegaUrl, setCurrentOmegaUrl] = useState(""); - const [draftForcedOmikronUrl, setDraftForcedOmikronUrl] = useState(""); - const [currentForcedOmikronUrl, setCurrentForcedOmikronUrl] = useState(""); - const [draftForcedOmikronPublicKey, setDraftForcedOmikronPublicKey] = useState(""); - const [currentForcedOmikronPublicKey, setCurrentForcedOmikronPublicKey] = useState(""); - - useEffect(() => { - load("omega_url").then((value) => { setDraftOmegaUrl(value); setCurrentOmegaUrl(value); }); - load("forced_omikron_url").then((value) => { setDraftForcedOmikronUrl(value || ""); setCurrentForcedOmikronUrl(value || ""); }); - load("forced_omikron_public_key").then((value) => { setDraftForcedOmikronPublicKey(value || ""); setCurrentForcedOmikronPublicKey(value || ""); }); - }, [load]); - - return
-

It's best not to touch these settings! They can be exploited to gain access to your account!

-
setDraftOmegaUrl(event.target.value)} />
-
setDraftForcedOmikronUrl(event.target.value)} /> setDraftForcedOmikronPublicKey(event.target.value)} />
-
; -} diff --git a/packages/settings/src/pages/theme.tsx b/packages/settings/src/pages/theme.tsx deleted file mode 100644 index a0cfab2..0000000 --- a/packages/settings/src/pages/theme.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { StylePicker } from "@tensamin/ui"; - -export default function Page() { - return ; -} diff --git a/packages/settings/tsconfig.json b/packages/settings/tsconfig.json deleted file mode 100644 index ce5e465..0000000 --- a/packages/settings/tsconfig.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2022", - "module": "ESNext", - "moduleResolution": "bundler", - "jsx": "react-jsx", - "strict": true, - "skipLibCheck": true, - "noEmit": true, - "resolveJsonModule": true, - "types": ["vite/client"] - }, - "include": ["src"] -} diff --git a/packages/shared/package.json b/packages/shared/package.json index ec5b322..26c0d9f 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -4,18 +4,16 @@ "version": "0.0.0", "type": "module", "exports": { - "./asyncQueue": "./src/asyncQueue.ts", "./code": "./src/code.ts", "./data": "./src/data.ts", "./desktopMedia": "./src/desktopMedia.tsx", "./log": "./src/log.tsx", - "./indexedDb": "./src/indexedDb.ts", "./settings": "./src/settings.ts", "./features/legal/schema": "./src/features/legal/schema.ts", "./features/conversation/schema": "./src/features/conversation/schema.ts" }, "scripts": { - "format": "pnpm exec prettier --write .", + "format": "bunx prettier --write .", "lint": "eslint src", "build": "tsc -p tsconfig.json --noEmit" }, diff --git a/packages/shared/src/asyncQueue.ts b/packages/shared/src/asyncQueue.ts deleted file mode 100644 index 60d12f3..0000000 --- a/packages/shared/src/asyncQueue.ts +++ /dev/null @@ -1,27 +0,0 @@ -export default function createAsyncQueue() { - let resolve!: (value: T) => void; - - const promise = new Promise((r) => { - resolve = r; - }); - - return { - set: resolve, - get: () => promise, - }; -} - -// eslint-disable-next-line -type AnyFn = (...args: any[]) => any; - -export function createQueuedFunc( - getFn: () => F | null | undefined, -) { - return (async (...args: Parameters): Promise>> => { - while (!getFn()) { - await new Promise((r) => setTimeout(r, 50)); - } - - return await getFn()!(...args); - }) as F; -} diff --git a/packages/shared/src/data.ts b/packages/shared/src/data.ts index b810ad6..765dce7 100644 --- a/packages/shared/src/data.ts +++ b/packages/shared/src/data.ts @@ -12,125 +12,40 @@ const fileFromMessage = z.object({ type: z.enum(["image", "image_top_right", "file"]), }); -const bytesLike = z.union([ - z.instanceof(Uint8Array), - z.array(z.number().int().min(0).max(255)), - z.base64(), -]); - -const protocolBytes = z.instanceof(Uint8Array); - -function bytesFromProtocol(value: z.infer): Uint8Array { - if (value instanceof Uint8Array) return value; - if (Array.isArray(value)) return new Uint8Array(value); - - const bin = atob(value); - const out = new Uint8Array(bin.length); - for (let i = 0; i < bin.length; i++) out[i] = bin.charCodeAt(i); - return out; -} - -const protocolBytesResponse = bytesLike.transform(bytesFromProtocol); - -const chatSecretResponse = z.object({ - UserId: z.string(), - ChatId: z.string(), - SecretId: z.string(), - VersionNumber: z.number(), - EncryptedSecret: bytesLike, - KemCiphertext: bytesLike, - WrappingScheme: z.string(), - CreatedAt: z.number(), - UpdatedAt: z.number(), -}); - -const chatSecretRecipient = z.object({ - UserId: z.string(), - EncryptedSecret: protocolBytes, - KemCiphertext: protocolBytes, -}); - -const callSecretEnvelopeResponse = z.object({ - SecretId: z.string(), - VersionNumber: z.number(), - EncryptedSecret: protocolBytesResponse, - KemCiphertext: protocolBytesResponse, - WrappingScheme: z.string(), -}); - -const callSecretEnvelopeRequest = z.object({ - SecretId: z.string(), - VersionNumber: z.number(), - EncryptedSecret: protocolBytes, - KemCiphertext: protocolBytes, - WrappingScheme: z.string(), -}); - -export const Reaction = z.object({ - Reaction: z.string(), - SenderId: z.number(), -}); - -export const Message = z.object({ - NotEncrypted: z.boolean().optional(), - SenderId: z.number(), - SendTime: z.number(), - Content: z.base64(), - Files: z.array(fileFromMessage).optional(), - Tint: z.string().length(7).startsWith("#").optional(), - Avatar: z.boolean().optional(), - Display: z.boolean().optional(), - ReplyId: z.number().optional(), - MessageState: z - .enum(["read", "received", "sent", "sending", "awaiting"]) // awaiting for 'internal' use - .default("received"), - Edited: z.boolean().optional(), - Reactions: z.array(Reaction).optional(), +export const message = z.object({ + height: z.number(), + not_encrypted: z.boolean().optional(), + sent_by_self: z.boolean().optional(), + send_time: z.number(), + content: z.base64(), + files: z.array(fileFromMessage).optional(), + tint: z.string().length(7).startsWith("#").optional(), + avatar: z.boolean().optional(), + display: z.boolean().optional(), + message_state: z + .enum(["read", "received", "sent", "sending", "awaiting"]) + .default("received"), // awaiting for 'internal' use }); export const failedUser = { - Display: "Failed", - IotaId: 0, - OmikronConnections: [], - OnlineStatus: "user_borked", - PublicKey: "", - SubEnd: 0, - SubLevel: 0, - UserId: 0, - Username: "unknown", -} as z.infer; + display: "Failed", + iota_id: 0, + omikron_connections: [], + online_status: "user_borked", + public_key: "", + sub_end: 0, + sub_level: 0, + user_id: 0, + username: "unknown", +} as z.infer; -const authPayload = z.object({ - Communities: z.array(z.object({})).default([]), - Contacts: z - .array( - z.object({ - LastMessageAt: z.number(), - UserId: z.number(), - LastMessage: z - .object({ - Content: z.base64(), - SenderId: z.number(), - }) - .optional(), - Messages: z.array(Message), - }), - ) - .default([]), - Calls: z - .array( - z.object({ - CallId: z.string(), - CallSecret: callSecretEnvelopeResponse.optional(), - CallMembers: z.array(z.number()), - }), - ) - .default([]), -}); - -export type Contacts = z.infer; -export type Communities = z.infer; -export type Calls = z.infer; +export type Contacts = z.infer< + typeof ttp.challenge_response.response.shape.contacts +>; +export type Communities = z.infer< + typeof ttp.challenge_response.response.shape.communities +>; +export type Calls = z.infer; type Base16Palette = Record< | "base00" @@ -152,15 +67,15 @@ type Base16Palette = Record< string >; -// MTP +// TTP const user = z.object({ - About: z.string().max(255).optional(), - Avatar: z.string().optional(), - Display: z.string().min(1).max(15), - IotaId: z.number(), - OmikronConnections: z.array(z.number()), - OmikronId: z.number().optional(), - OnlineStatus: z.enum([ + about: z.string().max(255).optional(), + avatar: z.string().optional(), + display: z.string().min(1).max(15), + iota_id: z.number(), + omikron_connections: z.array(z.number()), + omikron_id: z.number().optional(), + online_status: z.enum([ "user_offline", "user_online", "user_dnd", @@ -171,256 +86,187 @@ const user = z.object({ "iota_online", "iota_borked", ]), - PublicKey: z.base64(), - Status: z.string().max(15).optional(), - SubEnd: z.number(), - SubLevel: z.number(), - UserId: z.number(), - Username: z.string().min(1).max(15), + public_key: z.base64(), + status: z.string().max(15).optional(), + sub_end: z.number(), + sub_level: z.number(), + user_id: z.number(), + username: z.string().min(1).max(15), }); -export const mtp = { - IdentificationResponse: { - request: z.object({}).optional(), - response: authPayload, - }, - GetUserData: { +export const ttp = { + identification: { request: z.object({ - UserId: z.number().optional(), - Username: z.string().optional(), + version: z.string(), + session_id: z.number(), + user_id: z.number(), + }), + response: z.object({ + challenge: z.string(), + public_key: z.base64(), + }), + }, + challenge_response: { + request: z.object({ + challenge: z.base64(), + }), + response: z.object({ + communities: z.array(z.object({})).optional(), + contacts: z.array( + z.object({ + last_message_at: z.number(), + user_id: z.number(), + last_message: z + .object({ + content: z.base64(), + sender_id: z.number(), + }) + .optional(), + messages: z.array(message), + }), + ), + calls: z.array( + z.object({ + call_id: z.string(), + call_secret: z.base64().optional(), + call_members: z.array(z.number()), + }), + ), + }), + }, + get_user_data: { + request: z.object({ + user_id: z.number().optional(), + username: z.string().optional(), }), response: user, }, - ChangeUserData: { + change_user_data: { request: user.partial(), response: z.object({}), }, - Ping: { + ping: { request: z.object({ - LastPing: z.number(), + last_ping: z.number(), }), response: z.object({ - PingIota: z.number(), + ping_iota: z.number(), }), }, - MessageDelete: { - request: z.object({ - ChatPartnerId: z.number(), - SendTime: z.number(), - }), - response: z.object({}), - }, - MessageDeleteLive: { - request: z.object({}), - response: z.object({ - ChatPartnerId: z.number(), - SendTime: z.number(), - }), - }, - MessageEditLive: { - request: z.object({}), - response: z.object({ - Content: z.base64(), - ChatPartnerId: z.number(), - SendTime: z.number(), - }), - }, - MessageEdit: { - request: z.object({ - Content: z.base64(), - ChatPartnerId: z.number(), - SendTime: z.number(), - }), - response: z.object({}), - }, - MessageReactionAdd: { - request: z.object({ - Reaction: z.string(), - SendTime: z.number(), - ChatPartnerId: z.number(), - }), - response: z.object(), - }, - MessageReactionRemove: { - request: z.object({ - Reaction: z.string(), - SendTime: z.number(), - ChatPartnerId: z.number(), - }), - response: z.object(), - }, - MessageReactionLive: { - request: z.object(), - response: z.object({ - Reaction: z.string(), - SendTime: z.number(), - ChatPartnerId: z.number(), - }), - }, - MessageLive: { + message_live: { request: z.object({}).optional(), response: z.object({ - SenderId: z.number(), - Message, + sender_id: z.number(), + message, }), }, - MessageGet: { + messages_get: { request: z.object({ - SendTime: z.number(), - }), - response: Message, - }, - MessagesGet: { - request: z.object({ - UserId: z.number(), - Amount: z.number(), - Offset: z.number(), + user_id: z.number(), + amount: z.number(), + offset: z.number(), }), response: z.object({ - Messages: z.array(Message), + messages: z.array(message), }), }, - MessageSend: { + message_send: { request: z.object({ - Content: z.base64(), - ReceiverId: z.number(), - SendTime: z.number(), - Files: z.array(fileFromMessage).optional(), + height: z.number(), + content: z.base64(), + receiver_id: z.number(), + send_time: z.number(), + files: z.array(fileFromMessage).optional(), }), response: z.object({}), }, - AddConversation: { + add_conversation: { request: z.object({ - ChatPartnerId: z.number().optional(), - ChatPartnerName: z.string().min(1).max(15).optional(), + chat_partner_id: z.number().optional(), + chat_partner_name: z.string().min(1).max(15).optional(), }), response: z.object({}), }, - MessageState: { + message_state: { request: z .object({ - ChatPartnerId: z.number(), - SendTime: z.number(), - MessageState: Message.shape.MessageState, + chat_partner_id: z.number(), + send_time: z.number(), + message_state: message.shape.message_state, }) .or( z.object({ - MessageState: Message.shape.MessageState, + message_state: message.shape.message_state, }), ), response: z.object({ - ChatPartnerId: z.number(), - MessageState: Message.shape.MessageState, - SendTime: z.number(), + chat_partner_id: z.number(), + message_state: message.shape.message_state, + send_time: z.number(), }), }, - LoadTxtRecord: { + load_txt_record: { request: z.object({ - Path: z.string(), + path: z.string(), }), response: z.object({ - Content: z.string(), + content: z.string(), }), }, - AuthenticateApp: { + authenticate_app: { request: z.object({ - AppIdentifier: z.string(), + app_identifier: z.string(), }), response: z.object({ - Challenge: z.base64(), + challenge: z.base64(), }), }, - CreateApp: { + create_app: { request: z.object({ - AppPublicKey: z.base64(), - AppIdentifier: z.string(), + app_public_key: z.base64(), + app_identifier: z.string(), }), response: z.object({}), }, // Calls - CallToken: { + call_token: { request: z.object({ - CallId: z.string(), + call_id: z.string(), }), response: z.object({ - CallToken: z.string(), + call_token: z.string(), }), }, - CallData: { + call_data: { request: z.object({ - CallId: z.string(), + call_id: z.string(), }), response: z.object({ - UserIds: z.array(z.number()), + user_ids: z.array(z.number()), }), }, - CallInvite: { + call_invite: { request: z.object({ - CallId: z.string(), - CallSecret: callSecretEnvelopeRequest, - ReceiverId: z.number(), + call_id: z.string(), + call_secret: z.base64(), + receiver_id: z.number(), }), response: z.object({ - CallId: z.string().optional(), - CallSecret: callSecretEnvelopeResponse.optional(), - SenderId: z.number().optional(), + call_id: z.string().optional(), + call_secret: z.base64().optional(), + sender_id: z.number().optional(), }), }, - SetChatSecret: { - request: z.object({ - ChatId: z.string(), - SecretId: z.string(), - VersionNumber: z.number(), - WrappingScheme: z.string(), - CreatedAt: z.number(), - Recipients: z.array(chatSecretRecipient).min(1), - }), - response: z.object({}), - }, - GetChatSecret: { - request: z.object({ - UserId: z.string(), - ChatId: z.string(), - SecretId: z.string().optional(), - }), - response: chatSecretResponse, - }, - ChatSecretResponse: { - request: z.object({}).optional(), - response: chatSecretResponse, - }, - ChatSecretForward: { - request: z.object({ - ChatId: z.string(), - SenderUserId: z.string(), - RecipientUserId: z.string(), - SecretId: z.string(), - VersionNumber: z.number(), - EncryptedSecret: protocolBytes, - KemCiphertext: protocolBytes, - WrappingScheme: z.string(), - CreatedAt: z.number(), - }), - response: z.object({}), - }, - ErrorNoIota: { - request: z.object({}).optional(), - response: z.object({}), - }, - ErrorNotSet: { - request: z.object({}).optional(), - response: z.object({}), - }, } satisfies Record; -export type MTP = typeof mtp; +export type TTP = typeof ttp; // Storage export interface Storage extends SettingsStorageDefaults { session_id: number; user_id: number; - mtp_keyring: string; + private_key: string; ppandtos_done: boolean; accepted_terms_of_service: boolean; accepted_privacy_policy: boolean; @@ -430,11 +276,8 @@ export interface Storage extends SettingsStorageDefaults { legal_docs: z.infer; cached_contacts: Contacts; cached_communities: Communities; - cache_contacts: number; - cache_messages_per_chat: number; - omega_url: string; - forced_omikron_url: string | undefined; - forced_omikron_public_key: string | undefined; + ttp_url: string; + ttp_server_cert: string; call_mute_range_start: number; call_mute_range_end: number; theme_color: string; @@ -442,8 +285,6 @@ export interface Storage extends SettingsStorageDefaults { theme_primary_color: string; theme_polarity: "dark" | "light" | "system"; theme_tint: "soft" | "hard" | "extreme"; - theme_border_radius: number; - theme_custom_css: string; chat_trusted_domains: string[]; chat_picker_saved_media: string[]; chat_picker_last_tab: "gif" | "meme" | "saved"; @@ -451,13 +292,12 @@ export interface Storage extends SettingsStorageDefaults { width: number; height: number; } | null; - reactions: Record; } export const storageDefaults: Storage = { session_id: 0, user_id: 0, - mtp_keyring: "", + private_key: "", ppandtos_done: false, accepted_terms_of_service: false, accepted_privacy_policy: false, @@ -484,11 +324,8 @@ export const storageDefaults: Storage = { }, cached_contacts: [], cached_communities: [], - cache_contacts: 5, - cache_messages_per_chat: 20, - omega_url: "https://omega.tensamin.net", - forced_omikron_url: undefined, - forced_omikron_public_key: undefined, + ttp_url: "https://tensamin.net:959", + ttp_server_cert: "", call_mute_range_start: -55, call_mute_range_end: -45, theme_color: "", @@ -496,8 +333,6 @@ export const storageDefaults: Storage = { theme_primary_color: "", theme_polarity: "system", theme_tint: "soft", - theme_border_radius: 0.55, - theme_custom_css: "", chat_trusted_domains: [ // Other platforms "cdn.discordapp.com", @@ -525,16 +360,11 @@ export const storageDefaults: Storage = { chat_picker_saved_media: [], chat_picker_last_tab: "gif", chat_picker_size: null, - reactions: { - ":thumbsup:": 3, - ":fire:": 2, - ":white_check_mark:": 1, - }, }; // User Status export function getStatusColor( - status: z.infer, + status: z.infer, ) { switch (status) { case "user_online": diff --git a/packages/shared/src/desktopMedia.tsx b/packages/shared/src/desktopMedia.tsx index 32ecb74..4da0119 100644 --- a/packages/shared/src/desktopMedia.tsx +++ b/packages/shared/src/desktopMedia.tsx @@ -31,20 +31,6 @@ type ElectronDesktopApi = { >; selectScreenShareSource?: (sourceId: string) => Promise; }; - call?: { - setStatus?: (status: { - inCall: boolean; - speaking: boolean; - iconDataUrl?: string; - }) => Promise; - }; - secureStorage?: { - getStatus?: () => Promise<{ available: boolean; backend: string | null }>; - load?: (key: string) => Promise; - save?: (key: string, value: string) => Promise; - delete?: (key: string) => Promise; - clear?: () => Promise; - }; }; declare global { diff --git a/packages/shared/src/indexedDb.ts b/packages/shared/src/indexedDb.ts deleted file mode 100644 index c043787..0000000 --- a/packages/shared/src/indexedDb.ts +++ /dev/null @@ -1,98 +0,0 @@ -export const TENSAMIN_DB_NAME = "tensamin"; -export const TENSAMIN_DB_VERSION = 1; -export type TensaminStore = "storage" | "cache" | "keys"; - -const stores: TensaminStore[] = ["storage", "cache", "keys"]; -let databasePromise: Promise | undefined; - -export function openTensaminDatabase( - indexedDb: IDBFactory = globalThis.indexedDB, -) { - databasePromise ??= new Promise((resolve, reject) => { - const request = indexedDb.open(TENSAMIN_DB_NAME, TENSAMIN_DB_VERSION); - request.onupgradeneeded = () => { - for (const store of stores) { - if (!request.result.objectStoreNames.contains(store)) { - request.result.createObjectStore(store); - } - } - }; - request.onsuccess = () => { - request.result.onversionchange = () => request.result.close(); - resolve(request.result); - }; - request.onerror = () => { - databasePromise = undefined; - reject(request.error); - }; - request.onblocked = () => { - databasePromise = undefined; - reject(new Error("The Tensamin database upgrade is blocked.")); - }; - }); - return databasePromise; -} - -export async function getDatabaseEntry(store: TensaminStore, key: string) { - const database = await openTensaminDatabase(); - return new Promise((resolve, reject) => { - const request = database - .transaction(store, "readonly") - .objectStore(store) - .get(key); - request.onsuccess = () => resolve(request.result as T | undefined); - request.onerror = () => reject(request.error); - }); -} - -export async function setDatabaseEntry( - store: TensaminStore, - key: string, - value: unknown, -) { - const database = await openTensaminDatabase(); - return new Promise((resolve, reject) => { - const transaction = database.transaction(store, "readwrite"); - transaction.objectStore(store).put(value, key); - transaction.oncomplete = () => resolve(); - transaction.onerror = () => reject(transaction.error); - transaction.onabort = () => reject(transaction.error); - }); -} - -export async function deleteDatabaseEntry(store: TensaminStore, key: string) { - const database = await openTensaminDatabase(); - return new Promise((resolve, reject) => { - const transaction = database.transaction(store, "readwrite"); - transaction.objectStore(store).delete(key); - transaction.oncomplete = () => resolve(); - transaction.onerror = () => reject(transaction.error); - transaction.onabort = () => reject(transaction.error); - }); -} - -export async function listDatabaseEntries( - store: TensaminStore, - keyPrefix: string, -) { - const database = await openTensaminDatabase(); - return new Promise>((resolve, reject) => { - const entries: Array<[string, unknown]> = []; - const cursor = database - .transaction(store, "readonly") - .objectStore(store) - .openCursor(); - cursor.onsuccess = () => { - const value = cursor.result; - if (!value) { - resolve(entries); - return; - } - if (typeof value.key === "string" && value.key.startsWith(keyPrefix)) { - entries.push([value.key, value.value]); - } - value.continue(); - }; - cursor.onerror = () => reject(cursor.error); - }); -} diff --git a/packages/shared/src/log.tsx b/packages/shared/src/log.tsx index 0cba6d3..ebea635 100644 --- a/packages/shared/src/log.tsx +++ b/packages/shared/src/log.tsx @@ -67,31 +67,26 @@ const size = 20; export function toast( type: "error" | "info" | "warn" | "success", message: string, - description?: string, ) { switch (type) { case "error": sonnerToast(message, { icon: , - description, }); break; case "info": sonnerToast(message, { icon: , - description, }); break; case "warn": sonnerToast(message, { icon: , - description, }); break; case "success": sonnerToast(message, { icon: , - description, }); break; } diff --git a/packages/shared/src/settings.ts b/packages/shared/src/settings.ts index 26ed299..6739280 100644 --- a/packages/shared/src/settings.ts +++ b/packages/shared/src/settings.ts @@ -46,7 +46,6 @@ const settings = { }, }, application: { - cache: {}, theme: {}, licenses: {}, }, diff --git a/packages/storage/package.json b/packages/storage/package.json index 416af70..ef28e8b 100644 --- a/packages/storage/package.json +++ b/packages/storage/package.json @@ -6,17 +6,16 @@ "exports": { "./session": "./src/session.tsx", "./context": "./src/context.tsx", - "./secure": "./src/secure.ts" + "./indexed-db": "./src/indexed-db.ts" }, "scripts": { - "format": "pnpm exec prettier --write .", + "format": "bunx prettier --write .", "lint": "eslint src", "build": "tsc -p tsconfig.json --noEmit" }, "dependencies": { - "@tensamin/cache": "workspace:*", "@tensamin/shared": "workspace:*", - "@tensamin/mtp": "workspace:*", + "@tensamin/ttp": "workspace:*", "@tensamin/ui": "*", "react": "^19.2.0", "react-dom": "^19.2.0" diff --git a/packages/storage/src/context.tsx b/packages/storage/src/context.tsx index d5cbca1..d25cf2e 100644 --- a/packages/storage/src/context.tsx +++ b/packages/storage/src/context.tsx @@ -3,32 +3,17 @@ import { type Storage as StorageSchema, storageDefaults as defaults, } from "@tensamin/shared/data"; -import { - deleteDatabaseEntry, - getDatabaseEntry, - setDatabaseEntry, -} from "@tensamin/shared/indexedDb"; +import { getEntry, setEntry, deleteEntry } from "./indexed-db"; import { ErrorScreen } from "@tensamin/ui"; import { log } from "@tensamin/shared/log"; -import { - decodeSecureValue, - encodeSecureValue, - getSecureStorageStatus, - isSecureEnvelope, - type SecureStorageStatus, -} from "./secure"; - -export type SaveOptions = { secure?: boolean }; interface StorageContextValue { load(key: K): Promise; save( key: K, value: StorageSchema[K], - options?: SaveOptions, ): Promise; clear: () => Promise; - secureStorage: SecureStorageStatus | null; } const StorageContext = React.createContext( @@ -45,151 +30,96 @@ const isIndexedDBSupported = typeof indexedDB !== "undefined"; export default function StorageProvider(props: { children: React.ReactNode }) { const [storage, setStorage] = React.useState(defaults); const storageRef = React.useRef(storage); - const loadedKeys = React.useRef(new Set()); - const loadPromises = React.useRef( - new Map>(), - ); - const generations = React.useRef(new Map()); - const [secureStorage, setSecureStorage] = - React.useState(null); - const secureStorageRef = React.useRef(null); const [error, setError] = React.useState(""); const [errorDescription, setErrorDescription] = React.useState(""); React.useEffect(() => { - void getSecureStorageStatus().then((status) => { - secureStorageRef.current = status; - setSecureStorage(status); - }); - }, []); + storageRef.current = storage; + }, [storage]); - const commit = React.useCallback( - (key: K, nextValue: StorageSchema[K]) => { - const next = { ...storageRef.current, [key]: nextValue }; - storageRef.current = next; - loadedKeys.current.add(key); - setStorage(next); + const loadIO = React.useCallback( + async ( + key: K, + ): Promise => { + let stored: StorageSchema[K] | undefined; + + try { + stored = await getEntry(key); + } catch (err) { + setError("Failed to load data"); + setErrorDescription( + "An error occurred while loading data from IndexedDB. Please try again.", + ); + log(0, "Storage", "red", err); + } + + if (stored !== undefined) { + setStorage((prev) => ({ ...prev, [key]: stored })); + return stored; + } + + return defaults[key]; }, [], ); - const load = React.useCallback( - async ( - key: K, - ): Promise => { - if (loadedKeys.current.has(key)) return storageRef.current[key]; - const pending = loadPromises.current.get(key); - if (pending) return pending as Promise; - - const generation = generations.current.get(key) ?? 0; - const request = (async () => { - try { - const desktopStorage = window.tensaminDesktop?.secureStorage; - const desktopStatus = desktopStorage?.getStatus - ? await desktopStorage.getStatus() - : null; - const desktopValue = - desktopStatus?.available && desktopStorage?.load - ? await desktopStorage.load(String(key)) - : null; - let stored = - desktopValue === null - ? await getDatabaseEntry("storage", key) - : (JSON.parse(desktopValue) as StorageSchema[K]); - if (isSecureEnvelope(stored)) { - stored = (await decodeSecureValue(stored)) as StorageSchema[K]; - } - const value = stored ?? defaults[key]; - if ((generations.current.get(key) ?? 0) === generation) { - commit(key, value); - } - return (generations.current.get(key) ?? 0) === generation - ? value - : storageRef.current[key]; - } catch (err) { - setError("Failed to load data"); - setErrorDescription( - "An error occurred while loading local data. Please reload and try again.", - ); - log(0, "Storage", "red", err); - throw err; - } finally { - loadPromises.current.delete(key); - } - })(); - loadPromises.current.set( - key, - request as Promise, - ); - return request; - }, - [commit], - ); - - const save = React.useCallback( + const saveIO = React.useCallback( async ( key: K, value: StorageSchema[K], - options: SaveOptions = {}, ): Promise => { - generations.current.set(key, (generations.current.get(key) ?? 0) + 1); - const desktopStorage = window.tensaminDesktop?.secureStorage; if (JSON.stringify(value) === JSON.stringify(defaults[key])) { - if (desktopStorage?.delete) - await desktopStorage.delete(String(key)).catch(() => undefined); - await deleteDatabaseEntry("storage", key); - commit(key, defaults[key]); + await deleteEntry(key); + setStorage((prev) => ({ ...prev, [key]: defaults[key] })); } else { - const status = options.secure - ? (secureStorageRef.current ?? (await getSecureStorageStatus())) - : secureStorageRef.current; - if ( - options.secure && - status?.backend === "electron-keyring" && - desktopStorage?.save - ) { - await desktopStorage.save(String(key), JSON.stringify(value)); - await deleteDatabaseEntry("storage", key); - } else { - const persisted = options.secure - ? await encodeSecureValue(value) - : value; - await setDatabaseEntry("storage", key, persisted as StorageSchema[K]); - } - commit(key, value); + await setEntry(key, value); + setStorage((prev) => ({ ...prev, [key]: value })); } }, - [commit], + [], ); - const clear = React.useCallback(async () => { - const keys = Object.keys(defaults) as (keyof StorageSchema)[]; - for (const key of keys) { - generations.current.set(key, (generations.current.get(key) ?? 0) + 1); - } - await Promise.all( - keys.map((key) => deleteDatabaseEntry("storage", key)), - ); - await window.tensaminDesktop?.secureStorage - ?.clear?.() - .catch(() => undefined); - loadedKeys.current.clear(); - loadPromises.current.clear(); - storageRef.current = defaults; - setStorage(defaults); - }, []); - const value = React.useMemo( () => ({ - load, - save, - clear, - secureStorage, + async load( + key: K, + ): Promise { + const current = storageRef.current[key]; + + if ( + current === undefined || + JSON.stringify(current) === JSON.stringify(defaults[key]) + ) { + const loadedValue = await loadIO(key); + setStorage((prev) => ({ ...prev, [key]: loadedValue })); + return loadedValue; + } + + return current; + }, + + async save( + key: K, + nextValue: StorageSchema[K], + ): Promise { + await saveIO(key, nextValue); + }, + + async clear() { + const keys = Object.keys(defaults) as (keyof StorageSchema)[]; + await Promise.all(keys.map((key) => deleteEntry(key))); + setStorage(defaults); + }, }), - [clear, load, save, secureStorage], + [loadIO, saveIO], ); + React.useEffect(() => { + // @ts-expect-error development utility + window.save = value.save; + }, [value]); + if (error !== "" && errorDescription !== "") { return ; } diff --git a/packages/storage/src/indexed-db.ts b/packages/storage/src/indexed-db.ts new file mode 100644 index 0000000..ebdc58d --- /dev/null +++ b/packages/storage/src/indexed-db.ts @@ -0,0 +1,92 @@ +import type { Storage as StorageSchema } from "@tensamin/shared/data"; + +const DB_NAME = "tensamin"; +const DB_VERSION = 1; +const STORE_NAME = "storage"; + +let dbPromise: Promise | null = null; + +/** + * Executes openDB. + * @param none This function has no parameters. + * @returns Promise. + */ +function openDB(): Promise { + if (dbPromise) return dbPromise; + + dbPromise = new Promise((resolve, reject) => { + const request = indexedDB.open(DB_NAME, DB_VERSION); + + request.onupgradeneeded = () => { + const db = request.result; + if (!db.objectStoreNames.contains(STORE_NAME)) { + db.createObjectStore(STORE_NAME); + } + }; + + request.onsuccess = () => resolve(request.result); + request.onerror = () => reject(request.error); + }); + + return dbPromise; +} + +/** + * Executes getEntry. + * @param key Parameter key. + * @returns Promise. + */ +export async function getEntry( + key: K, +): Promise { + const db = await openDB(); + return new Promise((resolve, reject) => { + const tx = db.transaction(STORE_NAME, "readonly"); + const store = tx.objectStore(STORE_NAME); + const request = store.get(key as string); + + request.onsuccess = () => + resolve(request.result as StorageSchema[K] | undefined); + request.onerror = () => reject(request.error); + }); +} + +/** + * Executes setEntry. + * @param key Parameter key. + * @param value Parameter value. + * @returns Promise. + */ +export async function setEntry( + key: K, + value: StorageSchema[K], +): Promise { + const db = await openDB(); + return new Promise((resolve, reject) => { + const tx = db.transaction(STORE_NAME, "readwrite"); + const store = tx.objectStore(STORE_NAME); + const request = store.put(value, key as string); + + request.onsuccess = () => resolve(); + request.onerror = () => reject(request.error); + }); +} + +/** + * Executes deleteEntry. + * @param key Parameter key. + * @returns Promise. + */ +export async function deleteEntry( + key: K, +): Promise { + const db = await openDB(); + return new Promise((resolve, reject) => { + const tx = db.transaction(STORE_NAME, "readwrite"); + const store = tx.objectStore(STORE_NAME); + const request = store.delete(key as string); + + request.onsuccess = () => resolve(); + request.onerror = () => reject(request.error); + }); +} diff --git a/packages/storage/src/secure.ts b/packages/storage/src/secure.ts deleted file mode 100644 index 06ded7a..0000000 --- a/packages/storage/src/secure.ts +++ /dev/null @@ -1,142 +0,0 @@ -import type {} from "@tensamin/shared/desktopMedia"; -import { getDatabaseEntry, setDatabaseEntry } from "@tensamin/shared/indexedDb"; - -export type SecureStorageStatus = { - backend: "electron-keyring" | "webcrypto" | "indexeddb"; - secure: boolean; - reason?: string; -}; - -type SecureEnvelope = { - __tensaminSecure: 1; - version: 1; - iv: string; - data: string; -}; - -const MASTER_KEY_NAME = "master-v1"; -let keyPromise: Promise | undefined; - -function bytesToBase64(value: Uint8Array) { - let binary = ""; - for (const byte of value) binary += String.fromCharCode(byte); - return btoa(binary); -} - -function base64ToBytes(value: string) { - const binary = atob(value); - return Uint8Array.from(binary, (character) => character.charCodeAt(0)); -} - -async function loadBrowserKey() { - const existing = await getDatabaseEntry("keys", MASTER_KEY_NAME); - if (existing) return existing; - - const key = await crypto.subtle.generateKey( - { name: "AES-GCM", length: 256 }, - false, - ["encrypt", "decrypt"], - ); - await setDatabaseEntry("keys", MASTER_KEY_NAME, key); - return key; -} - -async function loadElectronKey() { - const storage = window.tensaminDesktop?.secureStorage; - if (!storage?.getStatus || !storage.load || !storage.save) return null; - const status = await storage.getStatus(); - if (!status.available) return null; - - let encoded = await storage.load(MASTER_KEY_NAME); - if (encoded === null) { - encoded = bytesToBase64(crypto.getRandomValues(new Uint8Array(32))); - await storage.save(MASTER_KEY_NAME, encoded); - } - return crypto.subtle.importKey( - "raw", - base64ToBytes(encoded), - "AES-GCM", - false, - ["encrypt", "decrypt"], - ); -} - -async function getKey() { - keyPromise ??= (async () => { - if (!globalThis.crypto?.subtle || typeof indexedDB === "undefined") { - return null; - } - if (window.tensaminDesktop?.secureStorage) return loadElectronKey(); - return loadBrowserKey(); - })().catch(() => null); - return keyPromise; -} - -export function isSecureEnvelope(value: unknown): value is SecureEnvelope { - if (!value || typeof value !== "object") return false; - const envelope = value as Partial; - return ( - envelope.__tensaminSecure === 1 && - envelope.version === 1 && - typeof envelope.iv === "string" && - typeof envelope.data === "string" - ); -} - -export async function encodeSecureValue(value: unknown): Promise { - const key = await getKey(); - if (!key) return value; - const iv = crypto.getRandomValues(new Uint8Array(12)); - const plaintext = new TextEncoder().encode(JSON.stringify(value)); - const encrypted = await crypto.subtle.encrypt( - { name: "AES-GCM", iv }, - key, - plaintext, - ); - return { - __tensaminSecure: 1, - version: 1, - iv: bytesToBase64(iv), - data: bytesToBase64(new Uint8Array(encrypted)), - } satisfies SecureEnvelope; -} - -export async function decodeSecureValue(value: unknown): Promise { - if (!isSecureEnvelope(value)) return value; - const key = await getKey(); - if (!key) throw new Error("Secure storage key is unavailable."); - const plaintext = await crypto.subtle.decrypt( - { name: "AES-GCM", iv: base64ToBytes(value.iv) }, - key, - base64ToBytes(value.data), - ); - return JSON.parse(new TextDecoder().decode(plaintext)) as unknown; -} - -export async function getSecureStorageStatus(): Promise { - const desktop = window.tensaminDesktop?.secureStorage; - if (desktop?.getStatus) { - const status = await desktop.getStatus(); - if (status.available) return { backend: "electron-keyring", secure: true }; - return { - backend: "indexeddb", - secure: false, - reason: - status.backend === "basic_text" - ? "The operating system keyring is unavailable." - : "Electron secure storage is unavailable.", - }; - } - return (await getKey()) - ? { backend: "webcrypto", secure: true } - : { - backend: "indexeddb", - secure: false, - reason: "This browser cannot protect local credentials with WebCrypto.", - }; -} - -export const secureValueCodec = { - encode: encodeSecureValue, - decode: decodeSecureValue, -}; diff --git a/packages/storage/src/session.tsx b/packages/storage/src/session.tsx index 394718b..46f36d6 100644 --- a/packages/storage/src/session.tsx +++ b/packages/storage/src/session.tsx @@ -1,4 +1,4 @@ -import { useMTP } from "@tensamin/mtp"; +import { useTTP } from "@tensamin/ttp"; import { createContext, type ReactNode, @@ -8,8 +8,6 @@ import { } from "react"; import { useStorage } from "./context"; import type { Contacts, Communities, Calls } from "@tensamin/shared/data"; -import { createCache } from "@tensamin/cache"; -import { secureValueCodec } from "./secure"; interface SessionContextType { contacts: Contacts; @@ -23,41 +21,29 @@ interface SessionContextType { const SessionContext = createContext(undefined); export default function SessionProvider({ children }: { children: ReactNode }) { - const { freshContacts, freshCommunities, freshCalls, contextReady } = - useMTP(); + const { freshContacts, freshCommunities, freshCalls } = useTTP(); const { load, save } = useStorage(); const [contacts, setContacts] = useState([]); const [communities, setCommunities] = useState([]); const [localCalls, setLocalCalls] = useState([]); - const [accountId, setAccountId] = useState(null); const calls = [ ...freshCalls, ...localCalls.filter( - (call) => !freshCalls.some((fresh) => fresh.CallId === call.CallId), + (call) => !freshCalls.some((fresh) => fresh.call_id === call.call_id), ), ]; + // Cached session data fills in items the server did not return freshly. useEffect(() => { - void load("user_id").then(setAccountId); - }, [load]); - - // Cached contacts seed the session, then authenticated server data replaces them. - useEffect(() => { - if (!accountId) return; - const cache = createCache(String(accountId), { - codec: secureValueCodec, + load("cached_contacts").then((cachedData) => { + setContacts([ + ...freshContacts, + ...cachedData.filter( + (item) => + !freshContacts.some((fresh) => fresh.user_id === item.user_id), + ), + ]); }); - void cache.contacts.get().then((cached) => { - if (cached) setContacts(cached); - }); - }, [accountId]); - - useEffect(() => { - if (!accountId || !contextReady) return; - setContacts(freshContacts); - }, [accountId, contextReady, freshContacts]); - - useEffect(() => { load("cached_communities").then((cachedData) => { if (cachedData && freshCommunities) { setCommunities([ @@ -71,7 +57,11 @@ export default function SessionProvider({ children }: { children: ReactNode }) { ]); } }); - }, [load, freshCommunities]); + }, [load, freshContacts, freshCommunities]); + + useEffect(() => { + save("cached_contacts", contacts); + }, [contacts, save]); useEffect(() => { save("cached_communities", communities); }, [communities, save]); @@ -79,28 +69,24 @@ export default function SessionProvider({ children }: { children: ReactNode }) { const moveUserIdToTop = (userId: number) => { setContacts((prevContacts) => { const userIndex = prevContacts.findIndex( - (contact) => contact.UserId === userId, + (contact) => contact.user_id === userId, ); if (userIndex === -1) return prevContacts; - const user = prevContacts[userIndex]; - return [ - user, - ...prevContacts.slice(0, userIndex), - ...prevContacts.slice(userIndex + 1), - ]; + const [user] = prevContacts.splice(userIndex, 1); + return [user, ...prevContacts]; }); }; const insertContact = (userId: number) => { setContacts((prevContacts) => { - if (prevContacts.some((contact) => contact.UserId === userId)) { + if (prevContacts.some((contact) => contact.user_id === userId)) { return prevContacts; } const newUser = { - UserId: userId, - LastMessageAt: new Date().getTime(), - Messages: [], + user_id: userId, + last_message_at: new Date().getTime(), + messages: [], } satisfies Contacts[0]; return [newUser, ...prevContacts]; @@ -109,7 +95,7 @@ export default function SessionProvider({ children }: { children: ReactNode }) { const insertCall = (call: Calls[number]) => { setLocalCalls((prevCalls) => { - if (prevCalls.some((prevCall) => prevCall.CallId === call.CallId)) { + if (prevCalls.some((prevCall) => prevCall.call_id === call.call_id)) { return prevCalls; } diff --git a/packages/tauth/package.json b/packages/tauth/package.json index 55a7f1b..2e9adf2 100644 --- a/packages/tauth/package.json +++ b/packages/tauth/package.json @@ -7,7 +7,7 @@ "./context": "./src/context.tsx" }, "scripts": { - "format": "pnpm exec prettier --write .", + "format": "bunx prettier --write .", "lint": "eslint src", "build": "tsc -p tsconfig.json --noEmit" }, @@ -18,7 +18,7 @@ "@tensamin/shared": "workspace:*", "@tensamin/storage": "workspace:*", "@tensamin/tauri": "workspace:*", - "@tensamin/mtp": "workspace:*", + "@tensamin/ttp": "workspace:*", "@tensamin/ui": "*", "@tensamin/user": "workspace:*", "lucide-react": "^1.8.0", diff --git a/packages/tauth/src/context.tsx b/packages/tauth/src/context.tsx index 68e54cb..0e094a0 100644 --- a/packages/tauth/src/context.tsx +++ b/packages/tauth/src/context.tsx @@ -1,6 +1,5 @@ -import { type ReactNode } from "react"; -/** import { useEffect, useState, type ReactNode } from "react"; +import { useCrypto } from "@tensamin/crypto/context"; import { useUser } from "@tensamin/user/context"; import { useStorage } from "@tensamin/storage/context"; import { @@ -12,59 +11,46 @@ import { DialogHeader, DialogTitle, } from "@tensamin/ui"; -import { useLocation, useNavigate } from "@tanstack/react-router"; +import { useLocation } from "@tanstack/react-router"; import { useDeeplinks } from "@tensamin/tauri/deeplinkHandler"; -import { useMTP } from "@tensamin/mtp"; +import { useTTP } from "@tensamin/ttp"; import { log, toast } from "@tensamin/shared/log"; import { Loader2 } from "lucide-react"; import { isTauri } from "@tauri-apps/api/core"; -*/ +import { decryptText } from "@tensamin/crypto/worker"; export default function Wrapper({ children }: { children: ReactNode }) { - /** const { get } = useUser(); const { load } = useStorage(); - const { send } = useMTP(); + const { send } = useTTP(); + const { getSharedSecret } = useCrypto(); const { searchStr } = useLocation(); - const navigate = useNavigate(); const [dialogOpen, setDialogOpen] = useState(false); const [loading, setLoading] = useState(false); const [identifier, setIdentifier] = useState(null); const [redirect, setRedirect] = useState(null); const [challenge, setChallenge] = useState(null); - const [appPublicKey, setAppPublicKey] = useState(null); - const [sessionId, setSessionId] = useState(null); const [allowChildern, setAllowChildern] = useState(false); const { deeplinks } = useDeeplinks(); const authorizeApp = async () => { - if (!identifier || !redirect || !challenge || !appPublicKey) return; + if (!identifier || !redirect || !challenge) return; try { // Get Data const user = await get(await load("user_id")); const { - data: { Content: appPublicKeyHash }, - } = await send("LoadTxtRecord", { - Path: "tauth." + identifier, + data: { content: appPublicKey }, + } = await send("load_txt_record", { + path: "tauth." + identifier, }); - const verifiedAppPublicKeyHash = await sha256Hex(appPublicKey); - if (normalizeHash(appPublicKeyHash) !== verifiedAppPublicKeyHash) { - log(1, "tauth", "red", "App public key hash mismatch", undefined, { - appPublicKey, - appPublicKeyHash, - verifiedAppPublicKeyHash, - }); - throw new Error("App public key hash mismatch"); - } - // Get Shared Secret const sharedSecret = await getSharedSecret( - await load("mtp_keyring"), - user.PublicKey, + await load("private_key"), + user.public_key, appPublicKey, ).catch((err) => { log(1, "tauth", "red", "Failed to get shared secret", err, { @@ -88,15 +74,14 @@ export default function Wrapper({ children }: { children: ReactNode }) { finalUrl.searchParams.set("userId", String(await load("user_id"))); finalUrl.searchParams.set("challenge", solvedChallenge); finalUrl.searchParams.set("originalChallenge", challenge); - finalUrl.searchParams.set( - "sessionId", - String(sessionId || new Date().getTime()), - ); + + const session = Date.now(); + finalUrl.searchParams.set("sessionId", String(session)); // Save Session - await send("CreateApp", { - AppPublicKey: appPublicKey, - AppIdentifier: identifier, + await send("create_app", { + app_public_key: appPublicKey, + app_identifier: identifier, }); // Open Redirect URL @@ -107,15 +92,11 @@ export default function Wrapper({ children }: { children: ReactNode }) { setIdentifier(null); setRedirect(null); setChallenge(null); - setAppPublicKey(null); - setSessionId(null); toast("success", "App authorized successfully"); return; } else { - navigate({ - href: finalUrl.toString(), - }); + window.location.href = finalUrl.toString(); return; } } catch (err) { @@ -127,28 +108,9 @@ export default function Wrapper({ children }: { children: ReactNode }) { setIdentifier(null); setRedirect(null); setChallenge(null); - setAppPublicKey(null); - setSessionId(null); } }; - async function sha256Hex(value: string): Promise { - const hash = await crypto.subtle.digest( - "SHA-256", - new TextEncoder().encode(value), - ); - return [...new Uint8Array(hash)] - .map((byte) => byte.toString(16).padStart(2, "0")) - .join(""); - } - - function normalizeHash(value: string): string { - return value - .trim() - .toLowerCase() - .replace(/^sha256[:=]/, ""); - } - function hexToBase64(hex: string): string { const bytes = hex.match(/.{2}/g)?.map((byte) => parseInt(byte, 16)) ?? []; const binaryString = String.fromCharCode(...bytes); @@ -160,8 +122,6 @@ export default function Wrapper({ children }: { children: ReactNode }) { const identifier = params.get("identifier"); const redirect = params.get("redirect"); const challenge = params.get("challenge"); - const appPublicKey = params.get("public_key"); - const urlSessionId = params.get("sessionId"); if (!identifier || !redirect) { setAllowChildern(true); return; @@ -171,27 +131,14 @@ export default function Wrapper({ children }: { children: ReactNode }) { if (!challenge) { const newUrl = new URL(redirect); newUrl.searchParams.set("userId", String(userId)); - newUrl.searchParams.set( - "sessionId", - String(urlSessionId || new Date().getTime()), - ); window.location.href = newUrl.toString(); return; } - if (!appPublicKey) { - toast("error", "Missing app public key"); - log(1, "tauth", "red", "Missing app public key"); - setAllowChildern(true); - return; - } - setAllowChildern(true); setIdentifier(identifier); setRedirect(redirect); setChallenge(hexToBase64(challenge || "")); - setAppPublicKey(appPublicKey); - setSessionId(urlSessionId); setDialogOpen(true); }); }, [searchStr, load]); @@ -202,15 +149,11 @@ export default function Wrapper({ children }: { children: ReactNode }) { const url = new URL(link); const identifier = url.searchParams.get("identifier"); const redirect = url.searchParams.get("redirect"); - const appPublicKey = url.searchParams.get("public_key"); - const urlSessionId = url.searchParams.get("sessionId"); - if (identifier && redirect && appPublicKey) { + if (identifier && redirect) { setIdentifier(identifier); setRedirect(redirect); setChallenge(hexToBase64(url.searchParams.get("challenge") || "")); - setAppPublicKey(appPublicKey); - setSessionId(urlSessionId); setDialogOpen(true); } } @@ -227,8 +170,6 @@ export default function Wrapper({ children }: { children: ReactNode }) { setIdentifier(null); setRedirect(null); setChallenge(null); - setAppPublicKey(null); - setSessionId(null); } }} > @@ -264,8 +205,6 @@ export default function Wrapper({ children }: { children: ReactNode }) { setIdentifier(null); setRedirect(null); setChallenge(null); - setAppPublicKey(null); - setSessionId(null); }} > Deny @@ -276,6 +215,4 @@ export default function Wrapper({ children }: { children: ReactNode }) { {allowChildern && children} ); - */ - return children; } diff --git a/packages/mtp/package.json b/packages/ttp/package.json similarity index 73% rename from packages/mtp/package.json rename to packages/ttp/package.json index 3cf7c86..7243f25 100644 --- a/packages/mtp/package.json +++ b/packages/ttp/package.json @@ -1,5 +1,5 @@ { - "name": "@tensamin/mtp", + "name": "@tensamin/ttp", "private": true, "version": "0.0.0", "type": "module", @@ -7,22 +7,21 @@ ".": "./src/index.ts" }, "scripts": { - "format": "pnpm exec prettier --write .", + "format": "bunx prettier --write .", "lint": "eslint src --ext .ts,.tsx", "build": "tsc -p tsconfig.json --noEmit" }, "dependencies": { - "@tauri-apps/api": "^2", + "@tensamin/ttp-core": "*", + "@tanstack/react-router": "^1.0.0", "@tensamin/crypto": "workspace:*", - "@tensamin/shared": "workspace:*", "@tensamin/storage": "workspace:*", + "@tensamin/shared": "workspace:*", "@tensamin/ui": "*", - "lucide-react": "^1.14.0", - "mtp": "*", + "@tauri-apps/api": "^2", "react": "^19.2.0", "react-dom": "^19.2.0", - "tauri-plugin-app-events-api": "^0.2.0", - "zod": "^4.4.2" + "tauri-plugin-app-events-api": "^0.2.0" }, "devDependencies": { "eslint": "^10.0.3" diff --git a/packages/ttp/src/context.tsx b/packages/ttp/src/context.tsx new file mode 100644 index 0000000..50eec69 --- /dev/null +++ b/packages/ttp/src/context.tsx @@ -0,0 +1,730 @@ +import { + useState, + createContext, + type ReactNode, + useRef, + useEffect, + useContext, + useCallback, + useMemo, +} from "react"; +import { useCrypto } from "@tensamin/crypto/context"; +import { log } from "@tensamin/shared/log"; +import { useStorage } from "@tensamin/storage/context"; +import { + createTransportClient, + READY_STATE, + type BoundSendFn, +} from "@tensamin/ttp-core"; +import { isTauri } from "@tauri-apps/api/core"; +import { onResume } from "tauri-plugin-app-events-api"; +import type { PushHandler } from "@tensamin/ttp-core"; +import { + PING_INTERVAL, + RECONNECT_RESET, + RECONNECT_TRIES, + RETRY_INTERVAL, +} from "./values"; +import { + type Calls, + type Communities, + type Contacts, + ttp as schemas, + type TTP as Schemas, +} from "@tensamin/shared/data"; +import { LoadingScreen as Loading } from "@tensamin/ui"; +import { ErrorScreen } from "@tensamin/ui"; + +import { version } from "../../../package.json"; +import { decryptText } from "@tensamin/crypto/worker"; + +const FATAL_IDENTIFICATION_ERROR_TYPES = new Set([ + "error", + "error_invalid_user_id", + "error_no_user_id", + "error_invalid_challenge", + "error_invalid_secret", + "error_invalid_private_key", + "error_invalid_public_key", + "error_not_authenticated", +]); + +/** + * Detects whether an error chain contains a STOP_SENDING transport signal. + * @param error Unknown error value from transport operations. + * @returns True when the error represents a STOP_SENDING condition. + */ +function isStopSendingError(error: unknown) { + if (typeof error === "string") { + return error.includes("STOP_SENDING"); + } + + if (error instanceof Error) { + if (error.message.includes("STOP_SENDING")) { + return true; + } + + const errorWithCause = error as Error & { cause?: unknown }; + if (errorWithCause.cause !== undefined) { + return isStopSendingError(errorWithCause.cause); + } + + return false; + } + + if (typeof error === "object" && error !== null) { + const maybeMessage = (error as { message?: unknown }).message; + if (typeof maybeMessage === "string") { + return maybeMessage.includes("STOP_SENDING"); + } + } + + return false; +} + +/** + * Classifies identification errors that should be treated as terminal. + * @param error Unknown error raised during identification. + * @returns True when identification should fail without retry. + */ +function isFatalIdentificationError(error: unknown) { + if (typeof error === "object" && error !== null && "type" in error) { + const type = (error as { type?: unknown }).type; + if ( + typeof type === "string" && + FATAL_IDENTIFICATION_ERROR_TYPES.has(type) + ) { + return true; + } + } + + if (!(error instanceof Error)) { + return false; + } + + if ( + error.message.includes("Missing or invalid user id") || + error.message.includes("Missing private key") || + error.message.includes("Identification challenge was rejected") || + error.message.includes("timed out after") || + error.message.includes("Response validation failed") + ) { + return true; + } + + return false; +} + +/** + * Extracts structured protocol error details for identification logging. + * @param error Unknown error raised during identification. + * @returns Structured protocol error details when available. + */ +function getProtocolErrorDetails(error: unknown) { + if (typeof error !== "object" || error === null) { + return null; + } + + if (!("type" in error)) { + return null; + } + + const protocolError = error as { + id?: unknown; + type?: unknown; + data?: unknown; + }; + + return { + id: protocolError.id, + type: protocolError.type, + data: protocolError.data, + }; +} + +function isTauriMobile() { + return isTauri() && /Android|iPhone|iPad|iPod/.test(navigator.userAgent); +} + +type ContextType = { + send: BoundSendFn; + subscribePush: (handler: PushHandler) => () => void; + readyState: number; + ownPing: number; + iotaPing: number; + identified: boolean; + freshContacts: Contacts; + freshCommunities: Communities; + freshCalls: Calls; +}; + +const TTPContext = createContext(undefined); + +/** + * Provides ttp transport state and authenticated send operations to children. + * @param props Component props with children. + * @returns Loading, error, or provider-wrapped JSX. + */ +export function Provider(props: { + children: ReactNode; + blockConnection?: boolean; +}) { + const { load } = useStorage(); + const { decrypt, getSharedSecret } = useCrypto(); + + const [readyState, setReadyState] = useState(READY_STATE.CLOSED); + const [connected, setConnected] = useState(false); + const [identified, setIdentified] = useState(false); + const [identifying, setIdentifying] = useState(false); + + const [ownPing, setOwnPing] = useState(0); + const [iotaPing, setIotaPing] = useState(0); + + const [error, setError] = useState(""); + const [errorDescription, setErrorDescription] = useState(""); + + const [freshCommunities, setFreshCommunities] = useState([]); + const [freshContacts, setFreshContacts] = useState([]); + const [freshCalls, setFreshCalls] = useState([]); + + const clientRef = useRef + > | null>(null); + const identificationStartedRef = useRef(false); + const identificationCancelRef = useRef(false); + + // Load ttp url + const [ttpUrl, setTtpUrl] = useState(null); + const [ttpServerCert, setTtpServerCert] = useState(""); + useEffect(() => { + load("ttp_url").then((url) => { + setTtpUrl(url); + }); + load("ttp_server_cert").then((cert) => { + setTtpServerCert(cert.trim()); + }); + }, [load]); + + /** + * Sends typed protocol messages through the active transport client. + * @param type Protocol message type. + * @param data Optional request payload. + * @param options Optional request id. + * @returns A promise for the typed message payload. + */ + const send: BoundSendFn = useMemo( + () => + (( + type: string, + data?: Record, + options?: { id?: number }, + ) => { + const client = clientRef.current; + + if (!client) { + return Promise.reject(new Error("ttp is not connected")); + } + + return client.send(type as keyof Schemas & string, data as never, { + ...options, + }); + }) as BoundSendFn, + [], + ); + + /** + * Subscribes to unsolicited push events from the active transport client. + * @param handler Callback invoked for each push message. + * @returns Unsubscribe function. + */ + const subscribePush = useCallback((handler: PushHandler) => { + const client = clientRef.current; + + if (!client) { + return () => {}; + } + + return client.subscribePush(handler); + }, []); + + // Check for error_no_iota + useEffect(() => { + if (!connected) return; + + return subscribePush((message) => { + if (message.type !== "error_no_iota") return; + + identificationCancelRef.current = true; + setIdentified(false); + setIdentifying(false); + setError("We couldn't reach your Iota"); + setErrorDescription( + "You could try to restart your Iota, check for updates or check your network connection.", + ); + }); + }, [connected, subscribePush]); + + useEffect(() => { + if (!connected || !identified) { + return; + } + + const interval = setInterval(async () => { + try { + const originalNow = Date.now(); + + const data = await send("ping", { + last_ping: originalNow, + }); + + const travelTime = Date.now() - originalNow; + setOwnPing(travelTime); + + const remotePing = data.data.ping_iota; + if (typeof remotePing === "number") { + setIotaPing(remotePing); + } + } catch (intervalError) { + log(1, "ttp", "yellow", "Ping failed", intervalError); + } + }, PING_INTERVAL); + + return () => { + clearInterval(interval); + }; + }, [connected, identified, send]); + + useEffect(() => { + if (!ttpUrl) { + return; + } + + let attempts = 0; + let reconnectTimer: ReturnType | null = null; + let reconnectResetTimer: ReturnType | null = null; + let reconnectScheduled = false; + let disposed = false; + let resumeListenerRegistered = false; + + /** + * Clears any scheduled reconnect timeout and resets scheduling flags. + * @returns Void. + */ + const clearReconnectTimer = () => { + if (!reconnectTimer) { + return; + } + + clearTimeout(reconnectTimer); + reconnectTimer = null; + reconnectScheduled = false; + }; + + /** + * Clears the stability timer that resets reconnect attempt counters. + * @returns Void. + */ + const clearReconnectResetTimer = () => { + if (!reconnectResetTimer) { + return; + } + + clearTimeout(reconnectResetTimer); + reconnectResetTimer = null; + }; + + /** + * Starts the stability timer that resets reconnect attempts after uptime. + * @returns Void. + */ + const scheduleReconnectReset = () => { + clearReconnectResetTimer(); + reconnectResetTimer = setTimeout(() => { + attempts = 0; + reconnectResetTimer = null; + }, RECONNECT_RESET * 1_000); + }; + + /** + * Schedules a delayed reconnect attempt unless retries are exhausted. + * @param reason Optional reason for reconnect scheduling. + * @returns Void. + */ + const scheduleReconnect = (reason?: unknown) => { + if (disposed || reconnectScheduled) { + return; + } + + if (attempts >= RECONNECT_TRIES) { + setError("Connection Failed"); + setErrorDescription( + "Unable to connect to the server after multiple attempts. Please check your internet connection or try again later.", + ); + log(0, "ttp", "red", "Reconnection attempts exhausted", reason); + return; + } + + attempts += 1; + reconnectScheduled = true; + reconnectTimer = setTimeout(() => { + reconnectScheduled = false; + reconnectTimer = null; + void connect(); + }, RETRY_INTERVAL); + }; + + const transportClient = !props.blockConnection + ? createTransportClient(schemas, { + url: ttpUrl, + serverCert: ttpServerCert || undefined, + onReadyStateChange: (state) => { + setReadyState(state); + + if (state === READY_STATE.OPEN) { + clearReconnectTimer(); + scheduleReconnectReset(); + identificationStartedRef.current = false; + identificationCancelRef.current = false; + setConnected(true); + setIdentified(false); + setError(""); + setErrorDescription(""); + return; + } + + clearReconnectResetTimer(); + identificationStartedRef.current = false; + setConnected(false); + setIdentified(false); + setIdentifying(false); + }, + onClose: ({ error: closeError, intentional }) => { + clearReconnectResetTimer(); + setConnected(false); + setIdentified(false); + setIdentifying(false); + + if (disposed || intentional) { + return; + } + + log(0, "ttp", "red", "Disconnected", closeError); + scheduleReconnect(closeError); + }, + }) + : null; + + clientRef.current = transportClient; + + /** + * Establishes the transport connection and schedules reconnect on failures. + * @returns Promise that resolves after one connection attempt. + */ + async function connect() { + if (disposed) { + return; + } + + if (!ttpUrl) { + return; + } + + try { + await transportClient?.connect(ttpUrl); + } catch (connectError) { + if (disposed) { + return; + } + + log(0, "ttp", "red", "Connection attempt failed", connectError); + scheduleReconnect(connectError); + } + } + + /** + * Starts a reconnect after resume only when the transport is disconnected. + * @returns Promise that resolves after any needed resume reconnect starts. + */ + async function reconnectAfterResume() { + if (disposed || !transportClient) { + return; + } + + clearReconnectTimer(); + clearReconnectResetTimer(); + attempts = 0; + reconnectScheduled = false; + setError(""); + setErrorDescription(""); + + await connect(); + } + + void connect(); + + if (!props.blockConnection && isTauriMobile()) { + resumeListenerRegistered = true; + onResume(() => { + void reconnectAfterResume(); + }); + } + + return () => { + disposed = true; + clearReconnectTimer(); + clearReconnectResetTimer(); + + if (resumeListenerRegistered) { + onResume(); + } + + if (clientRef.current === transportClient) { + clientRef.current = null; + } + + void transportClient?.close("context-dispose"); + setReadyState(READY_STATE.CLOSED); + setConnected(false); + setIdentified(false); + setIdentifying(false); + identificationStartedRef.current = false; + }; + }, [props.blockConnection, ttpServerCert, ttpUrl]); + + useEffect(() => { + if (!connected) { + identificationStartedRef.current = false; + return; + } + + if (identificationCancelRef.current) { + identificationStartedRef.current = false; + return; + } + + if (identificationStartedRef.current) { + return; + } + + identificationStartedRef.current = true; + let cancelled = false; + setIdentifying(true); + setIdentified(false); + + /** + * Executes the challenge-response identification handshake. + * @returns Promise that resolves when identification flow completes. + */ + const identify = async () => { + try { + const sessionId = await load("session_id"); + const userId = await load("user_id"); + const privateKey = await load("private_key"); + + if ( + !Number.isSafeInteger(userId) || + userId <= 0 || + privateKey.trim() === "" || + !Number.isSafeInteger(sessionId) || + sessionId <= 0 + ) { + throw new Error("Invalid credentials"); + } + + // Challenge Request + const challengeEnvelope = await send("identification", { + version, + session_id: sessionId, + user_id: userId, + }).catch((challengeError) => { + throw new Error( + "Failed to obtain identification challenge from server", + challengeError, + ); + }); + + // Shared Secret + const sharedSecret = await getSharedSecret( + privateKey, + "", + challengeEnvelope.data.public_key, + ).catch((secretError) => { + throw new Error( + "Failed to derive shared secret for identification", + secretError, + ); + }); + + // Challenge Decryption + const decryptedChallenge = await decryptText( + sharedSecret, + challengeEnvelope.data.challenge, + ).catch((decryptionError) => { + throw new Error( + "Failed to decrypt identification challenge: " + + String(decryptionError), + ); + }); + + // Challenge Response + const finalResponse = await send("challenge_response", { + challenge: decryptedChallenge, + }).catch((error) => { + if (!identificationCancelRef.current) { + setError("Identification Failed"); + setErrorDescription( + "Unable to complete secure identification. Please verify your credentials and try again.", + ); + } + throw error; + }); + + // Data handling + setFreshContacts(finalResponse.data.contacts); + setFreshCommunities(finalResponse.data.communities); + setFreshCalls(finalResponse.data.calls); + if (cancelled || identificationCancelRef.current) { + return; + } + + setError(""); + setErrorDescription(""); + setIdentified(true); + } catch (identificationError) { + if (cancelled) { + return; + } + + if (identificationCancelRef.current) { + return; + } + + if (isStopSendingError(identificationError)) { + setError("Connection closed"); + setErrorDescription( + "The connection was forcefully closed by the Omikron.", + ); + setIdentified(false); + return; + } + + const isFatal = isFatalIdentificationError(identificationError); + const protocolErrorDetails = + getProtocolErrorDetails(identificationError); + + log( + isFatal ? 0 : 1, + "ttp", + isFatal ? "red" : "yellow", + "Identification handshake failed", + protocolErrorDetails ?? identificationError, + ); + + setIdentified(false); + + setError("Identification Failed"); + setErrorDescription( + isFatal + ? "Unable to complete secure identification. Please verify your credentials and try again." + : "Unable to complete secure identification because the transport request failed.", + ); + } finally { + if (!cancelled && !identificationCancelRef.current) { + setIdentifying(false); + } + } + }; + + void identify(); + + return () => { + cancelled = true; + }; + }, [connected, decrypt, getSharedSecret, load, send]); + + const progress = useMemo(() => { + if (!ttpUrl) return 10; + if (readyState === READY_STATE.CONNECTING) return 30; + if (!connected) return 45; + if (identifying) return 75; + if (!identified) return 90; + return 100; + }, [connected, identified, identifying, readyState, ttpUrl]); + + const loadingTitle = useMemo(() => { + if (!ttpUrl) { + return "Looking up configuration"; + } + + if (readyState === READY_STATE.CONNECTING || !connected) { + return "Connecting to Tensamin"; + } + + if (identifying || !identified) { + return "Identifying secure session"; + } + + return "Loading"; + }, [connected, identified, identifying, readyState, ttpUrl]); + + const loadingDescription = useMemo(() => { + if (!ttpUrl) { + return "Loading connection details"; + } + + if (readyState === READY_STATE.CONNECTING || !connected) { + return "Establishing transport channel"; + } + + if (identifying || !identified) { + return "Verifying challenge-response handshake"; + } + + return undefined; + }, [connected, identified, identifying, readyState, ttpUrl]); + + if (error !== "" && errorDescription !== "") { + return ; + } + + if (!connected || !identified || !ttpUrl) { + return ( + + ); + } + + return ( + + {props.children} + + ); +} + +/** + * Returns the active ttp context and enforces provider usage. + * @returns ttp context API for transport operations and connection state. + */ +export function useTTP(): ContextType { + const context = useContext(TTPContext); + if (!context) { + throw new Error("useTTP must be used within a TTPProvider"); + } + return context; +} diff --git a/packages/ttp/src/index.ts b/packages/ttp/src/index.ts new file mode 100644 index 0000000..e1a274f --- /dev/null +++ b/packages/ttp/src/index.ts @@ -0,0 +1,3 @@ +export * from "@tensamin/ttp-core"; +export * from "./context"; +export * from "./values"; diff --git a/packages/mtp/src/values.ts b/packages/ttp/src/values.ts similarity index 66% rename from packages/mtp/src/values.ts rename to packages/ttp/src/values.ts index b95efe4..ae72d43 100644 --- a/packages/mtp/src/values.ts +++ b/packages/ttp/src/values.ts @@ -1,3 +1,5 @@ +export const RESPONSE_TIMEOUT = 15_000; +export const RETRY_COUNT = 10; export const RETRY_INTERVAL = 3_000; export const PING_INTERVAL = 3_000; export const RECONNECT_TRIES = 3; diff --git a/packages/cache/tsconfig.json b/packages/ttp/tsconfig.json similarity index 80% rename from packages/cache/tsconfig.json rename to packages/ttp/tsconfig.json index 2206f33..9714625 100644 --- a/packages/cache/tsconfig.json +++ b/packages/ttp/tsconfig.json @@ -1,13 +1,12 @@ { "compilerOptions": { - "jsx": "react-jsx", "target": "ES2022", "module": "ESNext", "moduleResolution": "bundler", + "jsx": "react-jsx", "strict": true, "skipLibCheck": true, - "noEmit": true, - "lib": ["ES2022", "DOM"] + "noEmit": true }, "include": ["src"] } diff --git a/packages/user/package.json b/packages/user/package.json index 710147c..ced2f84 100644 --- a/packages/user/package.json +++ b/packages/user/package.json @@ -9,13 +9,12 @@ "./values": "./src/values.ts" }, "scripts": { - "format": "pnpm exec prettier --write .", + "format": "bunx prettier --write .", "lint": "eslint src", "build": "tsc -p tsconfig.json --noEmit" }, "dependencies": { - "@tensamin/cache": "workspace:*", - "@tensamin/mtp": "workspace:*", + "@tensamin/ttp": "workspace:*", "@tensamin/shared": "workspace:*", "@tensamin/storage": "workspace:*", "react": "^19.2.0", diff --git a/packages/user/src/context.tsx b/packages/user/src/context.tsx index eb4b6dd..962152a 100644 --- a/packages/user/src/context.tsx +++ b/packages/user/src/context.tsx @@ -1,13 +1,10 @@ import * as React from "react"; -import { useMTP } from "@tensamin/mtp"; +import { useTTP } from "@tensamin/ttp"; -import { mtp as schemas } from "@tensamin/shared/data"; +import { ttp as schemas } from "@tensamin/shared/data"; import type z from "zod"; -import { createCache } from "@tensamin/cache"; -import { useStorage } from "@tensamin/storage/context"; -import { useSession } from "@tensamin/storage/session"; -export type User = z.infer; +export type User = z.infer; interface contextValue { get(userId: number): Promise; @@ -26,16 +23,7 @@ export default function UserProvider(props: { children: React.ReactNode }) { {}, ); - const { send } = useMTP(); - const { load } = useStorage(); - const { contacts } = useSession(); - const [accountId, setAccountId] = React.useState(null); - - React.useEffect(() => { - void load("user_id").then((accountId) => { - setAccountId(accountId); - }); - }, [load]); + const { send } = useTTP(); /** * Executes get. @@ -48,30 +36,27 @@ export default function UserProvider(props: { children: React.ReactNode }) { throw new Error("userId is required"); } + const cachedUser = storageRef.current[userId]; + if (cachedUser !== undefined) { + return cachedUser; + } + const pendingUser = pendingRef.current[userId]; if (pendingUser !== undefined) { return pendingUser; } const request = (async () => { - const cache = accountId ? createCache(String(accountId)) : null; - const cached = - storageRef.current[userId] ?? (await cache?.profiles.get(userId)); - if (cached) storageRef.current[userId] = cached; - try { - const userData = await send("GetUserData", { UserId: userId }); - const user = { - ...userData.data, - avatar: userData.data.Avatar - ? `data:image/webp;base64,${atob(userData.data.Avatar)}` - : undefined, - }; - storageRef.current[userId] = user; - return user; - } catch (error) { - if (cached) return cached; - throw error; - } + const userData = await send("get_user_data", { user_id: userId }); + const user = { + ...userData.data, + avatar: userData.data.avatar + ? `data:image/webp;base64,${atob(userData.data.avatar)}` + : undefined, + }; + + storageRef.current[userId] = user; + return user; })(); pendingRef.current[userId] = request; @@ -82,14 +67,9 @@ export default function UserProvider(props: { children: React.ReactNode }) { delete pendingRef.current[userId]; } }, - [accountId, send], + [send], ); - React.useEffect(() => { - if (!accountId) return; - for (const contact of contacts) void get(contact.UserId); - }, [accountId, contacts, get]); - return ( {props.children} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml deleted file mode 100644 index 3ec95c0..0000000 --- a/pnpm-lock.yaml +++ /dev/null @@ -1,9149 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -overrides: - '@tensamin/ui': https://git.methanium.net/tensamin/ui/releases/download/0.0.40/tensamin-ui.tgz - mtp: https://git.methanium.net/methanium/mtp/releases/download/0.2.0-3919eb46fd/mtp-0.2.0.tgz - -importers: - - .: - dependencies: - '@tensamin/ui': - specifier: https://git.methanium.net/tensamin/ui/releases/download/0.0.40/tensamin-ui.tgz - version: https://git.methanium.net/tensamin/ui/releases/download/0.0.40/tensamin-ui.tgz(@date-fns/tz@1.5.0)(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react-is@19.2.7)(react@19.2.7)(redux@5.0.1)(typescript@6.0.3) - mtp: - specifier: https://git.methanium.net/methanium/mtp/releases/download/0.2.0-3919eb46fd/mtp-0.2.0.tgz - version: https://git.methanium.net/methanium/mtp/releases/download/0.2.0-3919eb46fd/mtp-0.2.0.tgz - sonner: - specifier: ^2.0.7 - version: 2.0.7(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - devDependencies: - '@eslint/js': - specifier: ^10.0.1 - version: 10.0.1(eslint@10.6.0(jiti@2.7.0)) - '@types/node': - specifier: ^26.1.0 - version: 26.1.0 - '@types/react': - specifier: ^19.2.14 - version: 19.2.17 - '@types/react-dom': - specifier: ^19.2.3 - version: 19.2.3(@types/react@19.2.17) - '@typescript-eslint/parser': - specifier: ^8.59.1 - version: 8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) - eslint: - specifier: ^10.2.1 - version: 10.6.0(jiti@2.7.0) - eslint-plugin-react-hooks: - specifier: ^7.1.1 - version: 7.1.1(eslint@10.6.0(jiti@2.7.0)) - fallow: - specifier: ^2.86.0 - version: 2.104.0 - globals: - specifier: ^17.5.0 - version: 17.7.0 - jsonc-parser: - specifier: ^3.3.1 - version: 3.3.1 - prettier: - specifier: ^3.8.3 - version: 3.9.4 - typescript: - specifier: ^6.0.3 - version: 6.0.3 - typescript-eslint: - specifier: ^8.59.1 - version: 8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) - vitest: - specifier: ^4.0.8 - version: 4.1.9(@types/node@26.1.0)(vite@8.1.3(@types/node@26.1.0)(jiti@2.7.0)(yaml@2.9.0)) - yaml: - specifier: ^2.8.2 - version: 2.9.0 - - apps/electron: - devDependencies: - '@types/node': - specifier: ^25.9.1 - version: 25.9.4 - electron: - specifier: ^39.2.7 - version: 39.8.10 - electron-builder: - specifier: ^26.0.12 - version: 26.15.3(electron-builder-squirrel-windows@26.15.3) - esbuild: - specifier: ^0.25.11 - version: 0.25.12 - typescript: - specifier: ~6.0.3 - version: 6.0.3 - - apps/tauri: - dependencies: - '@tauri-apps/api': - specifier: ^2 - version: 2.11.1 - '@tauri-apps/plugin-barcode-scanner': - specifier: ~2 - version: 2.4.5 - '@tauri-apps/plugin-deep-link': - specifier: ~2 - version: 2.4.9 - '@tauri-apps/plugin-log': - specifier: ~2 - version: 2.8.0 - '@tauri-apps/plugin-notification': - specifier: ~2 - version: 2.3.3 - '@tensamin/shared': - specifier: workspace:* - version: link:../../packages/shared - '@tensamin/ui': - specifier: https://git.methanium.net/tensamin/ui/releases/download/0.0.40/tensamin-ui.tgz - version: https://git.methanium.net/tensamin/ui/releases/download/0.0.40/tensamin-ui.tgz(@date-fns/tz@1.5.0)(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react-is@19.2.7)(react@19.2.7)(redux@5.0.1)(typescript@6.0.3) - react: - specifier: ^19.2.0 - version: 19.2.7 - react-dom: - specifier: ^19.2.0 - version: 19.2.7(react@19.2.7) - devDependencies: - '@tauri-apps/cli': - specifier: ^2 - version: 2.11.4 - '@types/node': - specifier: ^25.9.1 - version: 25.9.4 - - apps/web: - dependencies: - '@babel/runtime': - specifier: ^7.29.2 - version: 7.29.7 - '@base-ui/react': - specifier: ^1.0.0 - version: 1.6.0(@date-fns/tz@1.5.0)(@types/react@19.2.17)(date-fns@4.4.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@base-ui/utils': - specifier: 0.3.1 - version: 0.3.1(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@floating-ui/core': - specifier: ^1.7.0 - version: 1.7.5 - '@floating-ui/dom': - specifier: ^1.7.0 - version: 1.7.6 - '@floating-ui/react-dom': - specifier: ^2.1.8 - version: 2.1.8(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@floating-ui/utils': - specifier: ^0.2.11 - version: 0.2.11 - '@fontsource-variable/inter': - specifier: ^5.2.8 - version: 5.2.8 - '@fontsource-variable/public-sans': - specifier: ^5.2.7 - version: 5.2.7 - '@radix-ui/primitive': - specifier: ^1.1.0 - version: 1.1.4 - '@radix-ui/react-compose-refs': - specifier: ^1.1.1 - version: 1.1.3(@types/react@19.2.17)(react@19.2.7) - '@radix-ui/react-context': - specifier: ^1.1.4 - version: 1.1.4(@types/react@19.2.17)(react@19.2.7) - '@radix-ui/react-dialog': - specifier: ^1.1.6 - version: 1.1.18(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@radix-ui/react-dismissable-layer': - specifier: ^1.1.11 - version: 1.1.14(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@radix-ui/react-focus-guards': - specifier: ^1.1.4 - version: 1.1.4(@types/react@19.2.17)(react@19.2.7) - '@radix-ui/react-focus-scope': - specifier: ^1.1.11 - version: 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@radix-ui/react-id': - specifier: ^1.1.0 - version: 1.1.2(@types/react@19.2.17)(react@19.2.7) - '@radix-ui/react-portal': - specifier: ^1.1.13 - version: 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@radix-ui/react-presence': - specifier: ^1.1.6 - version: 1.1.6(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@radix-ui/react-primitive': - specifier: ^2.0.2 - version: 2.1.7(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@radix-ui/react-slot': - specifier: ^1.1.2 - version: 1.3.0(@types/react@19.2.17)(react@19.2.7) - '@radix-ui/react-use-callback-ref': - specifier: ^1.1.1 - version: 1.1.2(@types/react@19.2.17)(react@19.2.7) - '@radix-ui/react-use-controllable-state': - specifier: ^1.2.3 - version: 1.2.3(@types/react@19.2.17)(react@19.2.7) - '@radix-ui/react-use-effect-event': - specifier: ^0.0.2 - version: 0.0.2(@types/react@19.2.17)(react@19.2.7) - '@radix-ui/react-use-layout-effect': - specifier: ^1.1.0 - version: 1.1.2(@types/react@19.2.17)(react@19.2.7) - '@reduxjs/toolkit': - specifier: ^2.0.0 - version: 2.12.0(react-redux@9.3.0(@types/react@19.2.17)(react@19.2.7))(react@19.2.7) - '@tailwindcss/vite': - specifier: ^4.2.4 - version: 4.3.2(vite@8.1.3(@types/node@26.1.0)(esbuild@0.25.12)(jiti@2.7.0)(yaml@2.9.0)) - '@tanstack/devtools-event-client': - specifier: ^0.3.0 - version: 0.3.5 - '@tanstack/history': - specifier: 1.162.0 - version: 1.162.0 - '@tanstack/query-core': - specifier: ^5.0.0 - version: 5.101.2 - '@tanstack/react-router': - specifier: ^1.169.1 - version: 1.170.17(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@tanstack/react-store': - specifier: ^0.9.3 - version: 0.9.3(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@tanstack/react-virtual': - specifier: ^3.13.24 - version: 3.14.5(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@tanstack/router-core': - specifier: ^1.169.1 - version: 1.171.14 - '@tanstack/store': - specifier: ^0.9.3 - version: 0.9.3 - '@tanstack/virtual-core': - specifier: ^3.13.24 - version: 3.17.3 - '@tauri-apps/api': - specifier: ^2 - version: 2.11.1 - '@tensamin/cache': - specifier: workspace:* - version: link:../../packages/cache - '@tensamin/call': - specifier: workspace:* - version: link:../../packages/call - '@tensamin/chat': - specifier: workspace:* - version: link:../../packages/chat - '@tensamin/crypto': - specifier: workspace:* - version: link:../../packages/crypto - '@tensamin/markdown': - specifier: workspace:* - version: link:../../packages/markdown - '@tensamin/mtp': - specifier: workspace:* - version: link:../../packages/mtp - '@tensamin/notifications': - specifier: workspace:* - version: link:../../packages/notifications - '@tensamin/settings': - specifier: workspace:* - version: link:../../packages/settings - '@tensamin/shared': - specifier: workspace:* - version: link:../../packages/shared - '@tensamin/storage': - specifier: workspace:* - version: link:../../packages/storage - '@tensamin/tauri': - specifier: workspace:* - version: link:../tauri - '@tensamin/tauth': - specifier: workspace:* - version: link:../../packages/tauth - '@tensamin/ui': - specifier: https://git.methanium.net/tensamin/ui/releases/download/0.0.40/tensamin-ui.tgz - version: https://git.methanium.net/tensamin/ui/releases/download/0.0.40/tensamin-ui.tgz(@date-fns/tz@1.5.0)(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react-is@19.2.7)(react@19.2.7)(redux@5.0.1)(typescript@6.0.3) - '@tensamin/user': - specifier: workspace:* - version: link:../../packages/user - aria-hidden: - specifier: ^1.2.4 - version: 1.2.6 - class-variance-authority: - specifier: ^0.7.1 - version: 0.7.1 - clsx: - specifier: ^2.1.1 - version: 2.1.1 - cmdk: - specifier: ^1.1.1 - version: 1.1.1(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - cookie-es: - specifier: ^3.0.0 - version: 3.1.1 - d3-array: - specifier: ^3.1.6 - version: 3.2.4 - d3-color: - specifier: ^3.1.0 - version: 3.1.0 - d3-ease: - specifier: ^3.0.1 - version: 3.0.1 - d3-format: - specifier: ^3.1.0 - version: 3.1.2 - d3-interpolate: - specifier: ^3.0.1 - version: 3.0.1 - d3-path: - specifier: ^3.0.1 - version: 3.1.0 - d3-scale: - specifier: ^4.0.2 - version: 4.0.2 - d3-shape: - specifier: ^3.1.0 - version: 3.2.0 - d3-time: - specifier: ^3.0.0 - version: 3.1.0 - d3-time-format: - specifier: ^4.1.0 - version: 4.1.0 - d3-timer: - specifier: ^3.0.1 - version: 3.0.1 - date-fns: - specifier: ^4.4.0 - version: 4.4.0 - decimal.js-light: - specifier: ^2.5.1 - version: 2.5.1 - detect-node-es: - specifier: ^1.1.0 - version: 1.1.0 - dijkstrajs: - specifier: ^1.0.1 - version: 1.0.3 - embla-carousel: - specifier: 8.6.0 - version: 8.6.0 - embla-carousel-react: - specifier: ^8.6.0 - version: 8.6.0(react@19.2.7) - embla-carousel-reactive-utils: - specifier: 8.6.0 - version: 8.6.0(embla-carousel@8.6.0) - es-toolkit: - specifier: ^1.39.3 - version: 1.49.0 - eventemitter3: - specifier: ^5.0.1 - version: 5.0.4 - get-nonce: - specifier: ^1.0.1 - version: 1.0.1 - immer: - specifier: ^10.1.1 - version: 10.2.0 - input-otp: - specifier: ^1.4.2 - version: 1.4.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - internmap: - specifier: ^2.0.3 - version: 2.0.3 - lucide-react: - specifier: ^1.14.0 - version: 1.23.0(react@19.2.7) - next-themes: - specifier: ^0.4.6 - version: 0.4.6(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - pngjs: - specifier: ^5.0.0 - version: 5.0.0 - qrcode: - specifier: ^1.5.4 - version: 1.5.4 - react: - specifier: ^19.2.0 - version: 19.2.7 - react-day-picker: - specifier: ^10.0.1 - version: 10.0.1(@types/react@19.2.17)(react@19.2.7) - react-dom: - specifier: ^19.2.0 - version: 19.2.7(react@19.2.7) - react-is: - specifier: ^19.0.0 - version: 19.2.7 - react-redux: - specifier: ^9.0.0 - version: 9.3.0(@types/react@19.2.17)(react@19.2.7)(redux@5.0.1) - react-remove-scroll: - specifier: ^2.7.2 - version: 2.7.2(@types/react@19.2.17)(react@19.2.7) - react-remove-scroll-bar: - specifier: ^2.3.7 - version: 2.3.8(@types/react@19.2.17)(react@19.2.7) - react-resizable-panels: - specifier: ^4.11.2 - version: 4.12.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - react-style-singleton: - specifier: ^2.2.3 - version: 2.2.3(@types/react@19.2.17)(react@19.2.7) - recharts: - specifier: 3.8.1 - version: 3.8.1(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react-is@19.2.7)(react@19.2.7)(redux@5.0.1) - redux: - specifier: ^5.0.0 - version: 5.0.1 - redux-thunk: - specifier: ^3.1.0 - version: 3.1.0(redux@5.0.1) - reselect: - specifier: 5.1.1 - version: 5.1.1 - scheduler: - specifier: ^0.27.0 - version: 0.27.0 - seroval: - specifier: ^1.5.4 - version: 1.5.4 - seroval-plugins: - specifier: ^1.5.4 - version: 1.5.4(seroval@1.5.4) - shadcn: - specifier: ^4.11.0 - version: 4.12.0(typescript@6.0.3) - sonner: - specifier: ^2.0.7 - version: 2.0.7(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - tailwind-merge: - specifier: ^3.6.0 - version: 3.6.0 - tailwind-scrollbar-hide: - specifier: ^4.0.0 - version: 4.0.0(tailwindcss@4.3.2) - tailwindcss: - specifier: ^4.2.4 - version: 4.3.2 - tiny-invariant: - specifier: ^1.3.3 - version: 1.3.3 - tslib: - specifier: ^2.8.1 - version: 2.8.1 - tw-animate-css: - specifier: ^1.4.0 - version: 1.4.0 - use-callback-ref: - specifier: ^1.3.3 - version: 1.3.3(@types/react@19.2.17)(react@19.2.7) - use-sidecar: - specifier: ^1.1.3 - version: 1.1.3(@types/react@19.2.17)(react@19.2.7) - use-sync-external-store: - specifier: ^1.2.2 - version: 1.6.0(react@19.2.7) - vaul: - specifier: ^1.1.2 - version: 1.1.2(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - victory-vendor: - specifier: ^37.0.2 - version: 37.3.6 - yargs: - specifier: ^15.3.1 - version: 15.4.1 - zod: - specifier: ^4.3.6 - version: 4.4.3 - devDependencies: - '@eslint/js': - specifier: ^10.0.1 - version: 10.0.1(eslint@10.6.0(jiti@2.7.0)) - '@types/qrcode': - specifier: ^1.5.6 - version: 1.5.6 - '@types/react': - specifier: ^19.2.2 - version: 19.2.17 - '@types/react-dom': - specifier: ^19.2.2 - version: 19.2.3(@types/react@19.2.17) - '@vitejs/plugin-react': - specifier: ^6.0.1 - version: 6.0.3(vite@8.1.3(@types/node@26.1.0)(esbuild@0.25.12)(jiti@2.7.0)(yaml@2.9.0)) - esbuild: - specifier: ^0.25.11 - version: 0.25.12 - eslint: - specifier: ^10.0.3 - version: 10.6.0(jiti@2.7.0) - globals: - specifier: ^17.4.0 - version: 17.7.0 - typescript: - specifier: ~6.0.3 - version: 6.0.3 - typescript-eslint: - specifier: ^8.57.0 - version: 8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) - vite: - specifier: ^8.0.10 - version: 8.1.3(@types/node@26.1.0)(esbuild@0.25.12)(jiti@2.7.0)(yaml@2.9.0) - - packages/cache: - dependencies: - '@tensamin/mtp': - specifier: workspace:* - version: link:../mtp - '@tensamin/shared': - specifier: workspace:* - version: link:../shared - '@tensamin/storage': - specifier: workspace:* - version: link:../storage - react: - specifier: ^19.2.0 - version: 19.2.7 - zod: - specifier: ^4.3.6 - version: 4.4.3 - - packages/call: - dependencies: - '@livekit/components-react': - specifier: ^2.9.20 - version: 2.9.21(livekit-client@2.20.0(@types/dom-mediacapture-record@1.0.22))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(tslib@2.8.1) - '@tanstack/react-router': - specifier: ^1.169.1 - version: 1.170.17(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@tauri-apps/api': - specifier: ^2 - version: 2.11.1 - '@tensamin/crypto': - specifier: workspace:* - version: link:../crypto - '@tensamin/mtp': - specifier: workspace:* - version: link:../mtp - '@tensamin/shared': - specifier: workspace:* - version: link:../shared - '@tensamin/storage': - specifier: workspace:* - version: link:../storage - '@tensamin/ui': - specifier: https://git.methanium.net/tensamin/ui/releases/download/0.0.40/tensamin-ui.tgz - version: https://git.methanium.net/tensamin/ui/releases/download/0.0.40/tensamin-ui.tgz(@date-fns/tz@1.5.0)(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react-is@19.2.7)(react@19.2.7)(redux@5.0.1)(typescript@6.0.3) - '@tensamin/user': - specifier: workspace:* - version: link:../user - deepfilternet3-noise-filter: - specifier: 1.2.1 - version: 1.2.1(livekit-client@2.20.0(@types/dom-mediacapture-record@1.0.22)) - livekit-client: - specifier: ^2.18.8 - version: 2.20.0(@types/dom-mediacapture-record@1.0.22) - lucide-react: - specifier: ^1.14.0 - version: 1.23.0(react@19.2.7) - react: - specifier: ^19.2.0 - version: 19.2.7 - react-dom: - specifier: ^19.2.0 - version: 19.2.7(react@19.2.7) - recharts: - specifier: ^3.8.1 - version: 3.8.1(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react-is@19.2.7)(react@19.2.7)(redux@5.0.1) - zod: - specifier: ^4.3.6 - version: 4.4.3 - zustand: - specifier: ^5.0.8 - version: 5.0.14(@types/react@19.2.17)(immer@11.1.9)(react@19.2.7)(use-sync-external-store@1.6.0(react@19.2.7)) - - packages/chat: - dependencies: - '@tanstack/pacer': - specifier: ^0.21.1 - version: 0.21.1 - '@tanstack/react-query': - specifier: ^5.0.0 - version: 5.101.2(react@19.2.7) - '@tanstack/react-router': - specifier: ^1.0.0 - version: 1.170.17(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@tanstack/react-virtual': - specifier: ^3.0.0 - version: 3.14.5(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@tensamin/cache': - specifier: workspace:* - version: link:../cache - '@tensamin/crypto': - specifier: workspace:* - version: link:../crypto - '@tensamin/markdown': - specifier: workspace:* - version: link:../markdown - '@tensamin/mtp': - specifier: workspace:* - version: link:../mtp - '@tensamin/shared': - specifier: workspace:* - version: link:../shared - '@tensamin/storage': - specifier: workspace:* - version: link:../storage - '@tensamin/ui': - specifier: https://git.methanium.net/tensamin/ui/releases/download/0.0.40/tensamin-ui.tgz - version: https://git.methanium.net/tensamin/ui/releases/download/0.0.40/tensamin-ui.tgz(@date-fns/tz@1.5.0)(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react-is@19.2.7)(react@19.2.7)(redux@5.0.1)(typescript@6.0.3) - '@tensamin/user': - specifier: workspace:* - version: link:../user - lucide-react: - specifier: ^1.14.0 - version: 1.23.0(react@19.2.7) - motion: - specifier: ^12.42.2 - version: 12.42.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - react: - specifier: ^19.2.0 - version: 19.2.7 - react-dom: - specifier: ^19.2.0 - version: 19.2.7(react@19.2.7) - zod: - specifier: ^4.3.6 - version: 4.4.3 - - packages/crypto: - dependencies: - react: - specifier: ^19.2.0 - version: 19.2.7 - react-dom: - specifier: ^19.2.0 - version: 19.2.7(react@19.2.7) - - packages/markdown: - dependencies: - '@codemirror/autocomplete': - specifier: ^6.20.3 - version: 6.20.3 - '@codemirror/commands': - specifier: ^6.10.2 - version: 6.10.4 - '@codemirror/lang-markdown': - specifier: ^6.5.0 - version: 6.5.0 - '@codemirror/language': - specifier: ^6.12.4 - version: 6.12.4 - '@codemirror/state': - specifier: ^6.5.4 - version: 6.7.0 - '@codemirror/view': - specifier: ^6.41.1 - version: 6.43.4 - '@tensamin/ui': - specifier: https://git.methanium.net/tensamin/ui/releases/download/0.0.40/tensamin-ui.tgz - version: https://git.methanium.net/tensamin/ui/releases/download/0.0.40/tensamin-ui.tgz(@date-fns/tz@1.5.0)(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react-is@19.2.7)(react@19.2.7)(redux@5.0.1)(typescript@6.0.3) - '@twemoji/api': - specifier: ^17.0.3 - version: 17.0.3 - emojibase-data: - specifier: ^17.0.0 - version: 17.0.0(emojibase@17.0.0) - react: - specifier: ^19.2.0 - version: 19.2.7 - react-dom: - specifier: ^19.2.0 - version: 19.2.7(react@19.2.7) - - packages/mtp: - dependencies: - '@tauri-apps/api': - specifier: ^2 - version: 2.11.1 - '@tensamin/crypto': - specifier: workspace:* - version: link:../crypto - '@tensamin/shared': - specifier: workspace:* - version: link:../shared - '@tensamin/storage': - specifier: workspace:* - version: link:../storage - '@tensamin/ui': - specifier: https://git.methanium.net/tensamin/ui/releases/download/0.0.40/tensamin-ui.tgz - version: https://git.methanium.net/tensamin/ui/releases/download/0.0.40/tensamin-ui.tgz(@date-fns/tz@1.5.0)(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react-is@19.2.7)(react@19.2.7)(redux@5.0.1)(typescript@6.0.3) - lucide-react: - specifier: ^1.14.0 - version: 1.23.0(react@19.2.7) - mtp: - specifier: https://git.methanium.net/methanium/mtp/releases/download/0.2.0-3919eb46fd/mtp-0.2.0.tgz - version: https://git.methanium.net/methanium/mtp/releases/download/0.2.0-3919eb46fd/mtp-0.2.0.tgz - react: - specifier: ^19.2.0 - version: 19.2.7 - react-dom: - specifier: ^19.2.0 - version: 19.2.7(react@19.2.7) - tauri-plugin-app-events-api: - specifier: ^0.2.0 - version: 0.2.0 - zod: - specifier: ^4.4.2 - version: 4.4.3 - devDependencies: - eslint: - specifier: ^10.0.3 - version: 10.6.0(jiti@2.7.0) - - packages/notifications: - dependencies: - '@tanstack/react-router': - specifier: ^1.169.1 - version: 1.170.17(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@tauri-apps/api': - specifier: ^2.11.0 - version: 2.11.1 - '@tensamin/chat': - specifier: workspace:* - version: link:../chat - '@tensamin/crypto': - specifier: workspace:* - version: link:../crypto - '@tensamin/mtp': - specifier: workspace:* - version: link:../mtp - '@tensamin/shared': - specifier: workspace:* - version: link:../shared - '@tensamin/storage': - specifier: workspace:* - version: link:../storage - '@tensamin/ui': - specifier: https://git.methanium.net/tensamin/ui/releases/download/0.0.40/tensamin-ui.tgz - version: https://git.methanium.net/tensamin/ui/releases/download/0.0.40/tensamin-ui.tgz(@date-fns/tz@1.5.0)(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react-is@19.2.7)(react@19.2.7)(redux@5.0.1)(typescript@6.0.3) - '@tensamin/user': - specifier: workspace:* - version: link:../user - react: - specifier: ^19.2.0 - version: 19.2.7 - react-dom: - specifier: ^19.2.0 - version: 19.2.7(react@19.2.7) - sonner: - specifier: ^2.0.7 - version: 2.0.7(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - zod: - specifier: ^4.3.6 - version: 4.4.3 - - packages/settings: - dependencies: - '@tanstack/react-router': - specifier: ^1.169.1 - version: 1.170.17(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@tensamin/cache': - specifier: workspace:* - version: link:../cache - '@tensamin/markdown': - specifier: workspace:* - version: link:../markdown - '@tensamin/mtp': - specifier: workspace:* - version: link:../mtp - '@tensamin/shared': - specifier: workspace:* - version: link:../shared - '@tensamin/storage': - specifier: workspace:* - version: link:../storage - '@tensamin/ui': - specifier: https://git.methanium.net/tensamin/ui/releases/download/0.0.40/tensamin-ui.tgz - version: https://git.methanium.net/tensamin/ui/releases/download/0.0.40/tensamin-ui.tgz(@date-fns/tz@1.5.0)(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react-is@19.2.7)(react@19.2.7)(redux@5.0.1)(typescript@6.0.3) - '@tensamin/user': - specifier: workspace:* - version: link:../user - lucide-react: - specifier: ^1.14.0 - version: 1.23.0(react@19.2.7) - react: - specifier: ^19.2.0 - version: 19.2.7 - react-dom: - specifier: ^19.2.0 - version: 19.2.7(react@19.2.7) - devDependencies: - vite: - specifier: ^8.0.10 - version: 8.1.3(@types/node@26.1.0)(esbuild@0.25.12)(jiti@2.7.0)(yaml@2.9.0) - - packages/shared: - dependencies: - '@tensamin/ui': - specifier: https://git.methanium.net/tensamin/ui/releases/download/0.0.40/tensamin-ui.tgz - version: https://git.methanium.net/tensamin/ui/releases/download/0.0.40/tensamin-ui.tgz(@date-fns/tz@1.5.0)(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react-is@19.2.7)(react@19.2.7)(redux@5.0.1)(typescript@6.0.3) - lucide-react: - specifier: ^1.14.0 - version: 1.23.0(react@19.2.7) - react: - specifier: ^19.2.0 - version: 19.2.7 - react-dom: - specifier: ^19.2.0 - version: 19.2.7(react@19.2.7) - zod: - specifier: ^4.3.6 - version: 4.4.3 - - packages/storage: - dependencies: - '@tensamin/cache': - specifier: workspace:* - version: link:../cache - '@tensamin/mtp': - specifier: workspace:* - version: link:../mtp - '@tensamin/shared': - specifier: workspace:* - version: link:../shared - '@tensamin/ui': - specifier: https://git.methanium.net/tensamin/ui/releases/download/0.0.40/tensamin-ui.tgz - version: https://git.methanium.net/tensamin/ui/releases/download/0.0.40/tensamin-ui.tgz(@date-fns/tz@1.5.0)(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react-is@19.2.7)(react@19.2.7)(redux@5.0.1)(typescript@6.0.3) - react: - specifier: ^19.2.0 - version: 19.2.7 - react-dom: - specifier: ^19.2.0 - version: 19.2.7(react@19.2.7) - - packages/tauth: - dependencies: - '@tanstack/react-router': - specifier: ^1.0.0 - version: 1.170.17(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@tauri-apps/api': - specifier: ^2.10.1 - version: 2.11.1 - '@tensamin/crypto': - specifier: workspace:* - version: link:../crypto - '@tensamin/mtp': - specifier: workspace:* - version: link:../mtp - '@tensamin/shared': - specifier: workspace:* - version: link:../shared - '@tensamin/storage': - specifier: workspace:* - version: link:../storage - '@tensamin/tauri': - specifier: workspace:* - version: link:../../apps/tauri - '@tensamin/ui': - specifier: https://git.methanium.net/tensamin/ui/releases/download/0.0.40/tensamin-ui.tgz - version: https://git.methanium.net/tensamin/ui/releases/download/0.0.40/tensamin-ui.tgz(@date-fns/tz@1.5.0)(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react-is@19.2.7)(react@19.2.7)(redux@5.0.1)(typescript@6.0.3) - '@tensamin/user': - specifier: workspace:* - version: link:../user - lucide-react: - specifier: ^1.8.0 - version: 1.23.0(react@19.2.7) - react: - specifier: ^19.2.0 - version: 19.2.7 - react-dom: - specifier: ^19.2.0 - version: 19.2.7(react@19.2.7) - - packages/user: - dependencies: - '@tensamin/cache': - specifier: workspace:* - version: link:../cache - '@tensamin/mtp': - specifier: workspace:* - version: link:../mtp - '@tensamin/shared': - specifier: workspace:* - version: link:../shared - '@tensamin/storage': - specifier: workspace:* - version: link:../storage - react: - specifier: ^19.2.0 - version: 19.2.7 - react-dom: - specifier: ^19.2.0 - version: 19.2.7(react@19.2.7) - zod: - specifier: ^4.3.6 - version: 4.4.3 - -packages: - - '@babel/code-frame@7.29.7': - resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} - engines: {node: '>=6.9.0'} - - '@babel/compat-data@7.29.7': - resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==} - engines: {node: '>=6.9.0'} - - '@babel/core@7.29.7': - resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==} - engines: {node: '>=6.9.0'} - - '@babel/generator@7.29.7': - resolution: {integrity: sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-annotate-as-pure@7.29.7': - resolution: {integrity: sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-compilation-targets@7.29.7': - resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==} - engines: {node: '>=6.9.0'} - - '@babel/helper-create-class-features-plugin@7.29.7': - resolution: {integrity: sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-globals@7.29.7': - resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-member-expression-to-functions@7.29.7': - resolution: {integrity: sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-imports@7.29.7': - resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-transforms@7.29.7': - resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-optimise-call-expression@7.29.7': - resolution: {integrity: sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==} - engines: {node: '>=6.9.0'} - - '@babel/helper-plugin-utils@7.29.7': - resolution: {integrity: sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-replace-supers@7.29.7': - resolution: {integrity: sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-skip-transparent-expression-wrappers@7.29.7': - resolution: {integrity: sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-string-parser@7.29.7': - resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-identifier@7.29.7': - resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-option@7.29.7': - resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==} - engines: {node: '>=6.9.0'} - - '@babel/helpers@7.29.7': - resolution: {integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==} - engines: {node: '>=6.9.0'} - - '@babel/parser@7.29.7': - resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==} - engines: {node: '>=6.0.0'} - hasBin: true - - '@babel/plugin-syntax-jsx@7.29.7': - resolution: {integrity: sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-typescript@7.29.7': - resolution: {integrity: sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-modules-commonjs@7.29.7': - resolution: {integrity: sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-typescript@7.29.7': - resolution: {integrity: sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/preset-typescript@7.29.7': - resolution: {integrity: sha512-/Foi8vKY2EVbed/1eZx0gJEEwHAIxogrySI7rULcRIvhZzbvoE/b5qG5Ghc0WKAFKOHA9SD1x7RsFlOYdutIiQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/runtime@7.29.7': - resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==} - engines: {node: '>=6.9.0'} - - '@babel/template@7.29.7': - resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} - engines: {node: '>=6.9.0'} - - '@babel/traverse@7.29.7': - resolution: {integrity: sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.29.7': - resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} - engines: {node: '>=6.9.0'} - - '@base-ui/react@1.6.0': - resolution: {integrity: sha512-/jzjTWJYXhRFO45Bev9lc3cHbmjzCMpUqbMZ2AgKy/z25mY9B6shGSNcXcjQar9n5doM0KYW1W8fcFv2jZBuMw==} - engines: {node: '>=14.0.0'} - peerDependencies: - '@date-fns/tz': ^1.2.0 - '@types/react': ^17 || ^18 || ^19 - date-fns: ^4.0.0 - react: ^17 || ^18 || ^19 - react-dom: ^17 || ^18 || ^19 - peerDependenciesMeta: - '@date-fns/tz': - optional: true - '@types/react': - optional: true - date-fns: - optional: true - - '@base-ui/utils@0.3.1': - resolution: {integrity: sha512-gFFiltORVmW/N6IILTGxizP3PBpVpysqML1ALY5Vk0mH+7faVkCknOU31goYHN5Aoek2dkjxva1XOD2Ce9WuIg==} - peerDependencies: - '@types/react': ^17 || ^18 || ^19 - react: ^17 || ^18 || ^19 - react-dom: ^17 || ^18 || ^19 - peerDependenciesMeta: - '@types/react': - optional: true - - '@bufbuild/protobuf@1.10.1': - resolution: {integrity: sha512-wJ8ReQbHxsAfXhrf9ixl0aYbZorRuOWpBNzm8pL8ftmSxQx/wnJD5Eg861NwJU/czy2VXFIebCeZnZrI9rktIQ==} - - '@codemirror/autocomplete@6.20.3': - resolution: {integrity: sha512-tlosUqb+3BbxCxZdu4tKeRghPFC+QM7q4X5YhKV2eCmPG+1r2F3f4AaSz5sCrFqUtX4Jh20VFTKecl16MgiV9g==} - - '@codemirror/commands@6.10.4': - resolution: {integrity: sha512-Ryk9y9T0FFVF0cUGhAknveAyUOl/A1qReTFi+qPKtOh2Z9F4AUBz3XOrYD4ZEgZirdugVzHvd/2/Wcwy5OliTg==} - - '@codemirror/lang-css@6.3.1': - resolution: {integrity: sha512-kr5fwBGiGtmz6l0LSJIbno9QrifNMUusivHbnA1H6Dmqy4HZFte3UAICix1VuKo0lMPKQr2rqB+0BkKi/S3Ejg==} - - '@codemirror/lang-html@6.4.11': - resolution: {integrity: sha512-9NsXp7Nwp891pQchI7gPdTwBuSuT3K65NGTHWHNJ55HjYcHLllr0rbIZNdOzas9ztc1EUVBlHou85FFZS4BNnw==} - - '@codemirror/lang-javascript@6.2.5': - resolution: {integrity: sha512-zD4e5mS+50htS7F+TYjBPsiIFGanfVqg4HyUz6WNFikgOPf2BgKlx+TQedI1w6n/IqRBVBbBWmGFdLB/7uxO4A==} - - '@codemirror/lang-markdown@6.5.0': - resolution: {integrity: sha512-0K40bZ35jpHya6FriukbgaleaqzBLZfOh7HuzqbMxBXkbYMJDxfF39c23xOgxFezR+3G+tR2/Mup+Xk865OMvw==} - - '@codemirror/language@6.12.4': - resolution: {integrity: sha512-1q4PaT+o6PbgpkJt4Q8Fv5XJxTy4FUZ4MWETtyiDw3J0Pyr9E2vqcKL+k9wcvjNTIsauxvE7OfmWj3FRPHQ76A==} - - '@codemirror/lint@6.9.7': - resolution: {integrity: sha512-28/+iWLYxKxsvGYhSYL7zaCZqLz5+FFFDq9tVsvGv9kv8RY4fFAchJ5WX9M3YrrRlTIsECjsXPqeNgnSmNP2dg==} - - '@codemirror/state@6.7.0': - resolution: {integrity: sha512-Zbl9NyscLMZkfXPQnNAIIAFftidrA1UbcJEIMp24C0Bukc2I5T8wJS0wsXYsnDOqCFJUeJ1BITGNs5CqPDSmSg==} - - '@codemirror/view@6.43.4': - resolution: {integrity: sha512-YImu23iyKfncJzT7sRy+rEqEhSc8RhOHqDxwy4WzXRKJwYm6iwf/9OJk5ctCAdZ6yi2ZqaGEvmf55fSVqMDrgg==} - - '@date-fns/tz@1.5.0': - resolution: {integrity: sha512-lwYN/vDPeNRULcepoE/LO2Pgx+7/RV+S9ARfbc9lr2DtGkOD7pAiruHvbR1RX3Qyf6ja47EWJDMsNK5vK08DJg==} - - '@dotenvx/dotenvx@1.75.1': - resolution: {integrity: sha512-/BITOC9dmS/edY2zQwZNicQ059O6RKabtQfyEafV0nGtfYRNHYy1DIPiYVcov40+tob9hfmBnbR963dS+EQ1DQ==} - hasBin: true - - '@dotenvx/primitives@0.8.0': - resolution: {integrity: sha512-VYJy0uhFm9zTJ1TxBaW/pA8bjbOM/OttaNMwZ1RHG4JKyRG7DhSdiqD1ipQoAyoD22olUtxbP78W9xY3Wd11bg==} - - '@electron/asar@3.4.1': - resolution: {integrity: sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA==} - engines: {node: '>=10.12.0'} - hasBin: true - - '@electron/fuses@1.8.0': - resolution: {integrity: sha512-zx0EIq78WlY/lBb1uXlziZmDZI4ubcCXIMJ4uGjXzZW0nS19TjSPeXPAjzzTmKQlJUZm0SbmZhPKP7tuQ1SsEw==} - hasBin: true - - '@electron/get@2.0.3': - resolution: {integrity: sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==} - engines: {node: '>=12'} - - '@electron/get@3.1.0': - resolution: {integrity: sha512-F+nKc0xW+kVbBRhFzaMgPy3KwmuNTYX1fx6+FxxoSnNgwYX6LD7AKBTWkU0MQ6IBoe7dz069CNkR673sPAgkCQ==} - engines: {node: '>=14'} - - '@electron/notarize@2.5.0': - resolution: {integrity: sha512-jNT8nwH1f9X5GEITXaQ8IF/KdskvIkOFfB2CvwumsveVidzpSc+mvhhTMdAGSYF3O+Nq49lJ7y+ssODRXu06+A==} - engines: {node: '>= 10.0.0'} - - '@electron/osx-sign@1.3.3': - resolution: {integrity: sha512-KZ8mhXvWv2rIEgMbWZ4y33bDHyUKMXnx4M0sTyPNK/vcB81ImdeY9Ggdqy0SWbMDgmbqyQ+phgejh6V3R2QuSg==} - engines: {node: '>=12.0.0'} - hasBin: true - - '@electron/rebuild@4.1.0': - resolution: {integrity: sha512-GFky+1JeO8fpSqtZCh+2wFRN/MVbAhm7tXI2M7BA1Os79OR8LEoxRtAbRPyxvmKWhEMF/p10rNJkkgP1klI13g==} - engines: {node: '>=22.12.0'} - hasBin: true - - '@electron/universal@2.0.3': - resolution: {integrity: sha512-Wn9sPYIVFRFl5HmwMJkARCCf7rqK/EurkfQ/rJZ14mHP3iYTjZSIOSVonEAnhWeAXwtw7zOekGRlc6yTtZ0t+g==} - engines: {node: '>=16.4'} - - '@electron/windows-sign@1.2.2': - resolution: {integrity: sha512-dfZeox66AvdPtb2lD8OsIIQh12Tp0GNCRUDfBHIKGpbmopZto2/A8nSpYYLoedPIHpqkeblZ/k8OV0Gy7PYuyQ==} - engines: {node: '>=14.14'} - hasBin: true - - '@emnapi/core@1.11.1': - resolution: {integrity: sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==} - - '@emnapi/runtime@1.11.1': - resolution: {integrity: sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==} - - '@emnapi/wasi-threads@1.2.2': - resolution: {integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==} - - '@esbuild/aix-ppc64@0.25.12': - resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - - '@esbuild/android-arm64@0.25.12': - resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm@0.25.12': - resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - - '@esbuild/android-x64@0.25.12': - resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - - '@esbuild/darwin-arm64@0.25.12': - resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-x64@0.25.12': - resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - - '@esbuild/freebsd-arm64@0.25.12': - resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.25.12': - resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - - '@esbuild/linux-arm64@0.25.12': - resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm@0.25.12': - resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-ia32@0.25.12': - resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-loong64@0.25.12': - resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-mips64el@0.25.12': - resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-ppc64@0.25.12': - resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-riscv64@0.25.12': - resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-s390x@0.25.12': - resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-x64@0.25.12': - resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - - '@esbuild/netbsd-arm64@0.25.12': - resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - - '@esbuild/netbsd-x64@0.25.12': - resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - - '@esbuild/openbsd-arm64@0.25.12': - resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - - '@esbuild/openbsd-x64@0.25.12': - resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - - '@esbuild/openharmony-arm64@0.25.12': - resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openharmony] - - '@esbuild/sunos-x64@0.25.12': - resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - - '@esbuild/win32-arm64@0.25.12': - resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-ia32@0.25.12': - resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-x64@0.25.12': - resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - - '@eslint-community/eslint-utils@4.9.1': - resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - - '@eslint-community/regexpp@4.12.2': - resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - - '@eslint/config-array@0.23.5': - resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - - '@eslint/config-helpers@0.6.0': - resolution: {integrity: sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - - '@eslint/core@1.2.1': - resolution: {integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - - '@eslint/js@10.0.1': - resolution: {integrity: sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - peerDependencies: - eslint: ^10.0.0 - peerDependenciesMeta: - eslint: - optional: true - - '@eslint/object-schema@3.0.5': - resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - - '@eslint/plugin-kit@0.7.2': - resolution: {integrity: sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - - '@fallow-cli/darwin-arm64@2.104.0': - resolution: {integrity: sha512-5kKt3JuoYVz5/9PpHdu8u41vOZ6CzIu+5SqNBR8MktGLVMBSERm85+NN63XqgbZrVwIC/5uiP8eHQ0RYw0qhHg==} - cpu: [arm64] - os: [darwin] - - '@fallow-cli/darwin-x64@2.104.0': - resolution: {integrity: sha512-BEwwYccutb8RxyAm3uE8vwCJ3JSLYYeREj3fpLPFFCjh9eXBBo3Q1Mu5pxBjjUeehfbR6r/FLJb9JV28bCia9g==} - cpu: [x64] - os: [darwin] - - '@fallow-cli/linux-arm64-gnu@2.104.0': - resolution: {integrity: sha512-IyIkmwxm0AfVKXfHYuSBO6Fzt6fgZsRE0arbtObeDlKSv7zZMzqHZPpbSGZxPEmVODBMScdSxxaFSli9xFHBTA==} - cpu: [arm64] - os: [linux] - - '@fallow-cli/linux-arm64-musl@2.104.0': - resolution: {integrity: sha512-YskAeLCUUPnbwqtMC452ksI+miw6hN4K6peTFRJ0j2gSpkTriJfUgkudFB1+JX2/YqV41yDAqe5XeDYhuXxjOA==} - cpu: [arm64] - os: [linux] - - '@fallow-cli/linux-x64-gnu@2.104.0': - resolution: {integrity: sha512-v3Um0fXwTPg7kGRD1hKeS36A7P/3J7h3TiQ2KAzE8ThKkDViHYjKGEkajtGGSIj/Tv+GVnJBOvJ7i752/6iSBA==} - cpu: [x64] - os: [linux] - - '@fallow-cli/linux-x64-musl@2.104.0': - resolution: {integrity: sha512-wMVyeSp5uHvzVUgNHk6xuTCisVOAUv8FTC6z1swANdLQlQgd4Trnu8GYwhJhO7cU9RuL85yn1XksCs6+PkRM8A==} - cpu: [x64] - os: [linux] - - '@fallow-cli/win32-arm64-msvc@2.104.0': - resolution: {integrity: sha512-qDRn7zoRKVAHVz+BqKUnUPa8H4gD/g26Fs/hqH9futbthecgjXmPyRJwycE8HTQBNlVwck5d5w36a+PEPsCYaQ==} - cpu: [arm64] - os: [win32] - - '@fallow-cli/win32-x64-msvc@2.104.0': - resolution: {integrity: sha512-irER9HuZ9DXunl4H9RNsWQ9AvGmHs/Zp1+Yr2ATmgSNumERPXvgXa2IiGtCvKFqI72639TlhUj8+2WqIXZ54WQ==} - cpu: [x64] - os: [win32] - - '@floating-ui/core@1.7.5': - resolution: {integrity: sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==} - - '@floating-ui/dom@1.7.4': - resolution: {integrity: sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==} - - '@floating-ui/dom@1.7.6': - resolution: {integrity: sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==} - - '@floating-ui/react-dom@2.1.8': - resolution: {integrity: sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' - - '@floating-ui/utils@0.2.11': - resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==} - - '@fontsource-variable/inter@5.2.8': - resolution: {integrity: sha512-kOfP2D+ykbcX/P3IFnokOhVRNoTozo5/JxhAIVYLpea/UBmCQ/YWPBfWIDuBImXX/15KH+eKh4xpEUyS2sQQGQ==} - - '@fontsource-variable/public-sans@5.2.7': - resolution: {integrity: sha512-4mvade2J3slKkvwRkS+p8T3szet/0vhWoSnuUJTVU81Uo2pRpSZY/Y8bSLRqpSwzIPxjVmRJ53oq6JKP/l/PSg==} - - '@hono/node-server@1.19.14': - resolution: {integrity: sha512-GwtvgtXxnWsucXvbQXkRgqksiH2Qed37H9xHZocE5sA3N8O8O8/8FA3uclQXxXVzc9XBZuEOMK7+r02FmSpHtw==} - engines: {node: '>=18.14.1'} - peerDependencies: - hono: ^4 - - '@humanfs/core@0.19.2': - resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} - engines: {node: '>=18.18.0'} - - '@humanfs/node@0.16.8': - resolution: {integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==} - engines: {node: '>=18.18.0'} - - '@humanfs/types@0.15.0': - resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==} - engines: {node: '>=18.18.0'} - - '@humanwhocodes/module-importer@1.0.1': - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - - '@humanwhocodes/retry@0.4.3': - resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} - engines: {node: '>=18.18'} - - '@isaacs/fs-minipass@4.0.1': - resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} - engines: {node: '>=18.0.0'} - - '@jridgewell/gen-mapping@0.3.13': - resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} - - '@jridgewell/remapping@2.3.5': - resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} - - '@jridgewell/resolve-uri@3.1.2': - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} - - '@jridgewell/sourcemap-codec@1.5.5': - resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - - '@jridgewell/trace-mapping@0.3.31': - resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - - '@lezer/common@1.5.2': - resolution: {integrity: sha512-sxQE460fPZyU3sdc8lafxiPwJHBzZRy/udNFynGQky1SePYBdhkBl1kOagA9uT3pxR8K09bOrmTUqA9wb/PjSQ==} - - '@lezer/css@1.3.4': - resolution: {integrity: sha512-N+tn9tej2hPvyKgHEApMOQfHczDJCwxrRFS3SPn9QjYN+uwHvEDnCgKRrb3mxDYxRS8sKMM8fhC3+lc04Abz5Q==} - - '@lezer/highlight@1.2.3': - resolution: {integrity: sha512-qXdH7UqTvGfdVBINrgKhDsVTJTxactNNxLk7+UMwZhU13lMHaOBlJe9Vqp907ya56Y3+ed2tlqzys7jDkTmW0g==} - - '@lezer/html@1.3.13': - resolution: {integrity: sha512-oI7n6NJml729m7pjm9lvLvmXbdoMoi2f+1pwSDJkl9d68zGr7a9Btz8NdHTGQZtW2DA25ybeuv/SyDb9D5tseg==} - - '@lezer/javascript@1.5.4': - resolution: {integrity: sha512-vvYx3MhWqeZtGPwDStM2dwgljd5smolYD2lR2UyFcHfxbBQebqx8yjmFmxtJ/E6nN6u1D9srOiVWm3Rb4tmcUA==} - - '@lezer/lr@1.4.10': - resolution: {integrity: sha512-rnCpTIBafOx4mRp43xOxDJbFipJm/c0cia/V5TiGlhmMa+wsSdoGmUN3w5Bqrks/09Q/D4tNAmWaT8p6NRi77A==} - - '@lezer/markdown@1.6.4': - resolution: {integrity: sha512-N0SxazMj4k65DBfaf1azqtMZd6u7MqluP84/NZnB/io8Td9aleFmAhz9hcbvSfsxT5tdYlJ5qgv5aMJGY4zEtA==} - - '@livekit/components-core@0.12.13': - resolution: {integrity: sha512-DQmi84afHoHjZ62wm8y+XPNIDHTwFHAltjd3lmyXj8UZHOY7wcza4vFt1xnghJOD5wLRY58L1dkAgAw59MgWvw==} - engines: {node: '>=18'} - peerDependencies: - livekit-client: ^2.17.2 - tslib: ^2.6.2 - - '@livekit/components-react@2.9.21': - resolution: {integrity: sha512-6hU9VucJJL+gAhilNGe4MBCDCZVk64qyjP9Ck86krvOIdVU76WeWksddg1MYUP10AlUwwrfD7davz41pJTcMJw==} - engines: {node: '>=18'} - peerDependencies: - '@livekit/krisp-noise-filter': ^0.2.12 || ^0.3.0 - livekit-client: ^2.18.2 - react: '>=18' - react-dom: '>=18' - tslib: ^2.6.2 - peerDependenciesMeta: - '@livekit/krisp-noise-filter': - optional: true - - '@livekit/mutex@1.1.1': - resolution: {integrity: sha512-EsshAucklmpuUAfkABPxJNhzj9v2sG7JuzFDL4ML1oJQSV14sqrpTYnsaOudMAw9yOaW53NU3QQTlUQoRs4czw==} - - '@livekit/protocol@1.46.6': - resolution: {integrity: sha512-upzlHP1vi/kZ/QqALZTFskQ0ifqc2f15RKucHYOsIHJsaXvEYanG75mAb7o+Yomfs4XhQ4BaRsdY+TFHXpaqrg==} - - '@malept/cross-spawn-promise@2.0.0': - resolution: {integrity: sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==} - engines: {node: '>= 12.13.0'} - - '@malept/flatpak-bundler@0.4.0': - resolution: {integrity: sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==} - engines: {node: '>= 10.0.0'} - - '@marijn/find-cluster-break@1.0.3': - resolution: {integrity: sha512-FY+MKLBoTsLNJF/eLWaOsXGdz6uh3Iu1axjPf6TUq92IYumcTcXWHoS747JARLkcdlJ/Waiaxc5wQfFO8jC6NA==} - - '@modelcontextprotocol/sdk@1.29.0': - resolution: {integrity: sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ==} - engines: {node: '>=18'} - peerDependencies: - '@cfworker/json-schema': ^4.1.1 - zod: ^3.25 || ^4.0 - peerDependenciesMeta: - '@cfworker/json-schema': - optional: true - - '@napi-rs/wasm-runtime@1.1.6': - resolution: {integrity: sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==} - peerDependencies: - '@emnapi/core': ^1.7.1 - '@emnapi/runtime': ^1.7.1 - - '@noble/hashes@1.4.0': - resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} - engines: {node: '>= 16'} - - '@noble/hashes@2.2.0': - resolution: {integrity: sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg==} - engines: {node: '>= 20.19.0'} - - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - - '@oxc-project/types@0.138.0': - resolution: {integrity: sha512-1a7ZKmrRTCoN1XMZ4L0PyyqrMnrNlLyPuOkdSX2MZg7IiIGRUyurNhAm73ptDOraoBcIordsIGKNPKUzy3ZmfA==} - - '@peculiar/asn1-schema@2.8.0': - resolution: {integrity: sha512-7YT0U/ze0tF2QOBbE15gKZwy5tvgGyLRiRHLzhlbOpf7BT032oBSd0haZqXn5W6l26WLlu3dyxzjM+2638/z2Q==} - - '@peculiar/json-schema@1.1.12': - resolution: {integrity: sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==} - engines: {node: '>=8.0.0'} - - '@peculiar/utils@2.0.3': - resolution: {integrity: sha512-+oL3HPFRIZ1St2K50lWCXiioIgSoxzz7R1J3uF6neO2yl1sgmpgY6XXJH4BdpoDkMWznQTeYF6oWNDZLCdQ4eQ==} - - '@peculiar/webcrypto@1.7.1': - resolution: {integrity: sha512-ODOov0sGMJMf3jPonOkgGqPknTsu+DdQ7kD++gz8aI+aFMOMHFbWAA2taqXXVTdP+OTOQR/znGvSpmkeI0WTYQ==} - engines: {node: '>=14.18.0'} - - '@radix-ui/primitive@1.1.4': - resolution: {integrity: sha512-7AdCK9PQyiljKoBDbN8OuctCbd/esdwZPQ8RtOE3SsyQtUpiPb+ND75q0jEhC1m1ecBI0MFNeLJvwIh9iKHRcQ==} - - '@radix-ui/react-compose-refs@1.1.3': - resolution: {integrity: sha512-rYOP8OMnuuPMQF1uhPVlGNcCDlkokKqGFE3JcxFViIkAXP7EvFWUliJAstrapypaBLJNHbZL6jGhbVDGTwmVhA==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-context@1.1.4': - resolution: {integrity: sha512-QwH4PO5urrbO+FaGd5Aglg+YJgWTyyuZ3g/6mKvsqraLkglDdckw9JafgL5McL5VEJ6EPNduPaT3ZE9BttDAqg==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-dialog@1.1.18': - resolution: {integrity: sha512-apa28mldjMgORmE6g/w3sCcA0Y9UAVeeDVoozN4i7kOw12mLl9RBchfzK3Nn6qxOWjrZhK1Lfy7f07kyzxtnBw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-dismissable-layer@1.1.14': - resolution: {integrity: sha512-4lUhWTWAjbDIqFrAPWJ3WqBOpO5YchVZ88X3nh6H9Lu5AFi5nCUeTPj3D8FSDmabmFeRe9ME0BDA4MwKTha5GQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-focus-guards@1.1.4': - resolution: {integrity: sha512-cot/aB/mOm0IYVYTTmQcEEK1M48lZWi8FlYe5nDPQQ8NYZUlXEFgncJ9p2Kzer3RKSrY7cTTpEMLZKNo9QoP5Q==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-focus-scope@1.1.11': - resolution: {integrity: sha512-Mn88Vg2whaRocGJNOH+DKFqYm6ySFPQaiwHNxZPyjn99B52KAEJWWY9NP83+nWdk2HM3rdov+STu9AG471Rt9w==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-id@1.1.2': - resolution: {integrity: sha512-orBC88futVpqCmhX1p4cvquNHsELQ+w+vBJnuj3ftETI5bJb0bZn3Tqu3SWN2IOcPycTnMGnhwoermvISt72sA==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-portal@1.1.13': - resolution: {integrity: sha512-z3oXfmaHLJTF1wktbjgD6cn9jiEbq3WSondB10LIuIt2m2Ym4iJlrW04/euMwENDdWDdE7z+OuY7Qyp1YpRSwA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-presence@1.1.6': - resolution: {integrity: sha512-zdTk4PlUO0E18HnZ3wYbW0KkJJxWCdiNYp6g6X1PtONFhxVkg01vliTJAmwIszU6mHiyBOoW9P0rAugl5/hULQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-primitive@2.1.7': - resolution: {integrity: sha512-bC3NiwsprbxKjuon9l7X6BUTw7FPVzEYaL92MPEY5SCd/9hUTPXVFtVwRix7778wtRsVao+zE062gL79FZleeQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-slot@1.3.0': - resolution: {integrity: sha512-MojKku4U/miO8Av4Dkb+ctMAQx7JmY96LmtDQlAarCRtd7rN52QCSzBF+XAvr5S6coSVj9HEPBgHAHKEJVk/WA==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-callback-ref@1.1.2': - resolution: {integrity: sha512-xCso9j1/u8sEgP1RNHjFrXJLApL8LiqOkI1R4ywuN00rxWdYg4oQXuwKLS3i0j5NWLromUD27/4nlxj2UFVvIw==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-controllable-state@1.2.3': - resolution: {integrity: sha512-PLzC90MS+ReootmjC597dvopoelpZ8Q61HJkDXZSExitIq7PL55vHNnesAHwguHK0aPfBnpdNzQtv1uliaqQrA==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-effect-event@0.0.2': - resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-effect-event@0.0.3': - resolution: {integrity: sha512-6c8ZqvPTWILEKnyVkP53EGRCcpnJiKTC21sS/6R1GF5xKyHJJWQEPfkqlcgUkdRQivd6tb23abUwe4ngWmY0JA==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-layout-effect@1.1.1': - resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-layout-effect@1.1.2': - resolution: {integrity: sha512-jrBWOxZITuGcnjRCM2t2U5ZPkCLxD+Ym6DjfssS5haTj2iiak/DOb64JeN6OdLfLgptb6/e2kKR+ZuTrGoZTPA==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@reduxjs/toolkit@2.12.0': - resolution: {integrity: sha512-KiT+RzZbp6mQET+Mg+h2c97+9j1sNflUxQkIHI7Yuzf6Peu+OYpmkn6nbHWmLLWj+1ZODUJFwGZ7gx3L9R9EOw==} - peerDependencies: - react: ^16.9.0 || ^17.0.0 || ^18 || ^19 - react-redux: ^7.2.1 || ^8.1.3 || ^9.0.0 - peerDependenciesMeta: - react: - optional: true - react-redux: - optional: true - - '@rolldown/binding-android-arm64@1.1.4': - resolution: {integrity: sha512-EZLpf/8y7GXkkra90ML47kzik/GMP3EMcE9bPyHmRfxLC6z9+aW5A8poCsoxjrT5GfEcNAAvWwUHjvP1pUQkfw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [android] - - '@rolldown/binding-darwin-arm64@1.1.4': - resolution: {integrity: sha512-aUi+HBvmYb7j8krl1+qJgkG8C17fO79gk3c+jPw4S8glRFc1DTija9S3EyaTSQUm5GJXYKDAsugBEhFHH2vYiQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [darwin] - - '@rolldown/binding-darwin-x64@1.1.4': - resolution: {integrity: sha512-F7hHC3gwY11+vByKPRWqwGbeXWVgKmL+pTGCinaEhdihzBV2aQ0fvZOch9cXYUOKuKKq429HeYXOqQLc7wFCEg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [darwin] - - '@rolldown/binding-freebsd-x64@1.1.4': - resolution: {integrity: sha512-sI5yw+7s92SK6odiEhD5lKCBlWcpjHS5qyqpVQbZAJ0fIzEUXrmbl3DH2ybR3PZogulNJF+COLtmA8hUfvkCCQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [freebsd] - - '@rolldown/binding-linux-arm-gnueabihf@1.1.4': - resolution: {integrity: sha512-mCi0OKgEieFircrtVYmQAFGszRtMnZ6fpZAXrxanXAu7lqZcsK1E1RAaZNG0uKAnxox3B1f4EyQNnoyMfN1vAA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm] - os: [linux] - - '@rolldown/binding-linux-arm64-gnu@1.1.4': - resolution: {integrity: sha512-B9Ial3Kv5sh0SHnB1g/QWcUQCEvCF6QKGAl4zXypYj65mVI+B4AhFBwPtSN7pDrJeIx8Z7zdy4ntx+wQABom7w==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [linux] - libc: [glibc] - - '@rolldown/binding-linux-arm64-musl@1.1.4': - resolution: {integrity: sha512-lZVym0PuHE1KZ22gmFTC15lAkrg9iTszR617oYRB/iPY1A56ywoJzVKOJBKaot5RiikCObmur6pogpse3gRcng==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [linux] - libc: [musl] - - '@rolldown/binding-linux-ppc64-gnu@1.1.4': - resolution: {integrity: sha512-t2DNiLJWNTbnEHyUzTumldML6ET4/g16467LZoDDJ3tSxGvguL5/NyC2lCsNKuyRycg9XeDQF5SSv+TNOhQEXg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [ppc64] - os: [linux] - libc: [glibc] - - '@rolldown/binding-linux-s390x-gnu@1.1.4': - resolution: {integrity: sha512-0WIRnL1Uw4BvTZRLQt+PVgo6ZKTJadlC2btP+/EOXv2f/DWbY0rEgl+y834mIVwP1FkTlWVTrGGJXf12lru7EQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [s390x] - os: [linux] - libc: [glibc] - - '@rolldown/binding-linux-x64-gnu@1.1.4': - resolution: {integrity: sha512-JWtGshGfX+oENAKonoNkqEJX+7hC8yfhi9GUyPX1VX4mdh1y5r+ZiJLR5XzAB0aoP6s/PcILsGjKq8O0mm24bw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [linux] - libc: [glibc] - - '@rolldown/binding-linux-x64-musl@1.1.4': - resolution: {integrity: sha512-rT6yQcxUuXs4CnbofqwHRRV0iem349rLMYpTjkgQGLjrY4ado/eDzwPZPTCgTOlF6Nkp8NEv70yLMTn6qkWxsQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [linux] - libc: [musl] - - '@rolldown/binding-openharmony-arm64@1.1.4': - resolution: {integrity: sha512-KXMGoboq5cyaCQjDA4GLuRiOwBQ0EyFnJoVViLeZ45/3rFItRODEr+NdsBcVpll40hhNArlm/speWGRvj08LzA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [openharmony] - - '@rolldown/binding-wasm32-wasi@1.1.4': - resolution: {integrity: sha512-5K83rb36oJiY7BCyE9zLZtGcPV4g5wvq+xwdO0XPIwDVZI8cyB/AUjkNXGb92/rnmezEkjMOpgY61rtwjQtFwg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [wasm32] - - '@rolldown/binding-win32-arm64-msvc@1.1.4': - resolution: {integrity: sha512-PnWBtw3TV5KOg69HQQDR0mnQuyCmSGR2pAB4DC1rPF808fgKeTUMj2EOEyKATpgiuxuR5APQmiDO7PDgEjTFSA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [win32] - - '@rolldown/binding-win32-x64-msvc@1.1.4': - resolution: {integrity: sha512-M1lpniBePobTfsa7Ks9a199e1akxsXn+GYBUKsEzv3YFzOm1HJAMNwKI3qr0Zq+mxwx9gOZoTdP1yXRYsZUocQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [win32] - - '@rolldown/pluginutils@1.0.1': - resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} - - '@sec-ant/readable-stream@0.4.1': - resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} - - '@sindresorhus/is@4.6.0': - resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} - engines: {node: '>=10'} - - '@sindresorhus/merge-streams@4.0.0': - resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} - engines: {node: '>=18'} - - '@standard-schema/spec@1.1.0': - resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} - - '@standard-schema/utils@0.3.0': - resolution: {integrity: sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==} - - '@szmarczak/http-timer@4.0.6': - resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} - engines: {node: '>=10'} - - '@tailwindcss/node@4.3.2': - resolution: {integrity: sha512-yWP/sqEcBLaD8JuA6zNwxoYKr75qxTioYwlRwekj5Jr/I5GXnoJfjetH/psLUIv74cYTH2lBUEzBkinthoYcBg==} - - '@tailwindcss/oxide-android-arm64@4.3.2': - resolution: {integrity: sha512-WHxqIuHpvZ5VtdX6GTl1Ik/Vp2YuN42Et+0CdeaVd/frQ9jAvGmvR8vLT+jk3e8/Q3x8kECB9+R17pgpp2BulA==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [android] - - '@tailwindcss/oxide-darwin-arm64@4.3.2': - resolution: {integrity: sha512-GZypeUY/IDJW3877KeM+O67vbXr3MBnbtEL4aYhNErv/JWZhye2vGSWWG9tB6iiqR2MqRNkY8IOUy4NdSZV26w==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [darwin] - - '@tailwindcss/oxide-darwin-x64@4.3.2': - resolution: {integrity: sha512-UIIzmefR6KO1sDU7MzRqAxC8iBpft/VhkGjTjnhoS6k7Z3rQ9wEgA1ODSiyH/tcSYssulNm4Ci3hOeK1jH7ccQ==} - engines: {node: '>= 20'} - cpu: [x64] - os: [darwin] - - '@tailwindcss/oxide-freebsd-x64@4.3.2': - resolution: {integrity: sha512-GN+uAmcI6DNspnCDwtOAZrTz6oukJnp337qZvxqCGLd3BHBzJpO0ZbTLRvJNdztOeAmTzewewGIMPb0tk2R4WA==} - engines: {node: '>= 20'} - cpu: [x64] - os: [freebsd] - - '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.2': - resolution: {integrity: sha512-4ABn7qSbdHRwTiDiuWNegCyb5+2FJ4vKIKc3DmKrvAFw7MU1Lm11dIkTPwUaFdTzc7IsOpDbqBrlh0x6y36U/w==} - engines: {node: '>= 20'} - cpu: [arm] - os: [linux] - - '@tailwindcss/oxide-linux-arm64-gnu@4.3.2': - resolution: {integrity: sha512-wDgEIGwoM8w8pufh9LVt1PahDgNdKXrLC2qfAnV3vAmococ9RWbxeAw4pxPttd/TsJfwjyLf90Dg1y9y8I6Emw==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [linux] - libc: [glibc] - - '@tailwindcss/oxide-linux-arm64-musl@4.3.2': - resolution: {integrity: sha512-J5Nuk0uZQIiMTJj3LEx4sAA9tMFUoXQZFv1J6An+QGYe53HKRJuFDi0rpq/tuouCZeAbOBY3kQ6g8qeD4TUjtA==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [linux] - libc: [musl] - - '@tailwindcss/oxide-linux-x64-gnu@4.3.2': - resolution: {integrity: sha512-kqCZpSKOBEJO4mz7OqWoofBZeXTAwaVGPj0ErAj7CojmhKpWVWVOnrt9dE8odoIraZq4oj3ausM37kXi+Tow8w==} - engines: {node: '>= 20'} - cpu: [x64] - os: [linux] - libc: [glibc] - - '@tailwindcss/oxide-linux-x64-musl@4.3.2': - resolution: {integrity: sha512-cixpqbh2toJDmkuCRI68nXA8ZxNmdK9Y+9v5h3MC3ZQKy/0BO8AWzlkWyRM7JAFSGBlfig4YVTPsK6MVgqz1uw==} - engines: {node: '>= 20'} - cpu: [x64] - os: [linux] - libc: [musl] - - '@tailwindcss/oxide-wasm32-wasi@4.3.2': - resolution: {integrity: sha512-4ec2Z/LOmRsAgU23CS4xeJfcJlmRg94A/XrbGRCF1gyU/zdDfRLYDVsS+ynSZCmGNxQ1jQriQOKMQeQxBA3Isw==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] - bundledDependencies: - - '@napi-rs/wasm-runtime' - - '@emnapi/core' - - '@emnapi/runtime' - - '@tybys/wasm-util' - - '@emnapi/wasi-threads' - - tslib - - '@tailwindcss/oxide-win32-arm64-msvc@4.3.2': - resolution: {integrity: sha512-Zyr/M0+XcYZu3bZrUytc7TXvrk0ftWfl8gN2MwekNDzhqhKRUucMPSeOzM0o0wH5AWOU49BsKRrfKxI2atCPMQ==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [win32] - - '@tailwindcss/oxide-win32-x64-msvc@4.3.2': - resolution: {integrity: sha512-QI9BO7KlNZsp2GuO0jwAAj5jCDABOKXRkCk2XuKTSaNEFSdfzqswYVTtCHBNKHLsqyjFyFkqlDiwkNbTYSssMQ==} - engines: {node: '>= 20'} - cpu: [x64] - os: [win32] - - '@tailwindcss/oxide@4.3.2': - resolution: {integrity: sha512-z8ZgnzX8gdNoWLBLqBPoh/sjnxkwvf9ZuWjnO0l0yIzbLa5/9S+eC5QxGZKRobVHIC3/1BoMWjHblqWjcgFgag==} - engines: {node: '>= 20'} - - '@tailwindcss/vite@4.3.2': - resolution: {integrity: sha512-eHpMeX4JXfVNJDEcsouTeCBubJBTcTLigeaw/NTUW6PB5ATKKXdyonnXgTBX2VuRbjz1hjfz6C5XAhr52ImQXA==} - peerDependencies: - vite: ^5.2.0 || ^6 || ^7 || ^8 - - '@tanstack/devtools-event-client@0.3.5': - resolution: {integrity: sha512-RL1f5ZlfZMpghrCIdzl6mLOFLTuhqmPNblZgBaeKfdtk5rfbjykurv+VfYydOFXj0vxVIoA2d/zT7xfD7Ph8fw==} - engines: {node: '>=18'} - - '@tanstack/devtools-event-client@0.4.4': - resolution: {integrity: sha512-6T5Yop/793YI+H+5J8Hsyj4kCih9sl4t3ElLgKioW5hk3ocn+ZdSJ94tT7vL7uabxSugWYBZlOTMPzEw2puvQw==} - engines: {node: '>=18'} - hasBin: true - - '@tanstack/history@1.162.0': - resolution: {integrity: sha512-79pf/RkhteYZTRgcR4F9kbk84P2N8rugQJswxfIqovlbRiT3yI7eBE+5QorIrZaOKktsgzRlXh1l/du/xpl4iA==} - engines: {node: '>=20.19'} - - '@tanstack/pacer@0.21.1': - resolution: {integrity: sha512-hB01dd4rlsYcTCNP7wK186jgAe6K5qimgM1Y5Jtvz+9PUaILvpmeLLjmQNUNSO1l23lIt+CeQR6mO1mjlPvRtQ==} - engines: {node: '>=18'} - - '@tanstack/query-core@5.101.2': - resolution: {integrity: sha512-hH5MLoJhF7KaIGd7q3xTXGXvslI+GYlM1Z/35aSHHWaCJWB7XvTSHYuV3eM7tw+aE0mT/xMro4M4Q9rCGHT0lw==} - - '@tanstack/react-query@5.101.2': - resolution: {integrity: sha512-seDkr6kzGzX1okaaTtZPtgA688CDPlXUz1C6xSg0ESqn04Vuc8tlrYms1s3de+znBqhPVxFRfpAfUf+6XvfPWg==} - peerDependencies: - react: ^18 || ^19 - - '@tanstack/react-router@1.170.17': - resolution: {integrity: sha512-ppLkjCfSMaeug9rmFRYzOd4TIqWV+yTE7tzIny7alJsSnM7w4lzEZm6eqCehG0SPetpZ0R3K+UnanSmBgOAVcQ==} - engines: {node: '>=20.19'} - peerDependencies: - react: '>=18.0.0 || >=19.0.0' - react-dom: '>=18.0.0 || >=19.0.0' - - '@tanstack/react-store@0.9.3': - resolution: {integrity: sha512-y2iHd/N9OkoQbFJLUX1T9vbc2O9tjH0pQRgTcx1/Nz4IlwLvkgpuglXUx+mXt0g5ZDFrEeDnONPqkbfxXJKwRg==} - 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 - - '@tanstack/react-virtual@3.14.5': - resolution: {integrity: sha512-4EKRXh7zBLkbKbFmG3AUVkircuHd+7OdT1pocJSepxtfBd3qnrJgJ5rtPkRYyo9fmyVb2+pI2xPy5oYvMLQy6A==} - 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 - - '@tanstack/router-core@1.171.14': - resolution: {integrity: sha512-Mo3hwx0qB0cJsVYGDjG0+Ouf7VV74h/vsoDMGztdlyzDanp4gBA2s7IVvm6hFrmQM6GpD9F0Z7SqD7OldfLE7g==} - engines: {node: '>=20.19'} - - '@tanstack/store@0.11.0': - resolution: {integrity: sha512-WlzzCt3xi0G6pCAJu1U+2jiECwabETDpQDi3hfkFZvJii9AuZqEKbOiVarX1/bWhTNjU486yQtJCCasi/0q+Cw==} - - '@tanstack/store@0.9.3': - resolution: {integrity: sha512-8reSzl/qGWGGVKhBoxXPMWzATSbZLZFWhwBAFO9NAyp0TxzfBP0mIrGb8CP8KrQTmvzXlR/vFPPUrHTLBGyFyw==} - - '@tanstack/virtual-core@3.17.3': - resolution: {integrity: sha512-8Np/TFELpI0ySuJoVmjvOrQYXH/8sTX0Biv9szhFhY39xOdAAY+smrMxjxOum/ux3eM8MUJQsEJ0/R0UpvC8dw==} - - '@tauri-apps/api@2.11.1': - resolution: {integrity: sha512-M2FPuYND2m+wh5hfW9ZpSdxMPdEJovPBWwoHJmwUpysTYNHaOkVFN419m/K0LIgjb/7KU2vBgsUepJWugQCvAA==} - - '@tauri-apps/cli-darwin-arm64@2.11.4': - resolution: {integrity: sha512-1ryOF3ZhpZ/nemHV5zVwBQBz9jDGKmKPvWPADOhc83ig0P4bMc2iER4NbC6r9sjeIZ6RVQ4g3RZIYvezhcl4TQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - '@tauri-apps/cli-darwin-x64@2.11.4': - resolution: {integrity: sha512-uFsGQAAfuyz1k/yGLmkWfkBlgKAqZfxqlHmLWx81QU27RJWfmbNHCIq8T8w1e+VClleIuZUjpHWfoE4E3DLo3A==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - '@tauri-apps/cli-linux-arm-gnueabihf@2.11.4': - resolution: {integrity: sha512-IaHZn5CdBL21oUmjiVOS1ctw6Ip1O0pjp70FwOWmYz1myWe0SY96ZIj2FYf7pT0m8bI2h/hrs5ZbEXXh44/MkQ==} - engines: {node: '>= 10'} - cpu: [arm] - os: [linux] - - '@tauri-apps/cli-linux-arm64-gnu@2.11.4': - resolution: {integrity: sha512-N41/ukTRVe6XSuUTESuFdGeOW2i7k62tK+6gHK5Kd5/q5RPvvi19GaWAVPPb9u95HSGmTChSolBfzynUsssFaA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - libc: [glibc] - - '@tauri-apps/cli-linux-arm64-musl@2.11.4': - resolution: {integrity: sha512-v277UnT/fB64xAfSroL5N3Km3tLmvATWqJJw/wRI+g6o+HkeD0slyE7gOhNs1MbjE41R7bQOTxMVoL3aomUJmw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - libc: [musl] - - '@tauri-apps/cli-linux-riscv64-gnu@2.11.4': - resolution: {integrity: sha512-qqgNkQ2u1yZHxjhxsZaxUtRDW8dIqIYm33rx/mzwQv0SfY9x1B+iraj8vWeFiXjjSVVhEMepXSOts1TqPzvXNQ==} - engines: {node: '>= 10'} - cpu: [riscv64] - os: [linux] - libc: [glibc] - - '@tauri-apps/cli-linux-x64-gnu@2.11.4': - resolution: {integrity: sha512-2VRNWl84FOH0m2giiDkO2h0QXlcMJeX+zJDpI5kDIQAx6s+geF3v48F4DXfJez4GS/FdoDGnPnw1C2iYGbQ7bQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [glibc] - - '@tauri-apps/cli-linux-x64-musl@2.11.4': - resolution: {integrity: sha512-o9GyhYor/nc7xarmwDE3ka2szuW3uuZzXjHWh64Q8YX5AtSgxdQkFWzrY4O8KiGtVNvFBI14H3Q49Qj5TOIP/A==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [musl] - - '@tauri-apps/cli-win32-arm64-msvc@2.11.4': - resolution: {integrity: sha512-ld5Ehb598m0VkYyylRPNeCFsBe/km0jxis6KgMpl3IGY6I/i1RwQXO05I1AsXUXO2WC6AvB/Lw4qTf/asiuEiQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - - '@tauri-apps/cli-win32-ia32-msvc@2.11.4': - resolution: {integrity: sha512-12Hxi0XX/H5VFxO/bGgHkFWhml9VMgEOu9CidjeCeTNQ1l6fpUlbiGgSP7CLI3PFtW9/FfbeHieZ+kyWK5H7CA==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] - - '@tauri-apps/cli-win32-x64-msvc@2.11.4': - resolution: {integrity: sha512-+vDiqBIU5dMISg/wNvX3sF+ZHfgJGJ5T0AcO+EHNXV9GGAG+P5fzodlDXD3QdKCRgZxMoCm5PPvj3BqLNjBthw==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - - '@tauri-apps/cli@2.11.4': - resolution: {integrity: sha512-R8xGtMpwyetawSqm9kYOuMmEqkhUbvcUy8n0aNXIxollKBLESUu5f4Fx+64hgASYm1H+jSWq6jCW6zqTnH6hqQ==} - engines: {node: '>= 10'} - hasBin: true - - '@tauri-apps/plugin-barcode-scanner@2.4.5': - resolution: {integrity: sha512-sIPRYEfxww8/y8skZ2LcAp/h5bwvlHkQiq+3w6QEl+2BHs13xnpn7hP+pv4fkBs8DyDfpUbOBIYS5YBwP7x1QQ==} - - '@tauri-apps/plugin-deep-link@2.4.9': - resolution: {integrity: sha512-u0SKOUHnJ1wqeqXsDFq2+kASCBj9xxbG0g9XZWPy9SOmU4wXtp6b/wiYpm6oH6/5fBTQsLqnLhIvqLBRpgHJlA==} - - '@tauri-apps/plugin-log@2.8.0': - resolution: {integrity: sha512-a+7rOq3MJwpTOLLKbL8d0qGZ85hgHw5pNOWusA9o3cf7cEgtYHiGY/+O8fj8MvywQIGqFv0da2bYQDlrqLE7rw==} - - '@tauri-apps/plugin-notification@2.3.3': - resolution: {integrity: sha512-Zw+ZH18RJb41G4NrfHgIuofJiymusqN+q8fGUIIV7vyCH+5sSn5coqRv/MWB9qETsUs97vmU045q7OyseCV3Qg==} - - '@tensamin/ui@https://git.methanium.net/tensamin/ui/releases/download/0.0.40/tensamin-ui.tgz': - resolution: {integrity: sha512-xyzw3/XAYKczV1cYQ2QuzhFzFYbU9U2U/gi/TMU/U7MC0vp1xHCVssTcB1kot8yk9YEIEcDBK2X49Ftzj6bJeQ==, tarball: https://git.methanium.net/tensamin/ui/releases/download/0.0.40/tensamin-ui.tgz} - version: 0.0.40 - peerDependencies: - react: ^19.2.7 - react-dom: ^19.2.7 - - '@ts-morph/common@0.27.0': - resolution: {integrity: sha512-Wf29UqxWDpc+i61k3oIOzcUfQt79PIT9y/MWfAGlrkjg6lBC1hwDECLXPVJAhWjiGbfBCxZd65F/LIZF3+jeJQ==} - - '@twemoji/api@17.0.3': - resolution: {integrity: sha512-iwERjxY0QgPGVwT6b1OKG0Oa9nIfHhJw+Ij1TapTBMKTvVCU6qdXPXX/XKwxKx5QZIJW5GwELUCtw8wlaIQ2ug==} - - '@twemoji/parser@17.0.2': - resolution: {integrity: sha512-X/P7pHsGOxnrupQYUVetIeuxBGgffFu8CLwoPMMjH9CWmQvlXiCpbTW/BXxMOCWXQojgHdmgdvm6IsCqAQ5nxA==} - - '@tybys/wasm-util@0.10.3': - resolution: {integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==} - - '@types/cacheable-request@6.0.3': - resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} - - '@types/chai@5.2.3': - resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} - - '@types/d3-array@3.2.2': - resolution: {integrity: sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==} - - '@types/d3-color@3.1.3': - resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} - - '@types/d3-ease@3.0.2': - resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} - - '@types/d3-interpolate@3.0.4': - resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} - - '@types/d3-path@3.1.1': - resolution: {integrity: sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==} - - '@types/d3-scale@4.0.9': - resolution: {integrity: sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==} - - '@types/d3-shape@3.1.8': - resolution: {integrity: sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==} - - '@types/d3-time@3.0.4': - resolution: {integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==} - - '@types/d3-timer@3.0.2': - resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} - - '@types/debug@4.1.13': - resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==} - - '@types/deep-eql@4.0.2': - resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} - - '@types/dom-mediacapture-record@1.0.22': - resolution: {integrity: sha512-mUMZLK3NvwRLcAAT9qmcK+9p7tpU2FHdDsntR3YI4+GY88XrgG4XiE7u1Q2LAN2/FZOz/tdMDC3GQCR4T8nFuw==} - - '@types/esrecurse@4.3.1': - resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} - - '@types/estree@1.0.9': - resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} - - '@types/fs-extra@9.0.13': - resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} - - '@types/http-cache-semantics@4.2.0': - resolution: {integrity: sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==} - - '@types/json-schema@7.0.15': - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - - '@types/keyv@3.1.4': - resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} - - '@types/ms@2.1.0': - resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - - '@types/node@22.20.0': - resolution: {integrity: sha512-QWlFW2wf3nTjC13/DqRnBpR4ZO36VJH/JVBkA/vcnmbTBNQIlnObqyqZE1tUR7+Ni23Lda8R1BxMfbXRpCUx5g==} - - '@types/node@25.9.4': - resolution: {integrity: sha512-dszCsrKb5U7ZsVZBWiHFklTloVl0mSEnWH/iZXfZUlI4rzCUnsvGmgqfuVRHL54ugE7/wRuxEIXRa2iMZ+BG6g==} - - '@types/node@26.1.0': - resolution: {integrity: sha512-O0A1G3xPGy4w7AgQdAQYUlQ+BKk2Oovw8eRpofyp5KdBZULnbe+WqaOVNrm705SHphCiG4XHsACrSmPu1f+Kgw==} - - '@types/qrcode@1.5.6': - resolution: {integrity: sha512-te7NQcV2BOvdj2b1hCAHzAoMNuj65kNBMz0KBaxM6c3VGBOhU0dURQKOtH8CFNI/dsKkwlv32p26qYQTWoB5bw==} - - '@types/react-dom@19.2.3': - resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} - peerDependencies: - '@types/react': ^19.2.0 - - '@types/react@19.2.17': - resolution: {integrity: sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==} - - '@types/responselike@1.0.3': - resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} - - '@types/use-sync-external-store@0.0.6': - resolution: {integrity: sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==} - - '@types/validate-npm-package-name@4.0.2': - resolution: {integrity: sha512-lrpDziQipxCEeK5kWxvljWYhUvOiB2A9izZd9B2AFarYAkqZshb4lPbRs7zKEic6eGtH8V/2qJW+dPp9OtF6bw==} - - '@types/yauzl@2.10.3': - resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - - '@typescript-eslint/eslint-plugin@8.62.1': - resolution: {integrity: sha512-4EQM77WgVNxj7OkL/5b/D/xZsw00G577+UriYTC7JF5opcF3T2AuoeY7ueLaZgSVjSgCS6yOAJB5bRGLPSJUzA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - '@typescript-eslint/parser': ^8.62.1 - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/parser@8.62.1': - resolution: {integrity: sha512-sPhE4iHuJDSvoAiec+Ro8JyXw8f0ql13HFR82P99nCm9GwTEKG0KYLvDe6REk8BCXuit6vJAv/Yxg5ABaNS2rA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/project-service@8.62.1': - resolution: {integrity: sha512-yQ3RgY5RkSBpsNS1Bx/JQEcA24FOSdfGktoyprAr5u18390UQdtVcfnEv4nIrIshNnavlVyZBKxQwT1fIAE6cg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/scope-manager@8.62.1': - resolution: {integrity: sha512-r4d249KbQ1SFdpeStvob8Ih6aPPIzfqllPVOtvhve6ZcpuVcYo5/7zUWckKpHE7StASX4kTKZTLf0WQm/wPkcg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/tsconfig-utils@8.62.1': - resolution: {integrity: sha512-xadytJqX9vJVQ2fdQjkcIVigwaOJNWkpjdLt6cEQ+xPnrI1fkp+/jZE/I97k9KUjqtpd25i0HeyZf3T6dutv2g==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/type-utils@8.62.1': - resolution: {integrity: sha512-aXM5xlqXiTxPibXB93cLAURfT3rlizf7uMXISCXy66Isr/9hISJx3yDsKl0L7lKa51b8JpFuNKby0/O0pEm9jg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/types@8.62.1': - resolution: {integrity: sha512-ooCzJFaf+Hg+uG6fA3NRFGuFjlfNlDhBthbv4ZPU/0elCAFUfnyXUvf/WOpHz/jYwSmvU2GkR2LtyUfy1AxZ1Q==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/typescript-estree@8.62.1': - resolution: {integrity: sha512-xMcW9oP9u7fAMXYs9A65CVmtLQe2r//oXINHfi8HV+oiqhih17sbLdhXr4540YWlgpDKQdY854OL5ZrdCiQsAA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/utils@8.62.1': - resolution: {integrity: sha512-sHtbPfuKNZCG+ih8SyjjucqRntSVmp8XgL5u6o9mAhiSn8ds5o/M/XdM0abweme2Tln3szOstOrZ9OXitvPh0g==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/visitor-keys@8.62.1': - resolution: {integrity: sha512-4g3BLxfdTMy8iZG0MaBkadnlRrCJ74cQiFbyEVMrkwIoqdyaXXQM22cotDvrl4x28wgIZ9rEJRoM+mmhSJpJ1g==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@vitejs/plugin-react@6.0.3': - resolution: {integrity: sha512-vmFvco5/QuC2f9Oj+wTk0+9XeDFkHxSamwZKYc7MxYwKICfvUvlMhqKI0VuICPltGqh1neqBKDvO4kes1ya8vg==} - engines: {node: ^20.19.0 || >=22.12.0} - peerDependencies: - '@rolldown/plugin-babel': ^0.1.7 || ^0.2.0 - babel-plugin-react-compiler: ^1.0.0 - vite: ^8.0.0 - peerDependenciesMeta: - '@rolldown/plugin-babel': - optional: true - babel-plugin-react-compiler: - optional: true - - '@vitest/expect@4.1.9': - resolution: {integrity: sha512-vl/rYsUKcBr3SnQn166+XR5ZQcgMx3DQhFWdfli/cWpLnLUmbxZvyrJZotLFUryib+LtArYMSTJ5RbQ57ZqrlA==} - - '@vitest/mocker@4.1.9': - resolution: {integrity: sha512-EVkXzBjrPGM+cK8/ANWgBrkUCfJfb38/EfTSO8h7pWvKkyPkpWxvR7BkD2MyItMF62C97zAEoqdpUixwR/e+Rw==} - peerDependencies: - msw: ^2.4.9 - vite: ^6.0.0 || ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - msw: - optional: true - vite: - optional: true - - '@vitest/pretty-format@4.1.9': - resolution: {integrity: sha512-s0iufns3iIFitdgm+YR7g1whCAaGtXz459VS9/PqyKDEEFgYIhsHOQmXgIgDuYCt7DeQmiZT0Qe2OA2p4ZPu5A==} - - '@vitest/runner@4.1.9': - resolution: {integrity: sha512-KXLMDtc7oe70+3mJfGrPUWPesswH+3sTxAMAMl8DG7I8IUQT4XW718dY5ID3vPUcmlu27CcKfY4P3h3I29SLJg==} - - '@vitest/snapshot@4.1.9': - resolution: {integrity: sha512-Jc7RKGNBo8Z28WYIm0Niej4xdSPByRf6mU58VpHQkd6Zh05rlnA+twjbK5HyeIGHxrzsc3mJgS43uM0CZKzaIA==} - - '@vitest/spy@4.1.9': - resolution: {integrity: sha512-fHpsS6mIi+PiEW+vcRVOMkX1oSaPKne3VOclSFICPcGOmfKgXPU5iAah+wcNcj2xPrCCmfq99IDGf+EojhhvhA==} - - '@vitest/utils@4.1.9': - resolution: {integrity: sha512-A51o8ymO5PpqlWNnBP9ZHPXDIpuMtTLlGSjN7la4US+LJzoUMyhwjA5QXlm39JexgwHKW4Xjs8Z2d3dLCXOeuA==} - - '@xmldom/xmldom@0.8.13': - resolution: {integrity: sha512-KRYzxepc14G/CEpEGc3Yn+JKaAeT63smlDr+vjB8jRfgTBBI9wRj/nkQEO+ucV8p8I9bfKLWp37uHgFrbntPvw==} - engines: {node: '>=10.0.0'} - - abbrev@4.0.0: - resolution: {integrity: sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA==} - engines: {node: ^20.17.0 || >=22.9.0} - - accepts@2.0.0: - resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} - engines: {node: '>= 0.6'} - - acorn-jsx@5.3.2: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - - acorn@8.17.0: - resolution: {integrity: sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==} - engines: {node: '>=0.4.0'} - hasBin: true - - agent-base@7.1.4: - resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} - engines: {node: '>= 14'} - - ajv-formats@2.1.1: - resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - - ajv-formats@3.0.1: - resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - - ajv@6.15.0: - resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} - - ajv@8.20.0: - resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} - - ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-regex@6.2.2: - resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} - engines: {node: '>=12'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - app-builder-lib@26.15.3: - resolution: {integrity: sha512-2VnyWkqsP5v5XbBhL3tD5Syx8iNPBYsoU7kY4S2fz7wg8Rj/nztWKCUzGKaFRTv0Xwf3/H058CR1Kvtd/3lRow==} - engines: {node: '>=14.0.0'} - peerDependencies: - dmg-builder: 26.15.3 - electron-builder-squirrel-windows: 26.15.3 - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - aria-hidden@1.2.6: - resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} - engines: {node: '>=10'} - - asn1js@3.0.10: - resolution: {integrity: sha512-S2s3aOytiKdFRdulw2qPE51MzjzVOisppcVv7jVFR+Kw0kxwvFrDcYA0h7Ndqbmj0HkMIXYWaoj7fli8kgx1eg==} - engines: {node: '>=12.0.0'} - - assertion-error@2.0.1: - resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} - engines: {node: '>=12'} - - ast-types@0.16.1: - resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} - engines: {node: '>=4'} - - async-exit-hook@2.0.1: - resolution: {integrity: sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==} - engines: {node: '>=0.12.0'} - - async@3.2.6: - resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} - - asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - - at-least-node@1.0.0: - resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} - engines: {node: '>= 4.0.0'} - - atomically@1.7.0: - resolution: {integrity: sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w==} - engines: {node: '>=10.12.0'} - - aws4@1.13.2: - resolution: {integrity: sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - balanced-match@4.0.4: - resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} - engines: {node: 18 || 20 || >=22} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - baseline-browser-mapping@2.10.41: - resolution: {integrity: sha512-WwS7MHhqGHHlaVsqRZnhvCEMS0owDX+SxRlve7JkuH7My1Ara3ZriTmCQupPfYjxMZ8I/tgxtJYr2t7taHaH4A==} - engines: {node: '>=6.0.0'} - hasBin: true - - bluebird@3.7.2: - resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} - - body-parser@2.3.0: - resolution: {integrity: sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==} - engines: {node: '>=18'} - - boolean@3.2.0: - resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - - brace-expansion@1.1.15: - resolution: {integrity: sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==} - - brace-expansion@2.1.1: - resolution: {integrity: sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==} - - brace-expansion@5.0.7: - resolution: {integrity: sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==} - engines: {node: 18 || 20 || >=22} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - browserslist@4.28.4: - resolution: {integrity: sha512-MTc8i/x9jBQd1iMw2CFGS+rwMa07eYjLR0CCTLDACl9xhxy+nIs3KeML/biicXtk9JrZ6dnnTatmc7ErPXIxqw==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - - buffer-crc32@0.2.13: - resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - builder-util-runtime@9.7.0: - resolution: {integrity: sha512-g/kR520giAFYkSXTzcmF3kqQq7wi8F6N6SzeDgZrqTBN+VHdmgWOyTdD1yD7AATDId/yXLvuP34CxW46/BwCdw==} - engines: {node: '>=12.0.0'} - - builder-util@26.15.3: - resolution: {integrity: sha512-q2hn7Mbo2nFNkVekPiHFx6Nfo3hURmES3tfBn+k5Pqxl2RkmP3QGqZUhH/q9Pch/4G05NRhPjDlVj1O8q4Txvw==} - engines: {node: '>=14.0.0'} - - bundle-name@4.1.0: - resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} - engines: {node: '>=18'} - - bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} - - bytestreamjs@2.0.1: - resolution: {integrity: sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==} - engines: {node: '>=6.0.0'} - - cacheable-lookup@5.0.4: - resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} - engines: {node: '>=10.6.0'} - - cacheable-request@7.0.4: - resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} - engines: {node: '>=8'} - - call-bind-apply-helpers@1.0.2: - resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} - engines: {node: '>= 0.4'} - - call-bound@1.0.4: - resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} - engines: {node: '>= 0.4'} - - callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - - camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} - - caniuse-lite@1.0.30001800: - resolution: {integrity: sha512-MMHtuAz9Ys840zAY5F4k6fV5GaivZ9sPk+nz0mY+GYVzRBnYkN0mpqkSR92oWRQ19yQWo4HvBV/FnC16AJX8MA==} - - chai@6.2.2: - resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} - engines: {node: '>=18'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chalk@5.6.2: - resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - chownr@3.0.0: - resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} - engines: {node: '>=18'} - - chromium-pickle-js@0.2.0: - resolution: {integrity: sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==} - - ci-info@4.3.1: - resolution: {integrity: sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==} - engines: {node: '>=8'} - - ci-info@4.4.0: - resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} - engines: {node: '>=8'} - - class-variance-authority@0.7.1: - resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} - - cli-cursor@5.0.0: - resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} - engines: {node: '>=18'} - - cli-spinners@2.9.2: - resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} - engines: {node: '>=6'} - - cliui@6.0.0: - resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} - - cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} - - clone-response@1.0.3: - resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} - - clsx@2.1.1: - resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} - engines: {node: '>=6'} - - cmdk@1.1.1: - resolution: {integrity: sha512-Vsv7kFaXm+ptHDMZ7izaRsP70GgrW9NBNGswt9OZaVBLlE0SNpDq8eu/VGXyF9r7M0azK3Wy7OlYXsuyYLFzHg==} - peerDependencies: - react: ^18 || ^19 || ^19.0.0-rc - react-dom: ^18 || ^19 || ^19.0.0-rc - - code-block-writer@13.0.3: - resolution: {integrity: sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - - commander@11.1.0: - resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} - engines: {node: '>=16'} - - commander@14.0.3: - resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} - engines: {node: '>=20'} - - commander@5.1.0: - resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} - engines: {node: '>= 6'} - - commander@9.5.0: - resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} - engines: {node: ^12.20.0 || >=14} - - compare-version@0.1.2: - resolution: {integrity: sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==} - engines: {node: '>=0.10.0'} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - conf@10.2.0: - resolution: {integrity: sha512-8fLl9F04EJqjSqH+QjITQfJF8BrOVaYr1jewVgSRAEWePfxT0sku4w2hrGQ60BC/TNLGQ2pgxNlTbWQmMPFvXg==} - engines: {node: '>=12'} - - content-disposition@1.1.0: - resolution: {integrity: sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==} - engines: {node: '>=18'} - - content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} - - content-type@2.0.0: - resolution: {integrity: sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==} - engines: {node: '>=18'} - - convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - - cookie-es@3.1.1: - resolution: {integrity: sha512-UaXxwISYJPTr9hwQxMFYZ7kNhSXboMXP+Z3TRX6f1/NyaGPfuNUZOWP1pUEb75B2HjfklIYLVRfWiFZJyC6Npg==} - - cookie-signature@1.2.2: - resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} - engines: {node: '>=6.6.0'} - - cookie@0.7.2: - resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} - engines: {node: '>= 0.6'} - - core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - - cors@2.8.6: - resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} - engines: {node: '>= 0.10'} - - cosmiconfig@9.0.2: - resolution: {integrity: sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg==} - engines: {node: '>=14'} - peerDependencies: - typescript: '>=4.9.5' - peerDependenciesMeta: - typescript: - optional: true - - crelt@1.0.7: - resolution: {integrity: sha512-aK6BbWfhf4U/wCcLHKPJl/xa6VkVstRaPywWtMKGwuOLc/wZTyQYuoxgvZnNsBvv7Kg3YTBQYYBCggcviQczuA==} - - cross-dirname@0.1.0: - resolution: {integrity: sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q==} - - cross-spawn@7.0.6: - resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} - engines: {node: '>= 8'} - - cssesc@3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} - hasBin: true - - csstype@3.2.3: - resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} - - d3-array@3.2.4: - resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} - engines: {node: '>=12'} - - d3-color@3.1.0: - resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} - engines: {node: '>=12'} - - d3-ease@3.0.1: - resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} - engines: {node: '>=12'} - - d3-format@3.1.2: - resolution: {integrity: sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==} - engines: {node: '>=12'} - - d3-interpolate@3.0.1: - resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} - engines: {node: '>=12'} - - d3-path@3.1.0: - resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} - engines: {node: '>=12'} - - d3-scale@4.0.2: - resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} - engines: {node: '>=12'} - - d3-shape@3.2.0: - resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} - engines: {node: '>=12'} - - d3-time-format@4.1.0: - resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} - engines: {node: '>=12'} - - d3-time@3.1.0: - resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} - engines: {node: '>=12'} - - d3-timer@3.0.1: - resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} - engines: {node: '>=12'} - - date-fns@4.4.0: - resolution: {integrity: sha512-+1UMbeh68lH1SegH83CGWwpb6OHHbpSgr3+s5Eww5M4CAgswBpoWS0AjTOfEJ33HiYKz1hdj/KTFprzXHmq/6w==} - - debounce-fn@4.0.0: - resolution: {integrity: sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==} - engines: {node: '>=10'} - - debug@4.4.3: - resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decamelize@1.2.0: - resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} - engines: {node: '>=0.10.0'} - - decimal.js-light@2.5.1: - resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==} - - decompress-response@6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} - engines: {node: '>=10'} - - dedent@1.7.2: - resolution: {integrity: sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==} - peerDependencies: - babel-plugin-macros: ^3.1.0 - peerDependenciesMeta: - babel-plugin-macros: - optional: true - - deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - - deepfilternet3-noise-filter@1.2.1: - resolution: {integrity: sha512-OAyrHTDlUHH+AhfpVNKYEOhVqb9cZpu0fdNThplA/tB/Ts4PF/UsI+abl2n1IbSxUkhiF0OqDejEhk1n42Oqpw==} - engines: {node: '>=18.0.0'} - peerDependencies: - livekit-client: ^2.0.0 - - deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} - engines: {node: '>=0.10.0'} - - default-browser-id@5.0.1: - resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==} - engines: {node: '>=18'} - - default-browser@5.5.0: - resolution: {integrity: sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==} - engines: {node: '>=18'} - - defer-to-connect@2.0.1: - resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} - engines: {node: '>=10'} - - define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} - - define-lazy-prop@2.0.0: - resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} - engines: {node: '>=8'} - - define-lazy-prop@3.0.0: - resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} - engines: {node: '>=12'} - - define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} - - delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - - depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} - - detect-libc@2.1.2: - resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} - engines: {node: '>=8'} - - detect-node-es@1.1.0: - resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} - - detect-node@2.1.0: - resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} - - diff@8.0.4: - resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==} - engines: {node: '>=0.3.1'} - - dijkstrajs@1.0.3: - resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} - - dir-compare@4.2.0: - resolution: {integrity: sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ==} - - dmg-builder@26.15.3: - resolution: {integrity: sha512-O3zJUFUYHJKgzPqioHxfxzBzlSC1eXCSr79gMSBKBP5AgjjpmrydMsMLotEg9fAJF36vdUncb+4ndRNxoPdlSQ==} - - dot-prop@6.0.1: - resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==} - engines: {node: '>=10'} - - dotenv-expand@11.0.7: - resolution: {integrity: sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==} - engines: {node: '>=12'} - - dotenv@16.6.1: - resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} - engines: {node: '>=12'} - - dotenv@17.4.2: - resolution: {integrity: sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==} - engines: {node: '>=12'} - - dunder-proto@1.0.1: - resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} - engines: {node: '>= 0.4'} - - duplexer2@0.1.4: - resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==} - - ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - - ejs@3.1.10: - resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} - engines: {node: '>=0.10.0'} - hasBin: true - - electron-builder-squirrel-windows@26.15.3: - resolution: {integrity: sha512-Jc19XPV9y9+2bAdZPkXuVNGNIEFBq9poHC61l8Kv6FdK7DRG3+Ic0rerC0DXOaeHNz8yW0fg/JnF8GQROOF5MA==} - - electron-builder@26.15.3: - resolution: {integrity: sha512-a1KM5heqS3gQCZzizXEI8RjJy3QVogULPdeSknt76uLDpBIW/HDGsMg/XgP0riP6PI9COsRvFITKKGDqA8fJxA==} - engines: {node: '>=14.0.0'} - hasBin: true - - electron-publish@26.15.3: - resolution: {integrity: sha512-g/2bn8YTavY4cuS5F+jOS7zmZbXXBV8KZ8yHKfJjFPoKtzBqrpCdNPxBd3tqdBwP7BVd0lGzf7Bk2s0KesWZ4Q==} - - electron-to-chromium@1.5.385: - resolution: {integrity: sha512-78sa/M08MNAYHQfjoWMvOlKQqZ0ElhSm/L5HNUc96VZ3b+KvDVnngFm8sYQy0XrhTRgAhggHr5abA7yTvRdo4Q==} - - electron-winstaller@5.4.0: - resolution: {integrity: sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg==} - engines: {node: '>=8.0.0'} - - electron@39.8.10: - resolution: {integrity: sha512-zbYtGPYUI7PzqLAzkk21Rk6j67WN0hxn0Mq/njErZo1d0HSf33is4f8ICI5fMLy5vYe0JtCtM5sYunNOaochSQ==} - engines: {node: '>= 12.20.55'} - hasBin: true - - embla-carousel-react@8.6.0: - resolution: {integrity: sha512-0/PjqU7geVmo6F734pmPqpyHqiM99olvyecY7zdweCw+6tKEXnrE90pBiBbMMU8s5tICemzpQ3hi5EpxzGW+JA==} - peerDependencies: - react: ^16.8.0 || ^17.0.1 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc - - embla-carousel-reactive-utils@8.6.0: - resolution: {integrity: sha512-fMVUDUEx0/uIEDM0Mz3dHznDhfX+znCCDCeIophYb1QGVM7YThSWX+wz11zlYwWFOr74b4QLGg0hrGPJeG2s4A==} - peerDependencies: - embla-carousel: 8.6.0 - - embla-carousel@8.6.0: - resolution: {integrity: sha512-SjWyZBHJPbqxHOzckOfo8lHisEaJWmwd23XppYFYVh10bU66/Pn5tkVkbkCMZVdbUE5eTCI2nD8OyIP4Z+uwkA==} - - emoji-regex@10.6.0: - resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - emojibase-data@17.0.0: - resolution: {integrity: sha512-Yvgb5AWoHViHV/gq1qr5ZAarcBip+B27/ZLRsUJkbgAEaLlZ/fof9g882LTpmEpyhBNEC0m2SEmItljHsTygjA==} - peerDependencies: - emojibase: '*' - - emojibase@17.0.0: - resolution: {integrity: sha512-bXdpf4HPY3p41zK5swVKZdC/VynsMZ4LoLxdYDE+GucqkFwzcM1GVc4ODfYAlwoKaf2U2oNNUoOO78N96ovpBA==} - engines: {node: '>=18.12.0'} - - encodeurl@2.0.0: - resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} - engines: {node: '>= 0.8'} - - end-of-stream@1.4.5: - resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} - - enhanced-resolve@5.21.6: - resolution: {integrity: sha512-aNnGCvbJ/RIyWo1IuhNdVjnNF+EjH9wpzpNHt+ci/m9He9LJvUN8wrCcXjp9cWsGNAuvSpVFTx/vraAFQ8qGjQ==} - engines: {node: '>=10.13.0'} - - enquirer@2.4.1: - resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} - engines: {node: '>=8.6'} - - env-paths@2.2.1: - resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} - engines: {node: '>=6'} - - err-code@2.0.3: - resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} - - error-ex@1.3.4: - resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} - - es-define-property@1.0.1: - resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} - engines: {node: '>= 0.4'} - - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - - es-module-lexer@2.3.0: - resolution: {integrity: sha512-KLdwQm2NvGLDkQDCGvmiQrhkd0JbMzXthwQAUgWjQuQdBLFa3eiBP5arXZyA+f8x+x7OXgud6bq2rxjGtHV2tw==} - - es-object-atoms@1.1.2: - resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} - engines: {node: '>= 0.4'} - - es-set-tostringtag@2.1.0: - resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} - engines: {node: '>= 0.4'} - - es-toolkit@1.49.0: - resolution: {integrity: sha512-G5iZ6Pc/FNRY/soKZHC+TxGDD83rHUDXxzaWhGCX44vAv/tMs56WMusnm/KMNK+luUPsgA9U28cGr4RDlSzL2g==} - - es6-error@4.1.1: - resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} - - esbuild@0.25.12: - resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} - engines: {node: '>=18'} - hasBin: true - - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eslint-plugin-react-hooks@7.1.1: - resolution: {integrity: sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==} - engines: {node: '>=18'} - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0 - - eslint-scope@9.1.2: - resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - - eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint-visitor-keys@5.0.1: - resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - - eslint@10.6.0: - resolution: {integrity: sha512-6lVbcqSodALYo+4ELD0heG6lFiFxnLMuLkiMi2qV8LMp54N8tE8FT1GMH+ev4Ti00nFjNze2+Su6DsV5OQW3Dg==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - hasBin: true - peerDependencies: - jiti: '*' - peerDependenciesMeta: - jiti: - optional: true - - espree@11.2.0: - resolution: {integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - - esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - - esquery@1.7.0: - resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} - engines: {node: '>=0.10'} - - esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - - estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - - estree-walker@3.0.3: - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} - - esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - - etag@1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} - - eventemitter3@5.0.4: - resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} - - events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} - - eventsource-parser@3.1.0: - resolution: {integrity: sha512-kJezFj9YFAMLeORyi7aCLxLbD5/qWMQnoMVlVPyHIll7lgRJCc3JVln9Vgl9nwQi0YkMnhdGTMNn7CkRRAptMg==} - engines: {node: '>=18.0.0'} - - eventsource@3.0.7: - resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} - engines: {node: '>=18.0.0'} - - execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} - - execa@9.6.1: - resolution: {integrity: sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==} - engines: {node: ^18.19.0 || >=20.5.0} - - expect-type@1.4.0: - resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} - engines: {node: '>=12.0.0'} - - exponential-backoff@3.1.3: - resolution: {integrity: sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==} - - express-rate-limit@8.5.2: - resolution: {integrity: sha512-5Kb34ipNX694DH48vN9irak1Qx30nb0PLYHXfJgw4YEjiC3ZEmZJhwOp+VfiCYwFzvFTdB9QkArYS5kXa2cx2A==} - engines: {node: '>= 16'} - peerDependencies: - express: '>= 4.11' - - express@5.2.1: - resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} - engines: {node: '>= 18'} - - extract-zip@2.0.1: - resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} - engines: {node: '>= 10.17.0'} - hasBin: true - - fallow@2.104.0: - resolution: {integrity: sha512-UX6Q10Feyb7epe5tTI0sHCHPReOhuKOtxdVpkbqr1lLSZirv2PJiLTTrJr7gKeLHbztE9CHR1y7YARSe0rNYag==} - engines: {node: '>=16'} - hasBin: true - - fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - - fast-glob@3.3.3: - resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} - engines: {node: '>=8.6.0'} - - fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - - fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - - fast-uri@3.1.3: - resolution: {integrity: sha512-i70LwGWUduXqzicKXWshooq+sWL1K3WUU5rKZNG/0i3a1OSoX3HqhH5WbWwTmqWfor4urUakGPiRQcleRZTwOg==} - - fastq@1.20.1: - resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} - - fd-slicer@1.1.0: - resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} - - fdir@6.5.0: - resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} - engines: {node: '>=12.0.0'} - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true - - figures@6.1.0: - resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} - engines: {node: '>=18'} - - file-entry-cache@8.0.0: - resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} - engines: {node: '>=16.0.0'} - - filelist@1.0.6: - resolution: {integrity: sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA==} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - finalhandler@2.1.1: - resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} - engines: {node: '>= 18.0.0'} - - find-up@3.0.0: - resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} - engines: {node: '>=6'} - - find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat-cache@4.0.1: - resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} - engines: {node: '>=16'} - - flatted@3.4.2: - resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} - - form-data@4.0.6: - resolution: {integrity: sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==} - engines: {node: '>= 6'} - - forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} - - framer-motion@12.42.2: - resolution: {integrity: sha512-5XY9luDiu0oHfHBjpDthFMh0ES+122w6p/papSJBweMkO8Sn+PW2QaEgRblQBpWFnuvZS5qvarpt/hO2pjGmnw==} - peerDependencies: - '@emotion/is-prop-valid': '*' - react: ^18.0.0 || ^19.0.0 - react-dom: ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - '@emotion/is-prop-valid': - optional: true - react: - optional: true - react-dom: - optional: true - - fresh@2.0.0: - resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} - engines: {node: '>= 0.8'} - - fs-extra@10.1.0: - resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} - engines: {node: '>=12'} - - fs-extra@11.3.1: - resolution: {integrity: sha512-eXvGGwZ5CL17ZSwHWd3bbgk7UUpF6IFHtP57NYYakPvHOs8GDgDe5KJI36jIJzDkJ6eJjuzRA8eBQb6SkKue0g==} - engines: {node: '>=14.14'} - - fs-extra@11.3.6: - resolution: {integrity: sha512-w8ZNZr2mKIc7qeNaQ9AVPT1+iFaI+Avd4xudVOvdDJ8VytREi1Ft5Ih7hd9jjehod8vAM5GMsfQ/TpPf4EyoEA==} - engines: {node: '>=14.14'} - - fs-extra@7.0.1: - resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} - engines: {node: '>=6 <7 || >=8'} - - fs-extra@8.1.0: - resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} - engines: {node: '>=6 <7 || >=8'} - - fs-extra@9.1.0: - resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} - engines: {node: '>=10'} - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - - fuzzysort@3.1.0: - resolution: {integrity: sha512-sR9BNCjBg6LNgwvxlBd0sBABvQitkLzoVY9MYYROQVX/FvfJ4Mai9LsGhDgd8qYdds0bY77VzYd5iuB+v5rwQQ==} - - gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-east-asian-width@1.6.0: - resolution: {integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==} - engines: {node: '>=18'} - - get-intrinsic@1.3.0: - resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} - engines: {node: '>= 0.4'} - - get-nonce@1.0.1: - resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} - engines: {node: '>=6'} - - get-own-enumerable-keys@1.0.0: - resolution: {integrity: sha512-PKsK2FSrQCyxcGHsGrLDcK0lx+0Ke+6e8KFFozA9/fIQLhQzPaRvJFdcz7+Axg3jUH/Mq+NI4xa5u/UT2tQskA==} - engines: {node: '>=14.16'} - - get-proto@1.0.1: - resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} - engines: {node: '>= 0.4'} - - get-stream@5.2.0: - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} - engines: {node: '>=8'} - - get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - - get-stream@9.0.1: - resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} - engines: {node: '>=18'} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - - glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me - - global-agent@3.0.0: - resolution: {integrity: sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==} - engines: {node: '>=10.0'} - - globals@17.7.0: - resolution: {integrity: sha512-Czmyns5dUsq4seFBR/Kdydhmo8y9kC79hiSkPn0YcGtNnYWnrgt0vjrSjx9tspoDGWm2CMarffRuLjM4xUz8xg==} - engines: {node: '>=18'} - - globalthis@1.0.4: - resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} - engines: {node: '>= 0.4'} - - gopd@1.2.0: - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} - engines: {node: '>= 0.4'} - - got@11.8.6: - resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} - engines: {node: '>=10.19.0'} - - graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - - has-symbols@1.1.0: - resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} - engines: {node: '>= 0.4'} - - has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} - - hasown@2.0.4: - resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} - engines: {node: '>= 0.4'} - - hermes-estree@0.25.1: - resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==} - - hermes-parser@0.25.1: - resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} - - hono@4.12.27: - resolution: {integrity: sha512-1yrb/+w6HWQJrUCLkJ2IF5jNIPvvFkblV5RNOYl6bV+OA6p9GLcMpHFFGTosSvHvcAUibuUukRqhlYI4z32C7Q==} - engines: {node: '>=16.9.0'} - - hosted-git-info@4.1.0: - resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} - engines: {node: '>=10'} - - http-cache-semantics@4.2.0: - resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} - - http-errors@2.0.1: - resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} - engines: {node: '>= 0.8'} - - http-proxy-agent@7.0.2: - resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} - engines: {node: '>= 14'} - - http2-wrapper@1.0.3: - resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} - engines: {node: '>=10.19.0'} - - https-proxy-agent@7.0.6: - resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} - engines: {node: '>= 14'} - - human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - - human-signals@8.0.1: - resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==} - engines: {node: '>=18.18.0'} - - iconv-lite@0.7.2: - resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} - engines: {node: '>=0.10.0'} - - ignore@5.3.2: - resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} - engines: {node: '>= 4'} - - ignore@7.0.5: - resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} - engines: {node: '>= 4'} - - immer@10.2.0: - resolution: {integrity: sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw==} - - immer@11.1.9: - resolution: {integrity: sha512-sc/z0Cyti70bZa0ZU4sWfAElfovFb9Ni8tArJZLuklYWxegPiK3pDOql1Rq5H0FIRAW9LSQRG6OX4KqBldbhBA==} - - import-fresh@3.3.1: - resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} - engines: {node: '>=6'} - - imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - input-otp@1.4.2: - resolution: {integrity: sha512-l3jWwYNvrEa6NTCt7BECfCm48GvwuZzkoeG3gBL2w4CHeOXW3eKFmf9UNYkNfYc3mxMrthMnxjIE07MT0zLBQA==} - peerDependencies: - react: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc - - internmap@2.0.3: - resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} - engines: {node: '>=12'} - - ip-address@10.2.0: - resolution: {integrity: sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==} - engines: {node: '>= 12'} - - ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} - - is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - - is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true - - is-docker@3.0.0: - resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - hasBin: true - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-in-ssh@1.0.0: - resolution: {integrity: sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==} - engines: {node: '>=20'} - - is-inside-container@1.0.0: - resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} - engines: {node: '>=14.16'} - hasBin: true - - is-interactive@2.0.0: - resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} - engines: {node: '>=12'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-obj@2.0.0: - resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} - engines: {node: '>=8'} - - is-obj@3.0.0: - resolution: {integrity: sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==} - engines: {node: '>=12'} - - is-plain-obj@4.1.0: - resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} - engines: {node: '>=12'} - - is-promise@4.0.0: - resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} - - is-regexp@3.1.0: - resolution: {integrity: sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA==} - engines: {node: '>=12'} - - is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - - is-stream@4.0.1: - resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} - engines: {node: '>=18'} - - is-unicode-supported@1.3.0: - resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} - engines: {node: '>=12'} - - is-unicode-supported@2.1.0: - resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} - engines: {node: '>=18'} - - is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} - - is-wsl@3.1.1: - resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} - engines: {node: '>=16'} - - isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - - isbinaryfile@4.0.10: - resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==} - engines: {node: '>= 8.0.0'} - - isbinaryfile@5.0.7: - resolution: {integrity: sha512-gnWD14Jh3FzS3CPhF0AxNOJ8CxqeblPTADzI38r0wt8ZyQl5edpy75myt08EG2oKvpyiqSqsx+Wkz9vtkbTqYQ==} - engines: {node: '>= 18.0.0'} - - isbot@5.1.44: - resolution: {integrity: sha512-PGEHtwMnKbZpeSEXW2Utx+/JWed7dp6DiH0WWg33vGSDA7RUvpUeJSVlLrVkQ1RCpvDOUc/eH9ql7VsdbBZ8pA==} - engines: {node: '>=18'} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isexe@3.1.5: - resolution: {integrity: sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==} - engines: {node: '>=18'} - - isexe@4.0.0: - resolution: {integrity: sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==} - engines: {node: '>=20'} - - jake@10.9.4: - resolution: {integrity: sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==} - engines: {node: '>=10'} - hasBin: true - - jiti@2.7.0: - resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} - hasBin: true - - jose@6.2.3: - resolution: {integrity: sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw==} - - js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - - js-yaml@4.3.0: - resolution: {integrity: sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==} - hasBin: true - - jsesc@3.1.0: - resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} - engines: {node: '>=6'} - hasBin: true - - json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - - json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - - json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - - json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - - json-schema-typed@7.0.3: - resolution: {integrity: sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==} - - json-schema-typed@8.0.2: - resolution: {integrity: sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==} - - json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - - jsonc-parser@3.3.1: - resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} - - jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - - jsonfile@5.0.0: - resolution: {integrity: sha512-NQRZ5CRo74MhMMC3/3r5g2k4fjodJ/wh8MxjFbCViWKFjxrnudWSY5vomh+23ZaXzAS7J3fBZIR2dV6WbmfM0w==} - - jsonfile@6.2.1: - resolution: {integrity: sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==} - - keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - - kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} - - kleur@4.1.5: - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} - engines: {node: '>=6'} - - lazy-val@1.0.5: - resolution: {integrity: sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==} - - levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - - lightningcss-android-arm64@1.32.0: - resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [android] - - lightningcss-darwin-arm64@1.32.0: - resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [darwin] - - lightningcss-darwin-x64@1.32.0: - resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [darwin] - - lightningcss-freebsd-x64@1.32.0: - resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [freebsd] - - lightningcss-linux-arm-gnueabihf@1.32.0: - resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} - engines: {node: '>= 12.0.0'} - cpu: [arm] - os: [linux] - - lightningcss-linux-arm64-gnu@1.32.0: - resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [linux] - libc: [glibc] - - lightningcss-linux-arm64-musl@1.32.0: - resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [linux] - libc: [musl] - - lightningcss-linux-x64-gnu@1.32.0: - resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [linux] - libc: [glibc] - - lightningcss-linux-x64-musl@1.32.0: - resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [linux] - libc: [musl] - - lightningcss-win32-arm64-msvc@1.32.0: - resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [win32] - - lightningcss-win32-x64-msvc@1.32.0: - resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [win32] - - lightningcss@1.32.0: - resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} - engines: {node: '>= 12.0.0'} - - lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - - livekit-client@2.20.0: - resolution: {integrity: sha512-RIJcpvBmOmwz3jTj3rmdY6Dzr55HrhcaJjMgY+HSmoEM+yIRyA40m7r8UKv0hnZWM3z/AYhP1q8C8ciz5UWFKQ==} - peerDependencies: - '@types/dom-mediacapture-record': ^1 - - locate-path@3.0.0: - resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} - engines: {node: '>=6'} - - locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - lodash.debounce@4.0.8: - resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} - - lodash@4.18.1: - resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} - - log-symbols@6.0.0: - resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} - engines: {node: '>=18'} - - loglevel@1.9.1: - resolution: {integrity: sha512-hP3I3kCrDIMuRwAwHltphhDM1r8i55H33GgqjXbrisuJhF4kRhW1dNuxsRklp4bXl8DSdLaNLuiL4A/LWRfxvg==} - engines: {node: '>= 0.6.0'} - - loglevel@1.9.2: - resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==} - engines: {node: '>= 0.6.0'} - - lowercase-keys@2.0.0: - resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} - engines: {node: '>=8'} - - lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - - lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - - lucide-react@1.23.0: - resolution: {integrity: sha512-38BpJcD0JhFosxHApP/BYsBetLpQFRoTRzEzstM/XCc3jsAG7wqaY1lgVwxiUe3xqYE+lNxo2PkCmYwXWrwwIw==} - peerDependencies: - react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 - - magic-string@0.30.21: - resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} - - matcher@3.0.0: - resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==} - engines: {node: '>=10'} - - math-intrinsics@1.1.0: - resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} - engines: {node: '>= 0.4'} - - media-typer@1.1.0: - resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} - engines: {node: '>= 0.8'} - - merge-descriptors@2.0.0: - resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} - engines: {node: '>=18'} - - merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - - merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - - micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} - engines: {node: '>=8.6'} - - mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - - mime-db@1.54.0: - resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} - engines: {node: '>= 0.6'} - - mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - - mime-types@3.0.2: - resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} - engines: {node: '>=18'} - - mime@2.6.0: - resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} - engines: {node: '>=4.0.0'} - hasBin: true - - mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - - mimic-fn@3.1.0: - resolution: {integrity: sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==} - engines: {node: '>=8'} - - mimic-function@5.0.1: - resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} - engines: {node: '>=18'} - - mimic-response@1.0.1: - resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} - engines: {node: '>=4'} - - mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} - - minimatch@10.2.5: - resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} - engines: {node: 18 || 20 || >=22} - - minimatch@3.1.5: - resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} - - minimatch@5.1.9: - resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==} - engines: {node: '>=10'} - - minimatch@9.0.9: - resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} - engines: {node: '>=16 || 14 >=14.17'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - minipass@7.1.3: - resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} - engines: {node: '>=16 || 14 >=14.17'} - - minizlib@3.1.0: - resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} - engines: {node: '>= 18'} - - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - - motion-dom@12.42.2: - resolution: {integrity: sha512-5gIMWLp/PycBtJRJWRgjxke5n8dlvkSn2DrYW+tr3XcqAZY1xZh6BJyooJXCM8wdfM7wfMjkBJNLge1CKPUIRA==} - - motion-utils@12.39.0: - resolution: {integrity: sha512-8nadJAJjTtqRkmRF36FoJTrywK9nnFmnPwnSMyxaOCU7GDjN9RTMJIxx9De8ErM+vpPhMccr/6fo5WciyQLnMQ==} - - motion@12.42.2: - resolution: {integrity: sha512-Atvv11yUKIid41cVrRBDVX5m8tF8kNpExRSlbpt6APClhDjtwQssgFHhQzejxw7/7YYbjHSPKBVbHo05BuJT5Q==} - peerDependencies: - '@emotion/is-prop-valid': '*' - react: ^18.0.0 || ^19.0.0 - react-dom: ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - '@emotion/is-prop-valid': - optional: true - react: - optional: true - react-dom: - optional: true - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - mtp@https://git.methanium.net/methanium/mtp/releases/download/0.2.0-3919eb46fd/mtp-0.2.0.tgz: - resolution: {integrity: sha512-Adfwu1N48pSNZXaLpBW//uAeFaDCHYMOjWg+APG4TxEwCyQjXygCxBuEdUOjOxVZP9cK8L/K5Mf5HBO1+bd4HA==, tarball: https://git.methanium.net/methanium/mtp/releases/download/0.2.0-3919eb46fd/mtp-0.2.0.tgz} - version: 0.2.0 - - nanoid@3.3.15: - resolution: {integrity: sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - - negotiator@1.0.0: - resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} - engines: {node: '>= 0.6'} - - next-themes@0.4.6: - resolution: {integrity: sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==} - peerDependencies: - react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc - react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc - - node-abi@4.33.0: - resolution: {integrity: sha512-vLBWCKb+7LWsX+TbfzWOkw0W81m377tyx3hOweBTjO43CXZnRGS1/JPWs20fr0PgZyDXk6ROYrylsEycK8raDA==} - engines: {node: '>=22.12.0'} - - node-api-version@0.2.1: - resolution: {integrity: sha512-2xP/IGGMmmSQpI1+O/k72jF/ykvZ89JeuKX3TLJAYPDVLUalrshrLHkeVcCCZqG/eEa635cr8IBYzgnDvM2O8Q==} - - node-gyp@12.4.0: - resolution: {integrity: sha512-OMcPNvqTCFUnNaBlmdgq+lfNqY7gTiSmNRDjY3uAXRyudeKZEZxu3CLtjMQrx4zZxCX2b/mpNqTtwuCJgXhHkw==} - engines: {node: ^20.17.0 || >=22.9.0} - hasBin: true - - node-int64@0.4.0: - resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - - node-releases@2.0.50: - resolution: {integrity: sha512-J6l92tKHX6w8Jy5nO1Vuc01NoIiRGi/d6qBKVxh+IQ8Cr3b6HbVNfKiF8ZpFKufTwpwxMmce2W3iQZ861ZRyTg==} - engines: {node: '>=18'} - - nopt@9.0.0: - resolution: {integrity: sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw==} - engines: {node: ^20.17.0 || >=22.9.0} - hasBin: true - - normalize-url@6.1.0: - resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} - engines: {node: '>=10'} - - npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} - - npm-run-path@6.0.0: - resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} - engines: {node: '>=18'} - - object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - - object-inspect@1.13.4: - resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} - engines: {node: '>= 0.4'} - - object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - - object-treeify@1.1.33: - resolution: {integrity: sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==} - engines: {node: '>= 10'} - - obug@2.1.3: - resolution: {integrity: sha512-9miFgM2OFba7hB+pRgvtV84pYTBaoTHohvmIgiRt6dRIzbwEOIaNaP+dIlGs2fNFoB0SeISs0Jz5WFVRid6Xyg==} - engines: {node: '>=12.20.0'} - - on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - - onetime@7.0.0: - resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} - engines: {node: '>=18'} - - open@11.0.0: - resolution: {integrity: sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==} - engines: {node: '>=20'} - - open@8.4.2: - resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} - engines: {node: '>=12'} - - optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} - engines: {node: '>= 0.8.0'} - - ora@8.2.0: - resolution: {integrity: sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==} - engines: {node: '>=18'} - - p-cancelable@2.1.1: - resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} - engines: {node: '>=8'} - - p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@3.0.0: - resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} - engines: {node: '>=6'} - - p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - - parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - - parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} - - parse-ms@4.0.0: - resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} - engines: {node: '>=18'} - - parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} - - path-browserify@1.0.1: - resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} - - path-exists@3.0.0: - resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} - engines: {node: '>=4'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - - path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} - - path-to-regexp@8.4.2: - resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==} - - pathe@2.0.3: - resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - - pe-library@0.4.1: - resolution: {integrity: sha512-eRWB5LBz7PpDu4PUlwT0PhnQfTQJlDDdPa35urV4Osrm0t0AqQFGn+UIkU3klZvwJ8KPO3VbBFsXquA6p6kqZw==} - engines: {node: '>=12', npm: '>=6'} - - pend@1.2.0: - resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} - - picocolors@1.1.1: - resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - - picomatch@2.3.2: - resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} - engines: {node: '>=8.6'} - - picomatch@4.0.5: - resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} - engines: {node: '>=12'} - - pkce-challenge@5.0.1: - resolution: {integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==} - engines: {node: '>=16.20.0'} - - pkg-up@3.1.0: - resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} - engines: {node: '>=8'} - - pkijs@3.4.0: - resolution: {integrity: sha512-emEcLuomt2j03vxD54giVB4SxTjnsqkU692xZOZXHDVoYyypEm+b3jpiTcc+Cf+myooc+/Ly0z01jqeNHVgJGw==} - engines: {node: '>=16.0.0'} - - plist@3.1.0: - resolution: {integrity: sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==} - engines: {node: '>=10.4.0'} - - pngjs@5.0.0: - resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} - engines: {node: '>=10.13.0'} - - postcss-selector-parser@7.1.4: - resolution: {integrity: sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==} - engines: {node: '>=4'} - - postcss@8.5.16: - resolution: {integrity: sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg==} - engines: {node: ^10 || ^12 || >=14} - - postject@1.0.0-alpha.6: - resolution: {integrity: sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A==} - engines: {node: '>=14.0.0'} - hasBin: true - - powershell-utils@0.1.0: - resolution: {integrity: sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==} - engines: {node: '>=20'} - - prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - - prettier@3.9.4: - resolution: {integrity: sha512-yWG/o/4oJfo036EKAfK6ACAoDOfHeRHx4tuxkfBZiauURiaSmYwlpOr5LQqKtIkRD2z1PLteme2WoxEnj4tHTg==} - engines: {node: '>=14'} - hasBin: true - - pretty-ms@9.3.0: - resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} - engines: {node: '>=18'} - - proc-log@6.1.0: - resolution: {integrity: sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==} - engines: {node: ^20.17.0 || >=22.9.0} - - process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - - progress@2.0.3: - resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} - engines: {node: '>=0.4.0'} - - promise-retry@2.0.1: - resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} - engines: {node: '>=10'} - - prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} - - proper-lockfile@4.1.2: - resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==} - - proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} - engines: {node: '>= 0.10'} - - pump@3.0.4: - resolution: {integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==} - - punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - - pvtsutils@1.3.6: - resolution: {integrity: sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==} - - pvutils@1.1.5: - resolution: {integrity: sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==} - engines: {node: '>=16.0.0'} - - qrcode@1.5.4: - resolution: {integrity: sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==} - engines: {node: '>=10.13.0'} - hasBin: true - - qs@6.15.3: - resolution: {integrity: sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==} - engines: {node: '>=0.6'} - - queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - - quick-lru@5.1.1: - resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} - engines: {node: '>=10'} - - range-parser@1.3.0: - resolution: {integrity: sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==} - engines: {node: '>= 0.6'} - - raw-body@3.0.2: - resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} - engines: {node: '>= 0.10'} - - react-day-picker@10.0.1: - resolution: {integrity: sha512-eNh6BlwcYInWaJtRv18mXQ06Ys/H6rdTZAnTaSdOYJuTpwP1JMCHNd1FDRadA+gbeinq+psdULN5Xnowy9mV8w==} - engines: {node: '>=18'} - peerDependencies: - '@types/react': '>=16.8.0' - react: '>=16.8.0' - peerDependenciesMeta: - '@types/react': - optional: true - - react-dom@19.2.7: - resolution: {integrity: sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==} - peerDependencies: - react: ^19.2.7 - - react-is@19.2.7: - resolution: {integrity: sha512-kZFnouyVv7eP/Phmrlo9FK+zcAdriZJvzxXHF1Sl1P377WSGe2G/JxVolhTrB/jeV47lKImhNUsijjHAAbcl/A==} - - react-redux@9.3.0: - resolution: {integrity: sha512-KQopgqFo/p/fgmAs5qz6p5RWaNAzq40WAu7fJIXnQpYxFPbJYtsJPWvGeF2rOBaY/kEuV77AVsX8TsQzKm+A/g==} - peerDependencies: - '@types/react': ^18.2.25 || ^19 - react: ^18.0 || ^19 - redux: ^5.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - redux: - optional: true - - react-remove-scroll-bar@2.3.8: - resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - - react-remove-scroll@2.7.2: - resolution: {integrity: sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - react-resizable-panels@4.12.0: - resolution: {integrity: sha512-t/Gp57qSCxGQ52ckhz+8lM7dnuymeU95TEzl2U203qEbGkSLHrtm7US2/ANzq/zOlja3CwPTAfCDuh1unv9mfw==} - peerDependencies: - react: ^18.0.0 || ^19.0.0 - react-dom: ^18.0.0 || ^19.0.0 - - react-style-singleton@2.2.3: - resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - react@19.2.7: - resolution: {integrity: sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==} - engines: {node: '>=0.10.0'} - - read-binary-file-arch@1.0.6: - resolution: {integrity: sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==} - hasBin: true - - readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} - - recast@0.23.12: - resolution: {integrity: sha512-dEWRjcINDu/F4l2dYx57ugBtD7HV9KXESyxhzw/MqWLeglJrsjJKqACPyUPg+6AF8mIgm+Zi0dZ3ACoIg+QtpA==} - engines: {node: '>= 4'} - - recharts@3.8.1: - resolution: {integrity: sha512-mwzmO1s9sFL0TduUpwndxCUNoXsBw3u3E/0+A+cLcrSfQitSG62L32N69GhqUrrT5qKcAE3pCGVINC6pqkBBQg==} - engines: {node: '>=18'} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-is: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - - redux-thunk@3.1.0: - resolution: {integrity: sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==} - peerDependencies: - redux: ^5.0.0 - - redux@5.0.1: - resolution: {integrity: sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} - - require-main-filename@2.0.0: - resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} - - resedit@1.7.2: - resolution: {integrity: sha512-vHjcY2MlAITJhC0eRD/Vv8Vlgmu9Sd3LX9zZvtGzU5ZImdTN3+d6e/4mnTyV8vEbyf1sgNIrWxhWlrys52OkEA==} - engines: {node: '>=12', npm: '>=6'} - - reselect@5.1.1: - resolution: {integrity: sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==} - - reselect@5.2.0: - resolution: {integrity: sha512-AgZ3UOZm3YndfrJ4OYjgrT7bmCm/1iqkjvEfH/oYjzh6PD2qw4QuT3jjnXIrpdt4MTpMXclMT3lXbmRY+XRakw==} - - resolve-alpn@1.2.1: - resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} - - resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - - responselike@2.0.1: - resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} - - restore-cursor@5.1.0: - resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} - engines: {node: '>=18'} - - retry@0.12.0: - resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} - engines: {node: '>= 4'} - - reusify@1.1.0: - resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - - rimraf@2.6.3: - resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - - roarr@2.15.4: - resolution: {integrity: sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==} - engines: {node: '>=8.0'} - - rolldown@1.1.4: - resolution: {integrity: sha512-IjZYiLxZwpnhwhdBH2ugdTGVSdhCQUmLxLoqyjiL0JxYjyRst+5a0P3xfrTxJ5F638j4Mvvw5FAX5XE6eHpXbA==} - engines: {node: ^20.19.0 || >=22.12.0} - hasBin: true - - router@2.2.0: - resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} - engines: {node: '>= 18'} - - run-applescript@7.1.0: - resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} - engines: {node: '>=18'} - - run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - - rxjs@7.8.2: - resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} - - safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - - safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - - sanitize-filename@1.6.4: - resolution: {integrity: sha512-9ZyI08PsvdQl2r/bBIGubpVdR3RR9sY6RDiWFPreA21C/EFlQhmgo20UZlNjZMMZNubusLhAQozkA0Od5J21Eg==} - - sax@1.6.0: - resolution: {integrity: sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==} - engines: {node: '>=11.0.0'} - - scheduler@0.27.0: - resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} - - sdp-transform@2.15.0: - resolution: {integrity: sha512-KrOH82c/W+GYQ0LHqtr3caRpM3ITglq3ljGUIb8LTki7ByacJZ9z+piSGiwZDsRyhQbYBOBJgr2k6X4BZXi3Kw==} - hasBin: true - - sdp@3.2.2: - resolution: {integrity: sha512-xZocWwfyp4hkbN4hLWxMjmv2Q8aNa9MhmOZ7L9aCZPT+dZsgRr6wZRrSYE3HTdyk/2pZKPSgqI7ns7Een1xMSA==} - - semver-compare@1.0.0: - resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} - - semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} - hasBin: true - - semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - - semver@7.7.4: - resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} - engines: {node: '>=10'} - hasBin: true - - semver@7.8.5: - resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} - engines: {node: '>=10'} - hasBin: true - - send@1.2.1: - resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} - engines: {node: '>= 18'} - - serialize-error@7.0.1: - resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} - engines: {node: '>=10'} - - seroval-plugins@1.5.4: - resolution: {integrity: sha512-S0xQPhUTefAhNvNWFg0c1J8qJArHt5KdtJ/cFAofo06KD1MVSeFWyl4iiu+ApDIuw0WhjpOfCdgConOfAnLgkw==} - engines: {node: '>=10'} - peerDependencies: - seroval: ^1.0 - - seroval@1.5.4: - resolution: {integrity: sha512-46uFvgrXTVxZcUorgSSRZ4y+ieqLLQRMlG4bnCZKW3qI6BZm7Rg4ntMW4p1mILEEBZWrFlcpp0AyIIlM6jD9iw==} - engines: {node: '>=10'} - - serve-static@2.2.1: - resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} - engines: {node: '>= 18'} - - set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - - setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - - shadcn@4.12.0: - resolution: {integrity: sha512-o781ieQziCnXH2FKsEqxp1fnbHdbgAPO9inTSPeZ59hQfsZXuMGp3ul8oFSV5KQS4nbUK9b+DrDE6C7OvfKKQQ==} - engines: {node: '>=20.18.1'} - hasBin: true - - shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - - shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - - side-channel-list@1.0.1: - resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} - engines: {node: '>= 0.4'} - - side-channel-map@1.0.1: - resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} - engines: {node: '>= 0.4'} - - side-channel-weakmap@1.0.2: - resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} - engines: {node: '>= 0.4'} - - side-channel@1.1.1: - resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==} - engines: {node: '>= 0.4'} - - siginfo@2.0.0: - resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - - signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - - signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - - simple-update-notifier@2.0.0: - resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} - engines: {node: '>=10'} - - sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - - sonner@2.0.7: - resolution: {integrity: sha512-W6ZN4p58k8aDKA4XPcx2hpIQXBRAgyiWVkYhT7CvK6D3iAu7xjvVyhQHg2/iaKJZ1XVJ4r7XuwGL+WGEK37i9w==} - peerDependencies: - react: ^18.0.0 || ^19.0.0 || ^19.0.0-rc - react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-rc - - source-map-js@1.2.1: - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} - engines: {node: '>=0.10.0'} - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - sprintf-js@1.1.3: - resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} - - stackback@0.0.2: - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - - stat-mode@1.0.0: - resolution: {integrity: sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==} - engines: {node: '>= 6'} - - statuses@2.0.2: - resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} - engines: {node: '>= 0.8'} - - std-env@4.1.0: - resolution: {integrity: sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==} - - stdin-discarder@0.2.2: - resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} - engines: {node: '>=18'} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - string-width@7.2.0: - resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} - engines: {node: '>=18'} - - string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} - - stringify-object@5.0.0: - resolution: {integrity: sha512-zaJYxz2FtcMb4f+g60KsRNFOpVMUyuJgA51Zi5Z1DOTC3S59+OQiVOzE9GZt0x72uBGWKsQIuBKeF9iusmKFsg==} - engines: {node: '>=14.16'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-ansi@7.2.0: - resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} - engines: {node: '>=12'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - - strip-final-newline@4.0.0: - resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} - engines: {node: '>=18'} - - style-mod@4.1.3: - resolution: {integrity: sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==} - - sumchecker@3.0.1: - resolution: {integrity: sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==} - engines: {node: '>= 8.0'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - systeminformation@5.31.11: - resolution: {integrity: sha512-I6O7iaUj23AXRgCPDDnvi3xHvdOLp4+1YMbF+X194lJwY1NeWojgHJPhslVKcmTtrLTguRk3QJK+xEdTiI3P0w==} - engines: {node: '>=8.0.0'} - os: [darwin, linux, win32, freebsd, openbsd, netbsd, sunos, android] - hasBin: true - - tailwind-merge@3.6.0: - resolution: {integrity: sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w==} - - tailwind-scrollbar-hide@4.0.0: - resolution: {integrity: sha512-gobtvVcThB2Dxhy0EeYSS1RKQJ5baDFkamkhwBvzvevwX6L4XQfpZ3me9s25Ss1ecFVT5jPYJ50n+7xTBJG9WQ==} - peerDependencies: - tailwindcss: '>=3.0.0 || >= 4.0.0 || >= 4.0.0-beta.8 || >= 4.0.0-alpha.20' - - tailwindcss@4.3.2: - resolution: {integrity: sha512-WtctNNSH8A9jlMIqxzuYumOHU5uGZyRv0Q5svQl+oEPy5w84YpBxdb7MdqyiSPQge5jTJ6zFQLq0PFygdccSBA==} - - tapable@2.3.3: - resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} - engines: {node: '>=6'} - - tar@7.5.19: - resolution: {integrity: sha512-4LeEWl96twnS2Q7Bz4MGqgazLqO+hJN63GZxXoIqh1T3VweYD997gbU1ItNsQafqqXTXd5WFyFdReLtwvRBNiw==} - engines: {node: '>=18'} - - tauri-plugin-app-events-api@0.2.0: - resolution: {integrity: sha512-CnlAeucWhT+Rgx6CCsqUpq2D3pqgx0fhjSPKomH7O2t1rGVu5kGLMkYvaCX6gqVTUYpIWX5BLV7LGY2DRri0QA==} - - temp-file@3.4.0: - resolution: {integrity: sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==} - - temp@0.9.4: - resolution: {integrity: sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==} - engines: {node: '>=6.0.0'} - - tiny-async-pool@1.3.0: - resolution: {integrity: sha512-01EAw5EDrcVrdgyCLgoSPvqznC0sVxDSVeiOz09FUpjh71G79VCqneOr+xvt7T1r76CF6ZZfPjHorN2+d+3mqA==} - - tiny-invariant@1.3.3: - resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} - - tinybench@2.9.0: - resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} - - tinyexec@1.2.4: - resolution: {integrity: sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==} - engines: {node: '>=18'} - - tinyglobby@0.2.17: - resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} - engines: {node: '>=12.0.0'} - - tinyrainbow@3.1.0: - resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==} - engines: {node: '>=14.0.0'} - - tmp-promise@3.0.3: - resolution: {integrity: sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==} - - tmp@0.2.7: - resolution: {integrity: sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==} - engines: {node: '>=14.14'} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} - - truncate-utf8-bytes@1.0.2: - resolution: {integrity: sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==} - - ts-api-utils@2.5.0: - resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} - engines: {node: '>=18.12'} - peerDependencies: - typescript: '>=4.8.4' - - ts-morph@26.0.0: - resolution: {integrity: sha512-ztMO++owQnz8c/gIENcM9XfCEzgoGphTv+nKpYNM1bgsdOVC/jRZuEBf6N+mLLDNg68Kl+GgUZfOySaRiG1/Ug==} - - tsconfig-paths@4.2.0: - resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} - engines: {node: '>=6'} - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - tw-animate-css@1.4.0: - resolution: {integrity: sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==} - - type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - - type-fest@0.13.1: - resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} - engines: {node: '>=10'} - - type-is@2.1.0: - resolution: {integrity: sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==} - engines: {node: '>= 18'} - - typed-emitter@2.1.0: - resolution: {integrity: sha512-g/KzbYKbH5C2vPkaXGu8DJlHrGKHLsM25Zg9WuC9pMGfuvT+X25tZQWo5fK1BjBm8+UrVE9LDCvaY0CQk+fXDA==} - - typescript-eslint@8.62.1: - resolution: {integrity: sha512-vymnnM5g0AKQDSAyfP12nMIBvgwgA42syg74kkuZ4x1VuTzwQKwc5h9rGxeShCjny5o+zWAb6OEoz7XLgrIkIw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' - - typescript@6.0.3: - resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} - engines: {node: '>=14.17'} - hasBin: true - - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - - undici-types@7.24.6: - resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} - - undici-types@8.3.0: - resolution: {integrity: sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==} - - undici@6.27.0: - resolution: {integrity: sha512-YmfV3YnEDzXRC5lZ2jWtWWHKGUm1zIt8AhesR1tens+HTNv+YZlN/dp6G727LOvMJ8xjP9Be7Y2Sdr96LDm+pg==} - engines: {node: '>=18.17'} - - undici@7.28.0: - resolution: {integrity: sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==} - engines: {node: '>=20.18.1'} - - unicorn-magic@0.3.0: - resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} - engines: {node: '>=18'} - - universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} - - universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} - engines: {node: '>= 10.0.0'} - - unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} - - unzipper@0.12.5: - resolution: {integrity: sha512-tXYOi9R57Uj/2Z25SOs5RRSzq886MBQj2gY8dPL+xl/kv6s6SvByoKfAtvfVeEuhntWDgjd2o9p2lb4TVPAz0A==} - - update-browserslist-db@1.2.3: - resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - - uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - - use-callback-ref@1.3.3: - resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - use-sidecar@1.1.3: - resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - use-sync-external-store@1.6.0: - resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - - usehooks-ts@3.1.1: - resolution: {integrity: sha512-I4diPp9Cq6ieSUH2wu+fDAVQO43xwtulo+fKEidHUwZPnYImbtkTjzIJYcDcJqxgmX31GVqNFURodvcgHcW0pA==} - engines: {node: '>=16.15.0'} - peerDependencies: - react: ^16.8.0 || ^17 || ^18 || ^19 || ^19.0.0-rc - - utf8-byte-length@1.0.5: - resolution: {integrity: sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==} - - util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - - validate-npm-package-name@7.0.2: - resolution: {integrity: sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A==} - engines: {node: ^20.17.0 || >=22.9.0} - - vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} - - vaul@1.1.2: - resolution: {integrity: sha512-ZFkClGpWyI2WUQjdLJ/BaGuV6AVQiJ3uELGk3OYtP+B6yCO7Cmn9vPFXVJkRaGkOJu3m8bQMgtyzNHixULceQA==} - peerDependencies: - react: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc - - victory-vendor@37.3.6: - resolution: {integrity: sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ==} - - vite@8.1.3: - resolution: {integrity: sha512-Ds+gBRbj0lwRO2Y5hwnUBdxSwlAve9LeRyU4sNnAr0ewW0gWF0n5bgXgUzbgZ49MV9BVUAQUFYVcDUcilUExMA==} - engines: {node: ^20.19.0 || >=22.12.0} - hasBin: true - peerDependencies: - '@types/node': ^20.19.0 || >=22.12.0 - '@vitejs/devtools': ^0.3.0 - 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 - - vitest@4.1.9: - resolution: {integrity: sha512-nE3/LEyc0z87uHYLZebqCUOaJr2hdtuPp7BQ4BosVFnfltxgAvMG08NyrSGlPpOUWvR27c5flSmYFTNr78L9GQ==} - engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@opentelemetry/api': ^1.9.0 - '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.1.9 - '@vitest/browser-preview': 4.1.9 - '@vitest/browser-webdriverio': 4.1.9 - '@vitest/coverage-istanbul': 4.1.9 - '@vitest/coverage-v8': 4.1.9 - '@vitest/ui': 4.1.9 - happy-dom: '*' - jsdom: '*' - vite: ^6.0.0 || ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@opentelemetry/api': - optional: true - '@types/node': - optional: true - '@vitest/browser-playwright': - optional: true - '@vitest/browser-preview': - optional: true - '@vitest/browser-webdriverio': - optional: true - '@vitest/coverage-istanbul': - optional: true - '@vitest/coverage-v8': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true - - w3c-keyname@2.2.8: - resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} - - webcrypto-core@1.9.2: - resolution: {integrity: sha512-gsXecm82UQNlTBURJGuqOWy1Ww08S3kZUcr3aOJS02Pk0xLtkfeUAVC0u0xhgdonFme80edSJUIJyuvL/7250Q==} - - webrtc-adapter@9.0.5: - resolution: {integrity: sha512-U9vjByy/sK2OMXu5mmfuZFKTMIUQe34c0JXRO+oDrxJTsntdYT2iIFwYMOV7HhMTuktcZLGf2W1N/OcSf9ssWg==} - engines: {node: '>=6.0.0', npm: '>=3.10.0'} - - which-module@2.0.1: - resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - which@4.0.0: - resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} - engines: {node: ^16.13.0 || >=18.0.0} - hasBin: true - - which@5.0.0: - resolution: {integrity: sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==} - engines: {node: ^18.17.0 || >=20.5.0} - hasBin: true - - which@6.0.1: - resolution: {integrity: sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==} - engines: {node: ^20.17.0 || >=22.9.0} - hasBin: true - - why-is-node-running@2.3.0: - resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} - engines: {node: '>=8'} - hasBin: true - - word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} - - wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - wsl-utils@0.3.1: - resolution: {integrity: sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==} - engines: {node: '>=20'} - - xmlbuilder@15.1.1: - resolution: {integrity: sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==} - engines: {node: '>=8.0'} - - y18n@4.0.3: - resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - - yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - - yallist@5.0.0: - resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} - engines: {node: '>=18'} - - yaml@2.9.0: - resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} - engines: {node: '>= 14.6'} - hasBin: true - - yargs-parser@18.1.3: - resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} - engines: {node: '>=6'} - - yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - - yargs@15.4.1: - resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} - engines: {node: '>=8'} - - yargs@17.7.3: - resolution: {integrity: sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==} - engines: {node: '>=12'} - - yauzl@2.10.0: - resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - - yocto-spinner@1.2.0: - resolution: {integrity: sha512-Yw0hUB6UA3o4YUgKy3oSe9a4cxoaZ9sBfYDw+JSxo6Id0KoJGoxzPA24qqUXYKBWABs/zDSGTz9kww7t3F0XGw==} - engines: {node: '>=18.19'} - - yoctocolors@2.1.2: - resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} - engines: {node: '>=18'} - - zod-to-json-schema@3.25.2: - resolution: {integrity: sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==} - peerDependencies: - zod: ^3.25.28 || ^4 - - zod-validation-error@4.0.2: - resolution: {integrity: sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==} - engines: {node: '>=18.0.0'} - peerDependencies: - zod: ^3.25.0 || ^4.0.0 - - zod@3.25.76: - resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} - - zod@4.4.3: - resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} - - zustand@5.0.14: - resolution: {integrity: sha512-/8tAspM5LMPr28b3fwLYrtdj77ECpfZviaP75CMTnwO8ISyaE4GDIG/9rDDYq/cH9D2Xw2A2RXglLInmVBQB/g==} - engines: {node: '>=12.20.0'} - peerDependencies: - '@types/react': '>=18.0.0' - immer: '>=9.0.6' - react: '>=18.0.0' - use-sync-external-store: '>=1.2.0' - peerDependenciesMeta: - '@types/react': - optional: true - immer: - optional: true - react: - optional: true - use-sync-external-store: - optional: true - -snapshots: - - '@babel/code-frame@7.29.7': - dependencies: - '@babel/helper-validator-identifier': 7.29.7 - js-tokens: 4.0.0 - picocolors: 1.1.1 - - '@babel/compat-data@7.29.7': {} - - '@babel/core@7.29.7': - 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/core@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.4.3 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/generator@7.29.7': - dependencies: - '@babel/parser': 7.29.7 - '@babel/types': 7.29.7 - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - jsesc: 3.1.0 - - '@babel/helper-annotate-as-pure@7.29.7': - dependencies: - '@babel/types': 7.29.7 - - '@babel/helper-compilation-targets@7.29.7': - dependencies: - '@babel/compat-data': 7.29.7 - '@babel/helper-validator-option': 7.29.7 - browserslist: 4.28.4 - lru-cache: 5.1.1 - semver: 6.3.1 - - '@babel/helper-create-class-features-plugin@7.29.7(@babel/core@7.29.7)': - dependencies: - '@babel/core': 7.29.7 - '@babel/helper-annotate-as-pure': 7.29.7 - '@babel/helper-member-expression-to-functions': 7.29.7 - '@babel/helper-optimise-call-expression': 7.29.7 - '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7) - '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 - '@babel/traverse': 7.29.7 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/helper-globals@7.29.7': {} - - '@babel/helper-member-expression-to-functions@7.29.7': - dependencies: - '@babel/traverse': 7.29.7 - '@babel/types': 7.29.7 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-imports@7.29.7': - dependencies: - '@babel/traverse': 7.29.7 - '@babel/types': 7.29.7 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)': - dependencies: - '@babel/core': 7.29.7 - '@babel/helper-module-imports': 7.29.7 - '@babel/helper-validator-identifier': 7.29.7 - '@babel/traverse': 7.29.7 - transitivePeerDependencies: - - supports-color - - '@babel/helper-optimise-call-expression@7.29.7': - dependencies: - '@babel/types': 7.29.7 - - '@babel/helper-plugin-utils@7.29.7': {} - - '@babel/helper-replace-supers@7.29.7(@babel/core@7.29.7)': - dependencies: - '@babel/core': 7.29.7 - '@babel/helper-member-expression-to-functions': 7.29.7 - '@babel/helper-optimise-call-expression': 7.29.7 - '@babel/traverse': 7.29.7 - transitivePeerDependencies: - - supports-color - - '@babel/helper-skip-transparent-expression-wrappers@7.29.7': - dependencies: - '@babel/traverse': 7.29.7 - '@babel/types': 7.29.7 - transitivePeerDependencies: - - supports-color - - '@babel/helper-string-parser@7.29.7': {} - - '@babel/helper-validator-identifier@7.29.7': {} - - '@babel/helper-validator-option@7.29.7': {} - - '@babel/helpers@7.29.7': - dependencies: - '@babel/template': 7.29.7 - '@babel/types': 7.29.7 - - '@babel/parser@7.29.7': - dependencies: - '@babel/types': 7.29.7 - - '@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7)': - dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 - - '@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7)': - dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 - - '@babel/plugin-transform-modules-commonjs@7.29.7(@babel/core@7.29.7)': - dependencies: - '@babel/core': 7.29.7 - '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) - '@babel/helper-plugin-utils': 7.29.7 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-typescript@7.29.7(@babel/core@7.29.7)': - dependencies: - '@babel/core': 7.29.7 - '@babel/helper-annotate-as-pure': 7.29.7 - '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7) - '@babel/helper-plugin-utils': 7.29.7 - '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 - '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7) - transitivePeerDependencies: - - supports-color - - '@babel/preset-typescript@7.29.7(@babel/core@7.29.7)': - dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 - '@babel/helper-validator-option': 7.29.7 - '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7) - transitivePeerDependencies: - - supports-color - - '@babel/runtime@7.29.7': {} - - '@babel/template@7.29.7': - dependencies: - '@babel/code-frame': 7.29.7 - '@babel/parser': 7.29.7 - '@babel/types': 7.29.7 - - '@babel/traverse@7.29.7': - dependencies: - '@babel/code-frame': 7.29.7 - '@babel/generator': 7.29.7 - '@babel/helper-globals': 7.29.7 - '@babel/parser': 7.29.7 - '@babel/template': 7.29.7 - '@babel/types': 7.29.7 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - - '@babel/types@7.29.7': - dependencies: - '@babel/helper-string-parser': 7.29.7 - '@babel/helper-validator-identifier': 7.29.7 - - '@base-ui/react@1.6.0(@date-fns/tz@1.5.0)(@types/react@19.2.17)(date-fns@4.4.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': - dependencies: - '@babel/runtime': 7.29.7 - '@base-ui/utils': 0.3.1(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@floating-ui/react-dom': 2.1.8(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@floating-ui/utils': 0.2.11 - react: 19.2.7 - react-dom: 19.2.7(react@19.2.7) - use-sync-external-store: 1.6.0(react@19.2.7) - optionalDependencies: - '@date-fns/tz': 1.5.0 - '@types/react': 19.2.17 - date-fns: 4.4.0 - - '@base-ui/utils@0.3.1(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': - dependencies: - '@babel/runtime': 7.29.7 - '@floating-ui/utils': 0.2.11 - react: 19.2.7 - react-dom: 19.2.7(react@19.2.7) - reselect: 5.2.0 - use-sync-external-store: 1.6.0(react@19.2.7) - optionalDependencies: - '@types/react': 19.2.17 - - '@bufbuild/protobuf@1.10.1': {} - - '@codemirror/autocomplete@6.20.3': - dependencies: - '@codemirror/language': 6.12.4 - '@codemirror/state': 6.7.0 - '@codemirror/view': 6.43.4 - '@lezer/common': 1.5.2 - - '@codemirror/commands@6.10.4': - dependencies: - '@codemirror/language': 6.12.4 - '@codemirror/state': 6.7.0 - '@codemirror/view': 6.43.4 - '@lezer/common': 1.5.2 - - '@codemirror/lang-css@6.3.1': - dependencies: - '@codemirror/autocomplete': 6.20.3 - '@codemirror/language': 6.12.4 - '@codemirror/state': 6.7.0 - '@lezer/common': 1.5.2 - '@lezer/css': 1.3.4 - - '@codemirror/lang-html@6.4.11': - dependencies: - '@codemirror/autocomplete': 6.20.3 - '@codemirror/lang-css': 6.3.1 - '@codemirror/lang-javascript': 6.2.5 - '@codemirror/language': 6.12.4 - '@codemirror/state': 6.7.0 - '@codemirror/view': 6.43.4 - '@lezer/common': 1.5.2 - '@lezer/css': 1.3.4 - '@lezer/html': 1.3.13 - - '@codemirror/lang-javascript@6.2.5': - dependencies: - '@codemirror/autocomplete': 6.20.3 - '@codemirror/language': 6.12.4 - '@codemirror/lint': 6.9.7 - '@codemirror/state': 6.7.0 - '@codemirror/view': 6.43.4 - '@lezer/common': 1.5.2 - '@lezer/javascript': 1.5.4 - - '@codemirror/lang-markdown@6.5.0': - dependencies: - '@codemirror/autocomplete': 6.20.3 - '@codemirror/lang-html': 6.4.11 - '@codemirror/language': 6.12.4 - '@codemirror/state': 6.7.0 - '@codemirror/view': 6.43.4 - '@lezer/common': 1.5.2 - '@lezer/markdown': 1.6.4 - - '@codemirror/language@6.12.4': - dependencies: - '@codemirror/state': 6.7.0 - '@codemirror/view': 6.43.4 - '@lezer/common': 1.5.2 - '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.10 - style-mod: 4.1.3 - - '@codemirror/lint@6.9.7': - dependencies: - '@codemirror/state': 6.7.0 - '@codemirror/view': 6.43.4 - crelt: 1.0.7 - - '@codemirror/state@6.7.0': - dependencies: - '@marijn/find-cluster-break': 1.0.3 - - '@codemirror/view@6.43.4': - dependencies: - '@codemirror/state': 6.7.0 - crelt: 1.0.7 - style-mod: 4.1.3 - w3c-keyname: 2.2.8 - - '@date-fns/tz@1.5.0': {} - - '@dotenvx/dotenvx@1.75.1': - dependencies: - '@dotenvx/primitives': 0.8.0 - commander: 11.1.0 - conf: 10.2.0 - dotenv: 17.4.2 - enquirer: 2.4.1 - env-paths: 2.2.1 - execa: 5.1.1 - fdir: 6.5.0(picomatch@4.0.5) - ignore: 5.3.2 - object-treeify: 1.1.33 - open: 8.4.2 - picomatch: 4.0.5 - systeminformation: 5.31.11 - undici: 7.28.0 - which: 4.0.0 - yocto-spinner: 1.2.0 - - '@dotenvx/primitives@0.8.0': {} - - '@electron/asar@3.4.1': - dependencies: - commander: 5.1.0 - glob: 7.2.3 - minimatch: 3.1.5 - - '@electron/fuses@1.8.0': - dependencies: - chalk: 4.1.2 - fs-extra: 9.1.0 - minimist: 1.2.8 - - '@electron/get@2.0.3': - dependencies: - debug: 4.4.3 - env-paths: 2.2.1 - fs-extra: 8.1.0 - got: 11.8.6 - progress: 2.0.3 - semver: 6.3.1 - sumchecker: 3.0.1 - optionalDependencies: - global-agent: 3.0.0 - transitivePeerDependencies: - - supports-color - - '@electron/get@3.1.0': - dependencies: - debug: 4.4.3 - env-paths: 2.2.1 - fs-extra: 8.1.0 - got: 11.8.6 - progress: 2.0.3 - semver: 6.3.1 - sumchecker: 3.0.1 - optionalDependencies: - global-agent: 3.0.0 - transitivePeerDependencies: - - supports-color - - '@electron/notarize@2.5.0': - dependencies: - debug: 4.4.3 - fs-extra: 9.1.0 - promise-retry: 2.0.1 - transitivePeerDependencies: - - supports-color - - '@electron/osx-sign@1.3.3': - dependencies: - compare-version: 0.1.2 - debug: 4.4.3 - fs-extra: 10.1.0 - isbinaryfile: 4.0.10 - minimist: 1.2.8 - plist: 3.1.0 - transitivePeerDependencies: - - supports-color - - '@electron/rebuild@4.1.0': - dependencies: - '@malept/cross-spawn-promise': 2.0.0 - debug: 4.4.3 - node-abi: 4.33.0 - node-api-version: 0.2.1 - node-gyp: 12.4.0 - read-binary-file-arch: 1.0.6 - transitivePeerDependencies: - - supports-color - - '@electron/universal@2.0.3': - dependencies: - '@electron/asar': 3.4.1 - '@malept/cross-spawn-promise': 2.0.0 - debug: 4.4.3 - dir-compare: 4.2.0 - fs-extra: 11.3.6 - minimatch: 9.0.9 - plist: 3.1.0 - transitivePeerDependencies: - - supports-color - - '@electron/windows-sign@1.2.2': - dependencies: - cross-dirname: 0.1.0 - debug: 4.4.3 - fs-extra: 11.3.6 - minimist: 1.2.8 - postject: 1.0.0-alpha.6 - transitivePeerDependencies: - - supports-color - optional: true - - '@emnapi/core@1.11.1': - dependencies: - '@emnapi/wasi-threads': 1.2.2 - tslib: 2.8.1 - optional: true - - '@emnapi/runtime@1.11.1': - dependencies: - tslib: 2.8.1 - optional: true - - '@emnapi/wasi-threads@1.2.2': - dependencies: - tslib: 2.8.1 - optional: true - - '@esbuild/aix-ppc64@0.25.12': - optional: true - - '@esbuild/android-arm64@0.25.12': - optional: true - - '@esbuild/android-arm@0.25.12': - optional: true - - '@esbuild/android-x64@0.25.12': - optional: true - - '@esbuild/darwin-arm64@0.25.12': - optional: true - - '@esbuild/darwin-x64@0.25.12': - optional: true - - '@esbuild/freebsd-arm64@0.25.12': - optional: true - - '@esbuild/freebsd-x64@0.25.12': - optional: true - - '@esbuild/linux-arm64@0.25.12': - optional: true - - '@esbuild/linux-arm@0.25.12': - optional: true - - '@esbuild/linux-ia32@0.25.12': - optional: true - - '@esbuild/linux-loong64@0.25.12': - optional: true - - '@esbuild/linux-mips64el@0.25.12': - optional: true - - '@esbuild/linux-ppc64@0.25.12': - optional: true - - '@esbuild/linux-riscv64@0.25.12': - optional: true - - '@esbuild/linux-s390x@0.25.12': - optional: true - - '@esbuild/linux-x64@0.25.12': - optional: true - - '@esbuild/netbsd-arm64@0.25.12': - optional: true - - '@esbuild/netbsd-x64@0.25.12': - optional: true - - '@esbuild/openbsd-arm64@0.25.12': - optional: true - - '@esbuild/openbsd-x64@0.25.12': - optional: true - - '@esbuild/openharmony-arm64@0.25.12': - optional: true - - '@esbuild/sunos-x64@0.25.12': - optional: true - - '@esbuild/win32-arm64@0.25.12': - optional: true - - '@esbuild/win32-ia32@0.25.12': - optional: true - - '@esbuild/win32-x64@0.25.12': - optional: true - - '@eslint-community/eslint-utils@4.9.1(eslint@10.6.0(jiti@2.7.0))': - dependencies: - eslint: 10.6.0(jiti@2.7.0) - eslint-visitor-keys: 3.4.3 - - '@eslint-community/regexpp@4.12.2': {} - - '@eslint/config-array@0.23.5': - dependencies: - '@eslint/object-schema': 3.0.5 - debug: 4.4.3 - minimatch: 10.2.5 - transitivePeerDependencies: - - supports-color - - '@eslint/config-helpers@0.6.0': - dependencies: - '@eslint/core': 1.2.1 - - '@eslint/core@1.2.1': - dependencies: - '@types/json-schema': 7.0.15 - - '@eslint/js@10.0.1(eslint@10.6.0(jiti@2.7.0))': - optionalDependencies: - eslint: 10.6.0(jiti@2.7.0) - - '@eslint/object-schema@3.0.5': {} - - '@eslint/plugin-kit@0.7.2': - dependencies: - '@eslint/core': 1.2.1 - levn: 0.4.1 - - '@fallow-cli/darwin-arm64@2.104.0': - optional: true - - '@fallow-cli/darwin-x64@2.104.0': - optional: true - - '@fallow-cli/linux-arm64-gnu@2.104.0': - optional: true - - '@fallow-cli/linux-arm64-musl@2.104.0': - optional: true - - '@fallow-cli/linux-x64-gnu@2.104.0': - optional: true - - '@fallow-cli/linux-x64-musl@2.104.0': - optional: true - - '@fallow-cli/win32-arm64-msvc@2.104.0': - optional: true - - '@fallow-cli/win32-x64-msvc@2.104.0': - optional: true - - '@floating-ui/core@1.7.5': - dependencies: - '@floating-ui/utils': 0.2.11 - - '@floating-ui/dom@1.7.4': - dependencies: - '@floating-ui/core': 1.7.5 - '@floating-ui/utils': 0.2.11 - - '@floating-ui/dom@1.7.6': - dependencies: - '@floating-ui/core': 1.7.5 - '@floating-ui/utils': 0.2.11 - - '@floating-ui/react-dom@2.1.8(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': - dependencies: - '@floating-ui/dom': 1.7.6 - react: 19.2.7 - react-dom: 19.2.7(react@19.2.7) - - '@floating-ui/utils@0.2.11': {} - - '@fontsource-variable/inter@5.2.8': {} - - '@fontsource-variable/public-sans@5.2.7': {} - - '@hono/node-server@1.19.14(hono@4.12.27)': - dependencies: - hono: 4.12.27 - - '@humanfs/core@0.19.2': - dependencies: - '@humanfs/types': 0.15.0 - - '@humanfs/node@0.16.8': - dependencies: - '@humanfs/core': 0.19.2 - '@humanfs/types': 0.15.0 - '@humanwhocodes/retry': 0.4.3 - - '@humanfs/types@0.15.0': {} - - '@humanwhocodes/module-importer@1.0.1': {} - - '@humanwhocodes/retry@0.4.3': {} - - '@isaacs/fs-minipass@4.0.1': - dependencies: - minipass: 7.1.3 - - '@jridgewell/gen-mapping@0.3.13': - dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 - '@jridgewell/trace-mapping': 0.3.31 - - '@jridgewell/remapping@2.3.5': - dependencies: - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - - '@jridgewell/resolve-uri@3.1.2': {} - - '@jridgewell/sourcemap-codec@1.5.5': {} - - '@jridgewell/trace-mapping@0.3.31': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 - - '@lezer/common@1.5.2': {} - - '@lezer/css@1.3.4': - dependencies: - '@lezer/common': 1.5.2 - '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.10 - - '@lezer/highlight@1.2.3': - dependencies: - '@lezer/common': 1.5.2 - - '@lezer/html@1.3.13': - dependencies: - '@lezer/common': 1.5.2 - '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.10 - - '@lezer/javascript@1.5.4': - dependencies: - '@lezer/common': 1.5.2 - '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.10 - - '@lezer/lr@1.4.10': - dependencies: - '@lezer/common': 1.5.2 - - '@lezer/markdown@1.6.4': - dependencies: - '@lezer/common': 1.5.2 - '@lezer/highlight': 1.2.3 - - '@livekit/components-core@0.12.13(livekit-client@2.20.0(@types/dom-mediacapture-record@1.0.22))(tslib@2.8.1)': - dependencies: - '@floating-ui/dom': 1.7.4 - livekit-client: 2.20.0(@types/dom-mediacapture-record@1.0.22) - loglevel: 1.9.1 - rxjs: 7.8.2 - tslib: 2.8.1 - - '@livekit/components-react@2.9.21(livekit-client@2.20.0(@types/dom-mediacapture-record@1.0.22))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(tslib@2.8.1)': - dependencies: - '@livekit/components-core': 0.12.13(livekit-client@2.20.0(@types/dom-mediacapture-record@1.0.22))(tslib@2.8.1) - clsx: 2.1.1 - events: 3.3.0 - jose: 6.2.3 - livekit-client: 2.20.0(@types/dom-mediacapture-record@1.0.22) - react: 19.2.7 - react-dom: 19.2.7(react@19.2.7) - tslib: 2.8.1 - usehooks-ts: 3.1.1(react@19.2.7) - - '@livekit/mutex@1.1.1': {} - - '@livekit/protocol@1.46.6': - dependencies: - '@bufbuild/protobuf': 1.10.1 - - '@malept/cross-spawn-promise@2.0.0': - dependencies: - cross-spawn: 7.0.6 - - '@malept/flatpak-bundler@0.4.0': - dependencies: - debug: 4.4.3 - fs-extra: 9.1.0 - lodash: 4.18.1 - tmp-promise: 3.0.3 - transitivePeerDependencies: - - supports-color - - '@marijn/find-cluster-break@1.0.3': {} - - '@modelcontextprotocol/sdk@1.29.0(zod@3.25.76)': - dependencies: - '@hono/node-server': 1.19.14(hono@4.12.27) - ajv: 8.20.0 - ajv-formats: 3.0.1(ajv@8.20.0) - content-type: 1.0.5 - cors: 2.8.6 - cross-spawn: 7.0.6 - eventsource: 3.0.7 - eventsource-parser: 3.1.0 - express: 5.2.1 - express-rate-limit: 8.5.2(express@5.2.1) - hono: 4.12.27 - jose: 6.2.3 - json-schema-typed: 8.0.2 - pkce-challenge: 5.0.1 - raw-body: 3.0.2 - zod: 3.25.76 - zod-to-json-schema: 3.25.2(zod@3.25.76) - transitivePeerDependencies: - - supports-color - - '@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': - dependencies: - '@emnapi/core': 1.11.1 - '@emnapi/runtime': 1.11.1 - '@tybys/wasm-util': 0.10.3 - optional: true - - '@noble/hashes@1.4.0': {} - - '@noble/hashes@2.2.0': {} - - '@nodelib/fs.scandir@2.1.5': - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - '@nodelib/fs.stat@2.0.5': {} - - '@nodelib/fs.walk@1.2.8': - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.20.1 - - '@oxc-project/types@0.138.0': {} - - '@peculiar/asn1-schema@2.8.0': - dependencies: - '@peculiar/utils': 2.0.3 - asn1js: 3.0.10 - tslib: 2.8.1 - - '@peculiar/json-schema@1.1.12': - dependencies: - tslib: 2.8.1 - - '@peculiar/utils@2.0.3': - dependencies: - tslib: 2.8.1 - - '@peculiar/webcrypto@1.7.1': - dependencies: - '@peculiar/asn1-schema': 2.8.0 - '@peculiar/json-schema': 1.1.12 - '@peculiar/utils': 2.0.3 - tslib: 2.8.1 - webcrypto-core: 1.9.2 - - '@radix-ui/primitive@1.1.4': {} - - '@radix-ui/react-compose-refs@1.1.3(@types/react@19.2.17)(react@19.2.7)': - dependencies: - react: 19.2.7 - optionalDependencies: - '@types/react': 19.2.17 - - '@radix-ui/react-context@1.1.4(@types/react@19.2.17)(react@19.2.7)': - dependencies: - react: 19.2.7 - optionalDependencies: - '@types/react': 19.2.17 - - '@radix-ui/react-dialog@1.1.18(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': - dependencies: - '@radix-ui/primitive': 1.1.4 - '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.17)(react@19.2.7) - '@radix-ui/react-context': 1.1.4(@types/react@19.2.17)(react@19.2.7) - '@radix-ui/react-dismissable-layer': 1.1.14(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@radix-ui/react-focus-guards': 1.1.4(@types/react@19.2.17)(react@19.2.7) - '@radix-ui/react-focus-scope': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@radix-ui/react-id': 1.1.2(@types/react@19.2.17)(react@19.2.7) - '@radix-ui/react-portal': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@radix-ui/react-presence': 1.1.6(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@radix-ui/react-primitive': 2.1.7(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@radix-ui/react-slot': 1.3.0(@types/react@19.2.17)(react@19.2.7) - '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@19.2.17)(react@19.2.7) - aria-hidden: 1.2.6 - react: 19.2.7 - react-dom: 19.2.7(react@19.2.7) - react-remove-scroll: 2.7.2(@types/react@19.2.17)(react@19.2.7) - optionalDependencies: - '@types/react': 19.2.17 - '@types/react-dom': 19.2.3(@types/react@19.2.17) - - '@radix-ui/react-dismissable-layer@1.1.14(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': - dependencies: - '@radix-ui/primitive': 1.1.4 - '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.17)(react@19.2.7) - '@radix-ui/react-primitive': 2.1.7(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@19.2.17)(react@19.2.7) - '@radix-ui/react-use-effect-event': 0.0.3(@types/react@19.2.17)(react@19.2.7) - react: 19.2.7 - react-dom: 19.2.7(react@19.2.7) - optionalDependencies: - '@types/react': 19.2.17 - '@types/react-dom': 19.2.3(@types/react@19.2.17) - - '@radix-ui/react-focus-guards@1.1.4(@types/react@19.2.17)(react@19.2.7)': - dependencies: - react: 19.2.7 - optionalDependencies: - '@types/react': 19.2.17 - - '@radix-ui/react-focus-scope@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': - dependencies: - '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.17)(react@19.2.7) - '@radix-ui/react-primitive': 2.1.7(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@19.2.17)(react@19.2.7) - react: 19.2.7 - react-dom: 19.2.7(react@19.2.7) - optionalDependencies: - '@types/react': 19.2.17 - '@types/react-dom': 19.2.3(@types/react@19.2.17) - - '@radix-ui/react-id@1.1.2(@types/react@19.2.17)(react@19.2.7)': - dependencies: - '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.17)(react@19.2.7) - react: 19.2.7 - optionalDependencies: - '@types/react': 19.2.17 - - '@radix-ui/react-portal@1.1.13(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': - dependencies: - '@radix-ui/react-primitive': 2.1.7(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.17)(react@19.2.7) - react: 19.2.7 - react-dom: 19.2.7(react@19.2.7) - optionalDependencies: - '@types/react': 19.2.17 - '@types/react-dom': 19.2.3(@types/react@19.2.17) - - '@radix-ui/react-presence@1.1.6(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': - dependencies: - '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.17)(react@19.2.7) - react: 19.2.7 - react-dom: 19.2.7(react@19.2.7) - optionalDependencies: - '@types/react': 19.2.17 - '@types/react-dom': 19.2.3(@types/react@19.2.17) - - '@radix-ui/react-primitive@2.1.7(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': - dependencies: - '@radix-ui/react-slot': 1.3.0(@types/react@19.2.17)(react@19.2.7) - react: 19.2.7 - react-dom: 19.2.7(react@19.2.7) - optionalDependencies: - '@types/react': 19.2.17 - '@types/react-dom': 19.2.3(@types/react@19.2.17) - - '@radix-ui/react-slot@1.3.0(@types/react@19.2.17)(react@19.2.7)': - dependencies: - '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.17)(react@19.2.7) - react: 19.2.7 - optionalDependencies: - '@types/react': 19.2.17 - - '@radix-ui/react-use-callback-ref@1.1.2(@types/react@19.2.17)(react@19.2.7)': - dependencies: - react: 19.2.7 - optionalDependencies: - '@types/react': 19.2.17 - - '@radix-ui/react-use-controllable-state@1.2.3(@types/react@19.2.17)(react@19.2.7)': - dependencies: - '@radix-ui/react-use-effect-event': 0.0.3(@types/react@19.2.17)(react@19.2.7) - '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.17)(react@19.2.7) - react: 19.2.7 - optionalDependencies: - '@types/react': 19.2.17 - - '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.17)(react@19.2.7)': - dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.17)(react@19.2.7) - react: 19.2.7 - optionalDependencies: - '@types/react': 19.2.17 - - '@radix-ui/react-use-effect-event@0.0.3(@types/react@19.2.17)(react@19.2.7)': - dependencies: - '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.17)(react@19.2.7) - react: 19.2.7 - optionalDependencies: - '@types/react': 19.2.17 - - '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.17)(react@19.2.7)': - dependencies: - react: 19.2.7 - optionalDependencies: - '@types/react': 19.2.17 - - '@radix-ui/react-use-layout-effect@1.1.2(@types/react@19.2.17)(react@19.2.7)': - dependencies: - react: 19.2.7 - optionalDependencies: - '@types/react': 19.2.17 - - '@reduxjs/toolkit@2.12.0(react-redux@9.3.0(@types/react@19.2.17)(react@19.2.7))(react@19.2.7)': - dependencies: - '@standard-schema/spec': 1.1.0 - '@standard-schema/utils': 0.3.0 - immer: 11.1.9 - redux: 5.0.1 - redux-thunk: 3.1.0(redux@5.0.1) - reselect: 5.1.1 - optionalDependencies: - react: 19.2.7 - react-redux: 9.3.0(@types/react@19.2.17)(react@19.2.7)(redux@5.0.1) - - '@rolldown/binding-android-arm64@1.1.4': - optional: true - - '@rolldown/binding-darwin-arm64@1.1.4': - optional: true - - '@rolldown/binding-darwin-x64@1.1.4': - optional: true - - '@rolldown/binding-freebsd-x64@1.1.4': - optional: true - - '@rolldown/binding-linux-arm-gnueabihf@1.1.4': - optional: true - - '@rolldown/binding-linux-arm64-gnu@1.1.4': - optional: true - - '@rolldown/binding-linux-arm64-musl@1.1.4': - optional: true - - '@rolldown/binding-linux-ppc64-gnu@1.1.4': - optional: true - - '@rolldown/binding-linux-s390x-gnu@1.1.4': - optional: true - - '@rolldown/binding-linux-x64-gnu@1.1.4': - optional: true - - '@rolldown/binding-linux-x64-musl@1.1.4': - optional: true - - '@rolldown/binding-openharmony-arm64@1.1.4': - optional: true - - '@rolldown/binding-wasm32-wasi@1.1.4': - dependencies: - '@emnapi/core': 1.11.1 - '@emnapi/runtime': 1.11.1 - '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) - optional: true - - '@rolldown/binding-win32-arm64-msvc@1.1.4': - optional: true - - '@rolldown/binding-win32-x64-msvc@1.1.4': - optional: true - - '@rolldown/pluginutils@1.0.1': {} - - '@sec-ant/readable-stream@0.4.1': {} - - '@sindresorhus/is@4.6.0': {} - - '@sindresorhus/merge-streams@4.0.0': {} - - '@standard-schema/spec@1.1.0': {} - - '@standard-schema/utils@0.3.0': {} - - '@szmarczak/http-timer@4.0.6': - dependencies: - defer-to-connect: 2.0.1 - - '@tailwindcss/node@4.3.2': - dependencies: - '@jridgewell/remapping': 2.3.5 - enhanced-resolve: 5.21.6 - jiti: 2.7.0 - lightningcss: 1.32.0 - magic-string: 0.30.21 - source-map-js: 1.2.1 - tailwindcss: 4.3.2 - - '@tailwindcss/oxide-android-arm64@4.3.2': - optional: true - - '@tailwindcss/oxide-darwin-arm64@4.3.2': - optional: true - - '@tailwindcss/oxide-darwin-x64@4.3.2': - optional: true - - '@tailwindcss/oxide-freebsd-x64@4.3.2': - optional: true - - '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.2': - optional: true - - '@tailwindcss/oxide-linux-arm64-gnu@4.3.2': - optional: true - - '@tailwindcss/oxide-linux-arm64-musl@4.3.2': - optional: true - - '@tailwindcss/oxide-linux-x64-gnu@4.3.2': - optional: true - - '@tailwindcss/oxide-linux-x64-musl@4.3.2': - optional: true - - '@tailwindcss/oxide-wasm32-wasi@4.3.2': - optional: true - - '@tailwindcss/oxide-win32-arm64-msvc@4.3.2': - optional: true - - '@tailwindcss/oxide-win32-x64-msvc@4.3.2': - optional: true - - '@tailwindcss/oxide@4.3.2': - optionalDependencies: - '@tailwindcss/oxide-android-arm64': 4.3.2 - '@tailwindcss/oxide-darwin-arm64': 4.3.2 - '@tailwindcss/oxide-darwin-x64': 4.3.2 - '@tailwindcss/oxide-freebsd-x64': 4.3.2 - '@tailwindcss/oxide-linux-arm-gnueabihf': 4.3.2 - '@tailwindcss/oxide-linux-arm64-gnu': 4.3.2 - '@tailwindcss/oxide-linux-arm64-musl': 4.3.2 - '@tailwindcss/oxide-linux-x64-gnu': 4.3.2 - '@tailwindcss/oxide-linux-x64-musl': 4.3.2 - '@tailwindcss/oxide-wasm32-wasi': 4.3.2 - '@tailwindcss/oxide-win32-arm64-msvc': 4.3.2 - '@tailwindcss/oxide-win32-x64-msvc': 4.3.2 - - '@tailwindcss/vite@4.3.2(vite@8.1.3(@types/node@26.1.0)(esbuild@0.25.12)(jiti@2.7.0)(yaml@2.9.0))': - dependencies: - '@tailwindcss/node': 4.3.2 - '@tailwindcss/oxide': 4.3.2 - tailwindcss: 4.3.2 - vite: 8.1.3(@types/node@26.1.0)(esbuild@0.25.12)(jiti@2.7.0)(yaml@2.9.0) - - '@tanstack/devtools-event-client@0.3.5': {} - - '@tanstack/devtools-event-client@0.4.4': {} - - '@tanstack/history@1.162.0': {} - - '@tanstack/pacer@0.21.1': - dependencies: - '@tanstack/devtools-event-client': 0.4.4 - '@tanstack/store': 0.11.0 - - '@tanstack/query-core@5.101.2': {} - - '@tanstack/react-query@5.101.2(react@19.2.7)': - dependencies: - '@tanstack/query-core': 5.101.2 - react: 19.2.7 - - '@tanstack/react-router@1.170.17(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': - dependencies: - '@tanstack/history': 1.162.0 - '@tanstack/react-store': 0.9.3(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@tanstack/router-core': 1.171.14 - isbot: 5.1.44 - react: 19.2.7 - react-dom: 19.2.7(react@19.2.7) - - '@tanstack/react-store@0.9.3(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': - dependencies: - '@tanstack/store': 0.9.3 - react: 19.2.7 - react-dom: 19.2.7(react@19.2.7) - use-sync-external-store: 1.6.0(react@19.2.7) - - '@tanstack/react-virtual@3.14.5(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': - dependencies: - '@tanstack/virtual-core': 3.17.3 - react: 19.2.7 - react-dom: 19.2.7(react@19.2.7) - - '@tanstack/router-core@1.171.14': - dependencies: - '@tanstack/history': 1.162.0 - cookie-es: 3.1.1 - seroval: 1.5.4 - seroval-plugins: 1.5.4(seroval@1.5.4) - - '@tanstack/store@0.11.0': {} - - '@tanstack/store@0.9.3': {} - - '@tanstack/virtual-core@3.17.3': {} - - '@tauri-apps/api@2.11.1': {} - - '@tauri-apps/cli-darwin-arm64@2.11.4': - optional: true - - '@tauri-apps/cli-darwin-x64@2.11.4': - optional: true - - '@tauri-apps/cli-linux-arm-gnueabihf@2.11.4': - optional: true - - '@tauri-apps/cli-linux-arm64-gnu@2.11.4': - optional: true - - '@tauri-apps/cli-linux-arm64-musl@2.11.4': - optional: true - - '@tauri-apps/cli-linux-riscv64-gnu@2.11.4': - optional: true - - '@tauri-apps/cli-linux-x64-gnu@2.11.4': - optional: true - - '@tauri-apps/cli-linux-x64-musl@2.11.4': - optional: true - - '@tauri-apps/cli-win32-arm64-msvc@2.11.4': - optional: true - - '@tauri-apps/cli-win32-ia32-msvc@2.11.4': - optional: true - - '@tauri-apps/cli-win32-x64-msvc@2.11.4': - optional: true - - '@tauri-apps/cli@2.11.4': - optionalDependencies: - '@tauri-apps/cli-darwin-arm64': 2.11.4 - '@tauri-apps/cli-darwin-x64': 2.11.4 - '@tauri-apps/cli-linux-arm-gnueabihf': 2.11.4 - '@tauri-apps/cli-linux-arm64-gnu': 2.11.4 - '@tauri-apps/cli-linux-arm64-musl': 2.11.4 - '@tauri-apps/cli-linux-riscv64-gnu': 2.11.4 - '@tauri-apps/cli-linux-x64-gnu': 2.11.4 - '@tauri-apps/cli-linux-x64-musl': 2.11.4 - '@tauri-apps/cli-win32-arm64-msvc': 2.11.4 - '@tauri-apps/cli-win32-ia32-msvc': 2.11.4 - '@tauri-apps/cli-win32-x64-msvc': 2.11.4 - - '@tauri-apps/plugin-barcode-scanner@2.4.5': - dependencies: - '@tauri-apps/api': 2.11.1 - - '@tauri-apps/plugin-deep-link@2.4.9': - dependencies: - '@tauri-apps/api': 2.11.1 - - '@tauri-apps/plugin-log@2.8.0': - dependencies: - '@tauri-apps/api': 2.11.1 - - '@tauri-apps/plugin-notification@2.3.3': - dependencies: - '@tauri-apps/api': 2.11.1 - - '@tensamin/ui@https://git.methanium.net/tensamin/ui/releases/download/0.0.40/tensamin-ui.tgz(@date-fns/tz@1.5.0)(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react-is@19.2.7)(react@19.2.7)(redux@5.0.1)(typescript@6.0.3)': - dependencies: - '@base-ui/react': 1.6.0(@date-fns/tz@1.5.0)(@types/react@19.2.17)(date-fns@4.4.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@fontsource-variable/inter': 5.2.8 - '@tauri-apps/api': 2.11.1 - class-variance-authority: 0.7.1 - clsx: 2.1.1 - cmdk: 1.1.1(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - date-fns: 4.4.0 - embla-carousel-react: 8.6.0(react@19.2.7) - input-otp: 1.4.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - lucide-react: 1.23.0(react@19.2.7) - next-themes: 0.4.6(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - react: 19.2.7 - react-day-picker: 10.0.1(@types/react@19.2.17)(react@19.2.7) - react-dom: 19.2.7(react@19.2.7) - react-resizable-panels: 4.12.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - recharts: 3.8.1(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react-is@19.2.7)(react@19.2.7)(redux@5.0.1) - shadcn: 4.12.0(typescript@6.0.3) - sonner: 2.0.7(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - tailwind-merge: 3.6.0 - tw-animate-css: 1.4.0 - vaul: 1.1.2(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - transitivePeerDependencies: - - '@cfworker/json-schema' - - '@date-fns/tz' - - '@types/react' - - '@types/react-dom' - - babel-plugin-macros - - react-is - - redux - - supports-color - - typescript - - '@ts-morph/common@0.27.0': - dependencies: - fast-glob: 3.3.3 - minimatch: 10.2.5 - path-browserify: 1.0.1 - - '@twemoji/api@17.0.3': - dependencies: - '@twemoji/parser': 17.0.2 - fs-extra: 8.1.0 - jsonfile: 5.0.0 - universalify: 0.1.2 - - '@twemoji/parser@17.0.2': {} - - '@tybys/wasm-util@0.10.3': - dependencies: - tslib: 2.8.1 - optional: true - - '@types/cacheable-request@6.0.3': - dependencies: - '@types/http-cache-semantics': 4.2.0 - '@types/keyv': 3.1.4 - '@types/node': 25.9.4 - '@types/responselike': 1.0.3 - - '@types/chai@5.2.3': - dependencies: - '@types/deep-eql': 4.0.2 - assertion-error: 2.0.1 - - '@types/d3-array@3.2.2': {} - - '@types/d3-color@3.1.3': {} - - '@types/d3-ease@3.0.2': {} - - '@types/d3-interpolate@3.0.4': - dependencies: - '@types/d3-color': 3.1.3 - - '@types/d3-path@3.1.1': {} - - '@types/d3-scale@4.0.9': - dependencies: - '@types/d3-time': 3.0.4 - - '@types/d3-shape@3.1.8': - dependencies: - '@types/d3-path': 3.1.1 - - '@types/d3-time@3.0.4': {} - - '@types/d3-timer@3.0.2': {} - - '@types/debug@4.1.13': - dependencies: - '@types/ms': 2.1.0 - - '@types/deep-eql@4.0.2': {} - - '@types/dom-mediacapture-record@1.0.22': {} - - '@types/esrecurse@4.3.1': {} - - '@types/estree@1.0.9': {} - - '@types/fs-extra@9.0.13': - dependencies: - '@types/node': 26.1.0 - - '@types/http-cache-semantics@4.2.0': {} - - '@types/json-schema@7.0.15': {} - - '@types/keyv@3.1.4': - dependencies: - '@types/node': 25.9.4 - - '@types/ms@2.1.0': {} - - '@types/node@22.20.0': - dependencies: - undici-types: 6.21.0 - - '@types/node@25.9.4': - dependencies: - undici-types: 7.24.6 - - '@types/node@26.1.0': - dependencies: - undici-types: 8.3.0 - - '@types/qrcode@1.5.6': - dependencies: - '@types/node': 26.1.0 - - '@types/react-dom@19.2.3(@types/react@19.2.17)': - dependencies: - '@types/react': 19.2.17 - - '@types/react@19.2.17': - dependencies: - csstype: 3.2.3 - - '@types/responselike@1.0.3': - dependencies: - '@types/node': 25.9.4 - - '@types/use-sync-external-store@0.0.6': {} - - '@types/validate-npm-package-name@4.0.2': {} - - '@types/yauzl@2.10.3': - dependencies: - '@types/node': 25.9.4 - optional: true - - '@typescript-eslint/eslint-plugin@8.62.1(@typescript-eslint/parser@8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3)': - dependencies: - '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/scope-manager': 8.62.1 - '@typescript-eslint/type-utils': 8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/utils': 8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.62.1 - eslint: 10.6.0(jiti@2.7.0) - ignore: 7.0.5 - natural-compare: 1.4.0 - ts-api-utils: 2.5.0(typescript@6.0.3) - typescript: 6.0.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/parser@8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3)': - dependencies: - '@typescript-eslint/scope-manager': 8.62.1 - '@typescript-eslint/types': 8.62.1 - '@typescript-eslint/typescript-estree': 8.62.1(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.62.1 - debug: 4.4.3 - eslint: 10.6.0(jiti@2.7.0) - typescript: 6.0.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/project-service@8.62.1(typescript@6.0.3)': - dependencies: - '@typescript-eslint/tsconfig-utils': 8.62.1(typescript@6.0.3) - '@typescript-eslint/types': 8.62.1 - debug: 4.4.3 - typescript: 6.0.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/scope-manager@8.62.1': - dependencies: - '@typescript-eslint/types': 8.62.1 - '@typescript-eslint/visitor-keys': 8.62.1 - - '@typescript-eslint/tsconfig-utils@8.62.1(typescript@6.0.3)': - dependencies: - typescript: 6.0.3 - - '@typescript-eslint/type-utils@8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3)': - dependencies: - '@typescript-eslint/types': 8.62.1 - '@typescript-eslint/typescript-estree': 8.62.1(typescript@6.0.3) - '@typescript-eslint/utils': 8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) - debug: 4.4.3 - eslint: 10.6.0(jiti@2.7.0) - ts-api-utils: 2.5.0(typescript@6.0.3) - typescript: 6.0.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/types@8.62.1': {} - - '@typescript-eslint/typescript-estree@8.62.1(typescript@6.0.3)': - dependencies: - '@typescript-eslint/project-service': 8.62.1(typescript@6.0.3) - '@typescript-eslint/tsconfig-utils': 8.62.1(typescript@6.0.3) - '@typescript-eslint/types': 8.62.1 - '@typescript-eslint/visitor-keys': 8.62.1 - debug: 4.4.3 - minimatch: 10.2.5 - semver: 7.8.5 - tinyglobby: 0.2.17 - ts-api-utils: 2.5.0(typescript@6.0.3) - typescript: 6.0.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3)': - dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.6.0(jiti@2.7.0)) - '@typescript-eslint/scope-manager': 8.62.1 - '@typescript-eslint/types': 8.62.1 - '@typescript-eslint/typescript-estree': 8.62.1(typescript@6.0.3) - eslint: 10.6.0(jiti@2.7.0) - typescript: 6.0.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/visitor-keys@8.62.1': - dependencies: - '@typescript-eslint/types': 8.62.1 - eslint-visitor-keys: 5.0.1 - - '@vitejs/plugin-react@6.0.3(vite@8.1.3(@types/node@26.1.0)(esbuild@0.25.12)(jiti@2.7.0)(yaml@2.9.0))': - dependencies: - '@rolldown/pluginutils': 1.0.1 - vite: 8.1.3(@types/node@26.1.0)(esbuild@0.25.12)(jiti@2.7.0)(yaml@2.9.0) - - '@vitest/expect@4.1.9': - dependencies: - '@standard-schema/spec': 1.1.0 - '@types/chai': 5.2.3 - '@vitest/spy': 4.1.9 - '@vitest/utils': 4.1.9 - chai: 6.2.2 - tinyrainbow: 3.1.0 - - '@vitest/mocker@4.1.9(vite@8.1.3(@types/node@26.1.0)(jiti@2.7.0)(yaml@2.9.0))': - dependencies: - '@vitest/spy': 4.1.9 - estree-walker: 3.0.3 - magic-string: 0.30.21 - optionalDependencies: - vite: 8.1.3(@types/node@26.1.0)(esbuild@0.25.12)(jiti@2.7.0)(yaml@2.9.0) - - '@vitest/pretty-format@4.1.9': - dependencies: - tinyrainbow: 3.1.0 - - '@vitest/runner@4.1.9': - dependencies: - '@vitest/utils': 4.1.9 - pathe: 2.0.3 - - '@vitest/snapshot@4.1.9': - dependencies: - '@vitest/pretty-format': 4.1.9 - '@vitest/utils': 4.1.9 - magic-string: 0.30.21 - pathe: 2.0.3 - - '@vitest/spy@4.1.9': {} - - '@vitest/utils@4.1.9': - dependencies: - '@vitest/pretty-format': 4.1.9 - convert-source-map: 2.0.0 - tinyrainbow: 3.1.0 - - '@xmldom/xmldom@0.8.13': {} - - abbrev@4.0.0: {} - - accepts@2.0.0: - dependencies: - mime-types: 3.0.2 - negotiator: 1.0.0 - - acorn-jsx@5.3.2(acorn@8.17.0): - dependencies: - acorn: 8.17.0 - - acorn@8.17.0: {} - - agent-base@7.1.4: {} - - ajv-formats@2.1.1(ajv@8.20.0): - optionalDependencies: - ajv: 8.20.0 - - ajv-formats@3.0.1(ajv@8.20.0): - optionalDependencies: - ajv: 8.20.0 - - ajv@6.15.0: - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - - ajv@8.20.0: - dependencies: - fast-deep-equal: 3.1.3 - fast-uri: 3.1.3 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - - ansi-colors@4.1.3: {} - - ansi-regex@5.0.1: {} - - ansi-regex@6.2.2: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - app-builder-lib@26.15.3(dmg-builder@26.15.3)(electron-builder-squirrel-windows@26.15.3): - dependencies: - '@electron/asar': 3.4.1 - '@electron/fuses': 1.8.0 - '@electron/get': 3.1.0 - '@electron/notarize': 2.5.0 - '@electron/osx-sign': 1.3.3 - '@electron/rebuild': 4.1.0 - '@electron/universal': 2.0.3 - '@malept/flatpak-bundler': 0.4.0 - '@noble/hashes': 2.2.0 - '@peculiar/webcrypto': 1.7.1 - '@types/fs-extra': 9.0.13 - ajv: 8.20.0 - asn1js: 3.0.10 - async-exit-hook: 2.0.1 - builder-util: 26.15.3 - builder-util-runtime: 9.7.0 - chromium-pickle-js: 0.2.0 - ci-info: 4.3.1 - debug: 4.4.3 - dmg-builder: 26.15.3(electron-builder-squirrel-windows@26.15.3) - dotenv: 16.6.1 - dotenv-expand: 11.0.7 - ejs: 3.1.10 - electron-builder-squirrel-windows: 26.15.3(dmg-builder@26.15.3) - electron-publish: 26.15.3 - fs-extra: 10.1.0 - hosted-git-info: 4.1.0 - isbinaryfile: 5.0.7 - jiti: 2.7.0 - js-yaml: 4.3.0 - json5: 2.2.3 - lazy-val: 1.0.5 - minimatch: 10.2.5 - pkijs: 3.4.0 - plist: 3.1.0 - proper-lockfile: 4.1.2 - resedit: 1.7.2 - semver: 7.7.4 - tar: 7.5.19 - temp-file: 3.4.0 - tiny-async-pool: 1.3.0 - unzipper: 0.12.5 - which: 5.0.0 - transitivePeerDependencies: - - supports-color - - argparse@2.0.1: {} - - aria-hidden@1.2.6: - dependencies: - tslib: 2.8.1 - - asn1js@3.0.10: - dependencies: - pvtsutils: 1.3.6 - pvutils: 1.1.5 - tslib: 2.8.1 - - assertion-error@2.0.1: {} - - ast-types@0.16.1: - dependencies: - tslib: 2.8.1 - - async-exit-hook@2.0.1: {} - - async@3.2.6: {} - - asynckit@0.4.0: {} - - at-least-node@1.0.0: {} - - atomically@1.7.0: {} - - aws4@1.13.2: {} - - balanced-match@1.0.2: {} - - balanced-match@4.0.4: {} - - base64-js@1.5.1: {} - - baseline-browser-mapping@2.10.41: {} - - bluebird@3.7.2: {} - - body-parser@2.3.0: - dependencies: - bytes: 3.1.2 - content-type: 2.0.0 - debug: 4.4.3 - http-errors: 2.0.1 - iconv-lite: 0.7.2 - on-finished: 2.4.1 - qs: 6.15.3 - raw-body: 3.0.2 - type-is: 2.1.0 - transitivePeerDependencies: - - supports-color - - boolean@3.2.0: - optional: true - - brace-expansion@1.1.15: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - brace-expansion@2.1.1: - dependencies: - balanced-match: 1.0.2 - - brace-expansion@5.0.7: - dependencies: - balanced-match: 4.0.4 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - browserslist@4.28.4: - dependencies: - baseline-browser-mapping: 2.10.41 - caniuse-lite: 1.0.30001800 - electron-to-chromium: 1.5.385 - node-releases: 2.0.50 - update-browserslist-db: 1.2.3(browserslist@4.28.4) - - buffer-crc32@0.2.13: {} - - buffer-from@1.1.2: {} - - builder-util-runtime@9.7.0: - dependencies: - debug: 4.4.3 - sax: 1.6.0 - transitivePeerDependencies: - - supports-color - - builder-util@26.15.3: - dependencies: - '@types/debug': 4.1.13 - builder-util-runtime: 9.7.0 - chalk: 4.1.2 - cross-spawn: 7.0.6 - debug: 4.4.3 - fs-extra: 10.1.0 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 - js-yaml: 4.3.0 - sanitize-filename: 1.6.4 - source-map-support: 0.5.21 - stat-mode: 1.0.0 - temp-file: 3.4.0 - tiny-async-pool: 1.3.0 - transitivePeerDependencies: - - supports-color - - bundle-name@4.1.0: - dependencies: - run-applescript: 7.1.0 - - bytes@3.1.2: {} - - bytestreamjs@2.0.1: {} - - cacheable-lookup@5.0.4: {} - - cacheable-request@7.0.4: - dependencies: - clone-response: 1.0.3 - get-stream: 5.2.0 - http-cache-semantics: 4.2.0 - keyv: 4.5.4 - lowercase-keys: 2.0.0 - normalize-url: 6.1.0 - responselike: 2.0.1 - - call-bind-apply-helpers@1.0.2: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - - call-bound@1.0.4: - dependencies: - call-bind-apply-helpers: 1.0.2 - get-intrinsic: 1.3.0 - - callsites@3.1.0: {} - - camelcase@5.3.1: {} - - caniuse-lite@1.0.30001800: {} - - chai@6.2.2: {} - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chalk@5.6.2: {} - - chownr@3.0.0: {} - - chromium-pickle-js@0.2.0: {} - - ci-info@4.3.1: {} - - ci-info@4.4.0: {} - - class-variance-authority@0.7.1: - dependencies: - clsx: 2.1.1 - - cli-cursor@5.0.0: - dependencies: - restore-cursor: 5.1.0 - - cli-spinners@2.9.2: {} - - cliui@6.0.0: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 6.2.0 - - cliui@8.0.1: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - clone-response@1.0.3: - dependencies: - mimic-response: 1.0.1 - - clsx@2.1.1: {} - - cmdk@1.1.1(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7): - dependencies: - '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.17)(react@19.2.7) - '@radix-ui/react-dialog': 1.1.18(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@radix-ui/react-id': 1.1.2(@types/react@19.2.17)(react@19.2.7) - '@radix-ui/react-primitive': 2.1.7(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - react: 19.2.7 - react-dom: 19.2.7(react@19.2.7) - transitivePeerDependencies: - - '@types/react' - - '@types/react-dom' - - code-block-writer@13.0.3: {} - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - combined-stream@1.0.8: - dependencies: - delayed-stream: 1.0.0 - - commander@11.1.0: {} - - commander@14.0.3: {} - - commander@5.1.0: {} - - commander@9.5.0: - optional: true - - compare-version@0.1.2: {} - - concat-map@0.0.1: {} - - conf@10.2.0: - dependencies: - ajv: 8.20.0 - ajv-formats: 2.1.1(ajv@8.20.0) - atomically: 1.7.0 - debounce-fn: 4.0.0 - dot-prop: 6.0.1 - env-paths: 2.2.1 - json-schema-typed: 7.0.3 - onetime: 5.1.2 - pkg-up: 3.1.0 - semver: 7.8.5 - - content-disposition@1.1.0: {} - - content-type@1.0.5: {} - - content-type@2.0.0: {} - - convert-source-map@2.0.0: {} - - cookie-es@3.1.1: {} - - cookie-signature@1.2.2: {} - - cookie@0.7.2: {} - - core-util-is@1.0.3: {} - - cors@2.8.6: - dependencies: - object-assign: 4.1.1 - vary: 1.1.2 - - cosmiconfig@9.0.2(typescript@6.0.3): - dependencies: - env-paths: 2.2.1 - import-fresh: 3.3.1 - js-yaml: 4.3.0 - parse-json: 5.2.0 - optionalDependencies: - typescript: 6.0.3 - - crelt@1.0.7: {} - - cross-dirname@0.1.0: - optional: true - - cross-spawn@7.0.6: - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - - cssesc@3.0.0: {} - - csstype@3.2.3: {} - - d3-array@3.2.4: - dependencies: - internmap: 2.0.3 - - d3-color@3.1.0: {} - - d3-ease@3.0.1: {} - - d3-format@3.1.2: {} - - d3-interpolate@3.0.1: - dependencies: - d3-color: 3.1.0 - - d3-path@3.1.0: {} - - d3-scale@4.0.2: - dependencies: - d3-array: 3.2.4 - d3-format: 3.1.2 - d3-interpolate: 3.0.1 - d3-time: 3.1.0 - d3-time-format: 4.1.0 - - d3-shape@3.2.0: - dependencies: - d3-path: 3.1.0 - - d3-time-format@4.1.0: - dependencies: - d3-time: 3.1.0 - - d3-time@3.1.0: - dependencies: - d3-array: 3.2.4 - - d3-timer@3.0.1: {} - - date-fns@4.4.0: {} - - debounce-fn@4.0.0: - dependencies: - mimic-fn: 3.1.0 - - debug@4.4.3: - dependencies: - ms: 2.1.3 - - decamelize@1.2.0: {} - - decimal.js-light@2.5.1: {} - - decompress-response@6.0.0: - dependencies: - mimic-response: 3.1.0 - - dedent@1.7.2: {} - - deep-is@0.1.4: {} - - deepfilternet3-noise-filter@1.2.1(livekit-client@2.20.0(@types/dom-mediacapture-record@1.0.22)): - dependencies: - livekit-client: 2.20.0(@types/dom-mediacapture-record@1.0.22) - - deepmerge@4.3.1: {} - - default-browser-id@5.0.1: {} - - default-browser@5.5.0: - dependencies: - bundle-name: 4.1.0 - default-browser-id: 5.0.1 - - defer-to-connect@2.0.1: {} - - define-data-property@1.1.4: - dependencies: - es-define-property: 1.0.1 - es-errors: 1.3.0 - gopd: 1.2.0 - optional: true - - define-lazy-prop@2.0.0: {} - - define-lazy-prop@3.0.0: {} - - define-properties@1.2.1: - dependencies: - define-data-property: 1.1.4 - has-property-descriptors: 1.0.2 - object-keys: 1.1.1 - optional: true - - delayed-stream@1.0.0: {} - - depd@2.0.0: {} - - detect-libc@2.1.2: {} - - detect-node-es@1.1.0: {} - - detect-node@2.1.0: - optional: true - - diff@8.0.4: {} - - dijkstrajs@1.0.3: {} - - dir-compare@4.2.0: - dependencies: - minimatch: 3.1.5 - p-limit: 3.1.0 - - dmg-builder@26.15.3(electron-builder-squirrel-windows@26.15.3): - dependencies: - app-builder-lib: 26.15.3(dmg-builder@26.15.3)(electron-builder-squirrel-windows@26.15.3) - builder-util: 26.15.3 - fs-extra: 10.1.0 - js-yaml: 4.3.0 - transitivePeerDependencies: - - electron-builder-squirrel-windows - - supports-color - - dot-prop@6.0.1: - dependencies: - is-obj: 2.0.0 - - dotenv-expand@11.0.7: - dependencies: - dotenv: 16.6.1 - - dotenv@16.6.1: {} - - dotenv@17.4.2: {} - - dunder-proto@1.0.1: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-errors: 1.3.0 - gopd: 1.2.0 - - duplexer2@0.1.4: - dependencies: - readable-stream: 2.3.8 - - ee-first@1.1.1: {} - - ejs@3.1.10: - dependencies: - jake: 10.9.4 - - electron-builder-squirrel-windows@26.15.3(dmg-builder@26.15.3): - dependencies: - app-builder-lib: 26.15.3(dmg-builder@26.15.3)(electron-builder-squirrel-windows@26.15.3) - builder-util: 26.15.3 - electron-winstaller: 5.4.0 - transitivePeerDependencies: - - dmg-builder - - supports-color - - electron-builder@26.15.3(electron-builder-squirrel-windows@26.15.3): - dependencies: - app-builder-lib: 26.15.3(dmg-builder@26.15.3)(electron-builder-squirrel-windows@26.15.3) - builder-util: 26.15.3 - builder-util-runtime: 9.7.0 - chalk: 4.1.2 - ci-info: 4.4.0 - dmg-builder: 26.15.3(electron-builder-squirrel-windows@26.15.3) - fs-extra: 10.1.0 - lazy-val: 1.0.5 - simple-update-notifier: 2.0.0 - yargs: 17.7.3 - transitivePeerDependencies: - - electron-builder-squirrel-windows - - supports-color - - electron-publish@26.15.3: - dependencies: - '@types/fs-extra': 9.0.13 - aws4: 1.13.2 - builder-util: 26.15.3 - builder-util-runtime: 9.7.0 - chalk: 4.1.2 - form-data: 4.0.6 - fs-extra: 10.1.0 - lazy-val: 1.0.5 - mime: 2.6.0 - transitivePeerDependencies: - - supports-color - - electron-to-chromium@1.5.385: {} - - electron-winstaller@5.4.0: - dependencies: - '@electron/asar': 3.4.1 - debug: 4.4.3 - fs-extra: 7.0.1 - lodash: 4.18.1 - temp: 0.9.4 - optionalDependencies: - '@electron/windows-sign': 1.2.2 - transitivePeerDependencies: - - supports-color - - electron@39.8.10: - dependencies: - '@electron/get': 2.0.3 - '@types/node': 22.20.0 - extract-zip: 2.0.1 - transitivePeerDependencies: - - supports-color - - embla-carousel-react@8.6.0(react@19.2.7): - dependencies: - embla-carousel: 8.6.0 - embla-carousel-reactive-utils: 8.6.0(embla-carousel@8.6.0) - react: 19.2.7 - - embla-carousel-reactive-utils@8.6.0(embla-carousel@8.6.0): - dependencies: - embla-carousel: 8.6.0 - - embla-carousel@8.6.0: {} - - emoji-regex@10.6.0: {} - - emoji-regex@8.0.0: {} - - emojibase-data@17.0.0(emojibase@17.0.0): - dependencies: - emojibase: 17.0.0 - - emojibase@17.0.0: {} - - encodeurl@2.0.0: {} - - end-of-stream@1.4.5: - dependencies: - once: 1.4.0 - - enhanced-resolve@5.21.6: - dependencies: - graceful-fs: 4.2.11 - tapable: 2.3.3 - - enquirer@2.4.1: - dependencies: - ansi-colors: 4.1.3 - strip-ansi: 6.0.1 - - env-paths@2.2.1: {} - - err-code@2.0.3: {} - - error-ex@1.3.4: - dependencies: - is-arrayish: 0.2.1 - - es-define-property@1.0.1: {} - - es-errors@1.3.0: {} - - es-module-lexer@2.3.0: {} - - es-object-atoms@1.1.2: - dependencies: - es-errors: 1.3.0 - - es-set-tostringtag@2.1.0: - dependencies: - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - has-tostringtag: 1.0.2 - hasown: 2.0.4 - - es-toolkit@1.49.0: {} - - es6-error@4.1.1: - optional: true - - esbuild@0.25.12: - 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 - - escalade@3.2.0: {} - - escape-html@1.0.3: {} - - escape-string-regexp@4.0.0: {} - - eslint-plugin-react-hooks@7.1.1(eslint@10.6.0(jiti@2.7.0)): - dependencies: - '@babel/core': 7.29.7 - '@babel/parser': 7.29.7 - eslint: 10.6.0(jiti@2.7.0) - hermes-parser: 0.25.1 - zod: 4.4.3 - zod-validation-error: 4.0.2(zod@4.4.3) - transitivePeerDependencies: - - supports-color - - eslint-scope@9.1.2: - dependencies: - '@types/esrecurse': 4.3.1 - '@types/estree': 1.0.9 - esrecurse: 4.3.0 - estraverse: 5.3.0 - - eslint-visitor-keys@3.4.3: {} - - eslint-visitor-keys@5.0.1: {} - - eslint@10.6.0(jiti@2.7.0): - dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.6.0(jiti@2.7.0)) - '@eslint-community/regexpp': 4.12.2 - '@eslint/config-array': 0.23.5 - '@eslint/config-helpers': 0.6.0 - '@eslint/core': 1.2.1 - '@eslint/plugin-kit': 0.7.2 - '@humanfs/node': 0.16.8 - '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.4.3 - '@types/estree': 1.0.9 - ajv: 6.15.0 - cross-spawn: 7.0.6 - debug: 4.4.3 - escape-string-regexp: 4.0.0 - eslint-scope: 9.1.2 - eslint-visitor-keys: 5.0.1 - espree: 11.2.0 - esquery: 1.7.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 8.0.0 - find-up: 5.0.0 - glob-parent: 6.0.2 - ignore: 5.3.2 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - json-stable-stringify-without-jsonify: 1.0.1 - minimatch: 10.2.5 - natural-compare: 1.4.0 - optionator: 0.9.4 - optionalDependencies: - jiti: 2.7.0 - transitivePeerDependencies: - - supports-color - - espree@11.2.0: - dependencies: - acorn: 8.17.0 - acorn-jsx: 5.3.2(acorn@8.17.0) - eslint-visitor-keys: 5.0.1 - - esprima@4.0.1: {} - - esquery@1.7.0: - dependencies: - estraverse: 5.3.0 - - esrecurse@4.3.0: - dependencies: - estraverse: 5.3.0 - - estraverse@5.3.0: {} - - estree-walker@3.0.3: - dependencies: - '@types/estree': 1.0.9 - - esutils@2.0.3: {} - - etag@1.8.1: {} - - eventemitter3@5.0.4: {} - - events@3.3.0: {} - - eventsource-parser@3.1.0: {} - - eventsource@3.0.7: - dependencies: - eventsource-parser: 3.1.0 - - execa@5.1.1: - dependencies: - cross-spawn: 7.0.6 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - - execa@9.6.1: - dependencies: - '@sindresorhus/merge-streams': 4.0.0 - cross-spawn: 7.0.6 - figures: 6.1.0 - get-stream: 9.0.1 - human-signals: 8.0.1 - is-plain-obj: 4.1.0 - is-stream: 4.0.1 - npm-run-path: 6.0.0 - pretty-ms: 9.3.0 - signal-exit: 4.1.0 - strip-final-newline: 4.0.0 - yoctocolors: 2.1.2 - - expect-type@1.4.0: {} - - exponential-backoff@3.1.3: {} - - express-rate-limit@8.5.2(express@5.2.1): - dependencies: - express: 5.2.1 - ip-address: 10.2.0 - - express@5.2.1: - dependencies: - accepts: 2.0.0 - body-parser: 2.3.0 - content-disposition: 1.1.0 - content-type: 1.0.5 - cookie: 0.7.2 - cookie-signature: 1.2.2 - debug: 4.4.3 - depd: 2.0.0 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 2.1.1 - fresh: 2.0.0 - http-errors: 2.0.1 - merge-descriptors: 2.0.0 - mime-types: 3.0.2 - on-finished: 2.4.1 - once: 1.4.0 - parseurl: 1.3.3 - proxy-addr: 2.0.7 - qs: 6.15.3 - range-parser: 1.3.0 - router: 2.2.0 - send: 1.2.1 - serve-static: 2.2.1 - statuses: 2.0.2 - type-is: 2.1.0 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - - extract-zip@2.0.1: - dependencies: - debug: 4.4.3 - get-stream: 5.2.0 - yauzl: 2.10.0 - optionalDependencies: - '@types/yauzl': 2.10.3 - transitivePeerDependencies: - - supports-color - - fallow@2.104.0: - dependencies: - detect-libc: 2.1.2 - optionalDependencies: - '@fallow-cli/darwin-arm64': 2.104.0 - '@fallow-cli/darwin-x64': 2.104.0 - '@fallow-cli/linux-arm64-gnu': 2.104.0 - '@fallow-cli/linux-arm64-musl': 2.104.0 - '@fallow-cli/linux-x64-gnu': 2.104.0 - '@fallow-cli/linux-x64-musl': 2.104.0 - '@fallow-cli/win32-arm64-msvc': 2.104.0 - '@fallow-cli/win32-x64-msvc': 2.104.0 - - fast-deep-equal@3.1.3: {} - - fast-glob@3.3.3: - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.8 - - fast-json-stable-stringify@2.1.0: {} - - fast-levenshtein@2.0.6: {} - - fast-uri@3.1.3: {} - - fastq@1.20.1: - dependencies: - reusify: 1.1.0 - - fd-slicer@1.1.0: - dependencies: - pend: 1.2.0 - - fdir@6.5.0(picomatch@4.0.5): - optionalDependencies: - picomatch: 4.0.5 - - figures@6.1.0: - dependencies: - is-unicode-supported: 2.1.0 - - file-entry-cache@8.0.0: - dependencies: - flat-cache: 4.0.1 - - filelist@1.0.6: - dependencies: - minimatch: 5.1.9 - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - finalhandler@2.1.1: - dependencies: - debug: 4.4.3 - encodeurl: 2.0.0 - escape-html: 1.0.3 - on-finished: 2.4.1 - parseurl: 1.3.3 - statuses: 2.0.2 - transitivePeerDependencies: - - supports-color - - find-up@3.0.0: - dependencies: - locate-path: 3.0.0 - - find-up@4.1.0: - dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat-cache@4.0.1: - dependencies: - flatted: 3.4.2 - keyv: 4.5.4 - - flatted@3.4.2: {} - - form-data@4.0.6: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - es-set-tostringtag: 2.1.0 - hasown: 2.0.4 - mime-types: 2.1.35 - - forwarded@0.2.0: {} - - framer-motion@12.42.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7): - dependencies: - motion-dom: 12.42.2 - motion-utils: 12.39.0 - tslib: 2.8.1 - optionalDependencies: - react: 19.2.7 - react-dom: 19.2.7(react@19.2.7) - - fresh@2.0.0: {} - - fs-extra@10.1.0: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.2.1 - universalify: 2.0.1 - - fs-extra@11.3.1: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.2.1 - universalify: 2.0.1 - - fs-extra@11.3.6: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.2.1 - universalify: 2.0.1 - - fs-extra@7.0.1: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - - fs-extra@8.1.0: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - - fs-extra@9.1.0: - dependencies: - at-least-node: 1.0.0 - graceful-fs: 4.2.11 - jsonfile: 6.2.1 - universalify: 2.0.1 - - fs.realpath@1.0.0: {} - - fsevents@2.3.3: - optional: true - - function-bind@1.1.2: {} - - fuzzysort@3.1.0: {} - - gensync@1.0.0-beta.2: {} - - get-caller-file@2.0.5: {} - - get-east-asian-width@1.6.0: {} - - get-intrinsic@1.3.0: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.2 - function-bind: 1.1.2 - get-proto: 1.0.1 - gopd: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.4 - math-intrinsics: 1.1.0 - - get-nonce@1.0.1: {} - - get-own-enumerable-keys@1.0.0: {} - - get-proto@1.0.1: - dependencies: - dunder-proto: 1.0.1 - es-object-atoms: 1.1.2 - - get-stream@5.2.0: - dependencies: - pump: 3.0.4 - - get-stream@6.0.1: {} - - get-stream@9.0.1: - dependencies: - '@sec-ant/readable-stream': 0.4.1 - is-stream: 4.0.1 - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob-parent@6.0.2: - dependencies: - is-glob: 4.0.3 - - glob@7.2.3: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.5 - once: 1.4.0 - path-is-absolute: 1.0.1 - - global-agent@3.0.0: - dependencies: - boolean: 3.2.0 - es6-error: 4.1.1 - matcher: 3.0.0 - roarr: 2.15.4 - semver: 7.8.5 - serialize-error: 7.0.1 - optional: true - - globals@17.7.0: {} - - globalthis@1.0.4: - dependencies: - define-properties: 1.2.1 - gopd: 1.2.0 - optional: true - - gopd@1.2.0: {} - - got@11.8.6: - dependencies: - '@sindresorhus/is': 4.6.0 - '@szmarczak/http-timer': 4.0.6 - '@types/cacheable-request': 6.0.3 - '@types/responselike': 1.0.3 - cacheable-lookup: 5.0.4 - cacheable-request: 7.0.4 - decompress-response: 6.0.0 - http2-wrapper: 1.0.3 - lowercase-keys: 2.0.0 - p-cancelable: 2.1.1 - responselike: 2.0.1 - - graceful-fs@4.2.11: {} - - has-flag@4.0.0: {} - - has-property-descriptors@1.0.2: - dependencies: - es-define-property: 1.0.1 - optional: true - - has-symbols@1.1.0: {} - - has-tostringtag@1.0.2: - dependencies: - has-symbols: 1.1.0 - - hasown@2.0.4: - dependencies: - function-bind: 1.1.2 - - hermes-estree@0.25.1: {} - - hermes-parser@0.25.1: - dependencies: - hermes-estree: 0.25.1 - - hono@4.12.27: {} - - hosted-git-info@4.1.0: - dependencies: - lru-cache: 6.0.0 - - http-cache-semantics@4.2.0: {} - - http-errors@2.0.1: - dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.2 - toidentifier: 1.0.1 - - http-proxy-agent@7.0.2: - dependencies: - agent-base: 7.1.4 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - - http2-wrapper@1.0.3: - dependencies: - quick-lru: 5.1.1 - resolve-alpn: 1.2.1 - - https-proxy-agent@7.0.6: - dependencies: - agent-base: 7.1.4 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - - human-signals@2.1.0: {} - - human-signals@8.0.1: {} - - iconv-lite@0.7.2: - dependencies: - safer-buffer: 2.1.2 - - ignore@5.3.2: {} - - ignore@7.0.5: {} - - immer@10.2.0: {} - - immer@11.1.9: {} - - import-fresh@3.3.1: - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - - imurmurhash@0.1.4: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - input-otp@1.4.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7): - dependencies: - react: 19.2.7 - react-dom: 19.2.7(react@19.2.7) - - internmap@2.0.3: {} - - ip-address@10.2.0: {} - - ipaddr.js@1.9.1: {} - - is-arrayish@0.2.1: {} - - is-docker@2.2.1: {} - - is-docker@3.0.0: {} - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-in-ssh@1.0.0: {} - - is-inside-container@1.0.0: - dependencies: - is-docker: 3.0.0 - - is-interactive@2.0.0: {} - - is-number@7.0.0: {} - - is-obj@2.0.0: {} - - is-obj@3.0.0: {} - - is-plain-obj@4.1.0: {} - - is-promise@4.0.0: {} - - is-regexp@3.1.0: {} - - is-stream@2.0.1: {} - - is-stream@4.0.1: {} - - is-unicode-supported@1.3.0: {} - - is-unicode-supported@2.1.0: {} - - is-wsl@2.2.0: - dependencies: - is-docker: 2.2.1 - - is-wsl@3.1.1: - dependencies: - is-inside-container: 1.0.0 - - isarray@1.0.0: {} - - isbinaryfile@4.0.10: {} - - isbinaryfile@5.0.7: {} - - isbot@5.1.44: {} - - isexe@2.0.0: {} - - isexe@3.1.5: {} - - isexe@4.0.0: {} - - jake@10.9.4: - dependencies: - async: 3.2.6 - filelist: 1.0.6 - picocolors: 1.1.1 - - jiti@2.7.0: {} - - jose@6.2.3: {} - - js-tokens@4.0.0: {} - - js-yaml@4.3.0: - dependencies: - argparse: 2.0.1 - - jsesc@3.1.0: {} - - json-buffer@3.0.1: {} - - json-parse-even-better-errors@2.3.1: {} - - json-schema-traverse@0.4.1: {} - - json-schema-traverse@1.0.0: {} - - json-schema-typed@7.0.3: {} - - json-schema-typed@8.0.2: {} - - json-stable-stringify-without-jsonify@1.0.1: {} - - json-stringify-safe@5.0.1: - optional: true - - json5@2.2.3: {} - - jsonc-parser@3.3.1: {} - - jsonfile@4.0.0: - optionalDependencies: - graceful-fs: 4.2.11 - - jsonfile@5.0.0: - dependencies: - universalify: 0.1.2 - optionalDependencies: - graceful-fs: 4.2.11 - - jsonfile@6.2.1: - dependencies: - universalify: 2.0.1 - optionalDependencies: - graceful-fs: 4.2.11 - - keyv@4.5.4: - dependencies: - json-buffer: 3.0.1 - - kleur@3.0.3: {} - - kleur@4.1.5: {} - - lazy-val@1.0.5: {} - - levn@0.4.1: - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - - lightningcss-android-arm64@1.32.0: - optional: true - - lightningcss-darwin-arm64@1.32.0: - optional: true - - lightningcss-darwin-x64@1.32.0: - optional: true - - lightningcss-freebsd-x64@1.32.0: - optional: true - - lightningcss-linux-arm-gnueabihf@1.32.0: - optional: true - - lightningcss-linux-arm64-gnu@1.32.0: - optional: true - - lightningcss-linux-arm64-musl@1.32.0: - optional: true - - lightningcss-linux-x64-gnu@1.32.0: - optional: true - - lightningcss-linux-x64-musl@1.32.0: - optional: true - - lightningcss-win32-arm64-msvc@1.32.0: - optional: true - - lightningcss-win32-x64-msvc@1.32.0: - optional: true - - lightningcss@1.32.0: - dependencies: - detect-libc: 2.1.2 - optionalDependencies: - lightningcss-android-arm64: 1.32.0 - lightningcss-darwin-arm64: 1.32.0 - lightningcss-darwin-x64: 1.32.0 - lightningcss-freebsd-x64: 1.32.0 - lightningcss-linux-arm-gnueabihf: 1.32.0 - lightningcss-linux-arm64-gnu: 1.32.0 - lightningcss-linux-arm64-musl: 1.32.0 - lightningcss-linux-x64-gnu: 1.32.0 - lightningcss-linux-x64-musl: 1.32.0 - lightningcss-win32-arm64-msvc: 1.32.0 - lightningcss-win32-x64-msvc: 1.32.0 - - lines-and-columns@1.2.4: {} - - livekit-client@2.20.0(@types/dom-mediacapture-record@1.0.22): - dependencies: - '@livekit/mutex': 1.1.1 - '@livekit/protocol': 1.46.6 - '@types/dom-mediacapture-record': 1.0.22 - events: 3.3.0 - jose: 6.2.3 - loglevel: 1.9.2 - sdp-transform: 2.15.0 - tslib: 2.8.1 - typed-emitter: 2.1.0 - webrtc-adapter: 9.0.5 - - locate-path@3.0.0: - dependencies: - p-locate: 3.0.0 - path-exists: 3.0.0 - - locate-path@5.0.0: - dependencies: - p-locate: 4.1.0 - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - lodash.debounce@4.0.8: {} - - lodash@4.18.1: {} - - log-symbols@6.0.0: - dependencies: - chalk: 5.6.2 - is-unicode-supported: 1.3.0 - - loglevel@1.9.1: {} - - loglevel@1.9.2: {} - - lowercase-keys@2.0.0: {} - - lru-cache@5.1.1: - dependencies: - yallist: 3.1.1 - - lru-cache@6.0.0: - dependencies: - yallist: 4.0.0 - - lucide-react@1.23.0(react@19.2.7): - dependencies: - react: 19.2.7 - - magic-string@0.30.21: - dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 - - matcher@3.0.0: - dependencies: - escape-string-regexp: 4.0.0 - optional: true - - math-intrinsics@1.1.0: {} - - media-typer@1.1.0: {} - - merge-descriptors@2.0.0: {} - - merge-stream@2.0.0: {} - - merge2@1.4.1: {} - - micromatch@4.0.8: - dependencies: - braces: 3.0.3 - picomatch: 2.3.2 - - mime-db@1.52.0: {} - - mime-db@1.54.0: {} - - mime-types@2.1.35: - dependencies: - mime-db: 1.52.0 - - mime-types@3.0.2: - dependencies: - mime-db: 1.54.0 - - mime@2.6.0: {} - - mimic-fn@2.1.0: {} - - mimic-fn@3.1.0: {} - - mimic-function@5.0.1: {} - - mimic-response@1.0.1: {} - - mimic-response@3.1.0: {} - - minimatch@10.2.5: - dependencies: - brace-expansion: 5.0.7 - - minimatch@3.1.5: - dependencies: - brace-expansion: 1.1.15 - - minimatch@5.1.9: - dependencies: - brace-expansion: 2.1.1 - - minimatch@9.0.9: - dependencies: - brace-expansion: 2.1.1 - - minimist@1.2.8: {} - - minipass@7.1.3: {} - - minizlib@3.1.0: - dependencies: - minipass: 7.1.3 - - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - - motion-dom@12.42.2: - dependencies: - motion-utils: 12.39.0 - - motion-utils@12.39.0: {} - - motion@12.42.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7): - dependencies: - framer-motion: 12.42.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - tslib: 2.8.1 - optionalDependencies: - react: 19.2.7 - react-dom: 19.2.7(react@19.2.7) - - ms@2.1.3: {} - - mtp@https://git.methanium.net/methanium/mtp/releases/download/0.2.0-3919eb46fd/mtp-0.2.0.tgz: - dependencies: - yaml: 2.9.0 - - nanoid@3.3.15: {} - - natural-compare@1.4.0: {} - - negotiator@1.0.0: {} - - next-themes@0.4.6(react-dom@19.2.7(react@19.2.7))(react@19.2.7): - dependencies: - react: 19.2.7 - react-dom: 19.2.7(react@19.2.7) - - node-abi@4.33.0: - dependencies: - semver: 7.8.5 - - node-api-version@0.2.1: - dependencies: - semver: 7.8.5 - - node-gyp@12.4.0: - dependencies: - env-paths: 2.2.1 - exponential-backoff: 3.1.3 - graceful-fs: 4.2.11 - nopt: 9.0.0 - proc-log: 6.1.0 - semver: 7.8.5 - tar: 7.5.19 - tinyglobby: 0.2.17 - undici: 6.27.0 - which: 6.0.1 - - node-int64@0.4.0: {} - - node-releases@2.0.50: {} - - nopt@9.0.0: - dependencies: - abbrev: 4.0.0 - - normalize-url@6.1.0: {} - - npm-run-path@4.0.1: - dependencies: - path-key: 3.1.1 - - npm-run-path@6.0.0: - dependencies: - path-key: 4.0.0 - unicorn-magic: 0.3.0 - - object-assign@4.1.1: {} - - object-inspect@1.13.4: {} - - object-keys@1.1.1: - optional: true - - object-treeify@1.1.33: {} - - obug@2.1.3: {} - - on-finished@2.4.1: - dependencies: - ee-first: 1.1.1 - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - onetime@5.1.2: - dependencies: - mimic-fn: 2.1.0 - - onetime@7.0.0: - dependencies: - mimic-function: 5.0.1 - - open@11.0.0: - dependencies: - default-browser: 5.5.0 - define-lazy-prop: 3.0.0 - is-in-ssh: 1.0.0 - is-inside-container: 1.0.0 - powershell-utils: 0.1.0 - wsl-utils: 0.3.1 - - open@8.4.2: - dependencies: - define-lazy-prop: 2.0.0 - is-docker: 2.2.1 - is-wsl: 2.2.0 - - optionator@0.9.4: - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - word-wrap: 1.2.5 - - ora@8.2.0: - dependencies: - chalk: 5.6.2 - cli-cursor: 5.0.0 - cli-spinners: 2.9.2 - is-interactive: 2.0.0 - is-unicode-supported: 2.1.0 - log-symbols: 6.0.0 - stdin-discarder: 0.2.2 - string-width: 7.2.0 - strip-ansi: 7.2.0 - - p-cancelable@2.1.1: {} - - p-limit@2.3.0: - dependencies: - p-try: 2.2.0 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@3.0.0: - dependencies: - p-limit: 2.3.0 - - p-locate@4.1.0: - dependencies: - p-limit: 2.3.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - p-try@2.2.0: {} - - parent-module@1.0.1: - dependencies: - callsites: 3.1.0 - - parse-json@5.2.0: - dependencies: - '@babel/code-frame': 7.29.7 - error-ex: 1.3.4 - json-parse-even-better-errors: 2.3.1 - lines-and-columns: 1.2.4 - - parse-ms@4.0.0: {} - - parseurl@1.3.3: {} - - path-browserify@1.0.1: {} - - path-exists@3.0.0: {} - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - path-key@3.1.1: {} - - path-key@4.0.0: {} - - path-to-regexp@8.4.2: {} - - pathe@2.0.3: {} - - pe-library@0.4.1: {} - - pend@1.2.0: {} - - picocolors@1.1.1: {} - - picomatch@2.3.2: {} - - picomatch@4.0.5: {} - - pkce-challenge@5.0.1: {} - - pkg-up@3.1.0: - dependencies: - find-up: 3.0.0 - - pkijs@3.4.0: - dependencies: - '@noble/hashes': 1.4.0 - asn1js: 3.0.10 - bytestreamjs: 2.0.1 - pvtsutils: 1.3.6 - pvutils: 1.1.5 - tslib: 2.8.1 - - plist@3.1.0: - dependencies: - '@xmldom/xmldom': 0.8.13 - base64-js: 1.5.1 - xmlbuilder: 15.1.1 - - pngjs@5.0.0: {} - - postcss-selector-parser@7.1.4: - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - - postcss@8.5.16: - dependencies: - nanoid: 3.3.15 - picocolors: 1.1.1 - source-map-js: 1.2.1 - - postject@1.0.0-alpha.6: - dependencies: - commander: 9.5.0 - optional: true - - powershell-utils@0.1.0: {} - - prelude-ls@1.2.1: {} - - prettier@3.9.4: {} - - pretty-ms@9.3.0: - dependencies: - parse-ms: 4.0.0 - - proc-log@6.1.0: {} - - process-nextick-args@2.0.1: {} - - progress@2.0.3: {} - - promise-retry@2.0.1: - dependencies: - err-code: 2.0.3 - retry: 0.12.0 - - prompts@2.4.2: - dependencies: - kleur: 3.0.3 - sisteransi: 1.0.5 - - proper-lockfile@4.1.2: - dependencies: - graceful-fs: 4.2.11 - retry: 0.12.0 - signal-exit: 3.0.7 - - proxy-addr@2.0.7: - dependencies: - forwarded: 0.2.0 - ipaddr.js: 1.9.1 - - pump@3.0.4: - dependencies: - end-of-stream: 1.4.5 - once: 1.4.0 - - punycode@2.3.1: {} - - pvtsutils@1.3.6: - dependencies: - tslib: 2.8.1 - - pvutils@1.1.5: {} - - qrcode@1.5.4: - dependencies: - dijkstrajs: 1.0.3 - pngjs: 5.0.0 - yargs: 15.4.1 - - qs@6.15.3: - dependencies: - es-define-property: 1.0.1 - side-channel: 1.1.1 - - queue-microtask@1.2.3: {} - - quick-lru@5.1.1: {} - - range-parser@1.3.0: {} - - raw-body@3.0.2: - dependencies: - bytes: 3.1.2 - http-errors: 2.0.1 - iconv-lite: 0.7.2 - unpipe: 1.0.0 - - react-day-picker@10.0.1(@types/react@19.2.17)(react@19.2.7): - dependencies: - '@date-fns/tz': 1.5.0 - date-fns: 4.4.0 - react: 19.2.7 - optionalDependencies: - '@types/react': 19.2.17 - - react-dom@19.2.7(react@19.2.7): - dependencies: - react: 19.2.7 - scheduler: 0.27.0 - - react-is@19.2.7: {} - - react-redux@9.3.0(@types/react@19.2.17)(react@19.2.7)(redux@5.0.1): - dependencies: - '@types/use-sync-external-store': 0.0.6 - react: 19.2.7 - use-sync-external-store: 1.6.0(react@19.2.7) - optionalDependencies: - '@types/react': 19.2.17 - redux: 5.0.1 - - react-remove-scroll-bar@2.3.8(@types/react@19.2.17)(react@19.2.7): - dependencies: - react: 19.2.7 - react-style-singleton: 2.2.3(@types/react@19.2.17)(react@19.2.7) - tslib: 2.8.1 - optionalDependencies: - '@types/react': 19.2.17 - - react-remove-scroll@2.7.2(@types/react@19.2.17)(react@19.2.7): - dependencies: - react: 19.2.7 - react-remove-scroll-bar: 2.3.8(@types/react@19.2.17)(react@19.2.7) - react-style-singleton: 2.2.3(@types/react@19.2.17)(react@19.2.7) - tslib: 2.8.1 - use-callback-ref: 1.3.3(@types/react@19.2.17)(react@19.2.7) - use-sidecar: 1.1.3(@types/react@19.2.17)(react@19.2.7) - optionalDependencies: - '@types/react': 19.2.17 - - react-resizable-panels@4.12.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7): - dependencies: - react: 19.2.7 - react-dom: 19.2.7(react@19.2.7) - - react-style-singleton@2.2.3(@types/react@19.2.17)(react@19.2.7): - dependencies: - get-nonce: 1.0.1 - react: 19.2.7 - tslib: 2.8.1 - optionalDependencies: - '@types/react': 19.2.17 - - react@19.2.7: {} - - read-binary-file-arch@1.0.6: - dependencies: - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - - readable-stream@2.3.8: - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 1.0.0 - process-nextick-args: 2.0.1 - safe-buffer: 5.1.2 - string_decoder: 1.1.1 - util-deprecate: 1.0.2 - - recast@0.23.12: - dependencies: - ast-types: 0.16.1 - esprima: 4.0.1 - source-map: 0.6.1 - tiny-invariant: 1.3.3 - tslib: 2.8.1 - - recharts@3.8.1(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react-is@19.2.7)(react@19.2.7)(redux@5.0.1): - dependencies: - '@reduxjs/toolkit': 2.12.0(react-redux@9.3.0(@types/react@19.2.17)(react@19.2.7))(react@19.2.7) - clsx: 2.1.1 - decimal.js-light: 2.5.1 - es-toolkit: 1.49.0 - eventemitter3: 5.0.4 - immer: 10.2.0 - react: 19.2.7 - react-dom: 19.2.7(react@19.2.7) - react-is: 19.2.7 - react-redux: 9.3.0(@types/react@19.2.17)(react@19.2.7)(redux@5.0.1) - reselect: 5.1.1 - tiny-invariant: 1.3.3 - use-sync-external-store: 1.6.0(react@19.2.7) - victory-vendor: 37.3.6 - transitivePeerDependencies: - - '@types/react' - - redux - - redux-thunk@3.1.0(redux@5.0.1): - dependencies: - redux: 5.0.1 - - redux@5.0.1: {} - - require-directory@2.1.1: {} - - require-from-string@2.0.2: {} - - require-main-filename@2.0.0: {} - - resedit@1.7.2: - dependencies: - pe-library: 0.4.1 - - reselect@5.1.1: {} - - reselect@5.2.0: {} - - resolve-alpn@1.2.1: {} - - resolve-from@4.0.0: {} - - responselike@2.0.1: - dependencies: - lowercase-keys: 2.0.0 - - restore-cursor@5.1.0: - dependencies: - onetime: 7.0.0 - signal-exit: 4.1.0 - - retry@0.12.0: {} - - reusify@1.1.0: {} - - rimraf@2.6.3: - dependencies: - glob: 7.2.3 - - roarr@2.15.4: - dependencies: - boolean: 3.2.0 - detect-node: 2.1.0 - globalthis: 1.0.4 - json-stringify-safe: 5.0.1 - semver-compare: 1.0.0 - sprintf-js: 1.1.3 - optional: true - - rolldown@1.1.4: - dependencies: - '@oxc-project/types': 0.138.0 - '@rolldown/pluginutils': 1.0.1 - optionalDependencies: - '@rolldown/binding-android-arm64': 1.1.4 - '@rolldown/binding-darwin-arm64': 1.1.4 - '@rolldown/binding-darwin-x64': 1.1.4 - '@rolldown/binding-freebsd-x64': 1.1.4 - '@rolldown/binding-linux-arm-gnueabihf': 1.1.4 - '@rolldown/binding-linux-arm64-gnu': 1.1.4 - '@rolldown/binding-linux-arm64-musl': 1.1.4 - '@rolldown/binding-linux-ppc64-gnu': 1.1.4 - '@rolldown/binding-linux-s390x-gnu': 1.1.4 - '@rolldown/binding-linux-x64-gnu': 1.1.4 - '@rolldown/binding-linux-x64-musl': 1.1.4 - '@rolldown/binding-openharmony-arm64': 1.1.4 - '@rolldown/binding-wasm32-wasi': 1.1.4 - '@rolldown/binding-win32-arm64-msvc': 1.1.4 - '@rolldown/binding-win32-x64-msvc': 1.1.4 - - router@2.2.0: - dependencies: - debug: 4.4.3 - depd: 2.0.0 - is-promise: 4.0.0 - parseurl: 1.3.3 - path-to-regexp: 8.4.2 - transitivePeerDependencies: - - supports-color - - run-applescript@7.1.0: {} - - run-parallel@1.2.0: - dependencies: - queue-microtask: 1.2.3 - - rxjs@7.8.2: - dependencies: - tslib: 2.8.1 - - safe-buffer@5.1.2: {} - - safer-buffer@2.1.2: {} - - sanitize-filename@1.6.4: - dependencies: - truncate-utf8-bytes: 1.0.2 - - sax@1.6.0: {} - - scheduler@0.27.0: {} - - sdp-transform@2.15.0: {} - - sdp@3.2.2: {} - - semver-compare@1.0.0: - optional: true - - semver@5.7.2: {} - - semver@6.3.1: {} - - semver@7.7.4: {} - - semver@7.8.5: {} - - send@1.2.1: - dependencies: - debug: 4.4.3 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - fresh: 2.0.0 - http-errors: 2.0.1 - mime-types: 3.0.2 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: 1.3.0 - statuses: 2.0.2 - transitivePeerDependencies: - - supports-color - - serialize-error@7.0.1: - dependencies: - type-fest: 0.13.1 - optional: true - - seroval-plugins@1.5.4(seroval@1.5.4): - dependencies: - seroval: 1.5.4 - - seroval@1.5.4: {} - - serve-static@2.2.1: - dependencies: - encodeurl: 2.0.0 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 1.2.1 - transitivePeerDependencies: - - supports-color - - set-blocking@2.0.0: {} - - setprototypeof@1.2.0: {} - - shadcn@4.12.0(typescript@6.0.3): - dependencies: - '@babel/core': 7.29.7 - '@babel/parser': 7.29.7 - '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7) - '@babel/preset-typescript': 7.29.7(@babel/core@7.29.7) - '@dotenvx/dotenvx': 1.75.1 - '@modelcontextprotocol/sdk': 1.29.0(zod@3.25.76) - '@types/validate-npm-package-name': 4.0.2 - browserslist: 4.28.4 - commander: 14.0.3 - cosmiconfig: 9.0.2(typescript@6.0.3) - dedent: 1.7.2 - deepmerge: 4.3.1 - diff: 8.0.4 - execa: 9.6.1 - fast-glob: 3.3.3 - fs-extra: 11.3.6 - fuzzysort: 3.1.0 - kleur: 4.1.5 - open: 11.0.0 - ora: 8.2.0 - postcss: 8.5.16 - postcss-selector-parser: 7.1.4 - prompts: 2.4.2 - recast: 0.23.12 - stringify-object: 5.0.0 - tailwind-merge: 3.6.0 - ts-morph: 26.0.0 - tsconfig-paths: 4.2.0 - undici: 7.28.0 - validate-npm-package-name: 7.0.2 - zod: 3.25.76 - zod-to-json-schema: 3.25.2(zod@3.25.76) - transitivePeerDependencies: - - '@cfworker/json-schema' - - babel-plugin-macros - - supports-color - - typescript - - shebang-command@2.0.0: - dependencies: - shebang-regex: 3.0.0 - - shebang-regex@3.0.0: {} - - side-channel-list@1.0.1: - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - - side-channel-map@1.0.1: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - object-inspect: 1.13.4 - - side-channel-weakmap@1.0.2: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - object-inspect: 1.13.4 - side-channel-map: 1.0.1 - - side-channel@1.1.1: - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - side-channel-list: 1.0.1 - side-channel-map: 1.0.1 - side-channel-weakmap: 1.0.2 - - siginfo@2.0.0: {} - - signal-exit@3.0.7: {} - - signal-exit@4.1.0: {} - - simple-update-notifier@2.0.0: - dependencies: - semver: 7.8.5 - - sisteransi@1.0.5: {} - - sonner@2.0.7(react-dom@19.2.7(react@19.2.7))(react@19.2.7): - dependencies: - react: 19.2.7 - react-dom: 19.2.7(react@19.2.7) - - source-map-js@1.2.1: {} - - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - - sprintf-js@1.1.3: - optional: true - - stackback@0.0.2: {} - - stat-mode@1.0.0: {} - - statuses@2.0.2: {} - - std-env@4.1.0: {} - - stdin-discarder@0.2.2: {} - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - string-width@7.2.0: - dependencies: - emoji-regex: 10.6.0 - get-east-asian-width: 1.6.0 - strip-ansi: 7.2.0 - - string_decoder@1.1.1: - dependencies: - safe-buffer: 5.1.2 - - stringify-object@5.0.0: - dependencies: - get-own-enumerable-keys: 1.0.0 - is-obj: 3.0.0 - is-regexp: 3.1.0 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-ansi@7.2.0: - dependencies: - ansi-regex: 6.2.2 - - strip-bom@3.0.0: {} - - strip-final-newline@2.0.0: {} - - strip-final-newline@4.0.0: {} - - style-mod@4.1.3: {} - - sumchecker@3.0.1: - dependencies: - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - systeminformation@5.31.11: {} - - tailwind-merge@3.6.0: {} - - tailwind-scrollbar-hide@4.0.0(tailwindcss@4.3.2): - dependencies: - tailwindcss: 4.3.2 - - tailwindcss@4.3.2: {} - - tapable@2.3.3: {} - - tar@7.5.19: - dependencies: - '@isaacs/fs-minipass': 4.0.1 - chownr: 3.0.0 - minipass: 7.1.3 - minizlib: 3.1.0 - yallist: 5.0.0 - - tauri-plugin-app-events-api@0.2.0: - dependencies: - '@tauri-apps/api': 2.11.1 - - temp-file@3.4.0: - dependencies: - async-exit-hook: 2.0.1 - fs-extra: 10.1.0 - - temp@0.9.4: - dependencies: - mkdirp: 0.5.6 - rimraf: 2.6.3 - - tiny-async-pool@1.3.0: - dependencies: - semver: 5.7.2 - - tiny-invariant@1.3.3: {} - - tinybench@2.9.0: {} - - tinyexec@1.2.4: {} - - tinyglobby@0.2.17: - dependencies: - fdir: 6.5.0(picomatch@4.0.5) - picomatch: 4.0.5 - - tinyrainbow@3.1.0: {} - - tmp-promise@3.0.3: - dependencies: - tmp: 0.2.7 - - tmp@0.2.7: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - toidentifier@1.0.1: {} - - truncate-utf8-bytes@1.0.2: - dependencies: - utf8-byte-length: 1.0.5 - - ts-api-utils@2.5.0(typescript@6.0.3): - dependencies: - typescript: 6.0.3 - - ts-morph@26.0.0: - dependencies: - '@ts-morph/common': 0.27.0 - code-block-writer: 13.0.3 - - tsconfig-paths@4.2.0: - dependencies: - json5: 2.2.3 - minimist: 1.2.8 - strip-bom: 3.0.0 - - tslib@2.8.1: {} - - tw-animate-css@1.4.0: {} - - type-check@0.4.0: - dependencies: - prelude-ls: 1.2.1 - - type-fest@0.13.1: - optional: true - - type-is@2.1.0: - dependencies: - content-type: 2.0.0 - media-typer: 1.1.0 - mime-types: 3.0.2 - - typed-emitter@2.1.0: - optionalDependencies: - rxjs: 7.8.2 - - typescript-eslint@8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3): - dependencies: - '@typescript-eslint/eslint-plugin': 8.62.1(@typescript-eslint/parser@8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/parser': 8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/typescript-estree': 8.62.1(typescript@6.0.3) - '@typescript-eslint/utils': 8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) - eslint: 10.6.0(jiti@2.7.0) - typescript: 6.0.3 - transitivePeerDependencies: - - supports-color - - typescript@6.0.3: {} - - undici-types@6.21.0: {} - - undici-types@7.24.6: {} - - undici-types@8.3.0: {} - - undici@6.27.0: {} - - undici@7.28.0: {} - - unicorn-magic@0.3.0: {} - - universalify@0.1.2: {} - - universalify@2.0.1: {} - - unpipe@1.0.0: {} - - unzipper@0.12.5: - dependencies: - bluebird: 3.7.2 - duplexer2: 0.1.4 - fs-extra: 11.3.1 - graceful-fs: 4.2.11 - node-int64: 0.4.0 - - update-browserslist-db@1.2.3(browserslist@4.28.4): - dependencies: - browserslist: 4.28.4 - escalade: 3.2.0 - picocolors: 1.1.1 - - uri-js@4.4.1: - dependencies: - punycode: 2.3.1 - - use-callback-ref@1.3.3(@types/react@19.2.17)(react@19.2.7): - dependencies: - react: 19.2.7 - tslib: 2.8.1 - optionalDependencies: - '@types/react': 19.2.17 - - use-sidecar@1.1.3(@types/react@19.2.17)(react@19.2.7): - dependencies: - detect-node-es: 1.1.0 - react: 19.2.7 - tslib: 2.8.1 - optionalDependencies: - '@types/react': 19.2.17 - - use-sync-external-store@1.6.0(react@19.2.7): - dependencies: - react: 19.2.7 - - usehooks-ts@3.1.1(react@19.2.7): - dependencies: - lodash.debounce: 4.0.8 - react: 19.2.7 - - utf8-byte-length@1.0.5: {} - - util-deprecate@1.0.2: {} - - validate-npm-package-name@7.0.2: {} - - vary@1.1.2: {} - - vaul@1.1.2(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7): - dependencies: - '@radix-ui/react-dialog': 1.1.18(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - react: 19.2.7 - react-dom: 19.2.7(react@19.2.7) - transitivePeerDependencies: - - '@types/react' - - '@types/react-dom' - - victory-vendor@37.3.6: - dependencies: - '@types/d3-array': 3.2.2 - '@types/d3-ease': 3.0.2 - '@types/d3-interpolate': 3.0.4 - '@types/d3-scale': 4.0.9 - '@types/d3-shape': 3.1.8 - '@types/d3-time': 3.0.4 - '@types/d3-timer': 3.0.2 - d3-array: 3.2.4 - d3-ease: 3.0.1 - d3-interpolate: 3.0.1 - d3-scale: 4.0.2 - d3-shape: 3.2.0 - d3-time: 3.1.0 - d3-timer: 3.0.1 - - vite@8.1.3(@types/node@26.1.0)(esbuild@0.25.12)(jiti@2.7.0)(yaml@2.9.0): - dependencies: - lightningcss: 1.32.0 - picomatch: 4.0.5 - postcss: 8.5.16 - rolldown: 1.1.4 - tinyglobby: 0.2.17 - optionalDependencies: - '@types/node': 26.1.0 - esbuild: 0.25.12 - fsevents: 2.3.3 - jiti: 2.7.0 - yaml: 2.9.0 - - vitest@4.1.9(@types/node@26.1.0)(vite@8.1.3(@types/node@26.1.0)(jiti@2.7.0)(yaml@2.9.0)): - dependencies: - '@vitest/expect': 4.1.9 - '@vitest/mocker': 4.1.9(vite@8.1.3(@types/node@26.1.0)(jiti@2.7.0)(yaml@2.9.0)) - '@vitest/pretty-format': 4.1.9 - '@vitest/runner': 4.1.9 - '@vitest/snapshot': 4.1.9 - '@vitest/spy': 4.1.9 - '@vitest/utils': 4.1.9 - es-module-lexer: 2.3.0 - expect-type: 1.4.0 - magic-string: 0.30.21 - obug: 2.1.3 - pathe: 2.0.3 - picomatch: 4.0.5 - std-env: 4.1.0 - tinybench: 2.9.0 - tinyexec: 1.2.4 - tinyglobby: 0.2.17 - tinyrainbow: 3.1.0 - vite: 8.1.3(@types/node@26.1.0)(esbuild@0.25.12)(jiti@2.7.0)(yaml@2.9.0) - why-is-node-running: 2.3.0 - optionalDependencies: - '@types/node': 26.1.0 - transitivePeerDependencies: - - msw - - w3c-keyname@2.2.8: {} - - webcrypto-core@1.9.2: - dependencies: - '@peculiar/asn1-schema': 2.8.0 - '@peculiar/json-schema': 1.1.12 - '@peculiar/utils': 2.0.3 - asn1js: 3.0.10 - tslib: 2.8.1 - - webrtc-adapter@9.0.5: - dependencies: - sdp: 3.2.2 - - which-module@2.0.1: {} - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - which@4.0.0: - dependencies: - isexe: 3.1.5 - - which@5.0.0: - dependencies: - isexe: 3.1.5 - - which@6.0.1: - dependencies: - isexe: 4.0.0 - - why-is-node-running@2.3.0: - dependencies: - siginfo: 2.0.0 - stackback: 0.0.2 - - word-wrap@1.2.5: {} - - wrap-ansi@6.2.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrappy@1.0.2: {} - - wsl-utils@0.3.1: - dependencies: - is-wsl: 3.1.1 - powershell-utils: 0.1.0 - - xmlbuilder@15.1.1: {} - - y18n@4.0.3: {} - - y18n@5.0.8: {} - - yallist@3.1.1: {} - - yallist@4.0.0: {} - - yallist@5.0.0: {} - - yaml@2.9.0: {} - - yargs-parser@18.1.3: - dependencies: - camelcase: 5.3.1 - decamelize: 1.2.0 - - yargs-parser@21.1.1: {} - - yargs@15.4.1: - dependencies: - cliui: 6.0.0 - decamelize: 1.2.0 - find-up: 4.1.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - require-main-filename: 2.0.0 - set-blocking: 2.0.0 - string-width: 4.2.3 - which-module: 2.0.1 - y18n: 4.0.3 - yargs-parser: 18.1.3 - - yargs@17.7.3: - dependencies: - cliui: 8.0.1 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 21.1.1 - - yauzl@2.10.0: - dependencies: - buffer-crc32: 0.2.13 - fd-slicer: 1.1.0 - - yocto-queue@0.1.0: {} - - yocto-spinner@1.2.0: - dependencies: - yoctocolors: 2.1.2 - - yoctocolors@2.1.2: {} - - zod-to-json-schema@3.25.2(zod@3.25.76): - dependencies: - zod: 3.25.76 - - zod-validation-error@4.0.2(zod@4.4.3): - dependencies: - zod: 4.4.3 - - zod@3.25.76: {} - - zod@4.4.3: {} - - zustand@5.0.14(@types/react@19.2.17)(immer@11.1.9)(react@19.2.7)(use-sync-external-store@1.6.0(react@19.2.7)): - optionalDependencies: - '@types/react': 19.2.17 - immer: 11.1.9 - react: 19.2.7 - use-sync-external-store: 1.6.0(react@19.2.7) diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml deleted file mode 100644 index 7a78a02..0000000 --- a/pnpm-workspace.yaml +++ /dev/null @@ -1,10 +0,0 @@ -packages: - - "packages/*" - - "apps/*" -allowBuilds: - electron: true - electron-winstaller: true - esbuild: true -overrides: - "@tensamin/ui": "https://git.methanium.net/tensamin/ui/releases/download/0.0.40/tensamin-ui.tgz" - mtp: "https://git.methanium.net/methanium/mtp/releases/download/0.2.0-3919eb46fd/mtp-0.2.0.tgz" diff --git a/readme.md b/readme.md index ff7c637..58c21e6 100644 --- a/readme.md +++ b/readme.md @@ -1,3 +1,3 @@ # Information -All dev releases get deleted upon creation of the latest prod release. +All dev releases between two prod version get deleted upon creation of the latest prod release. diff --git a/scripts/build-packages.ts b/scripts/build-packages.ts index 6561947..0f4991a 100644 --- a/scripts/build-packages.ts +++ b/scripts/build-packages.ts @@ -34,7 +34,7 @@ for (const fullPath of packageDirs) { const entry = fullPath.replace(packagesDir + "/", ""); console.log(`Building ${entry}...`); try { - execSync("pnpm run build", { cwd: fullPath, stdio: "inherit" }); + execSync("bun run build", { cwd: fullPath, stdio: "inherit" }); console.log(`${entry} built successfully.`); } catch { console.error(`Failed to build ${entry}.`); diff --git a/scripts/copy-licenses.ts b/scripts/copy-licenses.ts index 6ab5374..5361e82 100644 --- a/scripts/copy-licenses.ts +++ b/scripts/copy-licenses.ts @@ -1,10 +1,10 @@ import { promises as fs } from "node:fs"; import path from "node:path"; -import { parse } from "yaml"; +import { parse } from "jsonc-parser"; -type PnpmLock = { +type BunLock = { lockfileVersion?: number; - importers?: Record; + workspaces?: Record; packages?: Record; }; @@ -36,7 +36,7 @@ type ResolvedPackage = { }; const ROOT = process.cwd(); -const LOCKFILE_PATH = path.join(ROOT, "pnpm-lock.yaml"); +const LOCKFILE_PATH = path.join(ROOT, "bun.lock"); const OUTPUT_DIR = path.join(ROOT, "licenses"); const COMPLIANCE_FILE_PATTERNS = [ @@ -48,15 +48,15 @@ const COMPLIANCE_FILE_PATTERNS = [ async function main(): Promise { await ensureExists( LOCKFILE_PATH, - "Could not find pnpm-lock.yaml in the project root.", + "Could not find bun.lock in the project root.", ); - const lock = await readPnpmLock(); + const lock = await readBunLock(); const nodeModulesRoots = await getNodeModulesRoots(lock); if (nodeModulesRoots.length === 0) { throw new Error( - "Could not find any node_modules directories in the repo root or workspace folders. Run `pnpm install` first.", + "Could not find any node_modules directories in the repo root or workspace folders. Run `bun install` first.", ); } @@ -95,25 +95,25 @@ async function main(): Promise { ); } -async function readPnpmLock(): Promise { +async function readBunLock(): Promise { const raw = await fs.readFile(LOCKFILE_PATH, "utf8"); const parsed = parse(raw); if (!parsed || typeof parsed !== "object") { - throw new Error("Failed to parse pnpm-lock.yaml"); + throw new Error("Failed to parse bun.lock"); } - return parsed as PnpmLock; + return parsed as BunLock; } -async function getNodeModulesRoots(lock: PnpmLock): Promise { +async function getNodeModulesRoots(lock: BunLock): Promise { const candidates = new Set(); candidates.add(path.join(ROOT, "node_modules")); - for (const workspacePath of Object.keys(lock.importers ?? {})) { + for (const workspacePath of Object.keys(lock.workspaces ?? {})) { const workspaceDir = - workspacePath === "." ? ROOT : path.join(ROOT, workspacePath); + workspacePath === "" ? ROOT : path.join(ROOT, workspacePath); candidates.add(path.join(workspaceDir, "node_modules")); } @@ -130,15 +130,25 @@ async function getNodeModulesRoots(lock: PnpmLock): Promise { return existing; } -function extractResolvedThirdPartyPackages(lock: PnpmLock): ResolvedPackage[] { +function extractResolvedThirdPartyPackages(lock: BunLock): ResolvedPackage[] { const results = new Map(); const packages = lock.packages ?? {}; - for (const rawKey of Object.keys(packages)) { - const resolved = parsePnpmPackageKey(rawKey); - if (!resolved) continue; + for (const rawValue of Object.values(packages)) { + if (!Array.isArray(rawValue) || rawValue.length === 0) continue; - const { name, version } = resolved; + const first = rawValue[0]; + if (typeof first !== "string") continue; + + // Examples: + // react@19.2.0 + // @types/react@19.2.2 + // @tensamin/ui@workspace:packages/ui + const atIndex = first.lastIndexOf("@"); + if (atIndex <= 0) continue; + + const name = first.slice(0, atIndex); + const version = first.slice(atIndex + 1); if (!name || !version) continue; if (version.startsWith("workspace:")) continue; @@ -152,21 +162,6 @@ function extractResolvedThirdPartyPackages(lock: PnpmLock): ResolvedPackage[] { return [...results.values()]; } -function parsePnpmPackageKey(rawKey: string): ResolvedPackage | null { - const withoutPeerSuffix = rawKey.replace(/\(.+\)$/, ""); - const normalized = withoutPeerSuffix.startsWith("/") - ? withoutPeerSuffix.slice(1) - : withoutPeerSuffix; - const atIndex = normalized.lastIndexOf("@"); - - if (atIndex <= 0) return null; - - return { - name: normalized.slice(0, atIndex), - version: normalized.slice(atIndex + 1), - }; -} - async function processInstalledPackage( packageName: string, versionFromLock: string, @@ -359,7 +354,7 @@ async function writeThirdPartyNotices(records: PackageRecord[]): Promise { lines.push("# Third-Party Notices"); lines.push(""); lines.push( - "Generated from pnpm-lock.yaml and installed packages in workspace node_modules folders.", + "Generated from bun.lock and installed packages in workspace node_modules folders.", ); lines.push(""); @@ -447,7 +442,7 @@ async function writeCycloneDxSbom(records: PackageRecord[]): Promise { tools: [ { vendor: "OpenAI", - name: "custom pnpm license generator", + name: "custom bun license generator", }, ], component: { diff --git a/scripts/copy-releases.ts b/scripts/copy-releases.ts index 5dfe0e9..194228a 100644 --- a/scripts/copy-releases.ts +++ b/scripts/copy-releases.ts @@ -2,7 +2,6 @@ import { copyFileSync, createReadStream, existsSync, - writeFileSync, mkdirSync, readdirSync, renameSync, @@ -10,7 +9,7 @@ import { statSync, } from "node:fs"; import { createHash } from "node:crypto"; -import { basename, join } from "node:path"; +import { join } from "node:path"; import packageJson from "../package.json" with { type: "json" }; const { version } = packageJson; @@ -58,18 +57,6 @@ if (existsSync(apkSrc)) { // Electron desktop artifacts const electronReleaseDir = "apps/electron/release"; -const electronArtifactPattern = /\.(AppImage|deb|rpm|exe|dmg|zip)$/i; - -function readFilesRecursive(dir: string): string[] { - return readdirSync(dir).flatMap((file) => { - const filePath = join(dir, file); - const stat = statSync(filePath); - - if (stat.isDirectory()) return readFilesRecursive(filePath); - if (stat.isFile()) return [filePath]; - return []; - }); -} const copyElectronArtifacts = () => { if (!existsSync(electronReleaseDir)) { @@ -79,9 +66,12 @@ const copyElectronArtifacts = () => { return; } - for (const source of readFilesRecursive(electronReleaseDir)) { - const file = basename(source); - if (!electronArtifactPattern.test(file)) continue; + for (const file of readdirSync(electronReleaseDir)) { + if (file.endsWith(".blockmap") || file.endsWith(".yml")) continue; + if (!file.includes(version) && !file.includes(releaseVersion)) continue; + + const source = join(electronReleaseDir, file); + if (!statSync(source).isFile()) continue; copyFileSync(source, join(releasesDir, file)); } @@ -114,15 +104,13 @@ const artifacts = await Promise.all( }), ); -writeFileSync( +await Bun.write( join(releasesDir, "electron-release-metadata.json"), `${JSON.stringify({ version: releaseVersion, tag: releaseTag, publishedAt: new Date().toISOString(), artifacts: artifacts.filter((artifact) => artifact.platform !== "android") }, null, 2)}\n`, - "utf8", ); -writeFileSync( +await Bun.write( join(releasesDir, "SHA256SUMS"), `${artifacts.map((artifact) => `${artifact.sha256} ${artifact.name}`).join("\n")}\n`, - "utf8", ); console.log("Releases copied successfully."); diff --git a/scripts/lint-packages.ts b/scripts/lint-packages.ts index 9791c81..b9abdf2 100644 --- a/scripts/lint-packages.ts +++ b/scripts/lint-packages.ts @@ -36,7 +36,7 @@ for (const targetDir of targetDirs) { const entry = relative(rootDir, fullPath); console.log(`Linting ${entry}...`); try { - execSync("pnpm run lint", { cwd: fullPath, stdio: "inherit" }); + execSync("bun run lint", { cwd: fullPath, stdio: "inherit" }); console.log(`${entry} linted successfully.`); } catch { console.error(`Failed to lint ${entry}.`); diff --git a/scripts/update-packages.ts b/scripts/update-packages.ts index d6f59e1..403943a 100644 --- a/scripts/update-packages.ts +++ b/scripts/update-packages.ts @@ -34,7 +34,7 @@ for (const fullPath of packageDirs) { const entry = fullPath.replace(packagesDir + "/", ""); console.log(`Updating ${entry}...`); try { - execSync("pnpm update --interactive", { cwd: fullPath, stdio: "inherit" }); + execSync("bun update --interactive", { cwd: fullPath, stdio: "inherit" }); console.log(`${entry} updated successfully.`); } catch { console.error(`Failed to update ${entry}.`); diff --git a/todo.md b/todo.md index faefaa8..837b847 100644 --- a/todo.md +++ b/todo.md @@ -1,4 +1 @@ - Move legal to extra onboarding package -- Add a bunch of tests -- Add packages/hotkeys/ -- Full accessability diff --git a/type-maps.yaml b/type-maps.yaml deleted file mode 100644 index fb5dbe3..0000000 --- a/type-maps.yaml +++ /dev/null @@ -1,270 +0,0 @@ -protocol_version: "1.0" - -# Note that markers 0 to 31 are reserved for default use, manually working with them is not recommended - -# Fixed CommunicationType markers are: -# Error: 0 -# ErrorParsing: 1 -# ErrorBadVersion: 2 -# Disconnect: 3 -# Redirect: 4 -# Shutdown: 5 -# BadRequest: 6 -# Unauthorized: 7 -# Forbidden: 8 -# NotFound: 9 -# TooManyRequests: 10 -# InternalServerError: 11 -# BadGateway: 12 -# ServiceUnavailable: 13 -# GatewayTimeout: 14 -# Identification: 15 -# IdentificationResponse: 16 -# Register: 17 -# RegisterResponse: 18 -# Ping: 19 -# Pong: 20 - -# Fixed Data Type markers are: -# Error: 0 -# ErrorParsing: 1 -# ErrorMessage: 2 -# Version: 3 -# Description: 4 -# Timestamp: 5 -# Id: 6 -# ClientNonce: 7 -# ServerNonce: 8 -# PublicKeys: 9 -# Signature: 10 -# Connected: 11 - -type_maps: - "1.0": - CommunicationTypes: - ErrorProtocol: 33 - ErrorAnonymous: 34 - ErrorInternal: 35 - ErrorInvalidData: 36 - ErrorInvalidUserId: 37 - ErrorInvalidOmikronId: 38 - ErrorNotFound: 39 - ErrorNotAuthenticated: 40 - ErrorNoIota: 41 - ErrorInvalidChallenge: 42 - ErrorInvalidSecret: 43 - ErrorInvalidPrivateKey: 44 - ErrorInvalidPublicKey: 45 - ErrorNoUserId: 46 - ErrorNoCallId: 47 - ErrorInvalidCallId: 48 - Success: 49 - ShortenLink: 50 - SettingsSave: 51 - SettingsLoad: 52 - SettingsList: 53 - GlobalSettingsSave: 54 - GlobalSettingsLoad: 55 - Message: 56 - MessageState: 57 - MessageSend: 58 - MessageLive: 59 - MessageOtherIota: 60 - MessageChunk: 61 - MessageGet: 143 - MessagesGet: 62 - MessageDelete: 149 - PushNotification: 63 - ReadNotification: 64 - GetNotifications: 65 - TauriIdentification: 66 - ChangeConfirm: 67 - ConfirmReceive: 68 - ConfirmRead: 69 - GetChats: 70 - GetStates: 71 - AddCommunity: 72 - RemoveCommunity: 73 - GetCommunities: 74 - RegisterIota: 81 - RegisterIotaSuccess: 82 - AddConversation: 85 - SendChat: 86 - ClientChanged: 87 - ClientConnected: 88 - ClientDisconnected: 89 - ClientClosed: 90 - PublicKey: 91 - PrivateKey: 92 - WebrtcSdp: 93 - WebrtcIce: 94 - StartStream: 95 - EndStream: 96 - WatchStream: 97 - CallToken: 98 - CallInvite: 99 - CallDisconnectUser: 100 - CallTimeoutUser: 101 - CallSetAnonymousJoining: 102 - CallData: 103 - EndCall: 104 - Function: 105 - Update: 106 - CreateUser: 107 - RhoUpdate: 108 - UserConnected: 109 - UserDisconnected: 110 - IotaConnected: 111 - IotaDisconnected: 112 - SyncClientIotaStatus: 113 - GetUserData: 114 - GetIotaData: 115 - IotaUserData: 116 - ChangeUserData: 117 - ChangeIotaData: 118 - GetRegister: 119 - CompleteRegisterUser: 120 - CompleteRegisterIota: 121 - DeleteUser: 122 - DeleteIota: 123 - StartRegister: 124 - CompleteRegister: 125 - GetApp: 126 - CreateApp: 127 - DeleteApp: 128 - SaveAppData: 129 - LoadAppData: 130 - AppIdentification: 131 - AppChallenge: 132 - AppChallengeResponse: 133 - AppIdentificationResponse: 134 - LoadTxtRecord: 135 - ErrorNotSet: 136 - SetChatSecret: 139 - GetChatSecret: 140 - ChatSecretResponse: 141 - ChatSecretForward: 142 - MessageEditLive: 144 - MessageEdit: 145 - MessageReactionAdd: 146 - MessageReactionRemove: 147 - MessageReactionLive: 148 - MessageDeleteLive: 150 - DataTypes: - ErrorType: 32 - ErrorProtocol: 33 - AcceptedIds: 34 - Uuid: 35 - RegisterId: 36 - Link: 37 - Settings: 38 - SettingsName: 39 - ChatPartnerId: 40 - ChatPartnerName: 41 - IotaId: 42 - UserId: 43 - UserIds: 44 - IotaIds: 45 - UserState: 46 - UserStates: 47 - UserPings: 48 - CallState: 49 - ScreenShare: 50 - PrivateKeyHash: 51 - #Accepted: 52 - AcceptedProfiles: 53 - DeniedProfiles: 54 - Content: 55 - Messages: 56 - Notifications: 57 - SendTime: 58 - GetTime: 59 - GetVariant: 60 - SharedSecretOwn: 61 - SharedSecretOther: 62 - SharedSecretSign: 63 - SharedSecret: 64 - CallId: 65 - CallToken: 66 - CallSecret: 67 - Untill: 68 - Enabled: 69 - StartDate: 70 - EndDate: 71 - ReceiverId: 72 - SenderId: 73 - Signed: 75 - Message: 76 - MessageState: 77 - LastPing: 78 - PingIota: 79 - PingClients: 80 - Matches: 81 - Omikron: 82 - Offset: 83 - Amount: 84 - Position: 85 - Name: 86 - Path: 87 - Codec: 88 - Function: 89 - Payload: 90 - Result: 91 - Interactables: 92 - WantToWatch: 93 - Watcher: 94 - CreatedAt: 95 - Username: 96 - Display: 97 - Avatar: 98 - About: 99 - Status: 100 - PublicKey: 101 - SubLevel: 102 - SubEnd: 103 - CommunityAddress: 104 - CommunityTitle: 106 - Communities: 107 - RhoConnections: 108 - User: 109 - OnlineStatus: 110 - OmikronId: 111 - OmikronConnections: 112 - ResetToken: 113 - NewToken: 114 - CallInvited: 115 - CallMembers: 116 - Calls: 117 - Timeout: 118 - HasAdmin: 119 - LastMessageAt: 120 - Height: 121 - SentBySelf: 122 - SessionId: 123 - Contacts: 124 - LastMessage: 125 - AppIdentifier: 127 - AppPrivateKey: 128 - AppPublicKey: 129 - AppSession: 130 - AppData: 131 - TauriToken: 132 - Challenge: 133 - EncryptedPayload: 134 - SecurePayload: 135 - DeviceId: 136 - ClientId: 137 - SecretId: 142 - VersionNumber: 143 - EncryptedSecret: 144 - WrappingScheme: 146 - UpdatedAt: 147 - ChatId: 148 - KemCiphertext: 149 - SenderUserId: 152 - RecipientUserId: 153 - Recipients: 154 - Edited: 155 - Reactions: 156 - Reaction: 157 - ReplyId: 158 diff --git a/vitest.config.ts b/vitest.config.ts deleted file mode 100644 index 30e49b8..0000000 --- a/vitest.config.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { defineConfig } from "vitest/config"; - -export default defineConfig({ - test: { - exclude: ["**/node_modules/**", "**/.direnv/**", "**/dist/**"], - }, -});