From 38df6fc79d953e5246c58a89ee8b550a248bf37f Mon Sep 17 00:00:00 2001 From: chahinebrini Date: Sat, 30 May 2026 08:16:45 +0200 Subject: [PATCH] feat(chat): push notifications for DMs + rooms Backend: - Prisma PushToken model + chat_push_enabled flag on profiles - Migration 20260530_add_push_tokens (push_tokens table + profile flag) - Service sendChatPush with expo-server-sdk (auto-disable invalid tokens) - Fire-and-forget push trigger in sendDirectMessage + createRoomMessage - API POST /users/me/push-token (upsert) + DELETE (soft-disable) Client (rebreak-native): - usePushTokenRegistration hook: permission, getExpoPushTokenAsync, Android channel 'chat', POST to backend; idempotent per session - Notification tap deep-link: dm -> /dm?userId, room -> /room?roomId Deploy: - run_quiet spinner for silent altool/xcodebuild/gradle phases - Release-notes pipeline (--notes flag / NEXT_RELEASE.md / interactive) archived to CHANGELOG.md, printed with ASC + Play Console links - Default version bump ON (--no-bump opt-out), build cleanup - NEXT_RELEASE.md with push-notification release note --- apps/rebreak-native/CHANGELOG.md | 1 + apps/rebreak-native/NEXT_RELEASE.md | 1 + apps/rebreak-native/app/_layout.tsx | 26 +- apps/rebreak-native/deploy.sh | 813 ++++++++++++ .../hooks/usePushTokenRegistration.ts | 115 ++ backend/package.json | 1 + .../20260530_add_push_tokens/migration.sql | 38 + backend/prisma/schema.prisma | 29 + .../server/api/users/me/push-token.delete.ts | 29 + .../server/api/users/me/push-token.post.ts | 54 + backend/server/db/chat-rooms.ts | 32 + backend/server/db/chat.ts | 18 +- backend/server/services/push.ts | 128 ++ pnpm-lock.yaml | 1155 +++++++++-------- 14 files changed, 1910 insertions(+), 530 deletions(-) create mode 100644 apps/rebreak-native/NEXT_RELEASE.md create mode 100755 apps/rebreak-native/deploy.sh create mode 100644 apps/rebreak-native/hooks/usePushTokenRegistration.ts create mode 100644 backend/prisma/migrations/20260530_add_push_tokens/migration.sql create mode 100644 backend/server/api/users/me/push-token.delete.ts create mode 100644 backend/server/api/users/me/push-token.post.ts create mode 100644 backend/server/services/push.ts diff --git a/apps/rebreak-native/CHANGELOG.md b/apps/rebreak-native/CHANGELOG.md index 97e32b7..739206d 100644 --- a/apps/rebreak-native/CHANGELOG.md +++ b/apps/rebreak-native/CHANGELOG.md @@ -1,6 +1,7 @@ # Changelog All notable changes to rebreak-native will be documented in this file. +## v0.3.13 (Build 26 / versionCode 16) — 2026-05-30\n\nneue push für chat\n Format: [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) Versioning: `version` follows SemVer, `versionCode` is monotonically increasing. diff --git a/apps/rebreak-native/NEXT_RELEASE.md b/apps/rebreak-native/NEXT_RELEASE.md new file mode 100644 index 0000000..68bb06b --- /dev/null +++ b/apps/rebreak-native/NEXT_RELEASE.md @@ -0,0 +1 @@ +Push-Notifications für Chat: Du erhältst jetzt Pushes bei neuen Direkt-Nachrichten und Raum-Nachrichten. Abschaltbar in den Einstellungen. diff --git a/apps/rebreak-native/app/_layout.tsx b/apps/rebreak-native/app/_layout.tsx index afa4a5b..ce753a3 100644 --- a/apps/rebreak-native/app/_layout.tsx +++ b/apps/rebreak-native/app/_layout.tsx @@ -2,7 +2,7 @@ import { useEffect } from 'react'; import { AppState, I18nManager } from 'react-native'; I18nManager.allowRTL(true); -import { Stack } from 'expo-router'; +import { Stack, router } from 'expo-router'; import { StatusBar } from 'expo-status-bar'; import * as Notifications from 'expo-notifications'; @@ -31,6 +31,7 @@ import { BrandSplash } from '../components/BrandSplash'; import { AppLockGate } from '../components/AppLockGate'; import { DeviceLimitReachedSheet } from '../components/DeviceLimitReachedSheet'; import { OnlinePresenceProvider } from '../components/OnlinePresenceProvider'; +import { usePushTokenRegistration } from '../hooks/usePushTokenRegistration'; import '../lib/i18n'; // i18next-Init via Side-Effect import '../global.css'; @@ -55,7 +56,7 @@ const queryClient = new QueryClient({ }); function RootLayoutInner() { - const { loading, init } = useAuthStore(); + const { loading, init, user } = useAuthStore(); const initTheme = useThemeStore((s) => s.init); const colorScheme = useThemeStore((s) => s.colorScheme); const initLanguage = useLanguageStore((s) => s.init); @@ -71,6 +72,27 @@ function RootLayoutInner() { Nunito_800ExtraBold, }); + // Push-Token-Registration nach Login (idempotent) + usePushTokenRegistration(user?.id); + + // Push-Tap-Deep-Link: User tippt Notification → navigate zu Chat + useEffect(() => { + const sub = Notifications.addNotificationResponseReceivedListener( + (response) => { + const data = response.notification.request.content.data as + | { type?: 'dm' | 'room'; targetId?: string } + | undefined; + if (!data?.type || !data.targetId) return; + if (data.type === 'dm') { + router.push({ pathname: '/dm', params: { userId: data.targetId } }); + } else if (data.type === 'room') { + router.push({ pathname: '/room', params: { roomId: data.targetId } }); + } + }, + ); + return () => sub.remove(); + }, []); + useEffect(() => { init(); initTheme(); diff --git a/apps/rebreak-native/deploy.sh b/apps/rebreak-native/deploy.sh new file mode 100755 index 0000000..3324971 --- /dev/null +++ b/apps/rebreak-native/deploy.sh @@ -0,0 +1,813 @@ +#!/bin/bash +# deploy.sh — ReBreak Multi-Platform Release Pipeline +# +# SUBCOMMANDS: +# ./deploy.sh default: all (testflight + mdm + android) +# ./deploy.sh testflight iOS TestFlight via App Store Connect +# ./deploy.sh mdm iOS Ad-Hoc IPA + scp Upload zu MDM-Server +# ./deploy.sh android Android APK/AAB via Gradle + Play Console +# ./deploy.sh all Alle drei Targets +# +# FLAGS: +# --no-bump Build-Number NICHT bumpen (Default: bump an) +# --version X.Y.Z Explizite Version setzen +# --build N Explizite iOS Build-Nummer +# --android-version-code N Override Android versionCode +# --notes "text" Release-Notes für diese Version (TestFlight + Play Console) +# --skip-clean clean-ios.sh überspringen (iOS) +# --skip-validate altool --validate-app überspringen (TF) +# --skip-submit Play-Console-Submit überspringen (Android) +# --keep-build Build-Artefakte NICHT löschen (Default: cleanup nach Submit) +# --dry-run Alles simulieren, nichts ausführen +# -h, --help Diese Hilfe anzeigen +# +# BEISPIELE: +# # Full Release (alle Plattformen — bumpt + cleanup automatisch): +# ./deploy.sh +# +# # Nur Android build (kein Submit, Build behalten): +# ./deploy.sh android --skip-submit --keep-build +# +# # Nur iOS TestFlight mit expliziter Version (ohne Bump): +# ./deploy.sh testflight --no-bump --version 0.4.0 --build 26 +# +# # Dry-Run zum Testen: +# ./deploy.sh all --dry-run +# +# CREDENTIALS: +# iOS TestFlight: +# - APPLE_APP_SPECIFIC_PASSWORD (oder) +# - ASC_API_KEY_PATH + ASC_API_KEY_ID + ASC_API_KEY_ISSUER +# iOS MDM: +# - SSH-Access zu rebreak-mdm Server +# Android: +# - android/key.properties (signing) +# - android/app/*.keystore (release keystore) +# - PLAY_SERVICE_ACCOUNT_JSON (für --submit) + +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +APP_CONFIG="$SCRIPT_DIR/app.config.ts" +PACKAGE_JSON="$SCRIPT_DIR/package.json" +LOG_DIR="$SCRIPT_DIR/tmp/deploy-logs" +TIMESTAMP=$(date +%Y%m%d-%H%M%S) + +# ═══════════════════════════════════════════════════════════════════════════ +# Color Output (brew-style) +# ═══════════════════════════════════════════════════════════════════════════ + +if [[ -t 1 ]]; then + BOLD=$(tput bold) + GREEN=$(tput setaf 2) + YELLOW=$(tput setaf 3) + RED=$(tput setaf 1) + BLUE=$(tput setaf 4) + RESET=$(tput sgr0) +else + BOLD="" GREEN="" YELLOW="" RED="" BLUE="" RESET="" +fi + +log() { echo "${BLUE}==>${RESET} ${BOLD}$*${RESET}"; } +ok() { echo "${GREEN}✓${RESET} $*"; } +warn() { echo "${YELLOW}⚠${RESET} $*" >&2; } +error() { echo "${RED}✗${RESET} ${BOLD}$*${RESET}" >&2; } +die() { error "$*"; exit 1; } + +section() { + echo "" + echo "${BOLD}────────────────────────────────────────────────────────────${RESET}" + echo "${BOLD}$*${RESET}" + echo "${BOLD}────────────────────────────────────────────────────────────${RESET}" +} + +run() { + if $DRY_RUN; then + echo "${YELLOW}[DRY-RUN]${RESET} $*" + return 0 + else + "$@" + fi +} + +# run_quiet "Label" +# Runs cmd silently with a spinner + elapsed time. On error dumps last 40 log +# lines and exits. With --verbose / non-TTY: streams full output normally. +run_quiet() { + local label="$1"; shift + local logfile="$1"; shift + if $DRY_RUN; then + echo "${YELLOW}[DRY-RUN]${RESET} $label: $*" + return 0 + fi + if $VERBOSE || [[ ! -t 1 ]]; then + log "$label" + "$@" 2>&1 | tee "$logfile" + return ${PIPESTATUS[0]} + fi + local start=$SECONDS + local spin='⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏' + local i=0 pid elapsed frame + ( "$@" >"$logfile" 2>&1 ) & + pid=$! + while kill -0 "$pid" 2>/dev/null; do + elapsed=$((SECONDS - start)) + frame="${spin:i%10:1}" + i=$((i + 1)) + # \r + \033[K = carriage return + clear line to end + printf '\r\033[K%s %s==>%s %s %s(%ds)%s' \ + "$frame" "$BLUE" "$RESET" "$label" "$YELLOW" "$elapsed" "$RESET" >&2 + sleep 0.1 + done + wait "$pid" + local rc=$? + elapsed=$((SECONDS - start)) + printf '\r\033[K' >&2 # Clear spinner line + if [[ $rc -eq 0 ]]; then + ok "$label ${YELLOW}(${elapsed}s)${RESET}" + else + error "$label fehlgeschlagen nach ${elapsed}s (exit $rc)" + echo "" >&2 + echo "${BOLD}── Letzte Log-Zeilen (${logfile}) ──${RESET}" >&2 + tail -40 "$logfile" >&2 + echo "${BOLD}────────────────────────────────────${RESET}" >&2 + echo "Voller Log: $logfile" >&2 + exit $rc + fi +} + +# ═══════════════════════════════════════════════════════════════════════════ +# Flag Parsing +# ═══════════════════════════════════════════════════════════════════════════ + +COMMAND="${1:-all}" +shift || true + +DO_MDM=false +DO_TF=false +DO_ANDROID=false + +case "$COMMAND" in + all) DO_MDM=true; DO_TF=true; DO_ANDROID=true ;; + testflight|tf) DO_TF=true ;; + mdm|adhoc) DO_MDM=true ;; + android) DO_ANDROID=true ;; + -h|--help) + awk '/^#!/{next} /^#/{sub(/^# ?/, ""); print; next} {exit}' "$0" + exit 0 ;; + *) + error "Unbekanntes Subcommand: $COMMAND" + echo "" + echo "Verfügbare Commands:" + echo " all Alle Plattformen (testflight + mdm + android)" + echo " testflight Nur iOS TestFlight" + echo " mdm Nur iOS Ad-Hoc/MDM" + echo " android Nur Android" + echo "" + echo "Nutze --help für Details" + exit 1 + ;; +esac + +# Bump default ON — Android requires new versionCode for every upload, +# TestFlight requires unique build per version. --no-bump to opt out. +BUMP_IOS=true +BUMP_ANDROID=true +EXPLICIT_VERSION="" +EXPLICIT_BUILD="" +ANDROID_VERSION_CODE_OVERRIDE="" +RELEASE_NOTES="" +SKIP_CLEAN=false +SKIP_VALIDATE=false +SKIP_SUBMIT=false +KEEP_BUILD=false +DRY_RUN=false +VERBOSE=false + +while [[ $# -gt 0 ]]; do + case "$1" in + --bump) shift ;; # default on — silently accepted for backward compat + --no-bump) BUMP_IOS=false; BUMP_ANDROID=false; shift ;; + --version) EXPLICIT_VERSION="$2"; shift 2 ;; + --build) EXPLICIT_BUILD="$2"; shift 2 ;; + --android-version-code) ANDROID_VERSION_CODE_OVERRIDE="$2"; shift 2 ;; + --notes) RELEASE_NOTES="$2"; shift 2 ;; + --skip-clean) SKIP_CLEAN=true; shift ;; + --skip-validate) SKIP_VALIDATE=true; shift ;; + --skip-submit) SKIP_SUBMIT=true; shift ;; + --keep-build) KEEP_BUILD=true; shift ;; + --dry-run) DRY_RUN=true; shift ;; + -v|--verbose) VERBOSE=true; shift ;; + -h|--help) + awk '/^#!/{next} /^#/{sub(/^# ?/, ""); print; next} {exit}' "$0" + exit 0 ;; + *) die "Unbekannter Flag: $1 (--help für Hilfe)" ;; + esac +done + +# ═══════════════════════════════════════════════════════════════════════════ +# ENV & Paths +# ═══════════════════════════════════════════════════════════════════════════ + +REBREAK_TEAM_ID="${REBREAK_TEAM_ID:-84BQ7MTFYK}" +MDM_SERVER="${MDM_SERVER:-rebreak-mdm}" +INSTALL_BASE_URL="${INSTALL_BASE_URL:-https://mdm.rebreak.org/install}" +export REBREAK_ENABLE_FAMILY_CONTROLS="${REBREAK_ENABLE_FAMILY_CONTROLS:-1}" +export EXPO_PUBLIC_ENABLE_DEBUG="${EXPO_PUBLIC_ENABLE_DEBUG:-0}" + +IOS_DIR="$SCRIPT_DIR/ios" +ANDROID_DIR="$SCRIPT_DIR/android" +ARCHIVE_PATH="/tmp/Rebreak.xcarchive" +ADHOC_EXPORT_DIR="/tmp/Rebreak-ipa" +TF_EXPORT_DIR="/tmp/Rebreak-tf" +ADHOC_IPA="$ADHOC_EXPORT_DIR/Rebreak.ipa" +TF_IPA="$TF_EXPORT_DIR/Rebreak.ipa" +ADHOC_EXPORT_OPTIONS="$SCRIPT_DIR/build-config/exportOptions-adhoc.plist" +TF_EXPORT_OPTIONS="$SCRIPT_DIR/build-config/exportOptions-tf.plist" +WORKSPACE="$IOS_DIR/ReBreak.xcworkspace" +SCHEME="ReBreak" + +APPLE_ID_EMAIL="${APPLE_ID_EMAIL:-chahinebrini@gmail.com}" +APPLE_APP_SPECIFIC_PASSWORD="${APPLE_APP_SPECIFIC_PASSWORD:-}" +ASC_API_KEY_PATH="${ASC_API_KEY_PATH:-}" +ASC_API_KEY_ID="${ASC_API_KEY_ID:-}" +ASC_API_KEY_ISSUER="${ASC_API_KEY_ISSUER:-}" + +PLAY_SERVICE_ACCOUNT_JSON="${PLAY_SERVICE_ACCOUNT_JSON:-$HOME/secrets/rebreak-play-service-account.json}" + +mkdir -p "$LOG_DIR" 2>/dev/null || true + +# ═══════════════════════════════════════════════════════════════════════════ +# Helpers +# ═══════════════════════════════════════════════════════════════════════════ + +get_current_version() { + grep -E '"version"' "$PACKAGE_JSON" | head -1 \ + | sed -E 's/[^"]*"version"[^"]*"([^"]+)".*/\1/' || echo "0.0.0" +} + +get_current_build_number() { + grep -E 'buildNumber:' "$APP_CONFIG" \ + | sed -E 's/[^:]*:[^"]*"([0-9]+)".*/\1/' || echo "0" +} + +get_current_version_code() { + grep -E 'versionCode:' "$APP_CONFIG" \ + | sed -E 's/[^:]*:[^0-9]*([0-9]+).*/\1/' || echo "0" +} + +bump_ios_version() { + log "iOS Version Bump..." + + local current_version + current_version=$(get_current_version) + local current_build + current_build=$(get_current_build_number) + + local new_version="$current_version" + local new_build + + if [[ -n "$EXPLICIT_VERSION" ]]; then + new_version="$EXPLICIT_VERSION" + fi + + if [[ -n "$EXPLICIT_BUILD" ]]; then + new_build="$EXPLICIT_BUILD" + else + new_build=$((current_build + 1)) + fi + + echo " $current_version (Build $current_build) → $new_version (Build $new_build)" + + if ! $DRY_RUN; then + # Update package.json version + if [[ "$new_version" != "$current_version" ]]; then + if [[ "$(uname)" == "Darwin" ]]; then + sed -i '' "s/\"version\": \"$current_version\"/\"version\": \"$new_version\"/" "$PACKAGE_JSON" + else + sed -i "s/\"version\": \"$current_version\"/\"version\": \"$new_version\"/" "$PACKAGE_JSON" + fi + fi + + # Update buildNumber in app.config.ts + if [[ "$(uname)" == "Darwin" ]]; then + sed -i '' "s/buildNumber: \"$current_build\"/buildNumber: \"$new_build\"/" "$APP_CONFIG" + else + sed -i "s/buildNumber: \"$current_build\"/buildNumber: \"$new_build\"/" "$APP_CONFIG" + fi + + # Update Extension Info.plists + local ext_plists=( + "$SCRIPT_DIR/modules/rebreak-protection/ios/RebreakContentFilter/Info.plist" + "$SCRIPT_DIR/modules/rebreak-protection/ios/RebreakPacketTunnelExtension/Info.plist" + "$SCRIPT_DIR/modules/rebreak-protection/ios/RebreakURLFilterExtension/Info.plist" + ) + for plist in "${ext_plists[@]}"; do + if [[ -f "$plist" ]]; then + /usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString $new_version" "$plist" 2>/dev/null || true + /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $new_build" "$plist" 2>/dev/null || true + fi + done + + ok "iOS Version aktualisiert" + fi +} + +bump_android_version() { + log "Android versionCode Bump..." + + local current_version_code + current_version_code=$(get_current_version_code) + local new_version_code + + if [[ -n "$ANDROID_VERSION_CODE_OVERRIDE" ]]; then + new_version_code="$ANDROID_VERSION_CODE_OVERRIDE" + else + new_version_code=$((current_version_code + 1)) + fi + + echo " versionCode: $current_version_code → $new_version_code" + + if ! $DRY_RUN; then + if [[ "$(uname)" == "Darwin" ]]; then + sed -i '' "s/versionCode: $current_version_code,/versionCode: $new_version_code,/" "$APP_CONFIG" + else + sed -i "s/versionCode: $current_version_code,/versionCode: $new_version_code,/" "$APP_CONFIG" + fi + ok "Android versionCode aktualisiert" + fi +} + +# ═══════════════════════════════════════════════════════════════════════════ +# Release Notes Collection +# ═══════════════════════════════════════════════════════════════════════════ + +collect_release_notes() { + # Priority: --notes flag > NEXT_RELEASE.md > interactive prompt + local next_release_file="$SCRIPT_DIR/NEXT_RELEASE.md" + + if [[ -n "$RELEASE_NOTES" ]]; then + log "Release-Notes: aus --notes Flag" + return + fi + + if [[ -f "$next_release_file" ]] && [[ -s "$next_release_file" ]]; then + RELEASE_NOTES="$(cat "$next_release_file")" + log "Release-Notes: aus $next_release_file" + return + fi + + # Interactive prompt (nur wenn TTY) + if [[ -t 0 ]] && [[ -t 1 ]] && ! $DRY_RUN; then + echo "" + echo "${BOLD}Release-Notes für diese Version (optional):${RESET}" + echo "${YELLOW}Tipp: Multi-line mit Strg-D beenden, oder ENTER für skip${RESET}" + echo "" + + # Read multi-line input until EOF (Ctrl-D) or empty line + local input_lines=() + local line + while IFS= read -r line; do + if [[ -z "$line" ]] && [[ ${#input_lines[@]} -eq 0 ]]; then + # First line empty = skip + break + fi + input_lines+=("$line") + done + + if [[ ${#input_lines[@]} -gt 0 ]]; then + RELEASE_NOTES="$(printf '%s\n' "${input_lines[@]}")" + log "Release-Notes: interaktiv erfasst" + fi + fi +} + +archive_release_notes_to_changelog() { + [[ -z "$RELEASE_NOTES" ]] && return + + local changelog="$SCRIPT_DIR/CHANGELOG.md" + local version build version_code + version="$(get_current_version)" + build="$(get_current_build_number)" + version_code="$(get_current_version_code)" + local date_stamp + date_stamp="$(date +%Y-%m-%d)" + + local header="## v${version} (Build ${build} / versionCode ${version_code}) — ${date_stamp}" + local entry="${header}\n\n${RELEASE_NOTES}\n" + + if [[ ! -f "$changelog" ]]; then + # Create new CHANGELOG.md with header + echo "# Changelog" > "$changelog" + echo "" >> "$changelog" + echo "Alle wichtigen Änderungen an diesem Projekt werden in dieser Datei dokumentiert." >> "$changelog" + echo "" >> "$changelog" + fi + + # Prepend new entry after header (assumes "# Changelog" on line 1) + if $DRY_RUN; then + log "[DRY-RUN] Würde Release-Notes in $changelog archivieren" + else + # Use temporary file to prepend + local temp_file + temp_file="$(mktemp)" + { + head -3 "$changelog" 2>/dev/null || echo -e "# Changelog\n" + echo "$entry" + tail -n +4 "$changelog" 2>/dev/null || true + } > "$temp_file" + mv "$temp_file" "$changelog" + ok "Release-Notes in $changelog archiviert" + fi + + # Clear NEXT_RELEASE.md if it was used + local next_release_file="$SCRIPT_DIR/NEXT_RELEASE.md" + if [[ -f "$next_release_file" ]] && ! $DRY_RUN; then + rm "$next_release_file" + ok "NEXT_RELEASE.md geleert" + fi +} + +# ═══════════════════════════════════════════════════════════════════════════ +# iOS Ad-Hoc / MDM Pipeline +# ═══════════════════════════════════════════════════════════════════════════ + +deploy_mdm() { + section "iOS Ad-Hoc (MDM)" + + # Preflight + command -v xcodebuild >/dev/null 2>&1 || die "xcodebuild nicht gefunden" + command -v ssh >/dev/null 2>&1 || die "ssh nicht gefunden" + command -v scp >/dev/null 2>&1 || die "scp nicht gefunden" + [[ -f "$ADHOC_EXPORT_OPTIONS" ]] || die "ExportOptions nicht gefunden: $ADHOC_EXPORT_OPTIONS" + [[ -d "$IOS_DIR" ]] || die "ios/ nicht gefunden — expo prebuild zuerst ausführen" + + log "Prüfe SSH-Verbindung zu $MDM_SERVER..." + if ! ssh -o ConnectTimeout=10 -o BatchMode=yes "$MDM_SERVER" "echo ok" >/dev/null 2>&1; then + die "SSH zu $MDM_SERVER fehlgeschlagen — VPN oder SSH-Key prüfen" + fi + ok "SSH OK" + + # Clean + if ! $SKIP_CLEAN; then + log "Clean iOS..." + run "$SCRIPT_DIR/clean-ios.sh" + fi + + # Archive + rm -rf "$ARCHIVE_PATH" + run_quiet "Building xcarchive" "$LOG_DIR/mdm-archive-$TIMESTAMP.log" \ + xcodebuild archive \ + -workspace "$WORKSPACE" \ + -scheme "$SCHEME" \ + -configuration Release \ + -archivePath "$ARCHIVE_PATH" \ + -destination 'generic/platform=iOS' \ + DEVELOPMENT_TEAM="$REBREAK_TEAM_ID" + + ok "xcarchive fertig: $ARCHIVE_PATH" + + # Export IPA + rm -rf "$ADHOC_EXPORT_DIR" + run_quiet "Exporting Ad-Hoc IPA" "$LOG_DIR/mdm-export-$TIMESTAMP.log" \ + xcodebuild -exportArchive \ + -archivePath "$ARCHIVE_PATH" \ + -exportPath "$ADHOC_EXPORT_DIR" \ + -exportOptionsPlist "$ADHOC_EXPORT_OPTIONS" + + [[ -f "$ADHOC_IPA" ]] || die "IPA nicht erzeugt: $ADHOC_IPA" + ok "IPA exportiert: $ADHOC_IPA" + + # Upload + log "Uploading zu $MDM_SERVER..." + run scp "$ADHOC_IPA" "$MDM_SERVER:/opt/nanomdm/install/Rebreak.ipa" + run scp "$ADHOC_EXPORT_DIR/manifest.plist" "$MDM_SERVER:/opt/nanomdm/install/manifest.plist" + + ok "MDM-Deploy abgeschlossen" + echo "" + echo " Install-URL: $INSTALL_BASE_URL/manifest.plist" + echo " Server-seitiger systemd path-watcher triggert MDM-Push automatisch" +} + +# ═══════════════════════════════════════════════════════════════════════════ +# iOS TestFlight Pipeline +# ═══════════════════════════════════════════════════════════════════════════ + +deploy_testflight() { + section "iOS TestFlight" + + # Preflight + command -v xcodebuild >/dev/null 2>&1 || die "xcodebuild nicht gefunden" + command -v xcrun >/dev/null 2>&1 || die "xcrun nicht gefunden" + [[ -f "$TF_EXPORT_OPTIONS" ]] || die "ExportOptions nicht gefunden: $TF_EXPORT_OPTIONS" + + # Auth + local AUTH_MODE="" + if [[ -n "$ASC_API_KEY_PATH" && -n "$ASC_API_KEY_ID" && -n "$ASC_API_KEY_ISSUER" ]]; then + AUTH_MODE="api-key" + [[ -f "$ASC_API_KEY_PATH" ]] || die "ASC API-Key nicht gefunden: $ASC_API_KEY_PATH" + log "Auth: ASC API-Key ($ASC_API_KEY_ID)" + elif [[ -n "$APPLE_APP_SPECIFIC_PASSWORD" ]]; then + AUTH_MODE="app-specific-password" + log "Auth: App-Specific-Password ($APPLE_ID_EMAIL)" + else + die "Kein Auth konfiguriert. + +Benötigt einen der folgenden Auth-Wege: + +Option A — App-Specific-Password: + export APPLE_ID_EMAIL=chahinebrini@gmail.com + export APPLE_APP_SPECIFIC_PASSWORD=xxxx-xxxx-xxxx-xxxx + Passwort generieren: https://appleid.apple.com → Sicherheit + +Option B — ASC API-Key (besser für CI): + export ASC_API_KEY_PATH=/pfad/zu/AuthKey_ABCDE12345.p8 + export ASC_API_KEY_ID=ABCDE12345 + export ASC_API_KEY_ISSUER=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx + Key erstellen: https://appstoreconnect.apple.com → Users → Integrations" + fi + + # Archive lokalisieren + local USED_ARCHIVE="$ARCHIVE_PATH" + if [[ ! -d "$USED_ARCHIVE" ]]; then + # Fallback: neuestes Xcode-Archive + USED_ARCHIVE=$(find ~/Library/Developer/Xcode/Archives -name "ReBreak*.xcarchive" -type d 2>/dev/null \ + | sort -r | head -1 || true) + if [[ -z "$USED_ARCHIVE" ]]; then + die "Kein xcarchive gefunden. +Entweder: + 1. ./deploy.sh mdm zuerst ausführen (erzeugt $ARCHIVE_PATH) + 2. Oder: ./deploy.sh all (baut MDM + TF in einem Lauf)" + fi + log "Auto-detect: $USED_ARCHIVE" + else + log "Verwende Archive: $USED_ARCHIVE" + fi + + # Export IPA + rm -rf "$TF_EXPORT_DIR" + run_quiet "Exporting App-Store IPA" "$LOG_DIR/tf-export-$TIMESTAMP.log" \ + xcodebuild -exportArchive \ + -archivePath "$USED_ARCHIVE" \ + -exportPath "$TF_EXPORT_DIR" \ + -exportOptionsPlist "$TF_EXPORT_OPTIONS" + + [[ -f "$TF_IPA" ]] || die "IPA nicht erzeugt: $TF_IPA" + ok "IPA exportiert: $TF_IPA" + + # Validate + if ! $SKIP_VALIDATE; then + if [[ "$AUTH_MODE" == "api-key" ]]; then + run_quiet "Validating IPA (App-Store Connect)" "$LOG_DIR/tf-validate-$TIMESTAMP.log" \ + xcrun altool --validate-app \ + -f "$TF_IPA" \ + -t ios \ + --apiKey "$ASC_API_KEY_ID" \ + --apiIssuer "$ASC_API_KEY_ISSUER" + else + run_quiet "Validating IPA (App-Store Connect)" "$LOG_DIR/tf-validate-$TIMESTAMP.log" \ + xcrun altool --validate-app \ + -f "$TF_IPA" \ + -t ios \ + -u "$APPLE_ID_EMAIL" \ + -p "$APPLE_APP_SPECIFIC_PASSWORD" + fi + fi + + # Upload + if [[ "$AUTH_MODE" == "api-key" ]]; then + run_quiet "Uploading zu App-Store Connect (TestFlight)" "$LOG_DIR/tf-upload-$TIMESTAMP.log" \ + xcrun altool --upload-app \ + -f "$TF_IPA" \ + -t ios \ + --apiKey "$ASC_API_KEY_ID" \ + --apiIssuer "$ASC_API_KEY_ISSUER" + else + run_quiet "Uploading zu App-Store Connect (TestFlight)" "$LOG_DIR/tf-upload-$TIMESTAMP.log" \ + xcrun altool --upload-app \ + -f "$TF_IPA" \ + -t ios \ + -u "$APPLE_ID_EMAIL" \ + -p "$APPLE_APP_SPECIFIC_PASSWORD" + fi + + ok "TestFlight-Deploy abgeschlossen" + echo "" + echo " IPA erscheint automatisch in Internal Testing" + echo " Status: https://appstoreconnect.apple.com" +} + +# ═══════════════════════════════════════════════════════════════════════════ +# Android Pipeline +# ═══════════════════════════════════════════════════════════════════════════ + +deploy_android() { + section "Android Release" + + # Preflight + [[ -d "$ANDROID_DIR" ]] || die "android/ nicht gefunden — expo prebuild zuerst ausführen" + + local KEYSTORE_PROPS="$ANDROID_DIR/key.properties" + if [[ ! -f "$KEYSTORE_PROPS" ]]; then + error "Android Signing nicht konfiguriert" + echo "" + echo "Fehlt: $KEYSTORE_PROPS" + echo "" + echo "Setup-Schritte:" + echo "" + echo "1. Keystore generieren:" + echo " keytool -genkey -v -keystore ~/rebreak-release.keystore \\" + echo " -alias rebreak -keyalg RSA -keysize 2048 -validity 10000" + echo "" + echo "2. Keystore nach android/app/ kopieren:" + echo " cp ~/rebreak-release.keystore $ANDROID_DIR/app/" + echo "" + echo "3. key.properties erstellen:" + echo " cat > $KEYSTORE_PROPS << EOF" + echo "storePassword=" + echo "keyPassword=" + echo "keyAlias=rebreak" + echo "storeFile=rebreak-release.keystore" + echo "EOF" + echo "" + echo "4. NIEMALS committen — .gitignore prüfen" + exit 1 + fi + + log "Keystore-Config gefunden: $KEYSTORE_PROPS" + + # Build + run_quiet "Building Release AAB (gradlew bundleRelease)" \ + "$LOG_DIR/android-build-$TIMESTAMP.log" \ + bash -c "cd $ANDROID_DIR && ./gradlew bundleRelease --console=plain" + + local AAB="$ANDROID_DIR/app/build/outputs/bundle/release/app-release.aab" + [[ -f "$AAB" ]] || die "AAB nicht erzeugt: $AAB" + ok "AAB gebaut: $AAB" + + # Submit + if ! $SKIP_SUBMIT; then + if [[ ! -f "$PLAY_SERVICE_ACCOUNT_JSON" ]]; then + warn "Play Console Service-Account-JSON fehlt: $PLAY_SERVICE_ACCOUNT_JSON" + echo "" + echo "Setup-Schritte:" + echo "1. Google Cloud Console → Service Accounts → Create → JSON-Key" + echo "2. Play Console → Setup → API-Access → Service-Account linken" + echo "3. Permissions: 'Releases' (Edit + Read)" + echo "4. JSON-Key ablegen:" + echo " mkdir -p ~/secrets" + echo " mv ~/Downloads/rebreak-play-*.json ~/secrets/rebreak-play-service-account.json" + echo "" + echo "Oder ENV setzen:" + echo " export PLAY_SERVICE_ACCOUNT_JSON=/pfad/zu/key.json" + echo "" + echo "Skipped Submit — AAB ist gebaut und bereit für manuellen Upload" + else + log "Submitting zu Play Console Internal Track..." + local eas_bin + eas_bin="$(command -v eas || true)" + if [[ -z "$eas_bin" ]]; then + die "eas-cli nicht gefunden. Installiere mit: pnpm add -g eas-cli (oder npm i -g eas-cli)" + fi + run "$eas_bin" submit --platform android \ + --path "$AAB" \ + --profile production \ + --non-interactive + ok "Play Console Submit abgeschlossen" + fi + else + log "Submit skipped (--skip-submit)" + fi + + ok "Android-Deploy abgeschlossen" + echo "" + echo " AAB: $AAB" + if ! $SKIP_SUBMIT && [[ -f "$PLAY_SERVICE_ACCOUNT_JSON" ]]; then + echo " Status: https://play.google.com/console" + fi +} + +# ═══════════════════════════════════════════════════════════════════════════# Cleanup nach erfolgreichem Submit +# ═════════════════════════════════════════════════════════════════════════ + +human_size() { + # Cross-platform du -sh fallback for missing path + local p="$1" + [[ -e "$p" ]] || { echo "-"; return; } + du -sh "$p" 2>/dev/null | awk '{print $1}' +} + +cleanup_build_artifacts() { + if $KEEP_BUILD; then + log "Cleanup skipped (--keep-build)" + return + fi + if $DRY_RUN; then + log "Cleanup (dry-run) — würde löschen:" + else + log "Cleanup Build-Artefakte..." + fi + + local freed_paths=() + + if $DO_MDM || $DO_TF; then + for p in "$ARCHIVE_PATH" "$ADHOC_EXPORT_DIR" "$TF_EXPORT_DIR"; do + if [[ -e "$p" ]]; then + echo " $(human_size "$p")\t$p" + freed_paths+=("$p") + fi + done + fi + + if $DO_ANDROID; then + for p in "$ANDROID_DIR/app/build" "$ANDROID_DIR/build" "$ANDROID_DIR/.gradle"; do + if [[ -e "$p" ]]; then + echo " $(human_size "$p")\t$p" + freed_paths+=("$p") + fi + done + fi + + if ! $DRY_RUN; then + for p in "${freed_paths[@]}"; do + rm -rf "$p" 2>/dev/null || true + done + fi + ok "Cleanup fertig (${#freed_paths[@]} Pfade)" +} + +# ═════════════════════════════════════════════════════════════════════════# Main +# ═══════════════════════════════════════════════════════════════════════════ + +echo "" +log "ReBreak Multi-Platform Deploy" +echo "" +echo "Targets:" +if $DO_MDM; then echo " ${GREEN}✓${RESET} iOS Ad-Hoc/MDM"; fi +if $DO_TF; then echo " ${GREEN}✓${RESET} iOS TestFlight"; fi +if $DO_ANDROID; then echo " ${GREEN}✓${RESET} Android"; fi +echo "" + +# Collect Release Notes early (before bumping) +collect_release_notes + +# Version Bumping +if $BUMP_IOS && ($DO_MDM || $DO_TF); then + bump_ios_version +fi + +if $BUMP_ANDROID && $DO_ANDROID; then + bump_android_version +fi + +# Deploy +if $DO_MDM; then + deploy_mdm +fi + +if $DO_TF; then + deploy_testflight +fi + +if $DO_ANDROID; then + deploy_android +fi + +# Cleanup (default on — spart Mac-Speicher; --keep-build zum Opt-out) +cleanup_build_artifacts + +# Archive Release Notes +archive_release_notes_to_changelog + +# Summary +echo "" +section "✓ Deploy Abgeschlossen" +echo "" +echo "Logs: $LOG_DIR" +echo "" + +if [[ -n "$RELEASE_NOTES" ]]; then + echo "${BOLD}═══════════════════════════════════════════════════════════${RESET}" + echo "${BOLD}Release-Notes für v$(get_current_version) (Build $(get_current_build_number)):${RESET}" + echo "${BOLD}═══════════════════════════════════════════════════════════${RESET}" + echo "" + echo "$RELEASE_NOTES" + echo "" + echo "${BOLD}═══════════════════════════════════════════════════════════${RESET}" + echo "" + echo "${YELLOW}→ Copy-Paste in:${RESET}" + if $DO_TF; then + echo " ${BLUE}•${RESET} TestFlight: https://appstoreconnect.apple.com → TestFlight → Internal Testing → 'What to Test'" + fi + if $DO_ANDROID; then + echo " ${BLUE}•${RESET} Play Console: https://play.google.com/console → Internal Testing → Release-Notes" + fi + echo "" +fi + +if ! $DRY_RUN; then + echo "Nächste Schritte:" + echo " - Änderungen committen (Version-Bump + CHANGELOG.md)" + echo " - Git-Tag erstellen: git tag -a v$(get_current_version) -m 'Release $(get_current_version)'" + echo " - Push: git push && git push --tags" +fi diff --git a/apps/rebreak-native/hooks/usePushTokenRegistration.ts b/apps/rebreak-native/hooks/usePushTokenRegistration.ts new file mode 100644 index 0000000..3f3a4d4 --- /dev/null +++ b/apps/rebreak-native/hooks/usePushTokenRegistration.ts @@ -0,0 +1,115 @@ +/** + * Push-Token-Registration mit Expo. + * + * Flow: + * 1. Permission anfragen (falls noch nicht entschieden) + * 2. ExponentPushToken[xxx] via getExpoPushTokenAsync() holen + * 3. Token an Backend POST /api/users/me/push-token senden + * 4. Bei Logout: DELETE /api/users/me/push-token?token=… + * + * Wird einmal pro App-Start nach Login aufgerufen — idempotent durch + * upsert im Backend. + */ +import { useEffect, useRef } from 'react'; +import { Platform } from 'react-native'; +import * as Notifications from 'expo-notifications'; +import * as Device from 'expo-device'; +import Constants from 'expo-constants'; +import { apiFetch } from '../lib/api'; +import { getDeviceId } from '../lib/deviceId'; + +const lastRegisteredToken: { current: string | null } = { current: null }; + +export async function registerPushTokenWithBackend(): Promise { + // Simulator/Emulator support: Expo Push funktioniert auf physical devices only + // — Simulator gibt Permission denied. Wir loggen aber crashen nicht. + if (!Device.isDevice) { + if (__DEV__) console.log('[push] skipped (simulator)'); + return null; + } + + try { + // 1) Permission + const { status: existing } = await Notifications.getPermissionsAsync(); + let status = existing; + if (existing !== 'granted') { + const { status: requested } = await Notifications.requestPermissionsAsync(); + status = requested; + } + if (status !== 'granted') { + if (__DEV__) console.log('[push] permission denied'); + return null; + } + + // 2) Android-Channel (muss vor getExpoPushTokenAsync existieren) + if (Platform.OS === 'android') { + await Notifications.setNotificationChannelAsync('chat', { + name: 'Chat-Nachrichten', + importance: Notifications.AndroidImportance.HIGH, + vibrationPattern: [0, 250, 250, 250], + lightColor: '#007AFF', + sound: 'default', + }); + } + + // 3) Token holen + const projectId = + Constants.expoConfig?.extra?.eas?.projectId ?? + Constants.easConfig?.projectId; + if (!projectId) { + console.warn('[push] EAS projectId missing — token cannot be issued'); + return null; + } + const tokenData = await Notifications.getExpoPushTokenAsync({ projectId }); + const token = tokenData.data; + if (!token) return null; + + // 4) Idempotenz-Skip: wenn schon registriert in dieser Session, nicht nochmal + if (lastRegisteredToken.current === token) return token; + + // 5) Senden an Backend + const deviceId = await getDeviceId(); + await apiFetch('/api/users/me/push-token', { + method: 'POST', + body: { + token, + platform: Platform.OS as 'ios' | 'android', + deviceId, + }, + }); + + lastRegisteredToken.current = token; + if (__DEV__) console.log('[push] token registered:', token.slice(0, 30) + '…'); + return token; + } catch (err) { + console.warn('[push] registration failed:', err); + return null; + } +} + +export async function unregisterPushTokenFromBackend(): Promise { + const token = lastRegisteredToken.current; + if (!token) return; + try { + await apiFetch( + `/api/users/me/push-token?token=${encodeURIComponent(token)}`, + { method: 'DELETE' }, + ); + lastRegisteredToken.current = null; + } catch (err) { + console.warn('[push] unregister failed:', err); + } +} + +/** + * Hook: registriert Push-Token sobald User authenticated ist. + * Verwendet in app/_layout.tsx nach Auth-Init. + */ +export function usePushTokenRegistration(userId: string | null | undefined) { + const lastUserId = useRef(null); + useEffect(() => { + if (!userId || userId === lastUserId.current) return; + lastUserId.current = userId; + void registerPushTokenWithBackend(); + }, [userId]); +} diff --git a/backend/package.json b/backend/package.json index 17fa7c7..47b4a24 100644 --- a/backend/package.json +++ b/backend/package.json @@ -17,6 +17,7 @@ "@prisma/adapter-pg": "^7.2.0", "@prisma/client": "^7.2.0", "@supabase/supabase-js": "^2.39.7", + "expo-server-sdk": "^6.1.0", "franc": "^6.2.0", "groq-sdk": "^0.7.0", "imapflow": "^1.2.18", diff --git a/backend/prisma/migrations/20260530_add_push_tokens/migration.sql b/backend/prisma/migrations/20260530_add_push_tokens/migration.sql new file mode 100644 index 0000000..889bd03 --- /dev/null +++ b/backend/prisma/migrations/20260530_add_push_tokens/migration.sql @@ -0,0 +1,38 @@ +-- PushToken — Expo-Push-Tokens pro User-Device. +-- +-- Ein User kann mehrere Geräte (iPhone + Android-Tablet etc.) haben, jedes mit eigenem +-- ExponentPushToken[xxx]. Token ist unique (kommt von Expo, nicht von uns). +-- +-- Genutzt von: +-- - POST /api/users/me/push-token (Client registriert Token nach permission grant) +-- - DELETE /api/users/me/push-token (Client deregistriert bei Logout/permission revoke) +-- - server/services/push.ts sendChatPush() (Backend triggert Push nach Chat-Message) +-- +-- DSGVO: bei Profile-Delete (Art-17) kaskadiert via FK ON DELETE CASCADE → alle Tokens gelöscht. + +CREATE TABLE IF NOT EXISTS "rebreak"."push_tokens" ( + "id" UUID NOT NULL DEFAULT gen_random_uuid(), + "user_id" UUID NOT NULL, + "token" TEXT NOT NULL, + "platform" TEXT NOT NULL, -- 'ios' | 'android' + "device_id" TEXT, -- optional: Capacitor/Expo persistent UUID + "enabled" BOOLEAN NOT NULL DEFAULT true, + "created_at" TIMESTAMPTZ NOT NULL DEFAULT now(), + "updated_at" TIMESTAMPTZ NOT NULL DEFAULT now(), + "last_used_at" TIMESTAMPTZ, + + CONSTRAINT "push_tokens_pkey" PRIMARY KEY ("id"), + CONSTRAINT "push_tokens_token_key" UNIQUE ("token"), + CONSTRAINT "push_tokens_user_id_fkey" FOREIGN KEY ("user_id") + REFERENCES "rebreak"."profiles"("id") ON DELETE CASCADE ON UPDATE CASCADE +); + +CREATE INDEX IF NOT EXISTS "push_tokens_user_id_idx" ON "rebreak"."push_tokens"("user_id"); +CREATE INDEX IF NOT EXISTS "push_tokens_enabled_idx" ON "rebreak"."push_tokens"("enabled") WHERE "enabled" = true; + +-- ─── Profile.chat_push_enabled ───────────────────────────────────────────── +-- Per-User Opt-out für Chat-Push (Default ON). Granularer als Token-Enabled +-- weil hier User-Präferenz, nicht Device-State. Beide werden im Send-Pfad +-- berücksichtigt (UND-Verknüpfung). +ALTER TABLE "rebreak"."profiles" + ADD COLUMN IF NOT EXISTS "chat_push_enabled" BOOLEAN NOT NULL DEFAULT true; diff --git a/backend/prisma/schema.prisma b/backend/prisma/schema.prisma index d7755bd..6cb35de 100644 --- a/backend/prisma/schema.prisma +++ b/backend/prisma/schema.prisma @@ -114,6 +114,11 @@ model Profile { mdmManaged Boolean @default(false) @map("mdm_managed") mdmDetectedAt DateTime? @map("mdm_detected_at") + // ─── Push-Notifications (Migration 20260530) ────────────────────────── + // Per-User Opt-out für Chat-Push (DM + Room). Default ON. Token-spezifischer + // Disable (z.B. nach Permission-Revoke) wird in PushToken.enabled gesetzt. + chatPushEnabled Boolean @default(true) @map("chat_push_enabled") + // ─── Admin-Management (Phase E, Migration 20260509) ───────────────────── // banned: User wird auf API-Ebene blockiert (kein Login-Block — Supabase // bleibt unberührt). Soft-Delete scrubbt PII statt Hard-Delete (DSGVO). @@ -125,6 +130,7 @@ model Profile { communityPosts CommunityPost[] communityReplies CommunityReply[] domainSubmissions DomainSubmission[] + pushTokens PushToken[] @@index([deletedAt]) @@index([plan]) @@ -132,6 +138,29 @@ model Profile { @@schema("rebreak") } +// ─── Push-Tokens (Expo) ────────────────────────────────────────────────────── +// +// Ein User kann mehrere Geräte (iOS + Android etc.) haben, jedes mit eigenem +// ExponentPushToken[xxx]. Token ist von Expo serverseitig unique. +// Genutzt von server/services/push.ts sendChatPush(). +model PushToken { + id String @id @default(uuid()) @db.Uuid + userId String @map("user_id") @db.Uuid + token String @unique + platform String // "ios" | "android" + deviceId String? @map("device_id") + enabled Boolean @default(true) + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @default(now()) @updatedAt @map("updated_at") + lastUsedAt DateTime? @map("last_used_at") + + profile Profile @relation(fields: [userId], references: [id], onDelete: Cascade) + + @@index([userId]) + @@map("push_tokens") + @@schema("rebreak") +} + // ─── DiGA-Codes (Rezept-Einlösung für Krankenkassen-Pfad) ───────────────────── // // Codes werden vom Backend ausgegeben (später per Krankenkassen-API erstellt diff --git a/backend/server/api/users/me/push-token.delete.ts b/backend/server/api/users/me/push-token.delete.ts new file mode 100644 index 0000000..0b039f1 --- /dev/null +++ b/backend/server/api/users/me/push-token.delete.ts @@ -0,0 +1,29 @@ +/** + * DELETE /api/users/me/push-token?token=ExponentPushToken[xxx] + * + * Client deregistriert Token (Logout, Permission-Revoke, App-Uninstall-Cleanup). + * Wir setzen `enabled = false` statt zu löschen — Audit-Trail bleibt erhalten. + */ +import { requireUser } from "../../../utils/auth"; +import { usePrisma } from "../../../utils/prisma"; + +export default defineEventHandler(async (event) => { + const user = await requireUser(event); + const query = getQuery(event); + const token = typeof query.token === "string" ? query.token : ""; + + if (!token) { + throw createError({ + statusCode: 400, + data: { error: "MISSING_TOKEN" }, + }); + } + + const db = usePrisma(); + await db.pushToken.updateMany({ + where: { token, userId: user.id }, + data: { enabled: false }, + }); + + return { success: true, data: { ok: true } }; +}); diff --git a/backend/server/api/users/me/push-token.post.ts b/backend/server/api/users/me/push-token.post.ts new file mode 100644 index 0000000..f033031 --- /dev/null +++ b/backend/server/api/users/me/push-token.post.ts @@ -0,0 +1,54 @@ +/** + * POST /api/users/me/push-token + * + * Client (Expo) ruft das nach `getExpoPushTokenAsync()` auf, um seinen Token + * im Backend zu hinterlegen. Idempotent: bei existierendem Token wird nur + * lastUsedAt + enabled aktualisiert. + * + * Body: { token: string, platform: "ios" | "android", deviceId?: string } + */ +import { requireUser } from "../../../utils/auth"; +import { usePrisma } from "../../../utils/prisma"; +import { z } from "zod"; + +const Body = z.object({ + token: z.string().min(10).max(200), // ExponentPushToken[xxx] + platform: z.enum(["ios", "android"]), + deviceId: z.string().max(120).optional(), +}); + +export default defineEventHandler(async (event) => { + const user = await requireUser(event); + const raw = await readBody(event).catch(() => ({})); + const parsed = Body.safeParse(raw); + if (!parsed.success) { + throw createError({ + statusCode: 400, + data: { error: "INVALID_BODY", detail: parsed.error.flatten() }, + }); + } + + const { token, platform, deviceId } = parsed.data; + const db = usePrisma(); + + await db.pushToken.upsert({ + where: { token }, + create: { + userId: user.id, + token, + platform, + deviceId: deviceId ?? null, + enabled: true, + lastUsedAt: new Date(), + }, + update: { + userId: user.id, // Token könnte das Device gewechselt haben + platform, + deviceId: deviceId ?? null, + enabled: true, + lastUsedAt: new Date(), + }, + }); + + return { success: true, data: { ok: true } }; +}); diff --git a/backend/server/db/chat-rooms.ts b/backend/server/db/chat-rooms.ts index b4a4586..5dad6d3 100644 --- a/backend/server/db/chat-rooms.ts +++ b/backend/server/db/chat-rooms.ts @@ -269,6 +269,38 @@ export async function createRoomMessage(data: { where: { id: data.roomId }, data: { updatedAt: new Date() }, }); + + // Push-Notifications an alle Room-Member außer dem Sender selbst (fire-and-forget) + void (async () => { + const { sendChatPush, getDisplayName, truncatePreview } = await import( + "../services/push" + ); + const members = await db.chatRoomMember.findMany({ + where: { roomId: data.roomId, userId: { not: data.userId } }, + select: { userId: true }, + }); + if (members.length === 0) return; + const senderName = await getDisplayName(data.userId); + const room = await db.chatRoom.findUnique({ + where: { id: data.roomId }, + select: { name: true }, + }); + const title = room?.name ? `${senderName} · ${room.name}` : senderName; + const preview = truncatePreview( + data.content || (data.attachmentUrl ? "📎 Anhang" : ""), + ); + await Promise.all( + members.map((m) => + sendChatPush({ + receiverId: m.userId, + senderName: title, + preview, + data: { type: "room", targetId: data.roomId, messageId: msg.id }, + }), + ), + ); + })(); + return msg; } diff --git a/backend/server/db/chat.ts b/backend/server/db/chat.ts index eedf993..484a240 100644 --- a/backend/server/db/chat.ts +++ b/backend/server/db/chat.ts @@ -34,7 +34,7 @@ export async function sendDirectMessage( }, ) { const db = usePrisma(); - return db.directMessage.create({ + const msg = await db.directMessage.create({ data: { senderId, receiverId, @@ -58,6 +58,22 @@ export async function sendDirectMessage( }, }, }); + + // Push-Notification (fire-and-forget — blockt Response nicht) + void (async () => { + const { sendChatPush, getDisplayName, truncatePreview } = await import( + "../services/push" + ); + const senderName = await getDisplayName(senderId); + await sendChatPush({ + receiverId, + senderName, + preview: truncatePreview(content || (opts?.attachmentUrl ? "📎 Anhang" : "")), + data: { type: "dm", targetId: senderId, messageId: msg.id }, + }); + })(); + + return msg; } export async function getDmHistory( diff --git a/backend/server/services/push.ts b/backend/server/services/push.ts new file mode 100644 index 0000000..c077690 --- /dev/null +++ b/backend/server/services/push.ts @@ -0,0 +1,128 @@ +/** + * Push-Notifications via Expo Server SDK. + * + * Verwendet von: + * - backend/server/db/chat.ts sendDirectMessage() → triggert nach Insert + * - backend/server/db/chat-rooms.ts createRoomMessage() → triggert nach Insert + * + * Versand ist fire-and-forget (kein Block des HTTP-Response): Errors werden geloggt + * aber nicht propagiert, damit Chat-Send nicht failed wenn Expo-Server down ist. + * + * Token-Cleanup: Bei DeviceNotRegistered Receipts werden Tokens automatisch + * disabled (PushToken.enabled = false) — Re-Enable nur durch Re-Registrierung + * vom Client. + */ +import { Expo, type ExpoPushMessage } from "expo-server-sdk"; +import { usePrisma } from "../utils/prisma"; + +const expo = new Expo(); + +export interface ChatPushPayload { + /** Empfänger-User-ID (kann mehrere Tokens haben) */ + receiverId: string; + /** Sender-Display-Name (für Titel "Max sendete: …") */ + senderName: string; + /** Nachrichten-Vorschau (max ~100 Zeichen) */ + preview: string; + /** Deep-Link-Daten — Client navigiert beim Tap */ + data: { + type: "dm" | "room"; + /** Bei DM: senderId, bei Room: roomId */ + targetId: string; + messageId: string; + }; +} + +export async function sendChatPush(payload: ChatPushPayload): Promise { + try { + const db = usePrisma(); + + // 1) Profile-Opt-out prüfen + const profile = await db.profile.findUnique({ + where: { id: payload.receiverId }, + select: { chatPushEnabled: true, deletedAt: true }, + }); + if (!profile || profile.deletedAt || !profile.chatPushEnabled) { + return; + } + + // 2) Alle aktiven Tokens des Receivers + const tokens = await db.pushToken.findMany({ + where: { userId: payload.receiverId, enabled: true }, + select: { id: true, token: true }, + }); + if (tokens.length === 0) return; + + // 3) Messages bauen (nur valide Expo-Tokens) + const messages: ExpoPushMessage[] = []; + const validTokenIds: string[] = []; + + for (const t of tokens) { + if (!Expo.isExpoPushToken(t.token)) { + // Ungültiger Token-Format → disablen + await db.pushToken + .update({ where: { id: t.id }, data: { enabled: false } }) + .catch(() => {}); + continue; + } + messages.push({ + to: t.token, + sound: "default", + title: payload.senderName, + body: payload.preview, + data: payload.data, + // Channel-ID für Android — wird in app.config.ts/native registriert + channelId: "chat", + }); + validTokenIds.push(t.id); + } + + if (messages.length === 0) return; + + // 4) Senden in Chunks (Expo akzeptiert max 100 pro Request) + const chunks = expo.chunkPushNotifications(messages); + for (const chunk of chunks) { + try { + await expo.sendPushNotificationsAsync(chunk); + } catch (err) { + console.error("[push] chunk send failed:", err); + } + } + + // 5) lastUsedAt bumpen (best-effort) + await db.pushToken + .updateMany({ + where: { id: { in: validTokenIds } }, + data: { lastUsedAt: new Date() }, + }) + .catch(() => {}); + + // Hinweis: Receipt-Polling (DeviceNotRegistered → token disablen) wird in + // einem separaten Cron-Job gemacht (TODO: scripts/push-receipts-cleanup.ts). + // Für MVP: Tokens bleiben aktiv bis sie explizit vom Client deregistriert + // werden oder Expo dauerhaft DeviceNotRegistered meldet. + } catch (err) { + console.error("[push] sendChatPush failed:", err); + } +} + +/** + * Helper für Username-Lookup (für Push-Titel). + * Fällt auf "Jemand" zurück wenn kein nickname/username gesetzt. + */ +export async function getDisplayName(userId: string): Promise { + const db = usePrisma(); + const p = await db.profile.findUnique({ + where: { id: userId }, + select: { nickname: true, username: true }, + }); + return p?.nickname || p?.username || "Jemand"; +} + +/** + * Truncate für Push-Body (Expo hat 4kb hard limit, aber UI zeigt eh nur ~2 Zeilen). + */ +export function truncatePreview(text: string, max = 100): string { + if (text.length <= max) return text; + return text.slice(0, max - 1) + "…"; +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6d38559..52dc8b1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -30,10 +30,10 @@ importers: dependencies: '@nuxt/icon': specifier: ^1.10.0 - version: 1.15.0(magicast@0.5.2)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4))(vue@3.5.34(typescript@5.9.3)) + version: 1.15.0(magicast@0.5.3)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4))(vue@3.5.34(typescript@5.9.3)) '@nuxt/ui': specifier: ^4.5.1 - version: 4.7.1(@internationalized/date@3.12.1)(@internationalized/number@3.6.6)(@tiptap/extensions@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1))(@tiptap/y-tiptap@3.0.3(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.8)(y-protocols@1.0.7(yjs@13.6.30))(yjs@13.6.30))(db0@0.3.4(@electric-sql/pglite@0.4.1)(mysql2@3.15.3))(embla-carousel@8.6.0)(ioredis@5.10.1)(magicast@0.5.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(tailwindcss@4.2.4)(typescript@5.9.3)(valibot@1.4.0(typescript@5.9.3))(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4))(vue-router@4.6.4(vue@3.5.34(typescript@5.9.3)))(vue@3.5.34(typescript@5.9.3))(yjs@13.6.30)(zod@3.25.76) + version: 4.7.1(@internationalized/date@3.12.1)(@internationalized/number@3.6.6)(@tiptap/extensions@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1))(@tiptap/y-tiptap@3.0.3(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.8)(y-protocols@1.0.7(yjs@13.6.30))(yjs@13.6.30))(db0@0.3.4(@electric-sql/pglite@0.4.1)(mysql2@3.15.3))(embla-carousel@8.6.0)(ioredis@5.10.1)(magicast@0.5.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(tailwindcss@4.2.4)(typescript@5.9.3)(valibot@1.4.1(typescript@5.9.3))(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4))(vue-router@4.6.4(vue@3.5.34(typescript@5.9.3)))(vue@3.5.34(typescript@5.9.3))(yjs@13.6.30)(zod@3.25.76) '@nuxtjs/supabase': specifier: ^2.0.4 version: 2.0.6 @@ -42,10 +42,10 @@ importers: version: 14.3.0(vue@3.5.34(typescript@5.9.3)) '@vueuse/nuxt': specifier: ^14.2.1 - version: 14.3.0(magicast@0.5.2)(nuxt@4.1.3(@electric-sql/pglite@0.4.1)(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@parcel/watcher@2.5.6)(@types/node@22.19.17)(@vue/compiler-sfc@3.5.34)(cac@6.7.14)(db0@0.3.4(@electric-sql/pglite@0.4.1)(mysql2@3.15.3))(eslint@10.3.0(jiti@2.7.0))(ioredis@5.10.1)(lightningcss@1.32.0)(magicast@0.5.2)(mysql2@3.15.3)(optionator@0.9.4)(rollup@4.60.3)(terser@5.46.2)(typescript@5.9.3)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4))(yaml@2.8.4))(vue@3.5.34(typescript@5.9.3)) + version: 14.3.0(magicast@0.5.3)(nuxt@4.1.3(@electric-sql/pglite@0.4.1)(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@parcel/watcher@2.5.6)(@types/node@22.19.17)(@vue/compiler-sfc@3.5.35)(cac@6.7.14)(db0@0.3.4(@electric-sql/pglite@0.4.1)(mysql2@3.15.3))(eslint@10.3.0(jiti@2.7.0))(ioredis@5.10.1)(lightningcss@1.32.0)(magicast@0.5.3)(mysql2@3.15.3)(optionator@0.9.4)(rollup@4.60.3)(terser@5.46.2)(typescript@5.9.3)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4))(yaml@2.8.4))(vue@3.5.34(typescript@5.9.3)) nuxt: specifier: 4.1.3 - version: 4.1.3(@electric-sql/pglite@0.4.1)(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@parcel/watcher@2.5.6)(@types/node@22.19.17)(@vue/compiler-sfc@3.5.34)(cac@6.7.14)(db0@0.3.4(@electric-sql/pglite@0.4.1)(mysql2@3.15.3))(eslint@10.3.0(jiti@2.7.0))(ioredis@5.10.1)(lightningcss@1.32.0)(magicast@0.5.2)(mysql2@3.15.3)(optionator@0.9.4)(rollup@4.60.3)(terser@5.46.2)(typescript@5.9.3)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4))(yaml@2.8.4) + version: 4.1.3(@electric-sql/pglite@0.4.1)(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@parcel/watcher@2.5.6)(@types/node@22.19.17)(@vue/compiler-sfc@3.5.35)(cac@6.7.14)(db0@0.3.4(@electric-sql/pglite@0.4.1)(mysql2@3.15.3))(eslint@10.3.0(jiti@2.7.0))(ioredis@5.10.1)(lightningcss@1.32.0)(magicast@0.5.3)(mysql2@3.15.3)(optionator@0.9.4)(rollup@4.60.3)(terser@5.46.2)(typescript@5.9.3)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4))(yaml@2.8.4) tailwindcss: specifier: ^4.1.18 version: 4.2.4 @@ -61,7 +61,7 @@ importers: version: 1.2.3 '@nuxt/devtools': specifier: latest - version: 4.0.0-alpha.4(@pnpm/logger@1001.0.1)(db0@0.3.4(@electric-sql/pglite@0.4.1)(mysql2@3.15.3))(ioredis@5.10.1)(typescript@5.9.3)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4))(vue@3.5.34(typescript@5.9.3)) + version: 4.0.0-alpha.6(db0@0.3.4(@electric-sql/pglite@0.4.1)(mysql2@3.15.3))(ioredis@5.10.1)(typescript@5.9.3)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4))(vue@3.5.34(typescript@5.9.3)) typescript: specifier: ^5.9.3 version: 5.9.3 @@ -73,31 +73,31 @@ importers: version: 1.2.3 '@nuxt/fonts': specifier: ^0.11.4 - version: 0.11.4(db0@0.3.4(@electric-sql/pglite@0.4.1)(mysql2@3.15.3))(ioredis@5.10.1)(magicast@0.5.2)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4)) + version: 0.11.4(db0@0.3.4(@electric-sql/pglite@0.4.1)(mysql2@3.15.3))(ioredis@5.10.1)(magicast@0.5.3)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4)) '@nuxt/icon': specifier: ^1.10.0 - version: 1.15.0(magicast@0.5.2)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4))(vue@3.5.34(typescript@5.9.3)) + version: 1.15.0(magicast@0.5.3)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4))(vue@3.5.34(typescript@5.9.3)) '@nuxt/image': specifier: ^1.11.0 - version: 1.11.0(db0@0.3.4(@electric-sql/pglite@0.4.1)(mysql2@3.15.3))(ioredis@5.10.1)(magicast@0.5.2) + version: 1.11.0(db0@0.3.4(@electric-sql/pglite@0.4.1)(mysql2@3.15.3))(ioredis@5.10.1)(magicast@0.5.3) '@nuxt/ui': specifier: ^4.5.1 - version: 4.7.1(@internationalized/date@3.12.1)(@internationalized/number@3.6.6)(@tiptap/extensions@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1))(@tiptap/y-tiptap@3.0.3(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.8)(y-protocols@1.0.7(yjs@13.6.30))(yjs@13.6.30))(db0@0.3.4(@electric-sql/pglite@0.4.1)(mysql2@3.15.3))(embla-carousel@8.6.0)(ioredis@5.10.1)(magicast@0.5.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(tailwindcss@4.2.4)(typescript@5.9.3)(valibot@1.4.0(typescript@5.9.3))(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4))(vue-router@4.6.4(vue@3.5.34(typescript@5.9.3)))(vue@3.5.34(typescript@5.9.3))(yjs@13.6.30)(zod@3.25.76) + version: 4.7.1(@internationalized/date@3.12.1)(@internationalized/number@3.6.6)(@tiptap/extensions@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1))(@tiptap/y-tiptap@3.0.3(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.8)(y-protocols@1.0.7(yjs@13.6.30))(yjs@13.6.30))(db0@0.3.4(@electric-sql/pglite@0.4.1)(mysql2@3.15.3))(embla-carousel@8.6.0)(ioredis@5.10.1)(magicast@0.5.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(tailwindcss@4.2.4)(typescript@5.9.3)(valibot@1.4.1(typescript@5.9.3))(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4))(vue-router@4.6.4(vue@3.5.34(typescript@5.9.3)))(vue@3.5.34(typescript@5.9.3))(yjs@13.6.30)(zod@3.25.76) '@nuxtjs/i18n': specifier: ^9.5.6 - version: 9.5.6(@vue/compiler-dom@3.5.34)(eslint@10.3.0(jiti@2.7.0))(magicast@0.5.2)(rollup@4.60.3)(vue@3.5.34(typescript@5.9.3)) + version: 9.5.6(@vue/compiler-dom@3.5.35)(eslint@10.3.0(jiti@2.7.0))(magicast@0.5.3)(rollup@4.60.3)(vue@3.5.34(typescript@5.9.3)) '@vueuse/motion': specifier: ^3.0.3 - version: 3.0.3(magicast@0.5.2)(vue@3.5.34(typescript@5.9.3)) + version: 3.0.3(magicast@0.5.3)(vue@3.5.34(typescript@5.9.3)) '@vueuse/nuxt': specifier: ^14.2.1 - version: 14.3.0(magicast@0.5.2)(nuxt@4.1.3(@electric-sql/pglite@0.4.1)(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@parcel/watcher@2.5.6)(@types/node@22.19.17)(@vue/compiler-sfc@3.5.34)(cac@6.7.14)(db0@0.3.4(@electric-sql/pglite@0.4.1)(mysql2@3.15.3))(eslint@10.3.0(jiti@2.7.0))(ioredis@5.10.1)(lightningcss@1.32.0)(magicast@0.5.2)(mysql2@3.15.3)(optionator@0.9.4)(rollup@4.60.3)(terser@5.46.2)(typescript@5.9.3)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4))(yaml@2.8.4))(vue@3.5.34(typescript@5.9.3)) + version: 14.3.0(magicast@0.5.3)(nuxt@4.1.3(@electric-sql/pglite@0.4.1)(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@parcel/watcher@2.5.6)(@types/node@22.19.17)(@vue/compiler-sfc@3.5.35)(cac@6.7.14)(db0@0.3.4(@electric-sql/pglite@0.4.1)(mysql2@3.15.3))(eslint@10.3.0(jiti@2.7.0))(ioredis@5.10.1)(lightningcss@1.32.0)(magicast@0.5.3)(mysql2@3.15.3)(optionator@0.9.4)(rollup@4.60.3)(terser@5.46.2)(typescript@5.9.3)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4))(yaml@2.8.4))(vue@3.5.34(typescript@5.9.3)) chart.js: specifier: ^4.5.1 version: 4.5.1 nuxt: specifier: 4.1.3 - version: 4.1.3(@electric-sql/pglite@0.4.1)(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@parcel/watcher@2.5.6)(@types/node@22.19.17)(@vue/compiler-sfc@3.5.34)(cac@6.7.14)(db0@0.3.4(@electric-sql/pglite@0.4.1)(mysql2@3.15.3))(eslint@10.3.0(jiti@2.7.0))(ioredis@5.10.1)(lightningcss@1.32.0)(magicast@0.5.2)(mysql2@3.15.3)(optionator@0.9.4)(rollup@4.60.3)(terser@5.46.2)(typescript@5.9.3)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4))(yaml@2.8.4) + version: 4.1.3(@electric-sql/pglite@0.4.1)(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@parcel/watcher@2.5.6)(@types/node@22.19.17)(@vue/compiler-sfc@3.5.35)(cac@6.7.14)(db0@0.3.4(@electric-sql/pglite@0.4.1)(mysql2@3.15.3))(eslint@10.3.0(jiti@2.7.0))(ioredis@5.10.1)(lightningcss@1.32.0)(magicast@0.5.3)(mysql2@3.15.3)(optionator@0.9.4)(rollup@4.60.3)(terser@5.46.2)(typescript@5.9.3)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4))(yaml@2.8.4) tailwindcss: specifier: ^4.1.18 version: 4.2.4 @@ -113,7 +113,7 @@ importers: devDependencies: '@nuxt/devtools': specifier: latest - version: 4.0.0-alpha.4(@pnpm/logger@1001.0.1)(db0@0.3.4(@electric-sql/pglite@0.4.1)(mysql2@3.15.3))(ioredis@5.10.1)(typescript@5.9.3)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4))(vue@3.5.34(typescript@5.9.3)) + version: 4.0.0-alpha.6(db0@0.3.4(@electric-sql/pglite@0.4.1)(mysql2@3.15.3))(ioredis@5.10.1)(typescript@5.9.3)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4))(vue@3.5.34(typescript@5.9.3)) typescript: specifier: ^5.9.3 version: 5.9.3 @@ -325,6 +325,9 @@ importers: '@supabase/supabase-js': specifier: ^2.39.7 version: 2.105.3 + expo-server-sdk: + specifier: ^6.1.0 + version: 6.1.0 franc: specifier: ^6.2.0 version: 6.2.0 @@ -339,7 +342,7 @@ importers: version: 6.2.3 openai: specifier: ^4.65.0 - version: 4.104.0(ws@8.20.0)(zod@3.25.76) + version: 4.104.0(ws@8.21.0)(zod@3.25.76) pg: specifier: ^8.16.3 version: 8.20.0 @@ -367,7 +370,7 @@ importers: version: 1.15.11 nitropack: specifier: ^2.12.4 - version: 2.13.4(@electric-sql/pglite@0.4.1)(mysql2@3.15.3)(oxc-parser@0.126.0) + version: 2.13.4(@electric-sql/pglite@0.4.1)(mysql2@3.15.3)(oxc-parser@0.132.0) prisma: specifier: ^7.2.0 version: 7.8.0(@types/react@19.2.14)(magicast@0.5.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.9.3) @@ -948,6 +951,11 @@ packages: '@colordx/core@5.4.3': resolution: {integrity: sha512-kIxYSfA5T8HXjav55UaaH/o/cKivF6jCCGIb8eqtcsfI46wsvlSiT8jMDyrl779qLec3c2c2oHBZo4oAhvbjrQ==} + '@devframes/hub@0.5.2': + resolution: {integrity: sha512-qMkBFw1OqhPuNs1tQWkRq0z0Tg49kXNu53bs59tdF4lytKupatWVnL3cpsVPqn+Q5P7A70r99BKTcm+prMtHqw==} + peerDependencies: + devframe: 0.5.2 + '@egjs/hammerjs@2.0.17': resolution: {integrity: sha512-XQsZgjm2EcVUiZQf11UBJQfmZeEmOW8DpI1gsFeln6w0ae0ii4dMQEQ0kjl6DspdWX1aGY1/loyXnP0JS06e/A==} engines: {node: '>=0.8.0'} @@ -966,9 +974,15 @@ packages: '@electric-sql/pglite@0.4.1': resolution: {integrity: sha512-mZ9NzzUSYPOCnxHH1oAHPRzoMFJHY472raDKwXl/+6oPbpdJ7g8LsCN4FSaIIfkiCKHhb3iF/Zqo3NYxaIhU7Q==} + '@emnapi/core@1.10.0': + resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} + '@emnapi/core@1.9.2': resolution: {integrity: sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==} + '@emnapi/runtime@1.10.0': + resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} + '@emnapi/runtime@1.9.2': resolution: {integrity: sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==} @@ -1759,10 +1773,6 @@ packages: '@floating-ui/vue@1.1.11': resolution: {integrity: sha512-HzHKCNVxnGS35r9fCHBc3+uCnjw9IWIlCPL683cGgM9Kgj2BiAl8x1mS7vtvP6F9S/e/q4O6MApwSHj8hNLGfw==} - '@gwhitney/detect-indent@7.0.1': - resolution: {integrity: sha512-7bQW+gkKa2kKZPeJf6+c6gFK9ARxQfn+FKy9ScTBppyKRWH2KzsmweXUoklqeEiHiNVWaeP5csIdsNq6w7QhzA==} - engines: {node: '>=12.20'} - '@hono/node-server@1.19.11': resolution: {integrity: sha512-dr8/3zEaB+p0D2n/IUrlPF1HZm586qgJNXK1a9fhg/PzdtkK7Ksd5l312tJX2yBuALqDYBlG20QEbayqPyxn+g==} engines: {node: '>=18.14.1'} @@ -2041,8 +2051,8 @@ packages: peerDependencies: vite: '>=6.0' - '@nuxt/devtools-kit@4.0.0-alpha.4': - resolution: {integrity: sha512-y8IJJZMFf9igUUSVUt7zQTQHhc1rVKGRQUN9VfVHPWpYGOB+w2Owgy6mU6tv63zbz6RxyEJ1ZMKhQQaqFOzAWQ==} + '@nuxt/devtools-kit@4.0.0-alpha.6': + resolution: {integrity: sha512-bmsjBu6SymaHeD6Bt5DBvUBuZ9MtYRflGL0RHEdbTt7cILVK4te1i/kwCshXAeckxla6tBsadl6rqyjmRFc69Q==} peerDependencies: vite: '>=6.0' @@ -2056,8 +2066,8 @@ packages: peerDependencies: vite: '>=6.0' - '@nuxt/devtools@4.0.0-alpha.4': - resolution: {integrity: sha512-RHxJ7hk4RZazvwvgnT88QmZd2Li8NNWRi68p3Ocj9nCoYEkHZrbgWTfyEvilBW0PpPzvneDfKzOAZBx5wEuAyw==} + '@nuxt/devtools@4.0.0-alpha.6': + resolution: {integrity: sha512-5u6oB0UeBwCG6lIxLGcxqVwqTcmXiN4FiLCDJAQqi7rwJRkwTB7kdml9Nd6sraX2z5vuS3bsRyAav+8t6S3ryw==} peerDependencies: vite: '>=6.0' @@ -2089,6 +2099,10 @@ packages: resolution: {integrity: sha512-oy4fAeMkyz7gelnalDQLPm8QZRN+c5c/Eh/M6oFgPx86jnA8m6xeOlONpJN2dk0GhcJwJYuN/kmzBffZ93WXPQ==} engines: {node: '>=18.12.0'} + '@nuxt/kit@4.4.6': + resolution: {integrity: sha512-AzsqBJeG7b3whIciyzkz4nBossEotM314KzKAptc8kH07ORBIR8Qh3QYKepo2YZwtxiDP2Y9aqzAztwpSEDHtw==} + engines: {node: '>=18.12.0'} + '@nuxt/schema@4.1.3': resolution: {integrity: sha512-ZLkIfleKHQF0PqTDEwuVVnnE/hyMdfY4m2zX8vRC0XMSbFS1I0MFcKkzWnJaMC13NYmGPnT3sX0o3lznweKHJQ==} engines: {node: ^14.18.0 || >=16.10.0} @@ -2252,14 +2266,14 @@ packages: cpu: [x64] os: [win32] - '@oxc-parser/binding-android-arm-eabi@0.126.0': - resolution: {integrity: sha512-svyoHt25J4741QJ5aa4R+h0iiBeSRt63Lr3aAZcxy2c/NeSE1IfDeMnSij6rIg7EjxkdlXzz613wUjeCeilBNA==} + '@oxc-parser/binding-android-arm-eabi@0.132.0': + resolution: {integrity: sha512-KrLaPWa5c9Y7LkW+rKkaUE3y7DBDrQtaf7rlsSDfv6KAHUjgzAIRA761Lrrp6//Yd/Rlie/yEOt9YENCoJnOcw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@oxc-parser/binding-android-arm64@0.126.0': - resolution: {integrity: sha512-hPEBRKgplp1mG9GkINFsr4JVMDNrGJLOqfDaadTWpAoTnzYR5Rmv8RMvB3hJZpiNvbk1aacopdHUP1pggMQ/cw==} + '@oxc-parser/binding-android-arm64@0.132.0': + resolution: {integrity: sha512-SThDrSeamB/kG2+NxcJ5/wSLcV6dUqDknrPLqFYQ0ST/55mtBP4M7Q/f3QbubH6aAd11wpzZn/nwbVRSdobOpg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] @@ -2270,8 +2284,8 @@ packages: cpu: [arm64] os: [android] - '@oxc-parser/binding-darwin-arm64@0.126.0': - resolution: {integrity: sha512-ccRpu9sdYmznePJQG5halhs0FW5tw5a8zRSoZXOzM1OjoeZ4jiRRruFiPclsD59edoVAK1l83dvfjWz1nQi6lg==} + '@oxc-parser/binding-darwin-arm64@0.132.0': + resolution: {integrity: sha512-Lc0f/TYoKBghE5/2Gsv7bLXk+TJZunx2Tf61X8hG4ARXdc8UYI26dCGccFSd1AyFbK3jfaNXtMnupggDbjPXdQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] @@ -2288,8 +2302,8 @@ packages: cpu: [arm64] os: [darwin] - '@oxc-parser/binding-darwin-x64@0.126.0': - resolution: {integrity: sha512-CHB4zVjNSKqx8Fw9pHowzQQnjjuq04i4Ng0Avj+DixlwhwAoMYqlFbocYIlbg+q3zOLGlm7vEHm83jqEMitnyg==} + '@oxc-parser/binding-darwin-x64@0.132.0': + resolution: {integrity: sha512-RG2eJIpf7C21z9HSSXFw1bTArdpKe7Y4fwcJTwRq1yCSe1vSavaN9GA1sm9KqzemTLAGVktQ+7qBTGp0vQeUZg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] @@ -2306,8 +2320,8 @@ packages: cpu: [x64] os: [darwin] - '@oxc-parser/binding-freebsd-x64@0.126.0': - resolution: {integrity: sha512-RQ3nEJdcDKBfBjmLJ3Vl1d0KQERPV1P8eUrnBm7+VTYyoaJSPLVFuPg1mlD1hk3n0/879VLFMfusFkBal4ssWQ==} + '@oxc-parser/binding-freebsd-x64@0.132.0': + resolution: {integrity: sha512-wQIPntPLtJ8NcBpvKPbEv3NqzV6k8eP8tP/jE9Rg8HTg/j7urZGFSsTCPCW5k77Qfw2DM4vRvc9p3I4yq/Shvw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] @@ -2324,8 +2338,8 @@ packages: cpu: [x64] os: [freebsd] - '@oxc-parser/binding-linux-arm-gnueabihf@0.126.0': - resolution: {integrity: sha512-onipc2wCDA7Bauzb4KK1mab0GsEDf4ujiIfWECdnmY/2LlzAoX3xdQRLAUyEDB1kn3yilHBrkmXDdHluyHXxiw==} + '@oxc-parser/binding-linux-arm-gnueabihf@0.132.0': + resolution: {integrity: sha512-PixKEpeSe3yxQWqNyOCBALRYc72+Tj7ILDofUl3iXo25cVOzLA6jHUhmOINRtWIPh7dbUie3QNeabwaQpZTw6w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] @@ -2342,8 +2356,8 @@ packages: cpu: [arm] os: [linux] - '@oxc-parser/binding-linux-arm-musleabihf@0.126.0': - resolution: {integrity: sha512-5BuJJPohrV5NJ8lmcYOMbfRCUGoYH5J9HZHeuqOLwkHXWAuPMN3X1h8bC/2mWjmosdbfTtmyIdX3spS/TkqKNg==} + '@oxc-parser/binding-linux-arm-musleabihf@0.132.0': + resolution: {integrity: sha512-sCR+DzGHlyHKnbA2z9zWjTUhIo8Sy0enJl4RDsBwPmkxYynPatpwOAWe8W5127SlW0boqUWHGtr1NWn5UwIhXQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] @@ -2360,8 +2374,8 @@ packages: cpu: [arm] os: [linux] - '@oxc-parser/binding-linux-arm64-gnu@0.126.0': - resolution: {integrity: sha512-r2KApRgm2pOJaduRm6GOT8x0whcr67AyejNkSdzPt34GJ+Y3axcXN2mwlTs+8lfO/SSmpO5ZJGYiHYnxEE0jkw==} + '@oxc-parser/binding-linux-arm64-gnu@0.132.0': + resolution: {integrity: sha512-sQBix5P2cW+IpzTcCwYxnh9yALrKSIkKJThspBvMGcygSMnbzkSvhN7SfuX1hvBk8y1XEChsdkU3ET0V5DmzUw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] @@ -2378,8 +2392,8 @@ packages: cpu: [arm64] os: [linux] - '@oxc-parser/binding-linux-arm64-musl@0.126.0': - resolution: {integrity: sha512-FQ+MMh7MT0Dr/u8+RWmWKlfoeWPQyHDbhhxJShJlYtROXXPHsRs9EvmQOZZ3sx4Nn7JU8NX+oyw2YzQ7anBJcA==} + '@oxc-parser/binding-linux-arm64-musl@0.132.0': + resolution: {integrity: sha512-WozHg3Kc//8Sk756HXXgMbEAvqtG+Lzb9JOojwQzIGDtN78Az2dLttkb71akWYUF/8IgYfDSlfKh4Uot8is5Vw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] @@ -2396,14 +2410,14 @@ packages: cpu: [arm64] os: [linux] - '@oxc-parser/binding-linux-ppc64-gnu@0.126.0': - resolution: {integrity: sha512-Wv/T8C98hRQhGTlx2XFyLn5raRMp9U1lOQD+YnXNgAr7wHbJJpZ8mDBU7Rw+M3WytGcGTFcr6kqgfyQeHVtLbQ==} + '@oxc-parser/binding-linux-ppc64-gnu@0.132.0': + resolution: {integrity: sha512-CmX/ulNBOEwWTyVRmcpYKAcAizW6+OjtLJgo7fXoL9OqQvjF4VER8tPomv44vwzfSCy1BHbsB0ZlZYzYJNj4cA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] - '@oxc-parser/binding-linux-riscv64-gnu@0.126.0': - resolution: {integrity: sha512-DHx1rT1zauW0ZbLHOiQh5AC9Xs3UkWx2XmfZHs+7nnWYr3sagrufoUQC+/XPwwjMIlCFXiFGM0sFh3TyOCZwqA==} + '@oxc-parser/binding-linux-riscv64-gnu@0.132.0': + resolution: {integrity: sha512-j9oQS+hM90SdhviNGWbPgT4+Rlq+ac++q/zjgwPD1mVHgxHzATvoRGtDx0sXGmFOQ9J9YkwAhYGb5MAHL6TAsA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] @@ -2420,14 +2434,14 @@ packages: cpu: [riscv64] os: [linux] - '@oxc-parser/binding-linux-riscv64-musl@0.126.0': - resolution: {integrity: sha512-umDc2mTShH0U2zcEYf8mIJ163seLJNn54ZUZYeI5jD4qlg9izPwoLrC2aNPKlMJTu6u/ysmQWiEvIiaAG+INkw==} + '@oxc-parser/binding-linux-riscv64-musl@0.132.0': + resolution: {integrity: sha512-bLz+Xi+Agnfmd7kWPEsSVwCn2k4EyIalZkNBcQ0OGIv9rqn8VgCPLNd03tM9mKX/5TdlvDXalz0q71BIrOPNqg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] - '@oxc-parser/binding-linux-s390x-gnu@0.126.0': - resolution: {integrity: sha512-PXXeWayclRtO1pxQEeCpiqIglQdhK2mAI2VX5xnsWdImzSB5GpoQ8TNw7vTCKk2k+GZuxl+q1knncidjCyUP9w==} + '@oxc-parser/binding-linux-s390x-gnu@0.132.0': + resolution: {integrity: sha512-U6t2qbJU0ypTfyj9QV3W1Y6mITDTL8ai/OR6NUn85vyHthOvobKWgXzU4tu0EskSzlpuVFz1g0jFGulDIUKHxQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] @@ -2444,8 +2458,8 @@ packages: cpu: [s390x] os: [linux] - '@oxc-parser/binding-linux-x64-gnu@0.126.0': - resolution: {integrity: sha512-wzocjxm34TbB3bFlqG65JiLtvf6ZDg2ZxRkLLbgXwDQUNU+0MPjQN8zy/0jBKNA5fnPLk3XeVdZ7Uin+7+CVkg==} + '@oxc-parser/binding-linux-x64-gnu@0.132.0': + resolution: {integrity: sha512-WcEaSNHFk8yz5YFlQQAlhq6jOFmZBB/RKE7uzhyCIf+pF1Lmv9gUH4221mle2Gd9iHyWT3ySNph8yZgb1xYdWg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] @@ -2462,8 +2476,8 @@ packages: cpu: [x64] os: [linux] - '@oxc-parser/binding-linux-x64-musl@0.126.0': - resolution: {integrity: sha512-e83uftP60jmkPs2+CW6T6A1GYzN2H6IumDAiTntv9WyHR73PI3ImHNBkYqnA3ukeKI3xjcCbhSh9QeJWmufxGQ==} + '@oxc-parser/binding-linux-x64-musl@0.132.0': + resolution: {integrity: sha512-iQrV4iJzQgRwK3BWRmQl1C3C6g3wYpXN2WLdQdyR+efoUnncdShZAVp9OgcojtlD3MDRbuOMGG3SjxF4fL4nlQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] @@ -2480,15 +2494,15 @@ packages: cpu: [x64] os: [linux] - '@oxc-parser/binding-openharmony-arm64@0.126.0': - resolution: {integrity: sha512-4WiOILHnPrTDY2/L4mE6PZCYwLN1d3ghma6BuTJ452CCgzRMt3uFplCtR+o3r9zdUWJYb370UizpI9CUcWXr1A==} + '@oxc-parser/binding-openharmony-arm64@0.132.0': + resolution: {integrity: sha512-FWzmUGrZ6GUby4U7WIwcCtab6tdmlTO3xTRRKyb5kjIJVEiaUAT8animUG/nK8ZCA8gkRkPOTId4rl6uTqUmJQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@oxc-parser/binding-wasm32-wasi@0.126.0': - resolution: {integrity: sha512-Y17hhnrQTrxgAxAyAq401vnN9URsAL4s5AjqpG1NDsXSlhe1yBNnns+rC2P6xcMoitgX5nKH2ryYt9oiFRlzLw==} - engines: {node: '>=14.0.0'} + '@oxc-parser/binding-wasm32-wasi@0.132.0': + resolution: {integrity: sha512-TlbMppxJI5CjWDes0QaP6G3aneVg1yikBu5QYI+DUShF9WDL66ccgKFNNGmi/Wybtszw6hxwAvv76T4DaPKnHw==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [wasm32] '@oxc-parser/binding-wasm32-wasi@0.70.0': @@ -2501,8 +2515,8 @@ packages: engines: {node: '>=14.0.0'} cpu: [wasm32] - '@oxc-parser/binding-win32-arm64-msvc@0.126.0': - resolution: {integrity: sha512-Znug1u1iRvT4VC3jANz6nhGBHsFwEFMxuimYpJFwMtsB6H5FcEoZRMmH26tHkSTD03JvDmG+gB65W3ajLjPcSw==} + '@oxc-parser/binding-win32-arm64-msvc@0.132.0': + resolution: {integrity: sha512-RH/NbFjGKqdUAUi7Oh3LQPxUk2hsWFEEQ38HSnbRQT8QjBZFKqL1fMbmsB3N4jy/KPh9iX94+9dmkEMBBbambw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] @@ -2519,14 +2533,14 @@ packages: cpu: [arm64] os: [win32] - '@oxc-parser/binding-win32-ia32-msvc@0.126.0': - resolution: {integrity: sha512-qrw7mx5hFFTxVSXToOA40hpnjgNB/DJprZchtB4rDKNLKqkD3F26HbzaQeH1nxAKej0efSZfJd5Sw3qdtOLGhw==} + '@oxc-parser/binding-win32-ia32-msvc@0.132.0': + resolution: {integrity: sha512-JUr4jQY9jxoIB/YTLXr6XofSi5xikj6p5/Ns1h0VOBDT0j1jKU+kMsv2xxv51RwnETcXpA1Yw/9oUAfcqfaqEA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@oxc-parser/binding-win32-x64-msvc@0.126.0': - resolution: {integrity: sha512-ibB1s+mPUFXvS7MFJO2jpw/aCNs/P6ifnWlRyTYB+WYBpniOiCcHQQskZneJtwcjQMDRol3RGG3ihoYnzXSY4w==} + '@oxc-parser/binding-win32-x64-msvc@0.132.0': + resolution: {integrity: sha512-2dapgHpA5X8DSXF4AU36hJWYf6zP0tKjMXFRAZFBD62pkevW/uhFDXoFH9Y/3Fd2EtDrw5ByNnR1wVE9X9y0SQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -2547,8 +2561,8 @@ packages: resolution: {integrity: sha512-Dkf9/D87WGBCW3L0+1DtpAfL4SrNsgeRvxwjpKCtbH7Kf6K+pxrT0IridaJfmWKu1Ml+fDvj+7HEyBcfUC/TXQ==} deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - '@oxc-project/types@0.126.0': - resolution: {integrity: sha512-oGfVtjAgwQVVpfBrbtk4e1XDyWHRFta6BS3GWVzrF8xYBT2VGQAk39yJS/wFSMrZqoiCU4oghT3Ch0HaHGIHcQ==} + '@oxc-project/types@0.132.0': + resolution: {integrity: sha512-FESMOxil5Se014ui/Eq8fT5uHJo6nIRwH0PfJrZJXs6Gek3ZVFOrpUv3YIZT20m+extU98Hg1Ym72U58rlsxUQ==} '@oxc-project/types@0.60.0': resolution: {integrity: sha512-prhfNnb3ATFHOCv7mzKFfwLij5RzoUz6Y1n525ZhCEqfq5wreCXL+DyVoq3ShukPo7q45ZjYIdjFUgjj+WKzng==} @@ -2743,56 +2757,6 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@pnpm/constants@1001.3.1': - resolution: {integrity: sha512-2hf0s4pVrVEH8RvdJJ7YRKjQdiG8m0iAT26TTqXnCbK30kKwJW69VLmP5tED5zstmDRXcOeH5eRcrpkdwczQ9g==} - engines: {node: '>=18.12'} - - '@pnpm/core-loggers@1001.0.9': - resolution: {integrity: sha512-pW58m3ssrwVjwhlmTXDW1dh1sv2y6R2Gl5YvQInjM2d01/5mre/sYAY4MK3XfgEShZJQxv6wVXDUvyHHJ0oizg==} - engines: {node: '>=18.12'} - peerDependencies: - '@pnpm/logger': '>=1001.0.0 <1002.0.0' - - '@pnpm/error@1000.1.0': - resolution: {integrity: sha512-Dqc2IJJPjUatwc9Letw+vG29rnaMrDGi5g6WCx1HiZYm0obXbTmLygeRafMbgf+sLKXrWE1shOeiayQuczBdoA==} - engines: {node: '>=18.12'} - - '@pnpm/graceful-fs@1000.1.0': - resolution: {integrity: sha512-EsMX4slK0qJN2AR0/AYohY5m0HQNYGMNe+jhN74O994zp22/WbX+PbkIKyw3UQn39yQm2+z6SgwklDxbeapsmQ==} - engines: {node: '>=18.12'} - - '@pnpm/logger@1001.0.1': - resolution: {integrity: sha512-gdwlAMXC4Wc0s7Dmg/4wNybMEd/4lSd9LsXQxeg/piWY0PPXjgz1IXJWnVScx6dZRaaodWP3c1ornrw8mZdFZw==} - engines: {node: '>=18.12'} - - '@pnpm/manifest-utils@1002.0.5': - resolution: {integrity: sha512-2DSwQ6pP73IuJS5mCCtPd5fibJwuAdufXKuSL/Oq1n6AggCqy8616Xea1X3RH3z5dL4mn7Z4EZ+vnX8jX3Wrfw==} - engines: {node: '>=18.12'} - peerDependencies: - '@pnpm/logger': ^1001.0.1 - - '@pnpm/read-project-manifest@1001.2.6': - resolution: {integrity: sha512-BcNO50lAkE4m9JaJ0WmG3m/DH/qLSvMgZywtmb/dfyyLVu5nDZfDqmOd8U+f1NhLcLMbBK6AnS3hyUqZYvw9Vg==} - engines: {node: '>=18.12'} - peerDependencies: - '@pnpm/logger': ^1001.0.1 - - '@pnpm/semver.peer-range@1000.0.0': - resolution: {integrity: sha512-r6VzkrdH7ZKjPmAogTNvxuV/UyS/xwHNme+ZuEFiG0UthZgqudDftYtKmG20fcfrjG1lgJbbWICA8KvZy7mmbw==} - engines: {node: '>=18.12'} - - '@pnpm/text.comments-parser@1000.0.0': - resolution: {integrity: sha512-ivv/esrETOq9uMiKOC0ddVZ1BktEGsfsMQ9RWmrDpwPiqFSqWsIspnquxTBmm5GflC5N06fbqjGOpulZVYo3vQ==} - engines: {node: '>=18.12'} - - '@pnpm/types@1001.3.0': - resolution: {integrity: sha512-NLTXheat/u7OEGg5M5vF6Z85zx8uKUZE0+whtX/sbFV2XL48RdnOWGPTKYuVVkv8M+launaLUTgGEXNs/ess2w==} - engines: {node: '>=18.12'} - - '@pnpm/write-project-manifest@1000.0.16': - resolution: {integrity: sha512-zG68fk03ryot7TWUl9S/ShQ91uHWzIL9sVr2aQCuNHJo8G9kjsG6S0p58Zj/voahdDQeakZYYBSJ0mjNZeiJnw==} - engines: {node: '>=18.12'} - '@polka/url@1.0.0-next.29': resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} @@ -3249,8 +3213,8 @@ packages: '@react-navigation/routers@7.5.3': resolution: {integrity: sha512-1tJHg4KKRJuQ1/EvJxatrMef3NZXEPzwUIUZ3n1yJ2t7Q97siwRtbynRpQG9/69ebbtiZ8W3ScOZF/OmhvM4Rg==} - '@rolldown/debug@1.0.0': - resolution: {integrity: sha512-u29og41IXsrW3Ky2wM0WSp7toxztv2xoDxtHl0I4Ek6YADQV0CAjUEM+/zRTzHo+o9gy/FhiOS54NukuEHPkgg==} + '@rolldown/debug@1.0.3': + resolution: {integrity: sha512-mQ4V7ODNxW4o09we34Dw9I29ByK/m7yTHT8Nqt+wwWCcxPsiGoixUsFDiruxGQwrjk6XYgwi/Cf0Prg0x5ABsA==} '@rolldown/pluginutils@1.0.0': resolution: {integrity: sha512-aKs/3GSWyV0mrhNmt/96/Z3yczC3yvrzYATCiCXQebBsGyYzjNdUphRVLeJQ67ySKVXRfMxt2lm12pmXvbPFQQ==} @@ -4003,16 +3967,16 @@ packages: engines: {node: '>=20'} hasBin: true - '@vitejs/devtools-kit@0.1.21': - resolution: {integrity: sha512-u9d45h1GhcbY4O6a2TZxNTJnw6lySqSoEZM2i26caxVkbKEPuW6qSQMkVVr4ZfciNVfae2R3Trgn6DLxaq9BZQ==} + '@vitejs/devtools-kit@0.3.1': + resolution: {integrity: sha512-0zwX4IpFMbNWsiDMj/WnRZFdJU+zY8gU/uBf2jr5UktDicmwL+6yVZRF5zgOA6XZ3yj4+TLSdWQfVlaMerBWaw==} peerDependencies: vite: '*' - '@vitejs/devtools-rolldown@0.1.21': - resolution: {integrity: sha512-jsZa2YPSADZ87SJuGXV/UXPvRcPKPi7KUUB5jmPcrxoMlC3HQK5C2lpCc96QlvJ97KDz88djZsMoHfkOmeuNFQ==} + '@vitejs/devtools-rolldown@0.3.1': + resolution: {integrity: sha512-yrlrezS7xaR/nxRRTqsJevUPeZOWIQKX3wwK38zGsEEEMn8oyls8DBmYVagtXNPqUk9XW9bt5sVIsrR2n2F8+w==} - '@vitejs/devtools@0.1.21': - resolution: {integrity: sha512-0xcEjoYkUuuPANU2dAdeKs2g5PKuzwP+mtUZpeoeAUDMZ5HsyU4aVOxzcVouoBJsQ5MeXWLpJBGpx7jh4OhU4g==} + '@vitejs/devtools@0.3.1': + resolution: {integrity: sha512-uRgicpM7gzCJ4dHzs717uLvzvw2sdnVzxp7bui/cyezWyILjc0DYlPlFEwS2kIFLOnnQNGeryRbs/M96C7Ts8Q==} hasBin: true peerDependencies: vite: '*' @@ -4112,15 +4076,27 @@ packages: '@vue/compiler-core@3.5.34': resolution: {integrity: sha512-s9cLyK5mLcvZ4Agva5QgRsQyLKvts9WbU9DB6NqiZkkGEdwmcEiylj5Jbwkp680drF/NNCV8OlAJSe+yMLxaJw==} + '@vue/compiler-core@3.5.35': + resolution: {integrity: sha512-BUmHaR1J+O+CKZ9uJucdVTEr1LHsdyvv7vG3eNRhK3CczEHeMd/LtsHAuD7PbrxvI2envCY2v7HI1vC1aBRzKw==} + '@vue/compiler-dom@3.5.34': resolution: {integrity: sha512-EbF/T++k0e2MMZlJsBhzK8Sgwt0HcIPOhzn1CTB/lv6sQcyk+OWf8YeiLxZp3ro7MbbLcAfAJ6sEvjFWuNgUCw==} + '@vue/compiler-dom@3.5.35': + resolution: {integrity: sha512-k+bprkXxuqhVajgTx5mUHuir7TwQzUKOWR40ng1ncAqQRPnrLngGGgqVEEhOnTMlc8btHYVKmrP8s5Qyg0hvYA==} + '@vue/compiler-sfc@3.5.34': resolution: {integrity: sha512-D/ihr6uZeIt6r+pVZf46RWT1fAsLFMbUP7k8G1VkiiWexriED9GrX3echHd4Abbt17zjlfiFJ8z7a3BxZOPNjg==} + '@vue/compiler-sfc@3.5.35': + resolution: {integrity: sha512-G5VPMcXTSywXBgtFOZOnHKBxKSrwXUcvY1iaF5/hRcy7t0J6CH/d8ha9F4nzi00Fax1eLV0QHM7v4mQu68jydw==} + '@vue/compiler-ssr@3.5.34': resolution: {integrity: sha512-cDtTHKibkThKGHH1SP+WdccquNRYQDFH6rRjQCqT9G2ltFAfoR5pUftpab/z+aM5mW9HLLVQW7hfKKQe/1GBeQ==} + '@vue/compiler-ssr@3.5.35': + resolution: {integrity: sha512-rGhAeXgdM7/ffTJGXT69rCCdTmjDewnFuUZfBQQHTdcEBeWdT5HCGY60y2ytLJr9/Dsu7IntUi5z/w0h6Rjnzw==} + '@vue/devtools-api@6.6.4': resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==} @@ -4152,20 +4128,37 @@ packages: '@vue/reactivity@3.5.34': resolution: {integrity: sha512-y9XDjCEuBp+98k+UL5dbYkh57AHU4o6cxZedOPXw3bmrZZYLQsVHguGurq7hVrPCSrQtrnz1f9dssyFr+dMXfQ==} + '@vue/reactivity@3.5.35': + resolution: {integrity: sha512-tVc+SsHConvh/Lz64qq1pP3rYArBmK42xonovEcxY74SQtvctZodG/zhq54P5dr38cVuw25d27cPNRdlMidpGQ==} + '@vue/runtime-core@3.5.34': resolution: {integrity: sha512-mKeBYvu8tcMSLhypAHBmriUFfWXKTCF/23Z4jiCoYK3UtWepkliViNLuR90V9XOyD62mUxs9p1jsrpK3CCGIzw==} + '@vue/runtime-core@3.5.35': + resolution: {integrity: sha512-A/xFNX9loIcWDygeQuNCfKuh0CoYBzxhqEMNah5TSFg9Z53DrFYEN2qi5CU9necjM1OWYegYREUTHmXTmhfXtg==} + '@vue/runtime-dom@3.5.34': resolution: {integrity: sha512-e8kZzERmCwUnBRVsgSQlAfrfU2rGoy0FFKPBXSlfEjc/O3KfA7QP0t1/2ZylrbchjmIKB4dPTd07A6WPr0eOrg==} + '@vue/runtime-dom@3.5.35': + resolution: {integrity: sha512-odrJ1C391dbGnyDRh8U+rnP7J2amIEzfmRk5vXy7xi3aZhEXofTvpi0T4HJb6jlNqQZTNPR5MPHSB3RHNkIORA==} + '@vue/server-renderer@3.5.34': resolution: {integrity: sha512-nHxmJoTrKsmrkbILRhkC9gY1G3moZbJTqCzDd7DOOzG5KH9oeJ0Unqrff5f9v0pW//jES05ZkJcNtfE8JjOIew==} peerDependencies: vue: 3.5.34 + '@vue/server-renderer@3.5.35': + resolution: {integrity: sha512-NkebSOYdB97wi8OQcO3HqzZSlymJi/aWsN/7h74OSVhRTm6qGs3Jp3e0rCXynmWwSlKeRrnlIug+ilYoHBmQDA==} + peerDependencies: + vue: 3.5.35 + '@vue/shared@3.5.34': resolution: {integrity: sha512-24uqU4OIiX29ryC3MeWid/Xf2fa2EFRUVLb77nRhk+UrTVrh/XiGtFAFmJBAtBRbjwNdsPRP+jj/OL27Eg1NDA==} + '@vue/shared@3.5.35': + resolution: {integrity: sha512-zSbjL7gRXwks2ZQLRGCajBtBXEOXW9Ddhn/HvSdrGkE2dqGnumzW8XtusRrxrE9LvqtiqDXQ+A60Hp6mvdYxfA==} + '@vueuse/core@10.11.1': resolution: {integrity: sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww==} @@ -4348,6 +4341,10 @@ packages: resolution: {integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==} engines: {node: '>=14'} + ansis@4.3.0: + resolution: {integrity: sha512-44mvgtPvohuU/70DdY5Oz2AIrLJ9k6/5x4KmoSvPwO+5Moijo0+N9D0fKbbYZQWP1hNm5CpOf+E01jhxG/r8xg==} + engines: {node: '>=14'} + any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} @@ -4597,9 +4594,6 @@ packages: blob-to-buffer@1.2.9: resolution: {integrity: sha512-BF033y5fN6OCofD3vgHmNtwZWRcq9NLyyxyILx9hfMy1sXYy4ojFl765hJ2lP0YaN2fuxPaLO2Vzzoxy0FLFFA==} - bole@5.0.29: - resolution: {integrity: sha512-eYR9i2ubLv5/4TFGyZsQ1cVH4jF9+qLJA72Aow+E7ZZQfqHqQNUZeX3w+pVWF76PQyjl5eDKf2xylyOOX76ozA==} - boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} @@ -5143,8 +5137,8 @@ packages: devalue@5.8.0: resolution: {integrity: sha512-2zA9pFEsnp7vWBZbXF5JAgAq0fsUIt/1XPbRiAmRV3lp/2C3upzH+sADiyy66aFCihoLEsrQHxNM5w1gIDfsBg==} - devframe@0.1.21: - resolution: {integrity: sha512-tOCbGyJKYyYatfk1E7I96KVZQRTyFwewF1c5BVsm92EN6ezuUkAmJqNu6/kR6sAA8lUSnRG4iTUrk+bOtutJjQ==} + devframe@0.5.2: + resolution: {integrity: sha512-8dIdlOmuY+6NcCsaI2qS0uRLTZ3SvpejY8OYVbXvdWSQV7pvjdWaYNZhVfOfCSd/a5dSCgSge4vW4DCyJSf7+g==} peerDependencies: '@modelcontextprotocol/sdk': ^1.0.0 peerDependenciesMeta: @@ -5308,8 +5302,8 @@ packages: resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - error-ex@1.3.4: - resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} + err-code@2.0.3: + resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} error-stack-parser-es@1.0.5: resolution: {integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==} @@ -5679,6 +5673,10 @@ packages: react-server-dom-webpack: optional: true + expo-server-sdk@6.1.0: + resolution: {integrity: sha512-ISuax1AQ7cpM5RAqcu8gVcoLL0ZKskJ5OLoMWmdITBe9nYjTucjdGyBq817YkIvTcj1pAUwx+9toUT7l/V7thA==} + engines: {node: '>=20'} + expo-server@1.0.6: resolution: {integrity: sha512-vb5TBtskvEdzYuW79lATXutOEBfW5m6U4EFpNjCVZTnI7S//SAsLQkYEpn+EDfn84m6VQfzSGkIVR6YPaScKFA==} engines: {node: '>=20.16.0'} @@ -5759,13 +5757,10 @@ packages: fast-npm-meta@0.4.8: resolution: {integrity: sha512-ybZVlDZ2PkO79dosM+6CLZfKWRH8MF0PiWlw8M4mVWJl8IEJrPfxYc7Tsu830Dwj/R96LKXfePGTSzKWbPJ08w==} - fast-npm-meta@1.5.1: - resolution: {integrity: sha512-tWhw7z4jFuQgZB9tbQyUh5BY9nNd/wimM+fBLfmmJjakkJDNvbJKm0nQ5ruPKC0us1HGg7L6iBk1fxpSzcgSaA==} + fast-npm-meta@2.0.0: + resolution: {integrity: sha512-R8P+1F29waIKTtT6knAP2BzK9We2o0flgN1BaP/eaIMa1vtAb7olV9/N2cvNEKi5D+cS++2S6pUhluG4IhCmqg==} hasBin: true - fast-safe-stringify@2.1.1: - resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} - fast-string-truncated-width@3.0.3: resolution: {integrity: sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==} @@ -6040,6 +6035,16 @@ packages: h3@1.15.11: resolution: {integrity: sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==} + h3@2.0.1-rc.22: + resolution: {integrity: sha512-Esv0DMIuPkCTSWCA0vO73vcTqwzH1wjSrAO1TXNu/K3up1sZHa9EKMapbmxCDYBeymC3fVTk4qxp7ogQWQ+KgA==} + engines: {node: '>=20.11.1'} + hasBin: true + peerDependencies: + crossws: ^0.4.1 + peerDependenciesMeta: + crossws: + optional: true + has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} @@ -6179,9 +6184,6 @@ packages: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} - individual@3.0.0: - resolution: {integrity: sha512-rUY5vtT748NMRbEMrTNiFfy29BgGZwGXUi2NFUVMWQrogSLzlJvQV9eeMWi+g1aVaQ53tpyLAQtd5x/JH0Nh1g==} - 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. @@ -6218,9 +6220,6 @@ packages: resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} engines: {node: '>= 0.4'} - is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - is-arrayish@0.3.4: resolution: {integrity: sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==} @@ -6320,10 +6319,6 @@ packages: resolution: {integrity: sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==} engines: {node: '>=18'} - is-windows@1.0.2: - resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} - engines: {node: '>=0.10.0'} - is-wsl@2.2.0: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} @@ -6447,9 +6442,6 @@ packages: 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==} @@ -6680,6 +6672,10 @@ packages: resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==} engines: {node: '>=14'} + local-pkg@1.2.1: + resolution: {integrity: sha512-++gUqRDEvcnN6Zhqrr+y/CkVEHhlrR96vZn3nZZPYzMcBUyBtTKzB9NadClFIsIVSsu+3i9tfk/erqy9kAmt7Q==} + engines: {node: '>=14'} + locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -6713,9 +6709,6 @@ packages: resolution: {integrity: sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==} engines: {node: '>=4'} - logs-sdk@0.0.6: - resolution: {integrity: sha512-G4M1C9aLLBOIWpmw/Lqk4zrap/T2IJsoUOuUDjRcVSLy6lHQqxr3wCqIT1FvvpYTUYpEwvu4utsMY42jTNvx8Q==} - long@5.3.2: resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} @@ -6773,6 +6766,9 @@ packages: magicast@0.5.2: resolution: {integrity: sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ==} + magicast@0.5.3: + resolution: {integrity: sha512-pVKE4UdSQ7DvHzivsCIFx2BJn1mHG6KsyrFcaxFx6tONdneEuThrDx0Cj3AMg58KyN4pzYT+LHOotxDQDjNvkw==} + make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} @@ -7107,6 +7103,9 @@ packages: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} + nostics@0.2.0: + resolution: {integrity: sha512-/WQpI46UMbqvy1okYb+V+9wW3J8/m6GJ33wm691n/tyi6YtJiZ6ssJjENAU7y4evfYrrgYN9HllKDzPvffil1w==} + npm-package-arg@11.0.3: resolution: {integrity: sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==} engines: {node: ^16.14.0 || >=18.0.0} @@ -7257,8 +7256,8 @@ packages: resolution: {integrity: sha512-7+9iyxwpzfjuiEnSqNJYzTsC1Oud742PPkr/4S1bGY930U4tApdLEK8zmgbT57c1/56cfNOndqZaeQZiAfnJ5A==} engines: {node: ^20.19.0 || >=22.12.0} - oxc-parser@0.126.0: - resolution: {integrity: sha512-FktCvLby/mOHyuijZt22+nOt10dS24gGUZE3XwIbUg7Kf4+rer3/5T7RgwzazlNuVsCjPloZ3p8E+4ONT3A8Kw==} + oxc-parser@0.132.0: + resolution: {integrity: sha512-+0LAPHaqtfQlvWdpaAa09SmOaZZgP8C552xosEkGJ4+ruEwP1Vgx+sqBgcBCNfR6KDCmagGOZTde8wmAvcI/Hg==} engines: {node: ^20.19.0 || >=22.12.0} oxc-parser@0.70.0: @@ -7311,10 +7310,6 @@ packages: pako@0.2.9: resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} - parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} - parse-png@2.1.0: resolution: {integrity: sha512-Nt/a5SfCLiTnQAjx3fHlqp8hRgTL3z7kTQZzvIMS9uCAepnCyjpdEc6M/sz69WqMBdaDBw9sF1F1UaHROYzGkQ==} engines: {node: '>=10'} @@ -7676,6 +7671,10 @@ packages: resolution: {integrity: sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==} engines: {node: ^10 || ^12 || >=14} + postcss@8.5.15: + resolution: {integrity: sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==} + engines: {node: ^10 || ^12 || >=14} + postgres-array@2.0.0: resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} engines: {node: '>=4'} @@ -7762,6 +7761,13 @@ packages: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} + promise-limit@2.7.0: + resolution: {integrity: sha512-7nJ6v5lnJsXwGprnGXga4wx6d1POjvi5Qmf1ivTRxTjH4Z/9Czja/UCMLVmB9N93GeWOU93XaFaEt6jbuoagNw==} + + promise-retry@2.0.1: + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} + promise@8.3.0: resolution: {integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==} @@ -7808,8 +7814,8 @@ packages: prosemirror-view@1.41.8: resolution: {integrity: sha512-TnKDdohEatgyZNGCDWIdccOHXhYloJwbwU+phw/a23KBvJIR9lWQWW7WHHK3vBdOLDNuF7TaX98GObUZOWkOnA==} - publint@0.3.20: - resolution: {integrity: sha512-UWqFYP7VBVCe9l/leEEGJrDs6Am4K4KapLmLi5qbt+9fA+Ny38ghdW+bw1nYfVqCK8/3kgsxjjhFjTYqYYRpyw==} + publint@0.3.21: + resolution: {integrity: sha512-OqejcnMV6E9zel2oCrUOJEiiFkGiAAni0A6ibfQNh1k9Gu5z4F+Yso8lllam7AzmV6Do0vp7u3UpZNRBwuXaHQ==} engines: {node: '>=18'} hasBin: true @@ -8057,10 +8063,6 @@ packages: read-cache@1.0.0: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} - read-yaml-file@2.1.0: - resolution: {integrity: sha512-UkRNRIwnhG+y7hpqnycCL/xbTk7+ia9VuVTC0S+zVbwd65DI9eUpRMfsWIGrCWxTU/mi+JW8cHQCrv+zfCbEPQ==} - engines: {node: '>=10.13'} - readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} @@ -8231,6 +8233,9 @@ packages: rope-sequence@1.3.4: resolution: {integrity: sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==} + rou3@0.8.1: + resolution: {integrity: sha512-ePa+XGk00/3HuCqrEnK3LxJW7I0SdNg6EFzKUJG73hMAdDcOUC/i/aSz7LSDwLrGr33kal/rqOGydzwl6U7zBA==} + rtl-detect@1.1.2: resolution: {integrity: sha512-PGMBq03+TTG/p/cRB7HCLKJ1MgDIi07+QU1faSjiYRfmY5UsAttV9Hs08jDAHVwcOwmVLcSJkpwyfXszVjWfIQ==} @@ -8294,6 +8299,11 @@ packages: engines: {node: '>=10'} hasBin: true + semver@7.8.1: + resolution: {integrity: sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==} + engines: {node: '>=10'} + hasBin: true + send@0.19.2: resolution: {integrity: sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==} engines: {node: '>= 0.8.0'} @@ -8547,13 +8557,6 @@ packages: resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} engines: {node: '>=12'} - strip-bom@4.0.0: - resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} - engines: {node: '>=8'} - - strip-comments-strings@1.2.0: - resolution: {integrity: sha512-zwF4bmnyEjZwRhaak9jUWNxc0DoeKBJ7lwSN/LEc8dQXZcUFG6auaaTQJokQWXopLdM3iTx01nQT8E4aL29DAQ==} - strip-final-newline@3.0.0: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} @@ -8733,6 +8736,10 @@ packages: resolution: {integrity: sha512-dAqSqE/RabpBKI8+h26GfLq6Vb3JVXs30XYQjdMjaj/c2tS8IYYMbIzP599KtRj7c57/wYApb3QjgRgXmrCukA==} engines: {node: '>=18'} + tinyexec@1.2.3: + resolution: {integrity: sha512-g62dB+w1/OEFnPvmX0yd/HnetYITOL+1nJW7kitOycOeAvmbWC/nu0fwmmQ/kupNojqExzyC/T++pST/jRJ2mQ==} + engines: {node: '>=18'} + tinyglobby@0.2.16: resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} engines: {node: '>=12.0.0'} @@ -8860,6 +8867,10 @@ packages: resolution: {integrity: sha512-ZgpWDC5gmNiuY9CnLVXEH8rl50xhRCuLNA97fAUnKi8RRuV4E6KG31pDTsLVUKnohJE0I3XDrTeEydAXRw47xg==} engines: {node: '>=18.17'} + undici@7.26.0: + resolution: {integrity: sha512-3O9Tf67pGhgOv9jM35AbhkXAKi13f3oy3aE4CSgr+TckGeY+/iu97ZXN+J7DpHPzLbVApFd1IFhcnBjREYXYcg==} + engines: {node: '>=20.18.1'} + unenv@2.0.0-rc.24: resolution: {integrity: sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==} @@ -9126,6 +9137,14 @@ packages: typescript: optional: true + valibot@1.4.1: + resolution: {integrity: sha512-klCmFTz2jeDluy9RwX+F884TCiogtdBJ/YaxSx1EOBYXa3NXNWj8kR1jjN8rzluwojJVWWaHJ4r1U5LfICnM3g==} + peerDependencies: + typescript: '>=5' + peerDependenciesMeta: + typescript: + optional: true + validate-npm-package-name@5.0.1: resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -9213,8 +9232,8 @@ packages: '@nuxt/kit': optional: true - vite-plugin-inspect@12.0.0-beta.1: - resolution: {integrity: sha512-ang8DMcQxr2MJRjdvwabkD0uOPFB5/fP4hldZvAqCl82SABXK1zYLyZKGrauCblR61cvDUavxyiHbtD4zTdw0A==} + vite-plugin-inspect@12.0.0-beta.3: + resolution: {integrity: sha512-1uMZPSO7Y09KGRhBIhdxdobot14VxKrxm/yYxs5h5FqI4UplbP8PADazLveAUiQSvNwyl9taGPMBfgktX5g8Gg==} engines: {node: '>=14'} peerDependencies: '@nuxt/kit': '*' @@ -9229,6 +9248,12 @@ packages: vite: ^6.0.0 || ^7.0.0 vue: ^3.5.0 + vite-plugin-vue-tracer@1.4.0: + resolution: {integrity: sha512-0tQCjCqZWVSK6UeRW9S4ABbf47lKQ68zvrT2FNvZmiL+alDydCVyH/T3Jlfbdc3T3C2Iuyyl5aVsMbF8IQIoxA==} + peerDependencies: + vite: ^6.0.0 || ^7.0.0 || ^8.0.0-0 + vue: ^3.5.0 + vite@5.4.21: resolution: {integrity: sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==} engines: {node: ^18.0.0 || >=20.0.0} @@ -9373,8 +9398,8 @@ packages: peerDependencies: vue: ^3.5.0 - vue-virtual-scroller@3.0.3: - resolution: {integrity: sha512-nLWjtpPf/GyvIEEIWAuzevmTlC/aVf0yOcNkXDTUxZWyshsK6B6vc8R8wo9Nb8bpjy7wbi1zPMhzTKwUvWHQmg==} + vue-virtual-scroller@3.0.4: + resolution: {integrity: sha512-3qh3c9VUVysuXynaa4fVZ3ncx3VgD7EPRiQcj+jUVZl5u/TTkD3c27XvSEu3JGJfsJt/vVTVziZ3djiiHtW4cQ==} peerDependencies: vue: ^3.3.0 @@ -9386,6 +9411,14 @@ packages: typescript: optional: true + vue@3.5.35: + resolution: {integrity: sha512-cx89fnr+0kVGHiNFG6y6s0bdjypJRFNZn6x3WPstNdQR1bi1mbB7h4v5IBGTsPJU3nK1+0Iqj3Zf+hZWMieR4Q==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + w3c-keyname@2.2.8: resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} @@ -9440,9 +9473,9 @@ packages: 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} + which@7.0.0: + resolution: {integrity: sha512-RancgH2dmbLdHl6LRhEqvklWMgl/Hdnun0Y90KhBOLkMefg8Qa7/Zel8Sm+8HEcP6DEjzsWzpkuBQEZok58isA==} + engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} hasBin: true why-is-node-running@2.3.0: @@ -9476,14 +9509,6 @@ packages: resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - write-file-atomic@5.0.1: - resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - write-yaml-file@5.0.0: - resolution: {integrity: sha512-FdNA4RyH1L43TlvGG8qOMIfcEczwA5ij+zLXUy3Z83CjxhLvcV7/Q/8pk22wnCgYw7PJhtK+7lhO+qqyT4NdvQ==} - engines: {node: '>=16.14'} - ws@6.2.3: resolution: {integrity: sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==} peerDependencies: @@ -9519,6 +9544,18 @@ packages: utf-8-validate: optional: true + ws@8.21.0: + resolution: {integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + wsl-utils@0.1.0: resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} engines: {node: '>=18'} @@ -10305,6 +10342,15 @@ snapshots: '@colordx/core@5.4.3': {} + '@devframes/hub@0.5.2(devframe@0.5.2(typescript@5.9.3))': + dependencies: + birpc: 4.0.0 + devframe: 0.5.2(typescript@5.9.3) + nostics: 0.2.0 + pathe: 2.0.3 + perfect-debounce: 2.1.0 + tinyexec: 1.2.3 + '@egjs/hammerjs@2.0.17': dependencies: '@types/hammerjs': 2.0.46 @@ -10319,12 +10365,23 @@ snapshots: '@electric-sql/pglite@0.4.1': {} + '@emnapi/core@1.10.0': + dependencies: + '@emnapi/wasi-threads': 1.2.1 + tslib: 2.8.1 + optional: true + '@emnapi/core@1.9.2': dependencies: '@emnapi/wasi-threads': 1.2.1 tslib: 2.8.1 optional: true + '@emnapi/runtime@1.10.0': + dependencies: + tslib: 2.8.1 + optional: true + '@emnapi/runtime@1.9.2': dependencies: tslib: 2.8.1 @@ -11011,8 +11068,6 @@ snapshots: - '@vue/composition-api' - vue - '@gwhitney/detect-indent@7.0.1': {} - '@hono/node-server@1.19.11(hono@4.12.17)': dependencies: hono: 4.12.17 @@ -11120,12 +11175,12 @@ snapshots: '@intlify/shared@11.4.2': {} - '@intlify/unplugin-vue-i18n@6.0.8(@vue/compiler-dom@3.5.34)(eslint@10.3.0(jiti@2.7.0))(rollup@4.60.3)(typescript@5.9.3)(vue-i18n@10.0.8(vue@3.5.34(typescript@5.9.3)))(vue@3.5.34(typescript@5.9.3))': + '@intlify/unplugin-vue-i18n@6.0.8(@vue/compiler-dom@3.5.35)(eslint@10.3.0(jiti@2.7.0))(rollup@4.60.3)(typescript@5.9.3)(vue-i18n@10.0.8(vue@3.5.34(typescript@5.9.3)))(vue@3.5.34(typescript@5.9.3))': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@10.3.0(jiti@2.7.0)) '@intlify/bundle-utils': 10.0.1(vue-i18n@10.0.8(vue@3.5.34(typescript@5.9.3))) '@intlify/shared': 11.4.2 - '@intlify/vue-i18n-extensions': 8.0.0(@intlify/shared@11.4.2)(@vue/compiler-dom@3.5.34)(vue-i18n@10.0.8(vue@3.5.34(typescript@5.9.3)))(vue@3.5.34(typescript@5.9.3)) + '@intlify/vue-i18n-extensions': 8.0.0(@intlify/shared@11.4.2)(@vue/compiler-dom@3.5.35)(vue-i18n@10.0.8(vue@3.5.34(typescript@5.9.3)))(vue@3.5.34(typescript@5.9.3)) '@rollup/pluginutils': 5.3.0(rollup@4.60.3) '@typescript-eslint/scope-manager': 8.59.2 '@typescript-eslint/typescript-estree': 8.59.2(typescript@5.9.3) @@ -11149,12 +11204,12 @@ snapshots: '@intlify/utils@0.13.0': {} - '@intlify/vue-i18n-extensions@8.0.0(@intlify/shared@11.4.2)(@vue/compiler-dom@3.5.34)(vue-i18n@10.0.8(vue@3.5.34(typescript@5.9.3)))(vue@3.5.34(typescript@5.9.3))': + '@intlify/vue-i18n-extensions@8.0.0(@intlify/shared@11.4.2)(@vue/compiler-dom@3.5.35)(vue-i18n@10.0.8(vue@3.5.34(typescript@5.9.3)))(vue@3.5.34(typescript@5.9.3))': dependencies: '@babel/parser': 7.29.3 optionalDependencies: '@intlify/shared': 11.4.2 - '@vue/compiler-dom': 3.5.34 + '@vue/compiler-dom': 3.5.35 vue: 3.5.34(typescript@5.9.3) vue-i18n: 10.0.8(vue@3.5.34(typescript@5.9.3)) @@ -11307,10 +11362,10 @@ snapshots: '@tybys/wasm-util': 0.10.2 optional: true - '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': + '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: - '@emnapi/core': 1.9.2 - '@emnapi/runtime': 1.9.2 + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 '@tybys/wasm-util': 0.10.2 optional: true @@ -11326,11 +11381,11 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.20.1 - '@nuxt/cli@3.35.1(@nuxt/schema@4.1.3)(cac@6.7.14)(magicast@0.5.2)': + '@nuxt/cli@3.35.1(@nuxt/schema@4.1.3)(cac@6.7.14)(magicast@0.5.3)': dependencies: '@bomb.sh/tab': 0.0.14(cac@6.7.14)(citty@0.2.2) '@clack/prompts': 1.3.0 - c12: 3.3.4(magicast@0.5.2) + c12: 3.3.4(magicast@0.5.3) citty: 0.2.2 confbox: 0.2.4 consola: 3.4.2 @@ -11374,26 +11429,26 @@ snapshots: transitivePeerDependencies: - magicast - '@nuxt/devtools-kit@2.7.0(magicast@0.5.2)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4))': + '@nuxt/devtools-kit@2.7.0(magicast@0.5.3)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4))': dependencies: - '@nuxt/kit': 3.21.4(magicast@0.5.2) + '@nuxt/kit': 3.21.4(magicast@0.5.3) execa: 8.0.1 vite: 7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4) transitivePeerDependencies: - magicast - '@nuxt/devtools-kit@3.2.4(magicast@0.5.2)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4))': + '@nuxt/devtools-kit@3.2.4(magicast@0.5.3)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4))': dependencies: - '@nuxt/kit': 4.4.4(magicast@0.5.2) + '@nuxt/kit': 4.4.4(magicast@0.5.3) execa: 8.0.1 vite: 7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4) transitivePeerDependencies: - magicast - '@nuxt/devtools-kit@4.0.0-alpha.4(magicast@0.5.2)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4))': + '@nuxt/devtools-kit@4.0.0-alpha.6(magicast@0.5.3)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4))': dependencies: - '@nuxt/kit': 4.4.4(magicast@0.5.2) - tinyexec: 1.1.2 + '@nuxt/kit': 4.4.6(magicast@0.5.3) + tinyexec: 1.2.3 vite: 7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4) transitivePeerDependencies: - magicast @@ -11450,39 +11505,40 @@ snapshots: - utf-8-validate - vue - '@nuxt/devtools@4.0.0-alpha.4(@pnpm/logger@1001.0.1)(db0@0.3.4(@electric-sql/pglite@0.4.1)(mysql2@3.15.3))(ioredis@5.10.1)(typescript@5.9.3)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4))(vue@3.5.34(typescript@5.9.3))': + '@nuxt/devtools@4.0.0-alpha.6(db0@0.3.4(@electric-sql/pglite@0.4.1)(mysql2@3.15.3))(ioredis@5.10.1)(typescript@5.9.3)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4))(vue@3.5.34(typescript@5.9.3))': dependencies: - '@nuxt/devtools-kit': 4.0.0-alpha.4(magicast@0.5.2)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4)) - '@nuxt/kit': 4.4.4(magicast@0.5.2) - '@vitejs/devtools': 0.1.21(@pnpm/logger@1001.0.1)(db0@0.3.4(@electric-sql/pglite@0.4.1)(mysql2@3.15.3))(ioredis@5.10.1)(typescript@5.9.3)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4)) - '@vitejs/devtools-kit': 0.1.21(typescript@5.9.3)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4)) + '@nuxt/devtools-kit': 4.0.0-alpha.6(magicast@0.5.3)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4)) + '@nuxt/kit': 4.4.6(magicast@0.5.3) + '@vitejs/devtools': 0.3.1(db0@0.3.4(@electric-sql/pglite@0.4.1)(mysql2@3.15.3))(ioredis@5.10.1)(typescript@5.9.3)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4)) + '@vitejs/devtools-kit': 0.3.1(typescript@5.9.3)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4)) '@vue/devtools-core': 8.1.2(vue@3.5.34(typescript@5.9.3)) '@vue/devtools-kit': 8.1.2 birpc: 4.0.0 consola: 3.4.2 destr: 2.0.5 error-stack-parser-es: 1.0.5 - fast-npm-meta: 1.5.1 + fast-npm-meta: 2.0.0 get-port-please: 3.2.0 hookable: 6.1.1 image-meta: 0.2.2 launch-editor: 2.13.2 - local-pkg: 1.1.2 - magicast: 0.5.2 + local-pkg: 1.2.1 + magicast: 0.5.3 ohash: 2.0.11 pathe: 2.0.3 perfect-debounce: 2.1.0 pkg-types: 2.3.1 - semver: 7.7.4 + semver: 7.8.1 sirv: 3.0.2 structured-clone-es: 2.0.0 - tinyexec: 1.1.2 + tinyexec: 1.2.3 tinyglobby: 0.2.16 + unstorage: 1.17.5(db0@0.3.4(@electric-sql/pglite@0.4.1)(mysql2@3.15.3))(ioredis@5.10.1) vite: 7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4) - vite-plugin-inspect: 12.0.0-beta.1(@nuxt/kit@4.4.4(magicast@0.5.2))(typescript@5.9.3)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4)) - vite-plugin-vue-tracer: 1.3.0(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4))(vue@3.5.34(typescript@5.9.3)) - which: 6.0.1 - ws: 8.20.0 + vite-plugin-inspect: 12.0.0-beta.3(@nuxt/kit@4.4.6(magicast@0.5.3))(typescript@5.9.3)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4)) + vite-plugin-vue-tracer: 1.4.0(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4))(vue@3.5.34(typescript@5.9.3)) + which: 7.0.0 + ws: 8.21.0 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -11495,13 +11551,13 @@ snapshots: - '@modelcontextprotocol/sdk' - '@netlify/blobs' - '@planetscale/database' - - '@pnpm/logger' - '@upstash/redis' - '@vercel/blob' - '@vercel/functions' - '@vercel/kv' - aws4fetch - bufferutil + - crossws - db0 - idb-keyval - ioredis @@ -11510,10 +11566,10 @@ snapshots: - utf-8-validate - vue - '@nuxt/fonts@0.11.4(db0@0.3.4(@electric-sql/pglite@0.4.1)(mysql2@3.15.3))(ioredis@5.10.1)(magicast@0.5.2)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4))': + '@nuxt/fonts@0.11.4(db0@0.3.4(@electric-sql/pglite@0.4.1)(mysql2@3.15.3))(ioredis@5.10.1)(magicast@0.5.3)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4))': dependencies: - '@nuxt/devtools-kit': 2.7.0(magicast@0.5.2)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4)) - '@nuxt/kit': 3.21.4(magicast@0.5.2) + '@nuxt/devtools-kit': 2.7.0(magicast@0.5.3)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4)) + '@nuxt/kit': 3.21.4(magicast@0.5.3) consola: 3.4.2 css-tree: 3.2.1 defu: 6.1.7 @@ -11556,10 +11612,10 @@ snapshots: - uploadthing - vite - '@nuxt/fonts@0.14.0(db0@0.3.4(@electric-sql/pglite@0.4.1)(mysql2@3.15.3))(ioredis@5.10.1)(magicast@0.5.2)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4))': + '@nuxt/fonts@0.14.0(db0@0.3.4(@electric-sql/pglite@0.4.1)(mysql2@3.15.3))(ioredis@5.10.1)(magicast@0.5.3)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4))': dependencies: - '@nuxt/devtools-kit': 3.2.4(magicast@0.5.2)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4)) - '@nuxt/kit': 4.4.4(magicast@0.5.2) + '@nuxt/devtools-kit': 3.2.4(magicast@0.5.3)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4)) + '@nuxt/kit': 4.4.4(magicast@0.5.3) consola: 3.4.2 defu: 6.1.7 fontless: 0.2.1(db0@0.3.4(@electric-sql/pglite@0.4.1)(mysql2@3.15.3))(ioredis@5.10.1)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4)) @@ -11596,14 +11652,14 @@ snapshots: - uploadthing - vite - '@nuxt/icon@1.15.0(magicast@0.5.2)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4))(vue@3.5.34(typescript@5.9.3))': + '@nuxt/icon@1.15.0(magicast@0.5.3)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4))(vue@3.5.34(typescript@5.9.3))': dependencies: '@iconify/collections': 1.0.680 '@iconify/types': 2.0.0 '@iconify/utils': 2.3.0 '@iconify/vue': 5.0.1(vue@3.5.34(typescript@5.9.3)) - '@nuxt/devtools-kit': 2.7.0(magicast@0.5.2)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4)) - '@nuxt/kit': 3.21.4(magicast@0.5.2) + '@nuxt/devtools-kit': 2.7.0(magicast@0.5.3)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4)) + '@nuxt/kit': 3.21.4(magicast@0.5.3) consola: 3.4.2 local-pkg: 1.1.2 mlly: 1.8.2 @@ -11618,14 +11674,14 @@ snapshots: - vite - vue - '@nuxt/icon@2.2.2(magicast@0.5.2)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4))(vue@3.5.34(typescript@5.9.3))': + '@nuxt/icon@2.2.2(magicast@0.5.3)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4))(vue@3.5.34(typescript@5.9.3))': dependencies: '@iconify/collections': 1.0.680 '@iconify/types': 2.0.0 '@iconify/utils': 3.1.3 '@iconify/vue': 5.0.1(vue@3.5.34(typescript@5.9.3)) - '@nuxt/devtools-kit': 3.2.4(magicast@0.5.2)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4)) - '@nuxt/kit': 4.4.4(magicast@0.5.2) + '@nuxt/devtools-kit': 3.2.4(magicast@0.5.3)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4)) + '@nuxt/kit': 4.4.4(magicast@0.5.3) consola: 3.4.2 local-pkg: 1.1.2 mlly: 1.8.2 @@ -11639,9 +11695,9 @@ snapshots: - vite - vue - '@nuxt/image@1.11.0(db0@0.3.4(@electric-sql/pglite@0.4.1)(mysql2@3.15.3))(ioredis@5.10.1)(magicast@0.5.2)': + '@nuxt/image@1.11.0(db0@0.3.4(@electric-sql/pglite@0.4.1)(mysql2@3.15.3))(ioredis@5.10.1)(magicast@0.5.3)': dependencies: - '@nuxt/kit': 3.21.4(magicast@0.5.2) + '@nuxt/kit': 3.21.4(magicast@0.5.3) consola: 3.4.2 defu: 6.1.7 h3: 1.15.11 @@ -11704,9 +11760,9 @@ snapshots: transitivePeerDependencies: - magicast - '@nuxt/kit@3.21.4(magicast@0.5.2)': + '@nuxt/kit@3.21.4(magicast@0.5.3)': dependencies: - c12: 3.3.4(magicast@0.5.2) + c12: 3.3.4(magicast@0.5.3) consola: 3.4.2 defu: 6.1.7 destr: 2.0.5 @@ -11730,9 +11786,9 @@ snapshots: transitivePeerDependencies: - magicast - '@nuxt/kit@4.1.3(magicast@0.5.2)': + '@nuxt/kit@4.1.3(magicast@0.5.3)': dependencies: - c12: 3.3.4(magicast@0.5.2) + c12: 3.3.4(magicast@0.5.3) consola: 3.4.2 defu: 6.1.7 destr: 2.0.5 @@ -11757,9 +11813,9 @@ snapshots: transitivePeerDependencies: - magicast - '@nuxt/kit@4.4.4(magicast@0.5.2)': + '@nuxt/kit@4.4.4(magicast@0.5.3)': dependencies: - c12: 3.3.4(magicast@0.5.2) + c12: 3.3.4(magicast@0.5.3) consola: 3.4.2 defu: 6.1.7 destr: 2.0.5 @@ -11782,6 +11838,31 @@ snapshots: transitivePeerDependencies: - magicast + '@nuxt/kit@4.4.6(magicast@0.5.3)': + dependencies: + c12: 3.3.4(magicast@0.5.3) + consola: 3.4.2 + defu: 6.1.7 + destr: 2.0.5 + errx: 0.1.0 + exsolve: 1.0.8 + ignore: 7.0.5 + jiti: 2.7.0 + klona: 2.0.6 + mlly: 1.8.2 + ohash: 2.0.11 + pathe: 2.0.3 + pkg-types: 2.3.1 + rc9: 3.0.1 + scule: 1.3.0 + semver: 7.8.1 + tinyglobby: 0.2.16 + ufo: 1.6.4 + unctx: 2.5.0 + untyped: 2.0.0 + transitivePeerDependencies: + - magicast + '@nuxt/schema@4.1.3': dependencies: '@vue/shared': 3.5.34 @@ -11800,24 +11881,24 @@ snapshots: pkg-types: 2.3.1 std-env: 4.1.0 - '@nuxt/telemetry@2.8.0(@nuxt/kit@4.1.3(magicast@0.5.2))': + '@nuxt/telemetry@2.8.0(@nuxt/kit@4.1.3(magicast@0.5.3))': dependencies: - '@nuxt/kit': 4.1.3(magicast@0.5.2) + '@nuxt/kit': 4.1.3(magicast@0.5.3) citty: 0.2.2 consola: 3.4.2 ofetch: 2.0.0-alpha.3 rc9: 3.0.1 std-env: 4.1.0 - '@nuxt/ui@4.7.1(@internationalized/date@3.12.1)(@internationalized/number@3.6.6)(@tiptap/extensions@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1))(@tiptap/y-tiptap@3.0.3(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.8)(y-protocols@1.0.7(yjs@13.6.30))(yjs@13.6.30))(db0@0.3.4(@electric-sql/pglite@0.4.1)(mysql2@3.15.3))(embla-carousel@8.6.0)(ioredis@5.10.1)(magicast@0.5.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(tailwindcss@4.2.4)(typescript@5.9.3)(valibot@1.4.0(typescript@5.9.3))(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4))(vue-router@4.6.4(vue@3.5.34(typescript@5.9.3)))(vue@3.5.34(typescript@5.9.3))(yjs@13.6.30)(zod@3.25.76)': + '@nuxt/ui@4.7.1(@internationalized/date@3.12.1)(@internationalized/number@3.6.6)(@tiptap/extensions@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1))(@tiptap/y-tiptap@3.0.3(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.8)(y-protocols@1.0.7(yjs@13.6.30))(yjs@13.6.30))(db0@0.3.4(@electric-sql/pglite@0.4.1)(mysql2@3.15.3))(embla-carousel@8.6.0)(ioredis@5.10.1)(magicast@0.5.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(tailwindcss@4.2.4)(typescript@5.9.3)(valibot@1.4.1(typescript@5.9.3))(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4))(vue-router@4.6.4(vue@3.5.34(typescript@5.9.3)))(vue@3.5.34(typescript@5.9.3))(yjs@13.6.30)(zod@3.25.76)': dependencies: '@floating-ui/dom': 1.7.6 '@iconify/vue': 5.0.1(vue@3.5.34(typescript@5.9.3)) - '@nuxt/fonts': 0.14.0(db0@0.3.4(@electric-sql/pglite@0.4.1)(mysql2@3.15.3))(ioredis@5.10.1)(magicast@0.5.2)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4)) - '@nuxt/icon': 2.2.2(magicast@0.5.2)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4))(vue@3.5.34(typescript@5.9.3)) - '@nuxt/kit': 4.4.4(magicast@0.5.2) + '@nuxt/fonts': 0.14.0(db0@0.3.4(@electric-sql/pglite@0.4.1)(mysql2@3.15.3))(ioredis@5.10.1)(magicast@0.5.3)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4)) + '@nuxt/icon': 2.2.2(magicast@0.5.3)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4))(vue@3.5.34(typescript@5.9.3)) + '@nuxt/kit': 4.4.4(magicast@0.5.3) '@nuxt/schema': 4.4.4 - '@nuxtjs/color-mode': 3.5.2(magicast@0.5.2) + '@nuxtjs/color-mode': 3.5.2(magicast@0.5.3) '@standard-schema/spec': 1.1.0 '@tailwindcss/postcss': 4.2.4 '@tailwindcss/vite': 4.2.4(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4)) @@ -11871,14 +11952,14 @@ snapshots: typescript: 5.9.3 ufo: 1.6.4 unplugin: 3.0.0 - unplugin-auto-import: 21.0.0(@nuxt/kit@4.4.4(magicast@0.5.2))(@vueuse/core@14.3.0(vue@3.5.34(typescript@5.9.3))) - unplugin-vue-components: 32.0.0(@nuxt/kit@4.4.4(magicast@0.5.2))(vue@3.5.34(typescript@5.9.3)) + unplugin-auto-import: 21.0.0(@nuxt/kit@4.4.4(magicast@0.5.3))(@vueuse/core@14.3.0(vue@3.5.34(typescript@5.9.3))) + unplugin-vue-components: 32.0.0(@nuxt/kit@4.4.4(magicast@0.5.3))(vue@3.5.34(typescript@5.9.3)) vaul-vue: 0.4.1(reka-ui@2.9.6(vue@3.5.34(typescript@5.9.3)))(vue@3.5.34(typescript@5.9.3)) vue-component-type-helpers: 3.2.8 optionalDependencies: '@internationalized/date': 3.12.1 '@internationalized/number': 3.6.6 - valibot: 1.4.0(typescript@5.9.3) + valibot: 1.4.1(typescript@5.9.3) vue-router: 4.6.4(vue@3.5.34(typescript@5.9.3)) zod: 3.25.76 transitivePeerDependencies: @@ -11923,9 +12004,9 @@ snapshots: - vue - yjs - '@nuxt/vite-builder@4.1.3(@types/node@22.19.17)(eslint@10.3.0(jiti@2.7.0))(lightningcss@1.32.0)(magicast@0.5.2)(optionator@0.9.4)(rollup@4.60.3)(terser@5.46.2)(typescript@5.9.3)(vue@3.5.34(typescript@5.9.3))(yaml@2.8.4)': + '@nuxt/vite-builder@4.1.3(@types/node@22.19.17)(eslint@10.3.0(jiti@2.7.0))(lightningcss@1.32.0)(magicast@0.5.3)(optionator@0.9.4)(rollup@4.60.3)(terser@5.46.2)(typescript@5.9.3)(vue@3.5.34(typescript@5.9.3))(yaml@2.8.4)': dependencies: - '@nuxt/kit': 4.1.3(magicast@0.5.2) + '@nuxt/kit': 4.1.3(magicast@0.5.3) '@rollup/plugin-replace': 6.0.3(rollup@4.60.3) '@vitejs/plugin-vue': 6.0.6(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4))(vue@3.5.34(typescript@5.9.3)) '@vitejs/plugin-vue-jsx': 5.1.5(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4))(vue@3.5.34(typescript@5.9.3)) @@ -11980,23 +12061,23 @@ snapshots: - vue-tsc - yaml - '@nuxtjs/color-mode@3.5.2(magicast@0.5.2)': + '@nuxtjs/color-mode@3.5.2(magicast@0.5.3)': dependencies: - '@nuxt/kit': 3.21.4(magicast@0.5.2) + '@nuxt/kit': 3.21.4(magicast@0.5.3) pathe: 1.1.2 pkg-types: 1.3.1 semver: 7.7.4 transitivePeerDependencies: - magicast - '@nuxtjs/i18n@9.5.6(@vue/compiler-dom@3.5.34)(eslint@10.3.0(jiti@2.7.0))(magicast@0.5.2)(rollup@4.60.3)(vue@3.5.34(typescript@5.9.3))': + '@nuxtjs/i18n@9.5.6(@vue/compiler-dom@3.5.35)(eslint@10.3.0(jiti@2.7.0))(magicast@0.5.3)(rollup@4.60.3)(vue@3.5.34(typescript@5.9.3))': dependencies: '@intlify/h3': 0.6.1 '@intlify/shared': 10.0.8 - '@intlify/unplugin-vue-i18n': 6.0.8(@vue/compiler-dom@3.5.34)(eslint@10.3.0(jiti@2.7.0))(rollup@4.60.3)(typescript@5.9.3)(vue-i18n@10.0.8(vue@3.5.34(typescript@5.9.3)))(vue@3.5.34(typescript@5.9.3)) + '@intlify/unplugin-vue-i18n': 6.0.8(@vue/compiler-dom@3.5.35)(eslint@10.3.0(jiti@2.7.0))(rollup@4.60.3)(typescript@5.9.3)(vue-i18n@10.0.8(vue@3.5.34(typescript@5.9.3)))(vue@3.5.34(typescript@5.9.3)) '@intlify/utils': 0.13.0 '@miyaneee/rollup-plugin-json5': 1.2.0(rollup@4.60.3) - '@nuxt/kit': 3.21.4(magicast@0.5.2) + '@nuxt/kit': 3.21.4(magicast@0.5.3) '@oxc-parser/wasm': 0.60.0 '@rollup/plugin-yaml': 4.1.2(rollup@4.60.3) '@vue/compiler-sfc': 3.5.34 @@ -12071,9 +12152,9 @@ snapshots: '@oxc-minify/binding-linux-x64-musl@0.94.0': optional: true - '@oxc-minify/binding-wasm32-wasi@0.94.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': + '@oxc-minify/binding-wasm32-wasi@0.94.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: - '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -12085,16 +12166,16 @@ snapshots: '@oxc-minify/binding-win32-x64-msvc@0.94.0': optional: true - '@oxc-parser/binding-android-arm-eabi@0.126.0': + '@oxc-parser/binding-android-arm-eabi@0.132.0': optional: true - '@oxc-parser/binding-android-arm64@0.126.0': + '@oxc-parser/binding-android-arm64@0.132.0': optional: true '@oxc-parser/binding-android-arm64@0.94.0': optional: true - '@oxc-parser/binding-darwin-arm64@0.126.0': + '@oxc-parser/binding-darwin-arm64@0.132.0': optional: true '@oxc-parser/binding-darwin-arm64@0.70.0': @@ -12103,7 +12184,7 @@ snapshots: '@oxc-parser/binding-darwin-arm64@0.94.0': optional: true - '@oxc-parser/binding-darwin-x64@0.126.0': + '@oxc-parser/binding-darwin-x64@0.132.0': optional: true '@oxc-parser/binding-darwin-x64@0.70.0': @@ -12112,7 +12193,7 @@ snapshots: '@oxc-parser/binding-darwin-x64@0.94.0': optional: true - '@oxc-parser/binding-freebsd-x64@0.126.0': + '@oxc-parser/binding-freebsd-x64@0.132.0': optional: true '@oxc-parser/binding-freebsd-x64@0.70.0': @@ -12121,7 +12202,7 @@ snapshots: '@oxc-parser/binding-freebsd-x64@0.94.0': optional: true - '@oxc-parser/binding-linux-arm-gnueabihf@0.126.0': + '@oxc-parser/binding-linux-arm-gnueabihf@0.132.0': optional: true '@oxc-parser/binding-linux-arm-gnueabihf@0.70.0': @@ -12130,7 +12211,7 @@ snapshots: '@oxc-parser/binding-linux-arm-gnueabihf@0.94.0': optional: true - '@oxc-parser/binding-linux-arm-musleabihf@0.126.0': + '@oxc-parser/binding-linux-arm-musleabihf@0.132.0': optional: true '@oxc-parser/binding-linux-arm-musleabihf@0.70.0': @@ -12139,7 +12220,7 @@ snapshots: '@oxc-parser/binding-linux-arm-musleabihf@0.94.0': optional: true - '@oxc-parser/binding-linux-arm64-gnu@0.126.0': + '@oxc-parser/binding-linux-arm64-gnu@0.132.0': optional: true '@oxc-parser/binding-linux-arm64-gnu@0.70.0': @@ -12148,7 +12229,7 @@ snapshots: '@oxc-parser/binding-linux-arm64-gnu@0.94.0': optional: true - '@oxc-parser/binding-linux-arm64-musl@0.126.0': + '@oxc-parser/binding-linux-arm64-musl@0.132.0': optional: true '@oxc-parser/binding-linux-arm64-musl@0.70.0': @@ -12157,10 +12238,10 @@ snapshots: '@oxc-parser/binding-linux-arm64-musl@0.94.0': optional: true - '@oxc-parser/binding-linux-ppc64-gnu@0.126.0': + '@oxc-parser/binding-linux-ppc64-gnu@0.132.0': optional: true - '@oxc-parser/binding-linux-riscv64-gnu@0.126.0': + '@oxc-parser/binding-linux-riscv64-gnu@0.132.0': optional: true '@oxc-parser/binding-linux-riscv64-gnu@0.70.0': @@ -12169,10 +12250,10 @@ snapshots: '@oxc-parser/binding-linux-riscv64-gnu@0.94.0': optional: true - '@oxc-parser/binding-linux-riscv64-musl@0.126.0': + '@oxc-parser/binding-linux-riscv64-musl@0.132.0': optional: true - '@oxc-parser/binding-linux-s390x-gnu@0.126.0': + '@oxc-parser/binding-linux-s390x-gnu@0.132.0': optional: true '@oxc-parser/binding-linux-s390x-gnu@0.70.0': @@ -12181,7 +12262,7 @@ snapshots: '@oxc-parser/binding-linux-s390x-gnu@0.94.0': optional: true - '@oxc-parser/binding-linux-x64-gnu@0.126.0': + '@oxc-parser/binding-linux-x64-gnu@0.132.0': optional: true '@oxc-parser/binding-linux-x64-gnu@0.70.0': @@ -12190,7 +12271,7 @@ snapshots: '@oxc-parser/binding-linux-x64-gnu@0.94.0': optional: true - '@oxc-parser/binding-linux-x64-musl@0.126.0': + '@oxc-parser/binding-linux-x64-musl@0.132.0': optional: true '@oxc-parser/binding-linux-x64-musl@0.70.0': @@ -12199,14 +12280,14 @@ snapshots: '@oxc-parser/binding-linux-x64-musl@0.94.0': optional: true - '@oxc-parser/binding-openharmony-arm64@0.126.0': + '@oxc-parser/binding-openharmony-arm64@0.132.0': optional: true - '@oxc-parser/binding-wasm32-wasi@0.126.0': + '@oxc-parser/binding-wasm32-wasi@0.132.0': dependencies: - '@emnapi/core': 1.9.2 - '@emnapi/runtime': 1.9.2 - '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) optional: true '@oxc-parser/binding-wasm32-wasi@0.70.0': @@ -12214,15 +12295,15 @@ snapshots: '@napi-rs/wasm-runtime': 0.2.12 optional: true - '@oxc-parser/binding-wasm32-wasi@0.94.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': + '@oxc-parser/binding-wasm32-wasi@0.94.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: - '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' optional: true - '@oxc-parser/binding-win32-arm64-msvc@0.126.0': + '@oxc-parser/binding-win32-arm64-msvc@0.132.0': optional: true '@oxc-parser/binding-win32-arm64-msvc@0.70.0': @@ -12231,10 +12312,10 @@ snapshots: '@oxc-parser/binding-win32-arm64-msvc@0.94.0': optional: true - '@oxc-parser/binding-win32-ia32-msvc@0.126.0': + '@oxc-parser/binding-win32-ia32-msvc@0.132.0': optional: true - '@oxc-parser/binding-win32-x64-msvc@0.126.0': + '@oxc-parser/binding-win32-x64-msvc@0.132.0': optional: true '@oxc-parser/binding-win32-x64-msvc@0.70.0': @@ -12247,7 +12328,7 @@ snapshots: dependencies: '@oxc-project/types': 0.60.0 - '@oxc-project/types@0.126.0': {} + '@oxc-project/types@0.132.0': {} '@oxc-project/types@0.60.0': {} @@ -12291,9 +12372,9 @@ snapshots: '@oxc-transform/binding-linux-x64-musl@0.94.0': optional: true - '@oxc-transform/binding-wasm32-wasi@0.94.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': + '@oxc-transform/binding-wasm32-wasi@0.94.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: - '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -12375,70 +12456,6 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@pnpm/constants@1001.3.1': {} - - '@pnpm/core-loggers@1001.0.9(@pnpm/logger@1001.0.1)': - dependencies: - '@pnpm/logger': 1001.0.1 - '@pnpm/types': 1001.3.0 - - '@pnpm/error@1000.1.0': - dependencies: - '@pnpm/constants': 1001.3.1 - - '@pnpm/graceful-fs@1000.1.0': - dependencies: - graceful-fs: 4.2.11 - - '@pnpm/logger@1001.0.1': - dependencies: - bole: 5.0.29 - split2: 4.2.0 - - '@pnpm/manifest-utils@1002.0.5(@pnpm/logger@1001.0.1)': - dependencies: - '@pnpm/core-loggers': 1001.0.9(@pnpm/logger@1001.0.1) - '@pnpm/error': 1000.1.0 - '@pnpm/logger': 1001.0.1 - '@pnpm/semver.peer-range': 1000.0.0 - '@pnpm/types': 1001.3.0 - semver: 7.7.4 - - '@pnpm/read-project-manifest@1001.2.6(@pnpm/logger@1001.0.1)': - dependencies: - '@gwhitney/detect-indent': 7.0.1 - '@pnpm/error': 1000.1.0 - '@pnpm/graceful-fs': 1000.1.0 - '@pnpm/logger': 1001.0.1 - '@pnpm/manifest-utils': 1002.0.5(@pnpm/logger@1001.0.1) - '@pnpm/text.comments-parser': 1000.0.0 - '@pnpm/types': 1001.3.0 - '@pnpm/write-project-manifest': 1000.0.16 - fast-deep-equal: 3.1.3 - is-windows: 1.0.2 - json5: 2.2.3 - parse-json: 5.2.0 - read-yaml-file: 2.1.0 - strip-bom: 4.0.0 - - '@pnpm/semver.peer-range@1000.0.0': - dependencies: - semver: 7.7.4 - - '@pnpm/text.comments-parser@1000.0.0': - dependencies: - strip-comments-strings: 1.2.0 - - '@pnpm/types@1001.3.0': {} - - '@pnpm/write-project-manifest@1000.0.16': - dependencies: - '@pnpm/text.comments-parser': 1000.0.0 - '@pnpm/types': 1001.3.0 - json5: 2.2.3 - write-file-atomic: 5.0.1 - write-yaml-file: 5.0.0 - '@polka/url@1.0.0-next.29': {} '@poppinss/colors@4.1.6': @@ -12967,7 +12984,7 @@ snapshots: dependencies: nanoid: 3.3.12 - '@rolldown/debug@1.0.0': {} + '@rolldown/debug@1.0.3': {} '@rolldown/pluginutils@1.0.0': {} @@ -13672,9 +13689,9 @@ snapshots: '@urql/core': 5.2.0 wonka: 6.3.6 - '@valibot/to-json-schema@1.7.0(valibot@1.4.0(typescript@5.9.3))': + '@valibot/to-json-schema@1.7.0(valibot@1.4.1(typescript@5.9.3))': dependencies: - valibot: 1.4.0(typescript@5.9.3) + valibot: 1.4.1(typescript@5.9.3) '@vercel/nft@1.5.0(rollup@4.60.3)': dependencies: @@ -13695,54 +13712,47 @@ snapshots: - rollup - supports-color - '@vitejs/devtools-kit@0.1.21(typescript@5.9.3)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4))': + '@vitejs/devtools-kit@0.3.1(typescript@5.9.3)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4))': dependencies: - ansis: 4.2.0 + '@devframes/hub': 0.5.2(devframe@0.5.2(typescript@5.9.3)) birpc: 4.0.0 - devframe: 0.1.21(typescript@5.9.3) - logs-sdk: 0.0.6 + devframe: 0.5.2(typescript@5.9.3) mlly: 1.8.2 - ohash: 2.0.11 + nostics: 0.2.0 pathe: 2.0.3 perfect-debounce: 2.1.0 - sirv: 3.0.2 - tinyexec: 1.1.2 + tinyexec: 1.2.3 vite: 7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4) transitivePeerDependencies: - '@modelcontextprotocol/sdk' - bufferutil + - crossws - typescript - utf-8-validate - '@vitejs/devtools-rolldown@0.1.21(@pnpm/logger@1001.0.1)(db0@0.3.4(@electric-sql/pglite@0.4.1)(mysql2@3.15.3))(ioredis@5.10.1)(typescript@5.9.3)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4))(vue@3.5.34(typescript@5.9.3))': + '@vitejs/devtools-rolldown@0.3.1(db0@0.3.4(@electric-sql/pglite@0.4.1)(mysql2@3.15.3))(ioredis@5.10.1)(typescript@5.9.3)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4))(vue@3.5.35(typescript@5.9.3))': dependencies: '@floating-ui/dom': 1.7.6 - '@pnpm/read-project-manifest': 1001.2.6(@pnpm/logger@1001.0.1) - '@rolldown/debug': 1.0.0 - '@vitejs/devtools-kit': 0.1.21(typescript@5.9.3)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4)) - ansis: 4.2.0 + '@rolldown/debug': 1.0.3 + '@vitejs/devtools-kit': 0.3.1(typescript@5.9.3)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4)) birpc: 4.0.0 cac: 7.0.0 d3-shape: 3.2.0 - devframe: 0.1.21(typescript@5.9.3) + devframe: 0.5.2(typescript@5.9.3) diff: 9.0.0 get-port-please: 3.2.0 - h3: 1.15.11 - logs-sdk: 0.0.6 + h3: 2.0.1-rc.22 mlly: 1.8.2 mrmime: 2.0.1 - ohash: 2.0.11 + nostics: 0.2.0 p-limit: 7.3.0 pathe: 2.0.3 - publint: 0.3.20 - sirv: 3.0.2 - split2: 4.2.0 - structured-clone-es: 2.0.0 + publint: 0.3.21 tinyglobby: 0.2.16 unconfig: 7.5.0 unstorage: 1.17.5(db0@0.3.4(@electric-sql/pglite@0.4.1)(mysql2@3.15.3))(ioredis@5.10.1) - vue-virtual-scroller: 3.0.3(vue@3.5.34(typescript@5.9.3)) - ws: 8.20.0 + vue-virtual-scroller: 3.0.4(vue@3.5.35(typescript@5.9.3)) + ws: 8.21.0 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -13755,13 +13765,13 @@ snapshots: - '@modelcontextprotocol/sdk' - '@netlify/blobs' - '@planetscale/database' - - '@pnpm/logger' - '@upstash/redis' - '@vercel/blob' - '@vercel/functions' - '@vercel/kv' - aws4fetch - bufferutil + - crossws - db0 - idb-keyval - ioredis @@ -13771,27 +13781,24 @@ snapshots: - vite - vue - '@vitejs/devtools@0.1.21(@pnpm/logger@1001.0.1)(db0@0.3.4(@electric-sql/pglite@0.4.1)(mysql2@3.15.3))(ioredis@5.10.1)(typescript@5.9.3)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4))': + '@vitejs/devtools@0.3.1(db0@0.3.4(@electric-sql/pglite@0.4.1)(mysql2@3.15.3))(ioredis@5.10.1)(typescript@5.9.3)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4))': dependencies: - '@vitejs/devtools-kit': 0.1.21(typescript@5.9.3)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4)) - '@vitejs/devtools-rolldown': 0.1.21(@pnpm/logger@1001.0.1)(db0@0.3.4(@electric-sql/pglite@0.4.1)(mysql2@3.15.3))(ioredis@5.10.1)(typescript@5.9.3)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4))(vue@3.5.34(typescript@5.9.3)) + '@devframes/hub': 0.5.2(devframe@0.5.2(typescript@5.9.3)) + '@vitejs/devtools-kit': 0.3.1(typescript@5.9.3)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4)) + '@vitejs/devtools-rolldown': 0.3.1(db0@0.3.4(@electric-sql/pglite@0.4.1)(mysql2@3.15.3))(ioredis@5.10.1)(typescript@5.9.3)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4))(vue@3.5.35(typescript@5.9.3)) birpc: 4.0.0 cac: 7.0.0 - devframe: 0.1.21(typescript@5.9.3) - h3: 1.15.11 - immer: 11.1.7 - launch-editor: 2.13.2 - logs-sdk: 0.0.6 + devframe: 0.5.2(typescript@5.9.3) + h3: 2.0.1-rc.22 mlly: 1.8.2 + nostics: 0.2.0 obug: 2.1.1 - open: 11.0.0 pathe: 2.0.3 perfect-debounce: 2.1.0 - sirv: 3.0.2 - tinyexec: 1.1.2 + tinyexec: 1.2.3 vite: 7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4) - vue: 3.5.34(typescript@5.9.3) - ws: 8.20.0 + vue: 3.5.35(typescript@5.9.3) + ws: 8.21.0 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -13804,13 +13811,13 @@ snapshots: - '@modelcontextprotocol/sdk' - '@netlify/blobs' - '@planetscale/database' - - '@pnpm/logger' - '@upstash/redis' - '@vercel/blob' - '@vercel/functions' - '@vercel/kv' - aws4fetch - bufferutil + - crossws - db0 - idb-keyval - ioredis @@ -13958,11 +13965,24 @@ snapshots: estree-walker: 2.0.2 source-map-js: 1.2.1 + '@vue/compiler-core@3.5.35': + dependencies: + '@babel/parser': 7.29.3 + '@vue/shared': 3.5.35 + entities: 7.0.1 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + '@vue/compiler-dom@3.5.34': dependencies: '@vue/compiler-core': 3.5.34 '@vue/shared': 3.5.34 + '@vue/compiler-dom@3.5.35': + dependencies: + '@vue/compiler-core': 3.5.35 + '@vue/shared': 3.5.35 + '@vue/compiler-sfc@3.5.34': dependencies: '@babel/parser': 7.29.3 @@ -13975,11 +13995,28 @@ snapshots: postcss: 8.5.14 source-map-js: 1.2.1 + '@vue/compiler-sfc@3.5.35': + dependencies: + '@babel/parser': 7.29.3 + '@vue/compiler-core': 3.5.35 + '@vue/compiler-dom': 3.5.35 + '@vue/compiler-ssr': 3.5.35 + '@vue/shared': 3.5.35 + estree-walker: 2.0.2 + magic-string: 0.30.21 + postcss: 8.5.15 + source-map-js: 1.2.1 + '@vue/compiler-ssr@3.5.34': dependencies: '@vue/compiler-dom': 3.5.34 '@vue/shared': 3.5.34 + '@vue/compiler-ssr@3.5.35': + dependencies: + '@vue/compiler-dom': 3.5.35 + '@vue/shared': 3.5.35 + '@vue/devtools-api@6.6.4': {} '@vue/devtools-core@7.7.9(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4))(vue@3.5.34(typescript@5.9.3))': @@ -14037,11 +14074,20 @@ snapshots: dependencies: '@vue/shared': 3.5.34 + '@vue/reactivity@3.5.35': + dependencies: + '@vue/shared': 3.5.35 + '@vue/runtime-core@3.5.34': dependencies: '@vue/reactivity': 3.5.34 '@vue/shared': 3.5.34 + '@vue/runtime-core@3.5.35': + dependencies: + '@vue/reactivity': 3.5.35 + '@vue/shared': 3.5.35 + '@vue/runtime-dom@3.5.34': dependencies: '@vue/reactivity': 3.5.34 @@ -14049,14 +14095,29 @@ snapshots: '@vue/shared': 3.5.34 csstype: 3.2.3 + '@vue/runtime-dom@3.5.35': + dependencies: + '@vue/reactivity': 3.5.35 + '@vue/runtime-core': 3.5.35 + '@vue/shared': 3.5.35 + csstype: 3.2.3 + '@vue/server-renderer@3.5.34(vue@3.5.34(typescript@5.9.3))': dependencies: '@vue/compiler-ssr': 3.5.34 '@vue/shared': 3.5.34 vue: 3.5.34(typescript@5.9.3) + '@vue/server-renderer@3.5.35(vue@3.5.35(typescript@5.9.3))': + dependencies: + '@vue/compiler-ssr': 3.5.35 + '@vue/shared': 3.5.35 + vue: 3.5.35(typescript@5.9.3) + '@vue/shared@3.5.34': {} + '@vue/shared@3.5.35': {} + '@vueuse/core@10.11.1(vue@3.5.34(typescript@5.9.3))': dependencies: '@types/web-bluetooth': 0.0.20 @@ -14095,7 +14156,7 @@ snapshots: '@vueuse/metadata@14.3.0': {} - '@vueuse/motion@3.0.3(magicast@0.5.2)(vue@3.5.34(typescript@5.9.3))': + '@vueuse/motion@3.0.3(magicast@0.5.3)(vue@3.5.34(typescript@5.9.3))': dependencies: '@vueuse/core': 13.9.0(vue@3.5.34(typescript@5.9.3)) '@vueuse/shared': 13.9.0(vue@3.5.34(typescript@5.9.3)) @@ -14105,17 +14166,17 @@ snapshots: style-value-types: 5.1.2 vue: 3.5.34(typescript@5.9.3) optionalDependencies: - '@nuxt/kit': 3.21.4(magicast@0.5.2) + '@nuxt/kit': 3.21.4(magicast@0.5.3) transitivePeerDependencies: - magicast - '@vueuse/nuxt@14.3.0(magicast@0.5.2)(nuxt@4.1.3(@electric-sql/pglite@0.4.1)(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@parcel/watcher@2.5.6)(@types/node@22.19.17)(@vue/compiler-sfc@3.5.34)(cac@6.7.14)(db0@0.3.4(@electric-sql/pglite@0.4.1)(mysql2@3.15.3))(eslint@10.3.0(jiti@2.7.0))(ioredis@5.10.1)(lightningcss@1.32.0)(magicast@0.5.2)(mysql2@3.15.3)(optionator@0.9.4)(rollup@4.60.3)(terser@5.46.2)(typescript@5.9.3)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4))(yaml@2.8.4))(vue@3.5.34(typescript@5.9.3))': + '@vueuse/nuxt@14.3.0(magicast@0.5.3)(nuxt@4.1.3(@electric-sql/pglite@0.4.1)(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@parcel/watcher@2.5.6)(@types/node@22.19.17)(@vue/compiler-sfc@3.5.35)(cac@6.7.14)(db0@0.3.4(@electric-sql/pglite@0.4.1)(mysql2@3.15.3))(eslint@10.3.0(jiti@2.7.0))(ioredis@5.10.1)(lightningcss@1.32.0)(magicast@0.5.3)(mysql2@3.15.3)(optionator@0.9.4)(rollup@4.60.3)(terser@5.46.2)(typescript@5.9.3)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4))(yaml@2.8.4))(vue@3.5.34(typescript@5.9.3))': dependencies: - '@nuxt/kit': 4.4.4(magicast@0.5.2) + '@nuxt/kit': 4.4.4(magicast@0.5.3) '@vueuse/core': 14.3.0(vue@3.5.34(typescript@5.9.3)) '@vueuse/metadata': 14.3.0 local-pkg: 1.1.2 - nuxt: 4.1.3(@electric-sql/pglite@0.4.1)(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@parcel/watcher@2.5.6)(@types/node@22.19.17)(@vue/compiler-sfc@3.5.34)(cac@6.7.14)(db0@0.3.4(@electric-sql/pglite@0.4.1)(mysql2@3.15.3))(eslint@10.3.0(jiti@2.7.0))(ioredis@5.10.1)(lightningcss@1.32.0)(magicast@0.5.2)(mysql2@3.15.3)(optionator@0.9.4)(rollup@4.60.3)(terser@5.46.2)(typescript@5.9.3)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4))(yaml@2.8.4) + nuxt: 4.1.3(@electric-sql/pglite@0.4.1)(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@parcel/watcher@2.5.6)(@types/node@22.19.17)(@vue/compiler-sfc@3.5.35)(cac@6.7.14)(db0@0.3.4(@electric-sql/pglite@0.4.1)(mysql2@3.15.3))(eslint@10.3.0(jiti@2.7.0))(ioredis@5.10.1)(lightningcss@1.32.0)(magicast@0.5.3)(mysql2@3.15.3)(optionator@0.9.4)(rollup@4.60.3)(terser@5.46.2)(typescript@5.9.3)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4))(yaml@2.8.4) vue: 3.5.34(typescript@5.9.3) transitivePeerDependencies: - magicast @@ -14214,6 +14275,8 @@ snapshots: ansis@4.2.0: {} + ansis@4.3.0: {} + any-promise@1.3.0: {} anymatch@3.1.3: @@ -14514,11 +14577,6 @@ snapshots: blob-to-buffer@1.2.9: {} - bole@5.0.29: - dependencies: - fast-safe-stringify: 2.1.1 - individual: 3.0.0 - boolbase@1.0.0: {} bplist-creator@0.1.0: @@ -14620,6 +14678,23 @@ snapshots: optionalDependencies: magicast: 0.5.2 + c12@3.3.4(magicast@0.5.3): + dependencies: + chokidar: 5.0.0 + confbox: 0.2.4 + defu: 6.1.7 + dotenv: 17.4.2 + exsolve: 1.0.8 + giget: 3.2.0 + jiti: 2.7.0 + ohash: 2.0.11 + pathe: 2.0.3 + perfect-debounce: 2.1.0 + pkg-types: 2.3.1 + rc9: 3.0.1 + optionalDependencies: + magicast: 0.5.3 + cac@6.7.14: {} cac@7.0.0: {} @@ -15074,24 +15149,20 @@ snapshots: devalue@5.8.0: {} - devframe@0.1.21(typescript@5.9.3): + devframe@0.5.2(typescript@5.9.3): dependencies: - '@valibot/to-json-schema': 1.7.0(valibot@1.4.0(typescript@5.9.3)) - ansis: 4.2.0 + '@valibot/to-json-schema': 1.7.0(valibot@1.4.1(typescript@5.9.3)) birpc: 4.0.0 cac: 7.0.0 - h3: 1.15.11 - immer: 11.1.7 - launch-editor: 2.13.2 - logs-sdk: 0.0.6 - ohash: 2.0.11 + h3: 2.0.1-rc.22 + mrmime: 2.0.1 + nostics: 0.2.0 pathe: 2.0.3 - sirv: 3.0.2 - structured-clone-es: 2.0.0 - valibot: 1.4.0(typescript@5.9.3) - ws: 8.20.0 + valibot: 1.4.1(typescript@5.9.3) + ws: 8.21.0 transitivePeerDependencies: - bufferutil + - crossws - typescript - utf-8-validate @@ -15223,9 +15294,7 @@ snapshots: env-paths@3.0.0: {} - error-ex@1.3.4: - dependencies: - is-arrayish: 0.2.1 + err-code@2.0.3: {} error-stack-parser-es@1.0.5: {} @@ -15727,6 +15796,12 @@ snapshots: - '@types/react-dom' - supports-color + expo-server-sdk@6.1.0: + dependencies: + promise-limit: 2.7.0 + promise-retry: 2.0.1 + undici: 7.26.0 + expo-server@1.0.6: {} expo-speech@14.0.8(expo@54.0.34): @@ -15820,9 +15895,7 @@ snapshots: fast-npm-meta@0.4.8: {} - fast-npm-meta@1.5.1: {} - - fast-safe-stringify@2.1.1: {} + fast-npm-meta@2.0.0: {} fast-string-truncated-width@3.0.3: {} @@ -16161,6 +16234,11 @@ snapshots: ufo: 1.6.4 uncrypto: 0.1.3 + h3@2.0.1-rc.22: + dependencies: + rou3: 0.8.1 + srvx: 0.11.15 + has-flag@3.0.0: {} has-flag@4.0.0: {} @@ -16289,7 +16367,8 @@ snapshots: pino: 10.3.1 socks: 2.8.8 - immer@11.1.7: {} + immer@11.1.7: + optional: true import-meta-resolve@4.2.0: {} @@ -16303,8 +16382,6 @@ snapshots: imurmurhash@0.1.4: {} - individual@3.0.0: {} - inflight@1.0.6: dependencies: once: 1.4.0 @@ -16386,8 +16463,6 @@ snapshots: call-bound: 1.0.4 has-tostringtag: 1.0.2 - is-arrayish@0.2.1: {} - is-arrayish@0.3.4: {} is-binary-path@2.1.0: @@ -16467,8 +16542,6 @@ snapshots: is-what@5.5.0: {} - is-windows@1.0.2: {} - is-wsl@2.2.0: dependencies: is-docker: 2.2.1 @@ -16623,8 +16696,6 @@ snapshots: 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: {} @@ -16823,6 +16894,12 @@ snapshots: pkg-types: 2.3.1 quansync: 0.2.11 + local-pkg@1.2.1: + dependencies: + mlly: 1.8.2 + pkg-types: 2.3.1 + quansync: 0.2.11 + locate-path@5.0.0: dependencies: p-locate: 4.1.0 @@ -16849,12 +16926,6 @@ snapshots: dependencies: chalk: 2.4.2 - logs-sdk@0.0.6: - dependencies: - magic-string: 0.30.21 - oxc-parser: 0.126.0 - unplugin: 3.0.0 - long@5.3.2: {} loose-envify@1.4.0: @@ -16912,6 +16983,12 @@ snapshots: '@babel/types': 7.29.0 source-map-js: 1.2.1 + magicast@0.5.3: + dependencies: + '@babel/parser': 7.29.3 + '@babel/types': 7.29.0 + source-map-js: 1.2.1 + make-dir@4.0.0: dependencies: semver: 7.7.4 @@ -17272,7 +17349,7 @@ snapshots: nested-error-stacks@2.0.1: {} - nitropack@2.13.4(@electric-sql/pglite@0.4.1)(mysql2@3.15.3)(oxc-parser@0.126.0): + nitropack@2.13.4(@electric-sql/pglite@0.4.1)(mysql2@3.15.3)(oxc-parser@0.132.0): dependencies: '@cloudflare/kv-asset-handler': 0.4.2 '@rollup/plugin-alias': 6.0.0(rollup@4.60.3) @@ -17337,7 +17414,7 @@ snapshots: uncrypto: 0.1.3 unctx: 2.5.0 unenv: 2.0.0-rc.24 - unimport: 6.2.0(oxc-parser@0.126.0) + unimport: 6.2.0(oxc-parser@0.132.0) unplugin-utils: 0.3.1 unstorage: 1.17.5(db0@0.3.4(@electric-sql/pglite@0.4.1)(mysql2@3.15.3))(ioredis@5.10.1) untyped: 2.0.0 @@ -17376,7 +17453,7 @@ snapshots: - supports-color - uploadthing - nitropack@2.13.4(@electric-sql/pglite@0.4.1)(mysql2@3.15.3)(oxc-parser@0.94.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)): + nitropack@2.13.4(@electric-sql/pglite@0.4.1)(mysql2@3.15.3)(oxc-parser@0.94.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)): dependencies: '@cloudflare/kv-asset-handler': 0.4.2 '@rollup/plugin-alias': 6.0.0(rollup@4.60.3) @@ -17441,7 +17518,7 @@ snapshots: uncrypto: 0.1.3 unctx: 2.5.0 unenv: 2.0.0-rc.24 - unimport: 6.2.0(oxc-parser@0.94.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)) + unimport: 6.2.0(oxc-parser@0.94.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)) unplugin-utils: 0.3.1 unstorage: 1.17.5(db0@0.3.4(@electric-sql/pglite@0.4.1)(mysql2@3.15.3))(ioredis@5.10.1) untyped: 2.0.0 @@ -17516,6 +17593,12 @@ snapshots: normalize-path@3.0.0: {} + nostics@0.2.0: + dependencies: + magic-string: 0.30.21 + oxc-parser: 0.132.0 + unplugin: 3.0.0 + npm-package-arg@11.0.3: dependencies: hosted-git-info: 7.0.2 @@ -17538,18 +17621,18 @@ snapshots: nullthrows@1.1.1: {} - nuxt@4.1.3(@electric-sql/pglite@0.4.1)(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@parcel/watcher@2.5.6)(@types/node@22.19.17)(@vue/compiler-sfc@3.5.34)(cac@6.7.14)(db0@0.3.4(@electric-sql/pglite@0.4.1)(mysql2@3.15.3))(eslint@10.3.0(jiti@2.7.0))(ioredis@5.10.1)(lightningcss@1.32.0)(magicast@0.5.2)(mysql2@3.15.3)(optionator@0.9.4)(rollup@4.60.3)(terser@5.46.2)(typescript@5.9.3)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4))(yaml@2.8.4): + nuxt@4.1.3(@electric-sql/pglite@0.4.1)(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@parcel/watcher@2.5.6)(@types/node@22.19.17)(@vue/compiler-sfc@3.5.35)(cac@6.7.14)(db0@0.3.4(@electric-sql/pglite@0.4.1)(mysql2@3.15.3))(eslint@10.3.0(jiti@2.7.0))(ioredis@5.10.1)(lightningcss@1.32.0)(magicast@0.5.3)(mysql2@3.15.3)(optionator@0.9.4)(rollup@4.60.3)(terser@5.46.2)(typescript@5.9.3)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4))(yaml@2.8.4): dependencies: - '@nuxt/cli': 3.35.1(@nuxt/schema@4.1.3)(cac@6.7.14)(magicast@0.5.2) + '@nuxt/cli': 3.35.1(@nuxt/schema@4.1.3)(cac@6.7.14)(magicast@0.5.3) '@nuxt/devalue': 2.0.2 '@nuxt/devtools': 2.7.0(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4))(vue@3.5.34(typescript@5.9.3)) - '@nuxt/kit': 4.1.3(magicast@0.5.2) + '@nuxt/kit': 4.1.3(magicast@0.5.3) '@nuxt/schema': 4.1.3 - '@nuxt/telemetry': 2.8.0(@nuxt/kit@4.1.3(magicast@0.5.2)) - '@nuxt/vite-builder': 4.1.3(@types/node@22.19.17)(eslint@10.3.0(jiti@2.7.0))(lightningcss@1.32.0)(magicast@0.5.2)(optionator@0.9.4)(rollup@4.60.3)(terser@5.46.2)(typescript@5.9.3)(vue@3.5.34(typescript@5.9.3))(yaml@2.8.4) + '@nuxt/telemetry': 2.8.0(@nuxt/kit@4.1.3(magicast@0.5.3)) + '@nuxt/vite-builder': 4.1.3(@types/node@22.19.17)(eslint@10.3.0(jiti@2.7.0))(lightningcss@1.32.0)(magicast@0.5.3)(optionator@0.9.4)(rollup@4.60.3)(terser@5.46.2)(typescript@5.9.3)(vue@3.5.34(typescript@5.9.3))(yaml@2.8.4) '@unhead/vue': 2.1.13(vue@3.5.34(typescript@5.9.3)) '@vue/shared': 3.5.34 - c12: 3.3.4(magicast@0.5.2) + c12: 3.3.4(magicast@0.5.3) chokidar: 4.0.3 compatx: 0.2.0 consola: 3.4.2 @@ -17573,15 +17656,15 @@ snapshots: mlly: 1.8.2 mocked-exports: 0.1.1 nanotar: 0.2.1 - nitropack: 2.13.4(@electric-sql/pglite@0.4.1)(mysql2@3.15.3)(oxc-parser@0.94.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)) + nitropack: 2.13.4(@electric-sql/pglite@0.4.1)(mysql2@3.15.3)(oxc-parser@0.94.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)) nypm: 0.6.6 ofetch: 1.5.1 ohash: 2.0.11 on-change: 6.0.2 - oxc-minify: 0.94.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) - oxc-parser: 0.94.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) - oxc-transform: 0.94.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) - oxc-walker: 0.5.2(oxc-parser@0.94.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)) + oxc-minify: 0.94.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + oxc-parser: 0.94.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + oxc-transform: 0.94.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + oxc-walker: 0.5.2(oxc-parser@0.94.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)) pathe: 2.0.3 perfect-debounce: 2.1.0 pkg-types: 2.3.1 @@ -17596,7 +17679,7 @@ snapshots: unctx: 2.5.0 unimport: 5.7.0 unplugin: 2.3.11 - unplugin-vue-router: 0.15.0(@vue/compiler-sfc@3.5.34)(vue-router@4.6.4(vue@3.5.34(typescript@5.9.3)))(vue@3.5.34(typescript@5.9.3)) + unplugin-vue-router: 0.15.0(@vue/compiler-sfc@3.5.35)(vue-router@4.6.4(vue@3.5.34(typescript@5.9.3)))(vue@3.5.34(typescript@5.9.3)) unstorage: 1.17.5(db0@0.3.4(@electric-sql/pglite@0.4.1)(mysql2@3.15.3))(ioredis@5.10.1) untyped: 2.0.0 vue: 3.5.34(typescript@5.9.3) @@ -17766,7 +17849,7 @@ snapshots: is-docker: 2.2.1 is-wsl: 2.2.0 - openai@4.104.0(ws@8.20.0)(zod@3.25.76): + openai@4.104.0(ws@8.21.0)(zod@3.25.76): dependencies: '@types/node': 18.19.130 '@types/node-fetch': 2.6.13 @@ -17776,7 +17859,7 @@ snapshots: formdata-node: 4.4.1 node-fetch: 2.7.0 optionalDependencies: - ws: 8.20.0 + ws: 8.21.0 zod: 3.25.76 transitivePeerDependencies: - encoding @@ -17801,7 +17884,7 @@ snapshots: orderedmap@2.1.1: {} - oxc-minify@0.94.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2): + oxc-minify@0.94.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0): optionalDependencies: '@oxc-minify/binding-android-arm64': 0.94.0 '@oxc-minify/binding-darwin-arm64': 0.94.0 @@ -17815,37 +17898,37 @@ snapshots: '@oxc-minify/binding-linux-s390x-gnu': 0.94.0 '@oxc-minify/binding-linux-x64-gnu': 0.94.0 '@oxc-minify/binding-linux-x64-musl': 0.94.0 - '@oxc-minify/binding-wasm32-wasi': 0.94.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + '@oxc-minify/binding-wasm32-wasi': 0.94.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) '@oxc-minify/binding-win32-arm64-msvc': 0.94.0 '@oxc-minify/binding-win32-x64-msvc': 0.94.0 transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' - oxc-parser@0.126.0: + oxc-parser@0.132.0: dependencies: - '@oxc-project/types': 0.126.0 + '@oxc-project/types': 0.132.0 optionalDependencies: - '@oxc-parser/binding-android-arm-eabi': 0.126.0 - '@oxc-parser/binding-android-arm64': 0.126.0 - '@oxc-parser/binding-darwin-arm64': 0.126.0 - '@oxc-parser/binding-darwin-x64': 0.126.0 - '@oxc-parser/binding-freebsd-x64': 0.126.0 - '@oxc-parser/binding-linux-arm-gnueabihf': 0.126.0 - '@oxc-parser/binding-linux-arm-musleabihf': 0.126.0 - '@oxc-parser/binding-linux-arm64-gnu': 0.126.0 - '@oxc-parser/binding-linux-arm64-musl': 0.126.0 - '@oxc-parser/binding-linux-ppc64-gnu': 0.126.0 - '@oxc-parser/binding-linux-riscv64-gnu': 0.126.0 - '@oxc-parser/binding-linux-riscv64-musl': 0.126.0 - '@oxc-parser/binding-linux-s390x-gnu': 0.126.0 - '@oxc-parser/binding-linux-x64-gnu': 0.126.0 - '@oxc-parser/binding-linux-x64-musl': 0.126.0 - '@oxc-parser/binding-openharmony-arm64': 0.126.0 - '@oxc-parser/binding-wasm32-wasi': 0.126.0 - '@oxc-parser/binding-win32-arm64-msvc': 0.126.0 - '@oxc-parser/binding-win32-ia32-msvc': 0.126.0 - '@oxc-parser/binding-win32-x64-msvc': 0.126.0 + '@oxc-parser/binding-android-arm-eabi': 0.132.0 + '@oxc-parser/binding-android-arm64': 0.132.0 + '@oxc-parser/binding-darwin-arm64': 0.132.0 + '@oxc-parser/binding-darwin-x64': 0.132.0 + '@oxc-parser/binding-freebsd-x64': 0.132.0 + '@oxc-parser/binding-linux-arm-gnueabihf': 0.132.0 + '@oxc-parser/binding-linux-arm-musleabihf': 0.132.0 + '@oxc-parser/binding-linux-arm64-gnu': 0.132.0 + '@oxc-parser/binding-linux-arm64-musl': 0.132.0 + '@oxc-parser/binding-linux-ppc64-gnu': 0.132.0 + '@oxc-parser/binding-linux-riscv64-gnu': 0.132.0 + '@oxc-parser/binding-linux-riscv64-musl': 0.132.0 + '@oxc-parser/binding-linux-s390x-gnu': 0.132.0 + '@oxc-parser/binding-linux-x64-gnu': 0.132.0 + '@oxc-parser/binding-linux-x64-musl': 0.132.0 + '@oxc-parser/binding-openharmony-arm64': 0.132.0 + '@oxc-parser/binding-wasm32-wasi': 0.132.0 + '@oxc-parser/binding-win32-arm64-msvc': 0.132.0 + '@oxc-parser/binding-win32-ia32-msvc': 0.132.0 + '@oxc-parser/binding-win32-x64-msvc': 0.132.0 oxc-parser@0.70.0: dependencies: @@ -17866,7 +17949,7 @@ snapshots: '@oxc-parser/binding-win32-arm64-msvc': 0.70.0 '@oxc-parser/binding-win32-x64-msvc': 0.70.0 - oxc-parser@0.94.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2): + oxc-parser@0.94.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0): dependencies: '@oxc-project/types': 0.94.0 optionalDependencies: @@ -17882,14 +17965,14 @@ snapshots: '@oxc-parser/binding-linux-s390x-gnu': 0.94.0 '@oxc-parser/binding-linux-x64-gnu': 0.94.0 '@oxc-parser/binding-linux-x64-musl': 0.94.0 - '@oxc-parser/binding-wasm32-wasi': 0.94.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + '@oxc-parser/binding-wasm32-wasi': 0.94.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) '@oxc-parser/binding-win32-arm64-msvc': 0.94.0 '@oxc-parser/binding-win32-x64-msvc': 0.94.0 transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' - oxc-transform@0.94.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2): + oxc-transform@0.94.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0): optionalDependencies: '@oxc-transform/binding-android-arm64': 0.94.0 '@oxc-transform/binding-darwin-arm64': 0.94.0 @@ -17903,17 +17986,17 @@ snapshots: '@oxc-transform/binding-linux-s390x-gnu': 0.94.0 '@oxc-transform/binding-linux-x64-gnu': 0.94.0 '@oxc-transform/binding-linux-x64-musl': 0.94.0 - '@oxc-transform/binding-wasm32-wasi': 0.94.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + '@oxc-transform/binding-wasm32-wasi': 0.94.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) '@oxc-transform/binding-win32-arm64-msvc': 0.94.0 '@oxc-transform/binding-win32-x64-msvc': 0.94.0 transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' - oxc-walker@0.5.2(oxc-parser@0.94.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)): + oxc-walker@0.5.2(oxc-parser@0.94.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)): dependencies: magic-regexp: 0.10.0 - oxc-parser: 0.94.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + oxc-parser: 0.94.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) p-limit@2.3.0: dependencies: @@ -17943,13 +18026,6 @@ snapshots: pako@0.2.9: {} - parse-json@5.2.0: - dependencies: - '@babel/code-frame': 7.29.0 - error-ex: 1.3.4 - json-parse-even-better-errors: 2.3.1 - lines-and-columns: 1.2.4 - parse-png@2.1.0: dependencies: pngjs: 3.4.0 @@ -18289,6 +18365,12 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + postcss@8.5.15: + dependencies: + nanoid: 3.3.12 + picocolors: 1.1.1 + source-map-js: 1.2.1 + postgres-array@2.0.0: {} postgres-array@3.0.4: {} @@ -18362,6 +18444,13 @@ snapshots: progress@2.0.3: {} + promise-limit@2.7.0: {} + + promise-retry@2.0.1: + dependencies: + err-code: 2.0.3 + retry: 0.12.0 + promise@8.3.0: dependencies: asap: 2.0.6 @@ -18446,7 +18535,7 @@ snapshots: prosemirror-state: 1.4.4 prosemirror-transform: 1.12.0 - publint@0.3.20: + publint@0.3.21: dependencies: '@publint/pack': 0.1.4 package-manager-detector: 1.6.0 @@ -18741,11 +18830,6 @@ snapshots: dependencies: pify: 2.3.0 - read-yaml-file@2.1.0: - dependencies: - js-yaml: 4.1.1 - strip-bom: 4.0.0 - readable-stream@2.3.8: dependencies: core-util-is: 1.0.3 @@ -18941,6 +19025,8 @@ snapshots: rope-sequence@1.3.4: {} + rou3@0.8.1: {} + rtl-detect@1.1.2: {} run-applescript@7.1.0: {} @@ -18985,6 +19071,8 @@ snapshots: semver@7.7.4: {} + semver@7.8.1: {} + send@0.19.2: dependencies: debug: 2.6.9 @@ -19277,10 +19365,6 @@ snapshots: dependencies: ansi-regex: 6.2.2 - strip-bom@4.0.0: {} - - strip-comments-strings@1.2.0: {} - strip-final-newline@3.0.0: {} strip-json-comments@2.0.1: {} @@ -19521,6 +19605,8 @@ snapshots: tinyexec@1.1.2: {} + tinyexec@1.2.3: {} + tinyglobby@0.2.16: dependencies: fdir: 6.5.0(picomatch@4.0.4) @@ -19622,6 +19708,8 @@ snapshots: undici@6.25.0: {} + undici@7.26.0: {} + unenv@2.0.0-rc.24: dependencies: pathe: 2.0.3 @@ -19683,7 +19771,7 @@ snapshots: unplugin: 2.3.11 unplugin-utils: 0.3.1 - unimport@6.2.0(oxc-parser@0.126.0): + unimport@6.2.0(oxc-parser@0.132.0): dependencies: acorn: 8.16.0 escape-string-regexp: 5.0.0 @@ -19700,9 +19788,9 @@ snapshots: unplugin: 3.0.0 unplugin-utils: 0.3.1 optionalDependencies: - oxc-parser: 0.126.0 + oxc-parser: 0.132.0 - unimport@6.2.0(oxc-parser@0.94.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)): + unimport@6.2.0(oxc-parser@0.94.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)): dependencies: acorn: 8.16.0 escape-string-regexp: 5.0.0 @@ -19719,11 +19807,11 @@ snapshots: unplugin: 3.0.0 unplugin-utils: 0.3.1 optionalDependencies: - oxc-parser: 0.94.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + oxc-parser: 0.94.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) unpipe@1.0.0: {} - unplugin-auto-import@21.0.0(@nuxt/kit@4.4.4(magicast@0.5.2))(@vueuse/core@14.3.0(vue@3.5.34(typescript@5.9.3))): + unplugin-auto-import@21.0.0(@nuxt/kit@4.4.4(magicast@0.5.3))(@vueuse/core@14.3.0(vue@3.5.34(typescript@5.9.3))): dependencies: local-pkg: 1.1.2 magic-string: 0.30.21 @@ -19732,7 +19820,7 @@ snapshots: unplugin: 2.3.11 unplugin-utils: 0.3.1 optionalDependencies: - '@nuxt/kit': 4.4.4(magicast@0.5.2) + '@nuxt/kit': 4.4.4(magicast@0.5.3) '@vueuse/core': 14.3.0(vue@3.5.34(typescript@5.9.3)) unplugin-utils@0.2.5: @@ -19745,7 +19833,7 @@ snapshots: pathe: 2.0.3 picomatch: 4.0.4 - unplugin-vue-components@32.0.0(@nuxt/kit@4.4.4(magicast@0.5.2))(vue@3.5.34(typescript@5.9.3)): + unplugin-vue-components@32.0.0(@nuxt/kit@4.4.4(magicast@0.5.3))(vue@3.5.34(typescript@5.9.3)): dependencies: chokidar: 5.0.0 local-pkg: 1.1.2 @@ -19758,7 +19846,7 @@ snapshots: unplugin-utils: 0.3.1 vue: 3.5.34(typescript@5.9.3) optionalDependencies: - '@nuxt/kit': 4.4.4(magicast@0.5.2) + '@nuxt/kit': 4.4.4(magicast@0.5.3) unplugin-vue-router@0.12.0(vue-router@4.6.4(vue@3.5.34(typescript@5.9.3)))(vue@3.5.34(typescript@5.9.3)): dependencies: @@ -19782,10 +19870,10 @@ snapshots: transitivePeerDependencies: - vue - unplugin-vue-router@0.15.0(@vue/compiler-sfc@3.5.34)(vue-router@4.6.4(vue@3.5.34(typescript@5.9.3)))(vue@3.5.34(typescript@5.9.3)): + unplugin-vue-router@0.15.0(@vue/compiler-sfc@3.5.35)(vue-router@4.6.4(vue@3.5.34(typescript@5.9.3)))(vue@3.5.34(typescript@5.9.3)): dependencies: '@vue-macros/common': 3.0.0-beta.16(vue@3.5.34(typescript@5.9.3)) - '@vue/compiler-sfc': 3.5.34 + '@vue/compiler-sfc': 3.5.35 '@vue/language-core': 3.2.8 ast-walker-scope: 0.8.3 chokidar: 4.0.3 @@ -19918,7 +20006,7 @@ snapshots: optionalDependencies: typescript: 5.8.3 - valibot@1.4.0(typescript@5.9.3): + valibot@1.4.1(typescript@5.9.3): optionalDependencies: typescript: 5.9.3 @@ -20025,10 +20113,10 @@ snapshots: transitivePeerDependencies: - supports-color - vite-plugin-inspect@12.0.0-beta.1(@nuxt/kit@4.4.4(magicast@0.5.2))(typescript@5.9.3)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4)): + vite-plugin-inspect@12.0.0-beta.3(@nuxt/kit@4.4.6(magicast@0.5.3))(typescript@5.9.3)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4)): dependencies: - '@vitejs/devtools-kit': 0.1.21(typescript@5.9.3)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4)) - ansis: 4.2.0 + '@vitejs/devtools-kit': 0.3.1(typescript@5.9.3)(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4)) + ansis: 4.3.0 error-stack-parser-es: 1.0.5 obug: 2.1.1 ohash: 2.0.11 @@ -20038,10 +20126,11 @@ snapshots: unplugin-utils: 0.3.1 vite: 7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4) optionalDependencies: - '@nuxt/kit': 4.4.4(magicast@0.5.2) + '@nuxt/kit': 4.4.6(magicast@0.5.3) transitivePeerDependencies: - '@modelcontextprotocol/sdk' - bufferutil + - crossws - typescript - utf-8-validate @@ -20055,6 +20144,16 @@ snapshots: vite: 7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4) vue: 3.5.34(typescript@5.9.3) + vite-plugin-vue-tracer@1.4.0(vite@7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4))(vue@3.5.34(typescript@5.9.3)): + dependencies: + estree-walker: 3.0.3 + exsolve: 1.0.8 + magic-string: 0.30.21 + pathe: 2.0.3 + source-map-js: 1.2.1 + vite: 7.3.3(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(yaml@2.8.4) + vue: 3.5.34(typescript@5.9.3) + vite@5.4.21(@types/node@22.19.17)(lightningcss@1.32.0)(terser@5.46.2): dependencies: esbuild: 0.21.5 @@ -20152,9 +20251,9 @@ snapshots: '@vue/devtools-api': 6.6.4 vue: 3.5.34(typescript@5.9.3) - vue-virtual-scroller@3.0.3(vue@3.5.34(typescript@5.9.3)): + vue-virtual-scroller@3.0.4(vue@3.5.35(typescript@5.9.3)): dependencies: - vue: 3.5.34(typescript@5.9.3) + vue: 3.5.35(typescript@5.9.3) vue@3.5.34(typescript@5.9.3): dependencies: @@ -20166,6 +20265,16 @@ snapshots: optionalDependencies: typescript: 5.9.3 + vue@3.5.35(typescript@5.9.3): + dependencies: + '@vue/compiler-dom': 3.5.35 + '@vue/compiler-sfc': 3.5.35 + '@vue/runtime-dom': 3.5.35 + '@vue/server-renderer': 3.5.35(vue@3.5.35(typescript@5.9.3)) + '@vue/shared': 3.5.35 + optionalDependencies: + typescript: 5.9.3 + w3c-keyname@2.2.8: {} walker@1.0.8: @@ -20219,7 +20328,7 @@ snapshots: dependencies: isexe: 3.1.5 - which@6.0.1: + which@7.0.0: dependencies: isexe: 4.0.0 @@ -20257,16 +20366,6 @@ snapshots: imurmurhash: 0.1.4 signal-exit: 3.0.7 - write-file-atomic@5.0.1: - dependencies: - imurmurhash: 0.1.4 - signal-exit: 4.1.0 - - write-yaml-file@5.0.0: - dependencies: - js-yaml: 4.1.1 - write-file-atomic: 5.0.1 - ws@6.2.3: dependencies: async-limiter: 1.0.1 @@ -20275,6 +20374,8 @@ snapshots: ws@8.20.0: {} + ws@8.21.0: {} + wsl-utils@0.1.0: dependencies: is-wsl: 3.1.1