diff --git a/apps/x/ANALYTICS.md b/apps/x/ANALYTICS.md index ac4047dde..e76488ab0 100644 --- a/apps/x/ANALYTICS.md +++ b/apps/x/ANALYTICS.md @@ -208,6 +208,17 @@ All renderer events live in `apps/renderer/src/lib/analytics.ts` (typed wrappers - `settings_tab_changed` — `{ tab }` - `onboarding_completed` — the onboarding flow finished (`App.tsx`) +### Mobile app events + +Captured by the iOS app (`apps/mobile/src/lib/analytics.ts`, typed wrappers like the renderer's). Every event carries `platform: 'mobile'`, the counterpart of desktop's `platform: 'desktop'`, so the shared project separates surfaces. The key is injected at build time via `EXPO_PUBLIC_POSTHOG_KEY` (`EXPO_PUBLIC_POSTHOG_HOST` optional); without it every call is a no-op — dev builds send nothing. + +- `mobile_paired` — `{ method: 'qr' | 'manual' | 'dev-link' }` — pairing with a rowboat-server succeeded +- `mobile_unpaired` — `{ reason: 'user' | 'unauthorized' }` — `unauthorized` = the server key was rotated out from under the phone +- `mobile_message_sent` — a chat message sent from the phone +- `mobile_reconnected` — the WS feed recovered after a disconnect +- `mobile_note_opened` — a note opened in the read-only browser +- `mobile_voice_used` — reserved; fires once voice ships in the dev build + ## Person properties Persistent across sessions for the same user. Set via `posthog.people.set` or as the `properties` arg to `identify`. diff --git a/apps/x/apps/main/forge.config.cjs b/apps/x/apps/main/forge.config.cjs index b8eb57142..fa774663f 100644 --- a/apps/x/apps/main/forge.config.cjs +++ b/apps/x/apps/main/forge.config.cjs @@ -391,6 +391,14 @@ module.exports = { stdio: 'inherit' }); + // Build server (TypeScript compilation) - depends on shared, core; + // main imports it for the hosted rowboat-server transport + console.log('Building server...'); + execSync('pnpm run build', { + cwd: path.join(__dirname, '../server'), + stdio: 'inherit' + }); + // Build renderer (Vite build) - depends on shared console.log('Building renderer...'); execSync('pnpm run build', { diff --git a/apps/x/apps/main/package.json b/apps/x/apps/main/package.json index b41c26af4..f1b026eb5 100644 --- a/apps/x/apps/main/package.json +++ b/apps/x/apps/main/package.json @@ -16,6 +16,7 @@ "@agentclientprotocol/claude-agent-acp": "^0.67.0", "@agentclientprotocol/codex-acp": "^1.2.0", "@x/core": "workspace:*", + "@x/server": "workspace:*", "@x/shared": "workspace:*", "agent-slack": "0.9.3", "chokidar": "^4.0.3", diff --git a/apps/x/apps/main/src/ipc.ts b/apps/x/apps/main/src/ipc.ts index 6e0e2eb74..57edd40e0 100644 --- a/apps/x/apps/main/src/ipc.ts +++ b/apps/x/apps/main/src/ipc.ts @@ -53,6 +53,8 @@ import { isDurableTurnEvent } from '@x/shared/dist/turns.js'; import type { ISessions, EmitterSessionBus } from '@x/core/dist/runtime/sessions/index.js'; import type { ITurnEventBus } from '@x/core/dist/runtime/turns/event-hub.js'; import container from '@x/core/dist/di/container.js'; +import { forwardRpc, shouldForwardChannel } from './rpc-forwarder.js'; +import { getPairingInfo, rotateKey as rotateServerKey, setLanEnabled as setServerLanEnabled } from './server-host.js'; import { testModelConnection, listModelsForProvider, generateOneShot } from '@x/core/dist/models/models.js'; import { getModelCatalog } from '@x/core/dist/models/catalog.js'; import { captureProviderConnected, captureProviderDisconnected } from '@x/core/dist/analytics/model-providers.js'; @@ -513,12 +515,16 @@ export function registerIpcHandlers(handlers: InvokeHandlers) { InvokeChannels, InvokeHandler ][]) { + // Strangler-fig: channels migrated to rowboat-server cross localhost HTTP + // instead of calling their in-process handler (which stays in the map as + // the ROWBOAT_FORWARD_MIGRATED=0 kill switch). + const forwarded = shouldForwardChannel(channel); ipcMain.handle(channel, async (event, rawArgs) => { // Validate request payload const args = ipc.validateRequest(channel, rawArgs); - // Call handler - const result = await handler(event, args); + // Call handler (or the migrated channel's HTTP twin) + const result = forwarded ? await forwardRpc(channel, args) : await handler(event, args); // Validate response payload return ipc.validateResponse(channel, result); @@ -565,6 +571,19 @@ function emitKnowledgeCommitEvent(): void { */ function emitWorkspaceChangeEvent(event: z.infer): void { broadcastToWindows('workspace:didChange', event); + for (const listener of workspaceChangeListeners) { + listener(event); + } +} + +// Non-window consumers of workspace:didChange — today the rowboat-server WS +// hub, which relays it to paired phones. +const workspaceChangeListeners = new Set<(event: z.infer) => void>(); +export function onWorkspaceChange( + listener: (event: z.infer) => void, +): () => void { + workspaceChangeListeners.add(listener); + return () => workspaceChangeListeners.delete(listener); } /** @@ -852,7 +871,9 @@ export function startCodeRunFeedWatcher(): void { // sessions:list awaits this deferred; main.ts resolves it when the scan // settles (success or failure, so the list never hangs). let resolveSessionsIndexReady: () => void; -const sessionsIndexReady = new Promise((resolve) => { +// Exported for the rowboat-server host, whose sessions:list handler shares +// this gate (main and the hosted transport run on the same core instance). +export const sessionsIndexReady = new Promise((resolve) => { resolveSessionsIndexReady = resolve; }); export function markSessionsIndexReady(): void { @@ -3176,6 +3197,19 @@ export function setupIpcHandlers() { } return { show: false, chatDays: settings.chatDays }; }, + // Rowboat server (phone pairing) — client-local: answered by main, which + // hosts the transport. + 'server:getPairingInfo': async () => { + return getPairingInfo(); + }, + 'server:setLanEnabled': async (_event, args) => { + await setServerLanEnabled(args.enabled); + return { success: true }; + }, + 'server:rotateKey': async () => { + await rotateServerKey(); + return { success: true }; + }, // Embedded browser handlers (WebContentsView + navigation) ...browserIpcHandlers, }); diff --git a/apps/x/apps/main/src/main.ts b/apps/x/apps/main/src/main.ts index 3c70dc6a7..ec8e94d79 100644 --- a/apps/x/apps/main/src/main.ts +++ b/apps/x/apps/main/src/main.ts @@ -52,6 +52,7 @@ import { syncModelProviderPersonProperties } from "@x/core/dist/analytics/model- import { migrateRuns } from "@x/core/dist/migrations/runs/migrate.js"; import { initConfigs } from "@x/core/dist/config/initConfigs.js"; +import { startServerHost, stopServerHost } from "./server-host.js"; import { getAgentSlackCliStatus } from "@x/core/dist/slack/agent-slack-exec.js"; import { resolveWorkspacePath } from "@x/core/dist/workspace/workspace.js"; import started from "electron-squirrel-startup"; @@ -693,6 +694,13 @@ app.whenReady().then(async () => { startTurnEventsWatcher(); startCodeRunFeedWatcher(); + // rowboat-server transport (phone/API clients + the strangler-fig channel + // forwarder), hosted in-process on this same core instance. Needs the + // session index gate above; must never block boot. + startServerHost().catch((error) => { + console.error('[server-host] failed to start rowboat-server:', error); + }); + // Mobile channels (WhatsApp/Telegram bridge): needs the session index, so // start after initialize(). Failures must never block boot. startChannelsWatcher(); @@ -824,6 +832,9 @@ stopSkillsWatcher(); shutdownAppsServer().catch((error) => { console.error('[Apps] Failed to shut down cleanly:', error); }); + stopServerHost().catch((error) => { + console.error('[server-host] Failed to shut down cleanly:', error); + }); shutdownAnalytics().catch((error) => { console.error('[Analytics] Failed to flush on quit:', error); }); diff --git a/apps/x/apps/main/src/rpc-forwarder.ts b/apps/x/apps/main/src/rpc-forwarder.ts new file mode 100644 index 000000000..3a6de8360 --- /dev/null +++ b/apps/x/apps/main/src/rpc-forwarder.ts @@ -0,0 +1,46 @@ +import { isRpcChannel } from '@x/server'; +import { whenServerReady } from './server-host.js'; + +// Strangler-fig seam (RFC SERVER_CLIENT_SPEC.md Q4/Q15): channels that have +// migrated to rowboat-server are forwarded over real localhost HTTP instead +// of calling core in-process, so the network API is exercised by the desktop +// app on every keystroke — it cannot rot. Unmigrated channels are untouched. +// +// Forwarding is ON everywhere, packaged builds included — an HTTP path only +// dev traffic exercises is the API-rot trap Q2 exists to prevent. +// ROWBOAT_FORWARD_MIGRATED=0 is the emergency kill switch. + +export function forwardingEnabled(): boolean { + const env = process.env.ROWBOAT_FORWARD_MIGRATED; + if (env !== undefined) { + return env !== '0' && env.toLowerCase() !== 'false'; + } + return true; +} + +export function shouldForwardChannel(channel: string): boolean { + return forwardingEnabled() && isRpcChannel(channel); +} + +export async function forwardRpc(channel: string, args: unknown): Promise { + const server = await whenServerReady(); + const res = await fetch(`http://127.0.0.1:${server.port}/rpc/${channel}`, { + method: 'POST', + headers: { + 'content-type': 'application/json', + authorization: `Bearer ${server.key}`, + }, + body: JSON.stringify(args ?? null), + }); + const body = (await res.json().catch(() => null)) as + | { error?: { code?: string; message?: string } } + | Record + | null; + if (!res.ok) { + const message = + (body as { error?: { message?: string } } | null)?.error?.message ?? + `rpc ${channel} failed with status ${res.status}`; + throw new Error(message); + } + return body; +} diff --git a/apps/x/apps/main/src/server-host.ts b/apps/x/apps/main/src/server-host.ts new file mode 100644 index 000000000..ae896a8c1 --- /dev/null +++ b/apps/x/apps/main/src/server-host.ts @@ -0,0 +1,101 @@ +import os from 'node:os'; +import { app } from 'electron'; +import { + buildPairingPayload, + createCoreEventSources, + createCoreRpcHandlers, + createRowboatServer, + loadServerConfig, + resolveWorkspacePath, + rotateServerKey, + saveServerConfig, + type RowboatServer, +} from '@x/server'; +import { WorkDir } from '@x/core/dist/config/config.js'; +import { onWorkspaceChange, sessionsIndexReady } from './ipc.js'; + +// Vertical-slice hosting: main runs the rowboat-server transport in-process +// on its single core instance, so external clients (the phone) and the +// renderer's forwarded channels share one session index, one turn event hub, +// one set of schedulers. When the full server/client split lands (RFC +// SERVER_CLIENT_SPEC.md Phase 1), main stops booting core and spawns the +// standalone entrypoint instead — this module then shrinks to lifecycle +// management and everything else survives unchanged. + +let current: RowboatServer | null = null; +let ready: Promise | null = null; + +async function launch(): Promise { + const server = await createRowboatServer({ + workDir: WorkDir, + handlers: createCoreRpcHandlers({ sessionsIndexReady }), + events: { + ...createCoreEventSources(), + // workspace:didChange is sourced from main's debounced chokidar watcher, + // not a core bus — pipe it into the hub alongside the window fan-out. + subscribeWorkspaceEvents: onWorkspaceChange, + }, + resolveWorkspacePath, + serverVersion: app.getVersion(), + }); + current = server; + console.log(`[server-host] rowboat-server on http://${server.host}:${server.port} (lan: ${server.lanEnabled})`); + return server; +} + +export function startServerHost(): Promise { + if (!ready) { + ready = launch(); + } + return ready; +} + +/** Resolves once the transport is listening — the RPC forwarder awaits this. */ +export function whenServerReady(): Promise { + return startServerHost(); +} + +export async function stopServerHost(): Promise { + const server = current; + current = null; + ready = null; + await server?.close(); +} + +export async function getPairingInfo(): Promise<{ + running: boolean; + name: string; + port: number | null; + lanEnabled: boolean; + urls: string[]; + token: string | null; +}> { + if (!current) { + return { running: false, name: os.hostname(), port: null, lanEnabled: false, urls: [], token: null }; + } + const payload = buildPairingPayload(current.port, current.lanEnabled, current.key); + return { + running: true, + name: payload.name, + port: current.port, + lanEnabled: current.lanEnabled, + urls: payload.urls, + token: current.key, + }; +} + +// Persists the toggle and rebinds the listener (127.0.0.1 ⇄ 0.0.0.0). +// Connected clients drop and reconnect — acceptable for a settings flip. +export async function setLanEnabled(enabled: boolean): Promise { + const config = await loadServerConfig(WorkDir); + await saveServerConfig(WorkDir, { ...config, lanEnabled: enabled }); + await stopServerHost(); + await startServerHost(); +} + +/** Mints a new server key, revoking every paired client, then rebinds. */ +export async function rotateKey(): Promise { + await stopServerHost(); + await rotateServerKey(WorkDir); + await startServerHost(); +} diff --git a/apps/x/apps/mobile/.gitignore b/apps/x/apps/mobile/.gitignore new file mode 100644 index 000000000..4b00baf34 --- /dev/null +++ b/apps/x/apps/mobile/.gitignore @@ -0,0 +1,43 @@ +# Learn more https://docs.github.com/en/get-started/getting-started-with-git/ignoring-files + +# dependencies +node_modules/ + +# Expo +.expo/ +dist/ +web-build/ +expo-env.d.ts + +# Native +.kotlin/ +*.orig.* +*.jks +*.p8 +*.p12 +*.key +*.mobileprovision + +# Metro +.metro-health-check* + +# debug +npm-debug.* +yarn-debug.* +yarn-error.* + +# macOS +.DS_Store +*.pem + +# local env files +.env*.local + +# typescript +*.tsbuildinfo + +example + +# generated native folders +/ios +/android diff --git a/apps/x/apps/mobile/AGENTS.md b/apps/x/apps/mobile/AGENTS.md new file mode 100644 index 000000000..0e6bc801c --- /dev/null +++ b/apps/x/apps/mobile/AGENTS.md @@ -0,0 +1,3 @@ +# Expo HAS CHANGED + +Read the exact versioned docs at https://docs.expo.dev/versions/v57.0.0/ before writing any code. diff --git a/apps/x/apps/mobile/CLAUDE.md b/apps/x/apps/mobile/CLAUDE.md new file mode 100644 index 000000000..43c994c2d --- /dev/null +++ b/apps/x/apps/mobile/CLAUDE.md @@ -0,0 +1 @@ +@AGENTS.md diff --git a/apps/x/apps/mobile/LICENSE b/apps/x/apps/mobile/LICENSE new file mode 100644 index 000000000..30b20e3b5 --- /dev/null +++ b/apps/x/apps/mobile/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015-present 650 Industries, Inc. (aka Expo) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/apps/x/apps/mobile/README.md b/apps/x/apps/mobile/README.md new file mode 100644 index 000000000..4d67aec2a --- /dev/null +++ b/apps/x/apps/mobile/README.md @@ -0,0 +1,56 @@ +# Welcome to your Expo app 👋 + +This is an [Expo](https://expo.dev) project created with [`create-expo-app`](https://www.npmjs.com/package/create-expo-app). + +## Get started + +1. Install dependencies + + ```bash + npm install + ``` + +2. Start the app + + ```bash + npx expo start + ``` + +In the output, you'll find options to open the app in a + +- [development build](https://docs.expo.dev/develop/development-builds/introduction/) +- [Android emulator](https://docs.expo.dev/workflow/android-studio-emulator/) +- [iOS simulator](https://docs.expo.dev/workflow/ios-simulator/) +- [Expo Go](https://expo.dev/go), a limited sandbox for trying out app development with Expo + +You can start developing by editing the files inside the **app** directory. This project uses [file-based routing](https://docs.expo.dev/router/introduction). + +## Get a fresh project + +When you're ready, run: + +```bash +npm run reset-project +``` + +This command will move the starter code to the **app-example** directory and create a blank **app** directory where you can start developing. + +### Other setup steps + +- To set up ESLint for linting, run `npx expo lint`, or follow our guide on ["Using ESLint and Prettier"](https://docs.expo.dev/guides/using-eslint/) +- If you'd like to set up unit testing, follow our guide on ["Unit Testing with Jest"](https://docs.expo.dev/develop/unit-testing/) +- Learn more about the TypeScript setup in this template in our guide on ["Using TypeScript"](https://docs.expo.dev/guides/typescript/) + +## Learn more + +To learn more about developing your project with Expo, look at the following resources: + +- [Expo documentation](https://docs.expo.dev/): Learn fundamentals, or go into advanced topics with our [guides](https://docs.expo.dev/guides). +- [Learn Expo tutorial](https://docs.expo.dev/tutorial/introduction/): Follow a step-by-step tutorial where you'll create a project that runs on Android, iOS, and the web. + +## Join the community + +Join our community of developers creating universal apps. + +- [Expo on GitHub](https://github.com/expo/expo): View our open source platform and contribute. +- [Discord community](https://chat.expo.dev): Chat with Expo users and ask questions. diff --git a/apps/x/apps/mobile/app.json b/apps/x/apps/mobile/app.json new file mode 100644 index 000000000..2af7c2605 --- /dev/null +++ b/apps/x/apps/mobile/app.json @@ -0,0 +1,51 @@ +{ + "expo": { + "name": "Rowboat", + "slug": "rowboat-mobile", + "version": "0.1.0", + "orientation": "portrait", + "icon": "./assets/images/icon.png", + "scheme": "rowboat", + "userInterfaceStyle": "automatic", + "ios": { + "icon": "./assets/expo.icon", + "bundleIdentifier": "com.rowboat.app.mobile", + "supportsTablet": false, + "infoPlist": { + "NSCameraUsageDescription": "The camera is used to scan the pairing code shown in Rowboat on your Mac.", + "NSMicrophoneUsageDescription": "The microphone is used to talk to your Rowboat agents with voice.", + "NSLocalNetworkUsageDescription": "Rowboat connects to the Rowboat app on your Mac over your local network.", + "NSBonjourServices": ["_http._tcp"] + } + }, + "android": { + "adaptiveIcon": { + "backgroundColor": "#E6F4FE", + "foregroundImage": "./assets/images/android-icon-foreground.png", + "backgroundImage": "./assets/images/android-icon-background.png", + "monochromeImage": "./assets/images/android-icon-monochrome.png" + }, + "predictiveBackGestureEnabled": false + }, + "web": { + "output": "static", + "favicon": "./assets/images/favicon.png" + }, + "plugins": [ + "expo-router", + [ + "expo-splash-screen", + { + "backgroundColor": "#208AEF", + "image": "./assets/images/splash-icon.png", + "imageWidth": 76 + } + ], + "expo-secure-store" + ], + "experiments": { + "typedRoutes": true, + "reactCompiler": true + } + } +} diff --git a/apps/x/apps/mobile/assets/expo.icon/Assets/expo-symbol 2.svg b/apps/x/apps/mobile/assets/expo.icon/Assets/expo-symbol 2.svg new file mode 100644 index 000000000..51d367673 --- /dev/null +++ b/apps/x/apps/mobile/assets/expo.icon/Assets/expo-symbol 2.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/x/apps/mobile/assets/expo.icon/Assets/grid.png b/apps/x/apps/mobile/assets/expo.icon/Assets/grid.png new file mode 100644 index 000000000..eefea2424 Binary files /dev/null and b/apps/x/apps/mobile/assets/expo.icon/Assets/grid.png differ diff --git a/apps/x/apps/mobile/assets/expo.icon/icon.json b/apps/x/apps/mobile/assets/expo.icon/icon.json new file mode 100644 index 000000000..7a2c33cd0 --- /dev/null +++ b/apps/x/apps/mobile/assets/expo.icon/icon.json @@ -0,0 +1,40 @@ +{ + "fill" : { + "automatic-gradient" : "extended-srgb:0.00000,0.47843,1.00000,1.00000" + }, + "groups" : [ + { + "layers" : [ + { + "image-name" : "expo-symbol 2.svg", + "name" : "expo-symbol 2", + "position" : { + "scale" : 1, + "translation-in-points" : [ + 1.1008400065293245e-05, + -16.046875 + ] + } + }, + { + "image-name" : "grid.png", + "name" : "grid" + } + ], + "shadow" : { + "kind" : "neutral", + "opacity" : 0.5 + }, + "translucency" : { + "enabled" : true, + "value" : 0.5 + } + } + ], + "supported-platforms" : { + "circles" : [ + "watchOS" + ], + "squares" : "shared" + } +} \ No newline at end of file diff --git a/apps/x/apps/mobile/assets/images/android-icon-background.png b/apps/x/apps/mobile/assets/images/android-icon-background.png new file mode 100644 index 000000000..5ffefc5bb Binary files /dev/null and b/apps/x/apps/mobile/assets/images/android-icon-background.png differ diff --git a/apps/x/apps/mobile/assets/images/android-icon-foreground.png b/apps/x/apps/mobile/assets/images/android-icon-foreground.png new file mode 100644 index 000000000..3a9e5016d Binary files /dev/null and b/apps/x/apps/mobile/assets/images/android-icon-foreground.png differ diff --git a/apps/x/apps/mobile/assets/images/android-icon-monochrome.png b/apps/x/apps/mobile/assets/images/android-icon-monochrome.png new file mode 100644 index 000000000..77484ebdb Binary files /dev/null and b/apps/x/apps/mobile/assets/images/android-icon-monochrome.png differ diff --git a/apps/x/apps/mobile/assets/images/expo-badge-white.png b/apps/x/apps/mobile/assets/images/expo-badge-white.png new file mode 100644 index 000000000..28630679f Binary files /dev/null and b/apps/x/apps/mobile/assets/images/expo-badge-white.png differ diff --git a/apps/x/apps/mobile/assets/images/expo-badge.png b/apps/x/apps/mobile/assets/images/expo-badge.png new file mode 100644 index 000000000..5d5c5bb5c Binary files /dev/null and b/apps/x/apps/mobile/assets/images/expo-badge.png differ diff --git a/apps/x/apps/mobile/assets/images/expo-logo.png b/apps/x/apps/mobile/assets/images/expo-logo.png new file mode 100644 index 000000000..6b1642a0b Binary files /dev/null and b/apps/x/apps/mobile/assets/images/expo-logo.png differ diff --git a/apps/x/apps/mobile/assets/images/favicon.png b/apps/x/apps/mobile/assets/images/favicon.png new file mode 100644 index 000000000..408bd7466 Binary files /dev/null and b/apps/x/apps/mobile/assets/images/favicon.png differ diff --git a/apps/x/apps/mobile/assets/images/icon.png b/apps/x/apps/mobile/assets/images/icon.png new file mode 100644 index 000000000..67c777a45 Binary files /dev/null and b/apps/x/apps/mobile/assets/images/icon.png differ diff --git a/apps/x/apps/mobile/assets/images/logo-glow.png b/apps/x/apps/mobile/assets/images/logo-glow.png new file mode 100644 index 000000000..edc99be1b Binary files /dev/null and b/apps/x/apps/mobile/assets/images/logo-glow.png differ diff --git a/apps/x/apps/mobile/assets/images/react-logo.png b/apps/x/apps/mobile/assets/images/react-logo.png new file mode 100644 index 000000000..9d72a9ffc Binary files /dev/null and b/apps/x/apps/mobile/assets/images/react-logo.png differ diff --git a/apps/x/apps/mobile/assets/images/react-logo@2x.png b/apps/x/apps/mobile/assets/images/react-logo@2x.png new file mode 100644 index 000000000..2229b130a Binary files /dev/null and b/apps/x/apps/mobile/assets/images/react-logo@2x.png differ diff --git a/apps/x/apps/mobile/assets/images/react-logo@3x.png b/apps/x/apps/mobile/assets/images/react-logo@3x.png new file mode 100644 index 000000000..a99b20322 Binary files /dev/null and b/apps/x/apps/mobile/assets/images/react-logo@3x.png differ diff --git a/apps/x/apps/mobile/assets/images/splash-icon.png b/apps/x/apps/mobile/assets/images/splash-icon.png new file mode 100644 index 000000000..6b1642a0b Binary files /dev/null and b/apps/x/apps/mobile/assets/images/splash-icon.png differ diff --git a/apps/x/apps/mobile/assets/images/tabIcons/explore.png b/apps/x/apps/mobile/assets/images/tabIcons/explore.png new file mode 100644 index 000000000..73d825834 Binary files /dev/null and b/apps/x/apps/mobile/assets/images/tabIcons/explore.png differ diff --git a/apps/x/apps/mobile/assets/images/tabIcons/explore@2x.png b/apps/x/apps/mobile/assets/images/tabIcons/explore@2x.png new file mode 100644 index 000000000..21b9bd266 Binary files /dev/null and b/apps/x/apps/mobile/assets/images/tabIcons/explore@2x.png differ diff --git a/apps/x/apps/mobile/assets/images/tabIcons/explore@3x.png b/apps/x/apps/mobile/assets/images/tabIcons/explore@3x.png new file mode 100644 index 000000000..422202d5e Binary files /dev/null and b/apps/x/apps/mobile/assets/images/tabIcons/explore@3x.png differ diff --git a/apps/x/apps/mobile/assets/images/tabIcons/home.png b/apps/x/apps/mobile/assets/images/tabIcons/home.png new file mode 100644 index 000000000..ad5699c42 Binary files /dev/null and b/apps/x/apps/mobile/assets/images/tabIcons/home.png differ diff --git a/apps/x/apps/mobile/assets/images/tabIcons/home@2x.png b/apps/x/apps/mobile/assets/images/tabIcons/home@2x.png new file mode 100644 index 000000000..22a1f2c74 Binary files /dev/null and b/apps/x/apps/mobile/assets/images/tabIcons/home@2x.png differ diff --git a/apps/x/apps/mobile/assets/images/tabIcons/home@3x.png b/apps/x/apps/mobile/assets/images/tabIcons/home@3x.png new file mode 100644 index 000000000..f5d1f9a41 Binary files /dev/null and b/apps/x/apps/mobile/assets/images/tabIcons/home@3x.png differ diff --git a/apps/x/apps/mobile/assets/images/tutorial-web.png b/apps/x/apps/mobile/assets/images/tutorial-web.png new file mode 100644 index 000000000..e4a8c58f7 Binary files /dev/null and b/apps/x/apps/mobile/assets/images/tutorial-web.png differ diff --git a/apps/x/apps/mobile/eas.json b/apps/x/apps/mobile/eas.json new file mode 100644 index 000000000..68d2a9361 --- /dev/null +++ b/apps/x/apps/mobile/eas.json @@ -0,0 +1,26 @@ +{ + "cli": { + "version": ">= 16.0.0", + "appVersionSource": "remote" + }, + "build": { + "development": { + "developmentClient": true, + "distribution": "internal", + "ios": { "simulator": true } + }, + "device": { + "extends": "development", + "ios": { "simulator": false } + }, + "preview": { + "distribution": "internal" + }, + "production": { + "autoIncrement": true + } + }, + "submit": { + "production": {} + } +} diff --git a/apps/x/apps/mobile/package.json b/apps/x/apps/mobile/package.json new file mode 100644 index 000000000..e87ee3a0e --- /dev/null +++ b/apps/x/apps/mobile/package.json @@ -0,0 +1,51 @@ +{ + "name": "@x/mobile", + "main": "expo-router/entry", + "version": "1.0.0", + "dependencies": { + "@expo/ui": "~57.0.6", + "@react-native-async-storage/async-storage": "^3.1.1", + "@x/client": "workspace:*", + "@x/shared": "workspace:*", + "expo": "~57.0.6", + "expo-camera": "~57.0.2", + "expo-constants": "~57.0.5", + "expo-device": "~57.0.1", + "expo-font": "~57.0.1", + "expo-glass-effect": "~57.0.1", + "expo-image": "~57.0.1", + "expo-linking": "~57.0.3", + "expo-router": "~57.0.6", + "expo-secure-store": "~57.0.1", + "expo-splash-screen": "~57.0.4", + "expo-status-bar": "~57.0.1", + "expo-symbols": "~57.0.1", + "expo-system-ui": "~57.0.1", + "expo-web-browser": "~57.0.1", + "posthog-react-native": "^4.56.2", + "react": "19.2.3", + "react-dom": "19.2.3", + "react-native": "0.86.0", + "react-native-gesture-handler": "~2.32.0", + "react-native-markdown-display": "^7.0.2", + "react-native-reanimated": "4.5.0", + "react-native-safe-area-context": "~5.7.0", + "react-native-screens": "4.25.2", + "react-native-web": "~0.21.0", + "react-native-worklets": "0.10.0", + "zod": "^4.4.3" + }, + "devDependencies": { + "@types/react": "~19.2.2", + "typescript": "~6.0.3" + }, + "scripts": { + "start": "expo start", + "reset-project": "node ./scripts/reset-project.js", + "android": "expo start --android", + "ios": "expo start --ios", + "web": "expo start --web", + "lint": "expo lint" + }, + "private": true +} diff --git a/apps/x/apps/mobile/scripts/reset-project.js b/apps/x/apps/mobile/scripts/reset-project.js new file mode 100644 index 000000000..055d15b1d --- /dev/null +++ b/apps/x/apps/mobile/scripts/reset-project.js @@ -0,0 +1,114 @@ +#!/usr/bin/env node + +/** + * This script is used to reset the project to a blank state. + * It deletes or moves the /src and /scripts directories to /example based on user input and creates a new /src/app directory with an index.tsx and _layout.tsx file. + * You can remove the `reset-project` script from package.json and safely delete this file after running it. + */ + +const fs = require("fs"); +const path = require("path"); +const readline = require("readline"); + +const root = process.cwd(); +const oldDirs = ["src", "scripts"]; +const exampleDir = "example"; +const newAppDir = "src/app"; +const exampleDirPath = path.join(root, exampleDir); + +const indexContent = `import { Text, View, StyleSheet } from "react-native"; + +export default function Index() { + return ( + + Edit src/app/index.tsx to edit this screen. + + ); +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + alignItems: "center", + justifyContent: "center", + }, +}); +`; + +const layoutContent = `import { Stack } from "expo-router"; + +export default function RootLayout() { + return ; +} +`; + +const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout, +}); + +const moveDirectories = async (userInput) => { + try { + if (userInput === "y") { + // Create the app-example directory + await fs.promises.mkdir(exampleDirPath, { recursive: true }); + console.log(`📁 /${exampleDir} directory created.`); + } + + // Move old directories to new app-example directory or delete them + for (const dir of oldDirs) { + const oldDirPath = path.join(root, dir); + if (fs.existsSync(oldDirPath)) { + if (userInput === "y") { + const newDirPath = path.join(root, exampleDir, dir); + await fs.promises.rename(oldDirPath, newDirPath); + console.log(`➡️ /${dir} moved to /${exampleDir}/${dir}.`); + } else { + await fs.promises.rm(oldDirPath, { recursive: true, force: true }); + console.log(`❌ /${dir} deleted.`); + } + } else { + console.log(`➡️ /${dir} does not exist, skipping.`); + } + } + + // Create new /src/app directory + const newAppDirPath = path.join(root, newAppDir); + await fs.promises.mkdir(newAppDirPath, { recursive: true }); + console.log("\n📁 New /src/app directory created."); + + // Create index.tsx + const indexPath = path.join(newAppDirPath, "index.tsx"); + await fs.promises.writeFile(indexPath, indexContent); + console.log("📄 src/app/index.tsx created."); + + // Create _layout.tsx + const layoutPath = path.join(newAppDirPath, "_layout.tsx"); + await fs.promises.writeFile(layoutPath, layoutContent); + console.log("📄 src/app/_layout.tsx created."); + + console.log("\n✅ Project reset complete. Next steps:"); + console.log( + `1. Run \`npx expo start\` to start a development server.\n2. Edit src/app/index.tsx to edit the main screen.\n3. Put all your application code in /src, only screens and layout files should be in /src/app.${ + userInput === "y" + ? `\n4. Delete the /${exampleDir} directory when you're done referencing it.` + : "" + }` + ); + } catch (error) { + console.error(`❌ Error during script execution: ${error.message}`); + } +}; + +rl.question( + "Do you want to move existing files to /example instead of deleting them? (Y/n): ", + (answer) => { + const userInput = answer.trim().toLowerCase() || "y"; + if (userInput === "y" || userInput === "n") { + moveDirectories(userInput).finally(() => rl.close()); + } else { + console.log("❌ Invalid input. Please enter 'Y' or 'N'."); + rl.close(); + } + } +); diff --git a/apps/x/apps/mobile/src/app/_layout.tsx b/apps/x/apps/mobile/src/app/_layout.tsx new file mode 100644 index 000000000..3fd6a43bc --- /dev/null +++ b/apps/x/apps/mobile/src/app/_layout.tsx @@ -0,0 +1,26 @@ +import { DarkTheme, DefaultTheme, Stack, ThemeProvider } from 'expo-router'; +import * as SplashScreen from 'expo-splash-screen'; +import { useColorScheme } from 'react-native'; + +import { ConnectionProvider } from '@/lib/connection'; + +SplashScreen.preventAutoHideAsync(); + +export default function RootLayout() { + const colorScheme = useColorScheme(); + return ( + + + + + + + + + + + + + + ); +} diff --git a/apps/x/apps/mobile/src/app/index.tsx b/apps/x/apps/mobile/src/app/index.tsx new file mode 100644 index 000000000..af60d603d --- /dev/null +++ b/apps/x/apps/mobile/src/app/index.tsx @@ -0,0 +1,16 @@ +import { Redirect } from 'expo-router'; +import { ActivityIndicator, View } from 'react-native'; + +import { useConnection } from '@/lib/connection'; + +export default function Index() { + const { pairing } = useConnection(); + if (pairing === undefined) { + return ( + + + + ); + } + return ; +} diff --git a/apps/x/apps/mobile/src/app/notes/index.tsx b/apps/x/apps/mobile/src/app/notes/index.tsx new file mode 100644 index 000000000..9691eb23e --- /dev/null +++ b/apps/x/apps/mobile/src/app/notes/index.tsx @@ -0,0 +1,96 @@ +import { router, Stack, useFocusEffect } from 'expo-router'; +import { useCallback, useState } from 'react'; +import { FlatList, Pressable, RefreshControl, StyleSheet, Text, useColorScheme, View } from 'react-native'; +import type { z } from 'zod'; +import type { workspace as workspaceShared } from '@x/shared'; + +import { StatusPill } from '@/components/status-pill'; +import { useConnection } from '@/lib/connection'; + +type DirEntry = z.infer; + +// Read-only notes browser: the whole workspace tree, filtered to markdown, +// newest first. Sync dirs (config, events, sessions…) hold machine state, +// not notes — hide them. + +const HIDDEN_ROOTS = new Set([ + 'config', 'events', 'sessions', 'turns', 'runs', 'agents', 'apps', + 'skills', 'code-mode', 'index', 'server.lock', +]); + +export default function NotesScreen() { + const scheme = useColorScheme(); + const textColor = scheme === 'dark' ? '#fff' : '#000'; + const { rpc } = useConnection(); + const [entries, setEntries] = useState([]); + const [loading, setLoading] = useState(false); + const [error, setError] = useState(null); + + const refresh = useCallback(async () => { + if (!rpc) return; + setLoading(true); + try { + const all = await rpc.call('workspace:readdir', { + path: '', + opts: { recursive: true, includeStats: true, allowedExtensions: ['.md'] }, + }); + const notes = all + .filter((e) => e.kind === 'file' && !HIDDEN_ROOTS.has(e.path.split('/')[0])) + .sort((a, b) => (b.stat?.mtimeMs ?? 0) - (a.stat?.mtimeMs ?? 0)); + setEntries(notes); + setError(null); + } catch (err) { + setError(err instanceof Error ? err.message : String(err)); + } finally { + setLoading(false); + } + }, [rpc]); + + useFocusEffect( + useCallback(() => { + void refresh(); + }, [refresh]), + ); + + return ( + + }} /> + {error && {error}} + item.path} + refreshControl={ void refresh()} />} + renderItem={({ item }) => ( + router.push({ pathname: '/notes/view', params: { path: item.path } })} + > + + {item.name.replace(/\.md$/, '')} + + + {item.path.includes('/') ? item.path.slice(0, item.path.lastIndexOf('/')) : ''} + {item.stat ? ` · ${new Date(item.stat.mtimeMs).toLocaleDateString()}` : ''} + + + )} + ListEmptyComponent={loading ? null : No notes found.} + /> + + ); +} + +const styles = StyleSheet.create({ + container: { flex: 1 }, + row: { + paddingHorizontal: 16, + paddingVertical: 12, + borderBottomWidth: StyleSheet.hairlineWidth, + borderBottomColor: '#8884', + gap: 2, + }, + title: { fontSize: 16, fontWeight: '500' }, + meta: { fontSize: 12, opacity: 0.6 }, + empty: { textAlign: 'center', marginTop: 48, opacity: 0.6, color: '#888' }, + error: { color: '#c0392b', padding: 12 }, +}); diff --git a/apps/x/apps/mobile/src/app/notes/view.tsx b/apps/x/apps/mobile/src/app/notes/view.tsx new file mode 100644 index 000000000..62cfaec12 --- /dev/null +++ b/apps/x/apps/mobile/src/app/notes/view.tsx @@ -0,0 +1,102 @@ +import { Stack, useLocalSearchParams } from 'expo-router'; +import { useCallback, useEffect, useState } from 'react'; +import { Image, ScrollView, StyleSheet, Text, useColorScheme } from 'react-native'; +import Markdown from 'react-native-markdown-display'; + +import * as analytics from '@/lib/analytics'; +import { useConnection } from '@/lib/connection'; + +// Read-only note view. Relative image refs are rewritten to the server's +// authenticated /workspace route; the auth header rides along per-image. +// YAML frontmatter is stripped rather than rendered. + +function stripFrontmatter(markdown: string): string { + const match = /^---\n[\s\S]*?\n---\n?/.exec(markdown); + return match ? markdown.slice(match[0].length) : markdown; +} + +function rewriteImageRefs(markdown: string, noteDir: string, baseUrl: string): string { + return markdown.replace( + /!\[([^\]]*)\]\((?!https?:\/\/)([^)]+)\)/g, + (_m, alt: string, ref: string) => { + const rel = ref.startsWith('/') ? ref.slice(1) : noteDir ? `${noteDir}/${ref}` : ref; + return `![${alt}](${baseUrl}/workspace/${rel.split('/').map(encodeURIComponent).join('/')})`; + }, + ); +} + +export default function NoteViewScreen() { + const { path } = useLocalSearchParams<{ path: string }>(); + const { rpc, events, pairing } = useConnection(); + const scheme = useColorScheme(); + const [body, setBody] = useState(null); + const [error, setError] = useState(null); + + const refresh = useCallback(async () => { + if (!rpc || !path) return; + try { + const result = await rpc.call('workspace:readFile', { path }); + const noteDir = path.includes('/') ? path.slice(0, path.lastIndexOf('/')) : ''; + setBody(rewriteImageRefs(stripFrontmatter(result.data), noteDir, rpc.baseUrl)); + setError(null); + } catch (err) { + setError(err instanceof Error ? err.message : String(err)); + } + }, [rpc, path]); + + useEffect(() => { + void refresh(); + }, [refresh]); + + useEffect(() => { + analytics.mobileNoteOpened(); + }, []); + + useEffect(() => { + if (!events) return; + // Live notes update themselves on the Mac; refetch when this file changes. + const off = events.on('workspace:didChange', (payload) => { + const e = payload as { type: string; path: string }; + if (e.path === path) void refresh(); + }); + return off; + }, [events, path, refresh]); + + const title = path?.split('/').pop()?.replace(/\.md$/, '') ?? 'Note'; + const textColor = scheme === 'dark' ? '#fff' : '#000'; + + return ( + + + {error && {error}} + {body !== null && ( + rendering won't do — attach the header per image. + image: (node) => ( + + ), + }} + > + {body} + + )} + + ); +} + +const styles = StyleSheet.create({ + container: { padding: 16, paddingBottom: 48 }, + error: { color: '#c0392b', marginBottom: 8 }, + image: { width: '100%', height: 220, marginVertical: 8 }, +}); diff --git a/apps/x/apps/mobile/src/app/pair-dev.tsx b/apps/x/apps/mobile/src/app/pair-dev.tsx new file mode 100644 index 000000000..5bb5f8692 --- /dev/null +++ b/apps/x/apps/mobile/src/app/pair-dev.tsx @@ -0,0 +1,49 @@ +import { router, useLocalSearchParams } from 'expo-router'; +import { useEffect, useState } from 'react'; +import { ActivityIndicator, StyleSheet, Text, View } from 'react-native'; + +import * as analytics from '@/lib/analytics'; +import { probeUrls, useConnection } from '@/lib/connection'; + +// Dev-only: pair via deep link, for simulators with no camera to scan the QR. +// exp:///--/pair-dev?url=http://127.0.0.1:3220&token= +// No-op in release builds. + +export default function PairDevScreen() { + const { url, token } = useLocalSearchParams<{ url?: string; token?: string }>(); + const { pair } = useConnection(); + const [message, setMessage] = useState('Pairing…'); + + useEffect(() => { + if (!__DEV__) { + setMessage('Not available in release builds.'); + return; + } + if (!url || !token) { + setMessage('Missing url or token query params.'); + return; + } + void (async () => { + const healthy = await probeUrls([url]); + if (!healthy) { + setMessage(`Could not reach ${url}`); + return; + } + await pair({ url: healthy, token }); + analytics.mobilePaired('dev-link'); + router.replace('/sessions'); + })(); + }, [url, token, pair]); + + return ( + + + {message} + + ); +} + +const styles = StyleSheet.create({ + container: { flex: 1, alignItems: 'center', justifyContent: 'center', gap: 12 }, + text: { opacity: 0.7 }, +}); diff --git a/apps/x/apps/mobile/src/app/pairing.tsx b/apps/x/apps/mobile/src/app/pairing.tsx new file mode 100644 index 000000000..b879500c4 --- /dev/null +++ b/apps/x/apps/mobile/src/app/pairing.tsx @@ -0,0 +1,155 @@ +import { CameraView, useCameraPermissions } from 'expo-camera'; +import { router } from 'expo-router'; +import { useCallback, useRef, useState } from 'react'; +import { + ActivityIndicator, + Button, + KeyboardAvoidingView, + Platform, + StyleSheet, + Text, + TextInput, + View, +} from 'react-native'; +import { SafeAreaView } from 'react-native-safe-area-context'; + +import * as analytics from '@/lib/analytics'; +import { parseQrPayload, probeUrls, useConnection } from '@/lib/connection'; + +// Pairing: scan the QR in the desktop app's Settings → Phone app tab, or type +// the server address + token by hand (iOS simulator has no camera). + +export default function PairingScreen() { + const { pair } = useConnection(); + const [permission, requestPermission] = useCameraPermissions(); + const [scanning, setScanning] = useState(false); + const [url, setUrl] = useState(''); + const [token, setToken] = useState(''); + const [busy, setBusy] = useState(false); + const [error, setError] = useState(null); + const handled = useRef(false); + + const finishPairing = useCallback( + async (candidates: string[], pairToken: string, name?: string, method: 'qr' | 'manual' = 'manual') => { + setBusy(true); + setError(null); + const healthy = await probeUrls(candidates); + if (!healthy) { + setError( + "Couldn't reach your Mac. Check that both devices are on the same network and that network access is turned on in Rowboat's Phone app settings.", + ); + setBusy(false); + handled.current = false; + return; + } + await pair({ url: healthy, token: pairToken, name }); + analytics.mobilePaired(method); + router.replace('/sessions'); + }, + [pair], + ); + + const onScan = useCallback( + ({ data }: { data: string }) => { + if (handled.current) return; + const payload = parseQrPayload(data); + if (!payload) return; // not our QR; keep scanning + handled.current = true; + setScanning(false); + void finishPairing(payload.urls, payload.token, payload.name, 'qr'); + }, + [finishPairing], + ); + + const startScan = useCallback(async () => { + setError(null); + if (!permission?.granted) { + const result = await requestPermission(); + if (!result.granted) { + setError('Camera access is needed to scan the pairing code. You can also enter the details manually below.'); + return; + } + } + handled.current = false; + setScanning(true); + }, [permission, requestPermission]); + + return ( + + + + Open Rowboat on your Mac, go to Settings → Phone app, and scan the pairing code. + + + {scanning ? ( + + + + +
+ {token} + +
+ + +
+

Reset pairing

+

+ Creates a new pairing code. Every paired phone is disconnected and has to + pair again — use this if the code may have leaked. +

+ +
+ + ) +} diff --git a/apps/x/apps/renderer/src/hooks/use-turn.ts b/apps/x/apps/renderer/src/hooks/use-turn.ts index da1c5ed41..ba210e721 100644 --- a/apps/x/apps/renderer/src/hooks/use-turn.ts +++ b/apps/x/apps/renderer/src/hooks/use-turn.ts @@ -1,7 +1,7 @@ import { useEffect, useRef, useState } from 'react' import type { TurnState } from '@x/shared/src/turns.js' import { subscribeTurnFeed } from '@/lib/turn-feed' -import { followTurn } from '@/lib/turn-follower' +import { followTurn } from '@x/shared/src/turn-follower.js' export interface UseTurnResult { state: TurnState | null @@ -13,7 +13,7 @@ export interface UseTurnResult { } // Live view of one turn by id: snapshot via sessions:getTurn, then durable -// events from the turns:events spine (see lib/turn-follower.ts for the join +// events from the turns:events spine (see @x/shared turn-follower for the join // protocol). Works for any turn — session chat, headless runners, spawned // sub-agents. export function useTurn( @@ -39,7 +39,7 @@ export function useTurn( if (!turnId || !enabled) { return } - return followTurn(turnId, { + const follower = followTurn(turnId, { fetchTurn: (id) => window.ipc.invoke('sessions:getTurn', { turnId: id }), subscribe: subscribeTurnFeed, onState: (next) => { @@ -51,6 +51,7 @@ export function useTurn( onSnapshotFailed: () => setSnapshotFailed(true), ...(maxRetries === undefined ? {} : { maxRetries }), }) + return follower.stop }, [turnId, enabled, maxRetries]) return { state, error, snapshotFailed } diff --git a/apps/x/apps/renderer/src/lib/turn-follower.test.ts b/apps/x/apps/renderer/src/lib/turn-follower.test.ts index b8dae0dd6..d61f91d88 100644 --- a/apps/x/apps/renderer/src/lib/turn-follower.test.ts +++ b/apps/x/apps/renderer/src/lib/turn-follower.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it, vi } from 'vitest' import type { TurnBusEvent, TurnState } from '@x/shared/src/turns.js' -import { followTurn, type TurnFollowerDeps } from './turn-follower' +import { followTurn, type TurnFollowerDeps } from '@x/shared/src/turn-follower.js' import { completed, created, @@ -74,7 +74,7 @@ describe('followTurn', () => { it('publishes the snapshot, then extends it with contiguous feed events', async () => { const full = log() const h = harness([full.slice(0, 2)]) - const detach = followTurn(TURN, h.deps) + const { stop: detach } = followTurn(TURN, h.deps) await flush() expect(h.states).toHaveLength(1) @@ -93,7 +93,7 @@ describe('followTurn', () => { it('discards feed events already covered by the snapshot', async () => { const full = log() const h = harness([full]) - const detach = followTurn(TURN, h.deps) + const { stop: detach } = followTurn(TURN, h.deps) await flush() // Replays of already-snapshotted lines must not corrupt the reduction. @@ -116,7 +116,7 @@ describe('followTurn', () => { await gate return { events: full.slice(0, 3) } }) - const detach = followTurn(TURN, h.deps) + const { stop: detach } = followTurn(TURN, h.deps) h.emit(bus(full[3], 4)) // arrives mid-fetch release() @@ -130,7 +130,7 @@ describe('followTurn', () => { it('refetches the snapshot on a contiguity gap', async () => { const full = log() const h = harness([full.slice(0, 2), full]) - const detach = followTurn(TURN, h.deps) + const { stop: detach } = followTurn(TURN, h.deps) await flush() // Offset 4 while the local log has 2 entries: events were missed. @@ -146,7 +146,7 @@ describe('followTurn', () => { it('recovers from a failed snapshot when a feed event arrives', async () => { const full = log() const h = harness([new Error('turn file not created yet'), full]) - const detach = followTurn(TURN, h.deps) + const { stop: detach } = followTurn(TURN, h.deps) await flush() expect(h.states).toHaveLength(0) @@ -160,7 +160,7 @@ describe('followTurn', () => { it('reports snapshot failure once retries are exhausted', async () => { const h = harness([new Error('turn not found: legacy run id')]) - const detach = followTurn(TURN, h.deps) + const { stop: detach } = followTurn(TURN, h.deps) await flush() // maxRetries 0: the first failure is definitive (legacy-run fallback @@ -170,10 +170,29 @@ describe('followTurn', () => { detach() }) + it('refetch() re-converges a turn that finished while the feed was down', async () => { + const full = log() + // Snapshot lands mid-stream; the terminal events happened during a feed + // outage, so no bus event for this turn ever arrives again — the offset + // gap detection can never fire. refetch() is the reconnect escape hatch. + const h = harness([full.slice(0, 2), full]) + const follower = followTurn(TURN, h.deps) + await flush() + expect(h.states[h.states.length - 1].terminal).toBeUndefined() + + follower.refetch() + await flush() + + expect(h.fetchTurn).toHaveBeenCalledTimes(2) + expect(h.states[h.states.length - 1].terminal?.type).toBe('turn_completed') + expect(h.errors).toEqual([]) + follower.stop() + }) + it('stops delivering after detach and unsubscribes from the feed', async () => { const full = log() const h = harness([full.slice(0, 2)]) - const detach = followTurn(TURN, h.deps) + const { stop: detach } = followTurn(TURN, h.deps) await flush() expect(h.states).toHaveLength(1) diff --git a/apps/x/apps/server/.gitignore b/apps/x/apps/server/.gitignore new file mode 100644 index 000000000..b94707787 --- /dev/null +++ b/apps/x/apps/server/.gitignore @@ -0,0 +1,2 @@ +node_modules/ +dist/ diff --git a/apps/x/apps/server/package.json b/apps/x/apps/server/package.json new file mode 100644 index 000000000..a12152883 --- /dev/null +++ b/apps/x/apps/server/package.json @@ -0,0 +1,29 @@ +{ + "name": "@x/server", + "private": true, + "type": "module", + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "scripts": { + "build": "rm -rf dist && tsc -p tsconfig.build.json", + "dev": "tsc -w -p tsconfig.build.json", + "typecheck": "tsc --noEmit -p tsconfig.json", + "test": "vitest run", + "test:watch": "vitest", + "standalone": "node dist/standalone.js" + }, + "dependencies": { + "@hono/node-server": "^1.19.7", + "@x/core": "workspace:*", + "@x/shared": "workspace:*", + "hono": "^4.11.9", + "ws": "^8.18.3", + "zod": "^4.2.1" + }, + "devDependencies": { + "@types/node": "^25.0.3", + "@types/ws": "^8.18.1", + "@x/client": "workspace:*", + "vitest": "catalog:" + } +} diff --git a/apps/x/apps/server/src/auth.ts b/apps/x/apps/server/src/auth.ts new file mode 100644 index 000000000..d34ef9c4a --- /dev/null +++ b/apps/x/apps/server/src/auth.ts @@ -0,0 +1,50 @@ +import crypto from 'node:crypto'; +import fs from 'node:fs/promises'; +import path from 'node:path'; + +// Server key: a single random bearer token minted on first boot +// (~/.rowboat/server-key, mode 0600). Every client — the Electron forwarder, +// paired phones, third-party UIs — presents it. Rotation = delete the file +// and restart; that revokes every paired client at once. + +export const SERVER_KEY_FILE = 'server-key'; + +export async function loadOrCreateServerKey(workDir: string): Promise { + const keyPath = path.join(workDir, SERVER_KEY_FILE); + try { + const key = (await fs.readFile(keyPath, 'utf8')).trim(); + if (key) return key; + } catch { + // fall through to mint + } + const key = crypto.randomBytes(32).toString('base64url'); + await fs.mkdir(workDir, { recursive: true }); + await fs.writeFile(keyPath, key + '\n', { mode: 0o600 }); + return key; +} + +export async function rotateServerKey(workDir: string): Promise { + await fs.rm(path.join(workDir, SERVER_KEY_FILE), { force: true }); + return loadOrCreateServerKey(workDir); +} + +// Hash both sides so timingSafeEqual gets equal-length buffers regardless of +// what the client sent. +export function tokenMatches(presented: string, expected: string): boolean { + const a = crypto.createHash('sha256').update(presented).digest(); + const b = crypto.createHash('sha256').update(expected).digest(); + return crypto.timingSafeEqual(a, b); +} + +// Extracts the bearer token from an Authorization header value or a ?token= +// query fallback (browser WebSocket clients cannot set headers). +export function extractBearer( + authorizationHeader: string | undefined, + queryToken?: string | null, +): string | null { + if (authorizationHeader) { + const match = /^Bearer\s+(.+)$/i.exec(authorizationHeader.trim()); + if (match) return match[1]; + } + return queryToken || null; +} diff --git a/apps/x/apps/server/src/channels.ts b/apps/x/apps/server/src/channels.ts new file mode 100644 index 000000000..01f2e13c8 --- /dev/null +++ b/apps/x/apps/server/src/channels.ts @@ -0,0 +1,43 @@ +import type { ipc } from '@x/shared'; + +// The RPC surface this server exposes over POST /rpc/{channel}. This is the +// strangler-fig migration frontier: channels move here from Electron main's +// in-process handlers group by group; anything not listed 404s (the full +// channel surface is not leaked to unauthenticated probing by name). +// +// turns:subscribe / turns:unsubscribe are deliberately absent — delta +// subscription needs connection identity, so it lives on the WebSocket +// (`{type:'subscribe', topic:'turn-deltas', turnId}`), not HTTP. +export const RPC_CHANNELS = [ + 'sessions:list', + 'sessions:create', + 'sessions:get', + 'sessions:getTurn', + 'sessions:sendMessage', + 'sessions:respondToPermission', + 'sessions:respondToAskHuman', + 'sessions:stopTurn', + 'sessions:resumeTurn', + 'sessions:setTitle', + 'sessions:delete', + 'account:getRowboat', + 'workspace:getRoot', + 'workspace:exists', + 'workspace:stat', + 'workspace:readdir', + 'workspace:readFile', +] as const satisfies readonly ipc.InvokeChannels[]; + +export type RpcChannel = (typeof RPC_CHANNELS)[number]; + +export function isRpcChannel(channel: string): channel is RpcChannel { + return (RPC_CHANNELS as readonly string[]).includes(channel); +} + +// One handler per exposed channel. No Electron event argument — handlers are +// transport-agnostic; connection identity is a WS concern, never an RPC one. +export type RpcHandlers = { + [K in RpcChannel]: ( + args: ipc.IPCChannels[K]['req'], + ) => ipc.IPCChannels[K]['res'] | Promise; +}; diff --git a/apps/x/apps/server/src/config.ts b/apps/x/apps/server/src/config.ts new file mode 100644 index 000000000..17f98938a --- /dev/null +++ b/apps/x/apps/server/src/config.ts @@ -0,0 +1,31 @@ +import fs from 'node:fs/promises'; +import path from 'node:path'; +import { z } from 'zod'; + +// ~/.rowboat/config/server.json — user-facing knobs for the transport. +// 3210 is taken by the Rowboat Apps server; 3220 is ours. +export const DEFAULT_PORT = 3220; + +export const ServerConfig = z.object({ + lanEnabled: z.boolean().default(false), + port: z.number().int().positive().default(DEFAULT_PORT), +}); +export type ServerConfig = z.infer; + +function configPath(workDir: string): string { + return path.join(workDir, 'config', 'server.json'); +} + +export async function loadServerConfig(workDir: string): Promise { + try { + const raw = await fs.readFile(configPath(workDir), 'utf8'); + return ServerConfig.parse(JSON.parse(raw)); + } catch { + return ServerConfig.parse({}); + } +} + +export async function saveServerConfig(workDir: string, config: ServerConfig): Promise { + await fs.mkdir(path.dirname(configPath(workDir)), { recursive: true }); + await fs.writeFile(configPath(workDir), JSON.stringify(config, null, 2) + '\n'); +} diff --git a/apps/x/apps/server/src/core-deps.ts b/apps/x/apps/server/src/core-deps.ts new file mode 100644 index 000000000..9fb857119 --- /dev/null +++ b/apps/x/apps/server/src/core-deps.ts @@ -0,0 +1,88 @@ +import container from '@x/core/dist/di/container.js'; +import type { ISessions, EmitterSessionBus } from '@x/core/dist/runtime/sessions/index.js'; +import type { ITurnEventBus } from '@x/core/dist/runtime/turns/event-hub.js'; +import * as workspaceCore from '@x/core/dist/workspace/workspace.js'; +import { isSignedIn } from '@x/core/dist/account/account.js'; +import { getRowboatConfig } from '@x/core/dist/config/rowboat.js'; +import { getAccessToken } from '@x/core/dist/auth/tokens.js'; +import type { RpcHandlers } from './channels.js'; +import type { EventSources } from './server.js'; + +// Canonical implementations of the exposed channels against the @x/core DI +// container — the same thin pass-throughs Electron main registers in +// apps/main/src/ipc.ts, minus the Electron event argument. As channels +// migrate off main (strangler-fig), this file is where their server-side +// handler lands. + +export function createCoreRpcHandlers(opts?: { sessionsIndexReady?: Promise }): RpcHandlers { + const sessions = () => container.resolve('sessions'); + return { + 'sessions:create': async (args) => { + const sessionId = await sessions().createSession(args); + return { sessionId }; + }, + 'sessions:list': async () => { + await opts?.sessionsIndexReady; + return { sessions: sessions().listSessions() }; + }, + 'sessions:get': async (args) => sessions().getSession(args.sessionId), + 'sessions:getTurn': async (args) => sessions().getTurn(args.turnId), + 'sessions:sendMessage': async (args) => sessions().sendMessage(args.sessionId, args.input, args.config), + 'sessions:respondToPermission': async (args) => { + await sessions().respondToPermission(args.turnId, args.toolCallId, args.decision, args.metadata); + return { success: true }; + }, + 'sessions:respondToAskHuman': async (args) => { + await sessions().respondToAskHuman(args.turnId, args.toolCallId, args.answer); + return { success: true }; + }, + 'sessions:stopTurn': async (args) => { + const { dequeued } = await sessions().stopTurn(args.turnId, args.reason); + return { success: true, dequeued }; + }, + 'sessions:resumeTurn': async (args) => { + await sessions().resumeTurn(args.sessionId); + return { success: true }; + }, + 'sessions:setTitle': async (args) => { + await sessions().setTitle(args.sessionId, args.title); + return { success: true }; + }, + 'sessions:delete': async (args) => { + await sessions().deleteSession(args.sessionId); + return { success: true }; + }, + 'account:getRowboat': async () => { + const signedIn = await isSignedIn(); + if (!signedIn) { + return { signedIn: false, accessToken: null, config: null }; + } + const config = await getRowboatConfig(); + try { + const accessToken = await getAccessToken(); + return { signedIn: true, accessToken, config }; + } catch { + return { signedIn: true, accessToken: null, config }; + } + }, + 'workspace:getRoot': async () => workspaceCore.getRoot(), + 'workspace:exists': async (args) => workspaceCore.exists(args.path), + 'workspace:stat': async (args) => workspaceCore.stat(args.path), + 'workspace:readdir': async (args) => workspaceCore.readdir(args.path, args.opts), + 'workspace:readFile': async (args) => workspaceCore.readFile(args.path, args.encoding), + }; +} + +// Turn/session feeds come from core's in-process buses. workspace:didChange +// is host-sourced (main owns the chokidar watcher today), so hosts wire it +// via EventSources.subscribeWorkspaceEvents themselves. +export function createCoreEventSources(): EventSources { + return { + subscribeTurnEvents: (listener) => + container.resolve('turnEventBus').subscribeAll(listener), + subscribeSessionEvents: (listener) => + container.resolve('sessionBus').subscribe(listener), + }; +} + +export const resolveWorkspacePath = workspaceCore.resolveWorkspacePath; diff --git a/apps/x/apps/server/src/events-client.test.ts b/apps/x/apps/server/src/events-client.test.ts new file mode 100644 index 000000000..ae90a1842 --- /dev/null +++ b/apps/x/apps/server/src/events-client.test.ts @@ -0,0 +1,127 @@ +import fs from 'node:fs/promises'; +import os from 'node:os'; +import path from 'node:path'; +import { afterAll, beforeAll, describe, expect, it } from 'vitest'; +import { createEventsClient, type EventsClient } from '@x/client'; +import type { TurnBusEvent } from '@x/shared/dist/turns.js'; +import type { RpcHandlers } from './channels.js'; +import { RPC_CHANNELS } from './channels.js'; +import { createRowboatServer, type EventSources, type RowboatServer } from './server.js'; + +// Integration: the real @x/client events client against the real transport — +// the exact pairing the phone app ships with. + +function makeEmitter() { + const listeners = new Set<(e: T) => void>(); + return { + subscribe: (l: (e: T) => void) => { + listeners.add(l); + return () => listeners.delete(l); + }, + emit: (e: T) => { + for (const l of listeners) l(e); + }, + }; +} + +const stubHandlers = Object.fromEntries( + RPC_CHANNELS.map((ch) => [ch, () => Promise.reject(new Error('unused'))]), +) as unknown as RpcHandlers; + +const durable = (turnId: string, offset: number): TurnBusEvent => + ({ turnId, sessionId: 's1', offset, event: { type: 'turn_created' } }) as unknown as TurnBusEvent; +const delta = (turnId: string): TurnBusEvent => + ({ turnId, sessionId: 's1', event: { type: 'text_delta', text: 'x' } }) as unknown as TurnBusEvent; + +const waitFor = async (predicate: () => boolean, ms = 5000) => { + const start = Date.now(); + while (!predicate()) { + if (Date.now() - start > ms) throw new Error('timeout waiting for condition'); + await new Promise((r) => setTimeout(r, 25)); + } +}; + +describe('events client ↔ rowboat-server', () => { + let workDir: string; + let server: RowboatServer; + let client: EventsClient; + const turnBus = makeEmitter(); + const sessionBus = makeEmitter(); + const events: EventSources = { + subscribeTurnEvents: turnBus.subscribe, + subscribeSessionEvents: sessionBus.subscribe, + }; + + const makeServer = (port: number) => + createRowboatServer({ + workDir, + handlers: stubHandlers, + events, + resolveWorkspacePath: (rel) => path.join(workDir, rel), + serverVersion: 'test', + port, + }); + + beforeAll(async () => { + workDir = await fs.mkdtemp(path.join(os.tmpdir(), 'rowboat-events-client-')); + server = await makeServer(0); + }); + + afterAll(async () => { + client?.close(); + await server.close(); + await fs.rm(workDir, { recursive: true, force: true }); + }); + + it('connects, receives durable events, and gates deltas on subscription', async () => { + client = createEventsClient({ + baseUrl: `http://127.0.0.1:${server.port}`, + token: server.key, + clientName: 'test', + }); + const received: TurnBusEvent[] = []; + client.on('turns:events', (p) => received.push(p as TurnBusEvent)); + await waitFor(() => client.status() === 'connected'); + + turnBus.emit(durable('t1', 1)); + turnBus.emit(delta('t1')); + await waitFor(() => received.length === 1); + expect(received[0].offset).toBe(1); + + const release = client.subscribeTurnDeltas('t1'); + await new Promise((r) => setTimeout(r, 100)); // let subscribe reach the hub + turnBus.emit(delta('t1')); + await waitFor(() => received.length === 2); + expect(received[1].event.type).toBe('text_delta'); + + release(); + await new Promise((r) => setTimeout(r, 100)); + turnBus.emit(delta('t1')); + turnBus.emit(durable('t1', 2)); + await waitFor(() => received.length === 3); + expect(received[2].offset).toBe(2); // the delta after release never arrived + }); + + it('reconnects after a server restart, fires resync, re-arms delta subs', async () => { + const port = server.port; + let resyncs = 0; + client.onResync(() => (resyncs += 1)); + const release = client.subscribeTurnDeltas('t2'); + + await server.close(); + await waitFor(() => client.status() !== 'connected'); + server = await makeServer(port); + client.reconnectNow(); + await waitFor(() => client.status() === 'connected', 10_000); + expect(resyncs).toBeGreaterThanOrEqual(1); + + // Delta subscription survived the reconnect without a new subscribe call. + const received: TurnBusEvent[] = []; + client.on('turns:events', (p) => received.push(p as TurnBusEvent)); + await new Promise((r) => setTimeout(r, 100)); + turnBus.emit(delta('t2')); + await waitFor(() => received.length === 1); + expect(received[0].turnId).toBe('t2'); + release(); + }); +}); diff --git a/apps/x/apps/server/src/index.ts b/apps/x/apps/server/src/index.ts new file mode 100644 index 000000000..ff00cba67 --- /dev/null +++ b/apps/x/apps/server/src/index.ts @@ -0,0 +1,7 @@ +export { createRowboatServer, type EventSources, type RowboatServer, type RowboatServerOptions } from './server.js'; +export { RPC_CHANNELS, isRpcChannel, type RpcChannel, type RpcHandlers } from './channels.js'; +export { createWsHub, type WsHub, type PushChannel, WS_CLOSE_NO_HELLO, WS_CLOSE_UNAUTHORIZED } from './ws-hub.js'; +export { loadOrCreateServerKey, rotateServerKey, tokenMatches, extractBearer, SERVER_KEY_FILE } from './auth.js'; +export { loadServerConfig, saveServerConfig, ServerConfig, DEFAULT_PORT } from './config.js'; +export { buildPairingPayload, collectPairingUrls, type PairingPayload } from './pairing.js'; +export { createCoreRpcHandlers, createCoreEventSources, resolveWorkspacePath } from './core-deps.js'; diff --git a/apps/x/apps/server/src/pairing.ts b/apps/x/apps/server/src/pairing.ts new file mode 100644 index 000000000..b59c956d6 --- /dev/null +++ b/apps/x/apps/server/src/pairing.ts @@ -0,0 +1,35 @@ +import os from 'node:os'; + +// The QR shown in the desktop app encodes this JSON verbatim. The phone +// probes `urls` in order via authenticated GET /health and keeps the first +// that answers. +export interface PairingPayload { + v: 1; + name: string; + urls: string[]; + token: string; +} + +// Loopback always (simulator pairing); LAN/Tailscale addresses only when the +// user has explicitly opted in — exposing the API beyond the machine is a +// deliberate act, not a default. +export function collectPairingUrls(port: number, lanEnabled: boolean): string[] { + const urls = [`http://127.0.0.1:${port}`]; + if (!lanEnabled) return urls; + for (const infos of Object.values(os.networkInterfaces())) { + for (const info of infos ?? []) { + if (info.family !== 'IPv4' || info.internal) continue; + urls.push(`http://${info.address}:${port}`); + } + } + return urls; +} + +export function buildPairingPayload(port: number, lanEnabled: boolean, token: string): PairingPayload { + return { + v: 1, + name: os.hostname(), + urls: collectPairingUrls(port, lanEnabled), + token, + }; +} diff --git a/apps/x/apps/server/src/router.ts b/apps/x/apps/server/src/router.ts new file mode 100644 index 000000000..df4ae7eee --- /dev/null +++ b/apps/x/apps/server/src/router.ts @@ -0,0 +1,49 @@ +import { Hono } from 'hono'; +import { z } from 'zod'; +import { ipc } from '@x/shared'; +import { isRpcChannel, type RpcHandlers } from './channels.js'; + +// POST /rpc/{channel} — body and response are the channel's existing Zod +// req/res schemas from @x/shared ipcSchemas, so the wire contract is the IPC +// contract. The router is generic; only the handler map knows the channels. +export function createRpcRoutes(handlers: RpcHandlers): Hono { + const app = new Hono(); + + app.post('/rpc/:channel', async (c) => { + const channel = c.req.param('channel'); + // Unexposed channels 404 like unknown ones — don't enumerate the surface. + if (!isRpcChannel(channel) || !(channel in handlers)) { + return c.json({ error: { code: 'unknown_channel', message: `unknown channel: ${channel}` } }, 404); + } + + let body: unknown = null; + const raw = await c.req.text(); + if (raw.length > 0) { + try { + body = JSON.parse(raw); + } catch { + return c.json({ error: { code: 'invalid_request', message: 'body is not valid JSON' } }, 400); + } + } + + let args; + try { + args = ipc.validateRequest(channel, body); + } catch (err) { + const issues = err instanceof z.ZodError ? err.issues : undefined; + return c.json({ error: { code: 'invalid_request', message: 'request failed validation', issues } }, 400); + } + + try { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const result = await (handlers[channel] as (a: unknown) => Promise)(args as any); + return c.json(ipc.validateResponse(channel, result) as object); + } catch (err) { + const message = err instanceof Error ? err.message : String(err); + console.error(`[server] rpc ${channel} failed:`, message); + return c.json({ error: { code: 'internal', message } }, 500); + } + }); + + return app; +} diff --git a/apps/x/apps/server/src/server.test.ts b/apps/x/apps/server/src/server.test.ts new file mode 100644 index 000000000..6165f009d --- /dev/null +++ b/apps/x/apps/server/src/server.test.ts @@ -0,0 +1,286 @@ +import fs from 'node:fs/promises'; +import { request as httpRequest } from 'node:http'; +import os from 'node:os'; +import path from 'node:path'; +import { afterAll, beforeAll, describe, expect, it } from 'vitest'; +import { WebSocket } from 'ws'; +import type { TurnBusEvent } from '@x/shared/dist/turns.js'; +import type { RpcHandlers } from './channels.js'; +import { RPC_CHANNELS } from './channels.js'; +import { createRowboatServer, type EventSources, type RowboatServer } from './server.js'; +import { WS_CLOSE_NO_HELLO, WS_CLOSE_UNAUTHORIZED } from './ws-hub.js'; + +type Listener = (e: T) => void; + +function makeEmitter() { + const listeners = new Set>(); + return { + subscribe: (l: Listener) => { + listeners.add(l); + return () => listeners.delete(l); + }, + emit: (e: T) => { + for (const l of listeners) l(e); + }, + }; +} + +// Full handler map: every exposed channel throws unless a test overrides it. +function stubHandlers(overrides: Partial): RpcHandlers { + const base = Object.fromEntries( + RPC_CHANNELS.map((ch) => [ + ch, + () => { + throw new Error(`no stub for ${ch}`); + }, + ]), + ); + return { ...base, ...overrides } as RpcHandlers; +} + +const durable = (turnId: string, offset: number): TurnBusEvent => + ({ turnId, sessionId: 's1', offset, event: { type: 'turn_created' } }) as unknown as TurnBusEvent; +const delta = (turnId: string): TurnBusEvent => + ({ turnId, sessionId: 's1', event: { type: 'text_delta', text: 'x' } }) as unknown as TurnBusEvent; + +interface WsProbe { + socket: WebSocket; + messages: Array>; + next(predicate?: (m: Record) => boolean): Promise>; + closed: Promise; +} + +function connect(url: string, opts?: { token?: string; hello?: boolean }): WsProbe { + const socket = new WebSocket( + url, + opts?.token ? { headers: { authorization: `Bearer ${opts.token}` } } : undefined, + ); + const messages: Array> = []; + const waiters: Array<{ predicate: (m: Record) => boolean; resolve: (m: Record) => void }> = []; + socket.on('message', (data) => { + const msg = JSON.parse(String(data)) as Record; + messages.push(msg); + for (let i = waiters.length - 1; i >= 0; i--) { + if (waiters[i].predicate(msg)) { + waiters.splice(i, 1)[0].resolve(msg); + } + } + }); + const closed = new Promise((resolve) => socket.on('close', (code) => resolve(code))); + if (opts?.hello) { + socket.on('open', () => socket.send(JSON.stringify({ type: 'hello', v: 1, client: { name: 'test' } }))); + } + return { + socket, + messages, + closed, + next: (predicate = () => true) => { + const already = messages.find(predicate); + if (already) return Promise.resolve(already); + return new Promise((resolve) => waiters.push({ predicate, resolve })); + }, + }; +} + +describe('rowboat-server transport', () => { + let workDir: string; + let server: RowboatServer; + let base: string; + const turnBus = makeEmitter(); + const sessionBus = makeEmitter(); + + const events: EventSources = { + subscribeTurnEvents: turnBus.subscribe, + subscribeSessionEvents: sessionBus.subscribe, + }; + + beforeAll(async () => { + workDir = await fs.mkdtemp(path.join(os.tmpdir(), 'rowboat-server-test-')); + await fs.mkdir(path.join(workDir, 'notes'), { recursive: true }); + await fs.writeFile(path.join(workDir, 'notes', 'hello.md'), '# hi\n'); + server = await createRowboatServer({ + workDir, + handlers: stubHandlers({ + 'sessions:list': async () => ({ sessions: [] }), + }), + events, + resolveWorkspacePath: (rel) => { + if (rel.includes('..') || rel.startsWith('forbidden') || path.isAbsolute(rel)) { + throw new Error('traversal'); + } + return path.join(workDir, rel); + }, + serverVersion: 'test', + port: 0, // let the OS pick a free port + }); + base = `http://127.0.0.1:${server.port}`; + }); + + afterAll(async () => { + await server.close(); + await fs.rm(workDir, { recursive: true, force: true }); + }); + + const authed = (init?: RequestInit): RequestInit => ({ + ...init, + headers: { ...(init?.headers as Record), authorization: `Bearer ${server.key}` }, + }); + + it('serves /health unauthenticated', async () => { + const res = await fetch(`${base}/health`); + expect(res.status).toBe(200); + expect(await res.json()).toMatchObject({ ok: true, apiVersion: 0 }); + expect(res.headers.get('x-rowboat-api-version')).toBe('0'); + }); + + it('rejects rpc without a bearer token', async () => { + const res = await fetch(`${base}/rpc/sessions:list`, { method: 'POST' }); + expect(res.status).toBe(401); + }); + + it('rejects a wrong bearer token', async () => { + const res = await fetch(`${base}/rpc/sessions:list`, { + method: 'POST', + headers: { authorization: 'Bearer nope' }, + }); + expect(res.status).toBe(401); + }); + + it('answers an allowlisted channel', async () => { + const res = await fetch(`${base}/rpc/sessions:list`, authed({ method: 'POST', body: '{}' })); + expect(res.status).toBe(200); + expect(await res.json()).toEqual({ sessions: [] }); + }); + + it('404s channels outside the allowlist without leaking the surface', async () => { + for (const channel of ['models:list', 'no-such-channel', 'turns:subscribe']) { + const res = await fetch(`${base}/rpc/${channel}`, authed({ method: 'POST', body: '{}' })); + expect(res.status).toBe(404); + const body = (await res.json()) as { error: { code: string } }; + expect(body.error.code).toBe('unknown_channel'); + } + }); + + it('400s a payload that fails the request schema', async () => { + const res = await fetch( + `${base}/rpc/sessions:get`, + authed({ method: 'POST', body: JSON.stringify({ wrong: true }) }), + ); + expect(res.status).toBe(400); + const body = (await res.json()) as { error: { code: string } }; + expect(body.error.code).toBe('invalid_request'); + }); + + it('500s a handler failure with the internal code', async () => { + const res = await fetch( + `${base}/rpc/sessions:get`, + authed({ method: 'POST', body: JSON.stringify({ sessionId: 's1' }) }), + ); + expect(res.status).toBe(500); + }); + + it('serves workspace files with auth and blocks traversal', async () => { + const ok = await fetch(`${base}/workspace/notes/hello.md`, authed()); + expect(ok.status).toBe(200); + expect(await ok.text()).toBe('# hi\n'); + expect(ok.headers.get('content-type')).toContain('text/markdown'); + + const noAuth = await fetch(`${base}/workspace/notes/hello.md`); + expect(noAuth.status).toBe(401); + + // Dot segments (raw or percent-encoded) are collapsed by WHATWG URL + // parsing inside the node adapter before routing, so a traversal path + // never reaches the handler — assert it can't leak a file either way. + const traversal = await new Promise<{ status: number; body: string }>((resolve, reject) => { + const req = httpRequest( + { + host: '127.0.0.1', + port: server.port, + path: '/workspace/notes/../../../../etc/passwd', + headers: { authorization: `Bearer ${server.key}` }, + }, + (res) => { + let body = ''; + res.on('data', (chunk) => (body += chunk)); + res.on('end', () => resolve({ status: res.statusCode ?? 0, body })); + }, + ); + req.on('error', reject); + req.end(); + }); + expect([403, 404]).toContain(traversal.status); + expect(traversal.body).not.toContain('root:'); + + // The handler's own guard: resolver refusals map to 403. + const refused = await fetch(`${base}/workspace/forbidden/x.md`, authed()); + expect(refused.status).toBe(403); + + const missing = await fetch(`${base}/workspace/notes/nope.md`, authed()); + expect(missing.status).toBe(404); + }); + + it('closes unauthorized websockets with 4401', async () => { + const probe = connect(`ws://127.0.0.1:${server.port}/events`); + expect(await probe.closed).toBe(WS_CLOSE_UNAUTHORIZED); + }); + + it('accepts ?token= for browser clients', async () => { + const probe = connect(`ws://127.0.0.1:${server.port}/events?token=${server.key}`, { hello: true }); + const welcome = await probe.next((m) => m.type === 'welcome'); + expect(welcome.seq).toBe(1); + probe.socket.close(); + }); + + it('broadcasts durable turn events, routes deltas to subscribers only, seq stays monotonic', async () => { + const sub = connect(`ws://127.0.0.1:${server.port}/events`, { token: server.key, hello: true }); + const bystander = connect(`ws://127.0.0.1:${server.port}/events`, { token: server.key, hello: true }); + await sub.next((m) => m.type === 'welcome'); + await bystander.next((m) => m.type === 'welcome'); + + sub.socket.send(JSON.stringify({ type: 'subscribe', topic: 'turn-deltas', turnId: 't1' })); + // subscribe is fire-and-forget; give the server a beat to process it + await new Promise((r) => setTimeout(r, 50)); + + turnBus.emit(durable('t1', 1)); + turnBus.emit(delta('t1')); + turnBus.emit(durable('t1', 2)); + + await sub.next((m) => { + const p = m.payload as { offset?: number } | undefined; + return m.type === 'event' && p?.offset === 2; + }); + await bystander.next((m) => { + const p = m.payload as { offset?: number } | undefined; + return m.type === 'event' && p?.offset === 2; + }); + + const subEvents = sub.messages.filter((m) => m.type === 'event'); + const bystanderEvents = bystander.messages.filter((m) => m.type === 'event'); + expect(subEvents).toHaveLength(3); // durable + delta + durable + expect(bystanderEvents).toHaveLength(2); // durable only + + const seqs = sub.messages.map((m) => m.seq as number); + expect(seqs).toEqual([...seqs].sort((a, b) => a - b)); + expect(new Set(seqs).size).toBe(seqs.length); + + sub.socket.close(); + bystander.socket.close(); + }); + + it('drops clients that never say hello', async () => { + const tmp = await fs.mkdtemp(path.join(os.tmpdir(), 'rowboat-hello-test-')); + const quick = await createRowboatServer({ + workDir: tmp, + handlers: stubHandlers({}), + events, + resolveWorkspacePath: (rel) => path.join(tmp, rel), + serverVersion: 'test', + port: 0, + helloTimeoutMs: 100, + }); + const probe = connect(`ws://127.0.0.1:${quick.port}/events`, { token: quick.key }); + expect(await probe.closed).toBe(WS_CLOSE_NO_HELLO); + await quick.close(); + await fs.rm(tmp, { recursive: true, force: true }); + }); +}); diff --git a/apps/x/apps/server/src/server.ts b/apps/x/apps/server/src/server.ts new file mode 100644 index 000000000..764b5db9d --- /dev/null +++ b/apps/x/apps/server/src/server.ts @@ -0,0 +1,134 @@ +import type { Server as HttpServer } from 'node:http'; +import { createAdaptorServer } from '@hono/node-server'; +import { Hono } from 'hono'; +import type { TurnBusEvent } from '@x/shared/dist/turns.js'; +import type { SessionBusEvent } from '@x/shared/dist/sessions.js'; +import { WorkspaceChangeEvent } from '@x/shared/dist/workspace.js'; +import { z } from 'zod'; +import { extractBearer, loadOrCreateServerKey, tokenMatches } from './auth.js'; +import type { RpcHandlers } from './channels.js'; +import { loadServerConfig } from './config.js'; +import { createRpcRoutes } from './router.js'; +import { createWorkspaceRoutes } from './workspace-route.js'; +import { createWsHub, type WsHub } from './ws-hub.js'; + +// Assembles the transport: HTTP router + workspace files + WS event hub on +// one node:http server. Deliberately does NOT boot @x/core — the host (today +// Electron main in-process, later the standalone headless entrypoint) owns +// exactly one core instance and hands its handler map and event buses in. +// That inversion is what keeps the strangler-fig slice split-brain-free. + +export interface EventSources { + subscribeTurnEvents(listener: (e: TurnBusEvent) => void): () => void; + subscribeSessionEvents(listener: (e: SessionBusEvent) => void): () => void; + subscribeWorkspaceEvents?(listener: (e: z.infer) => void): () => void; +} + +export interface RowboatServerOptions { + workDir: string; + handlers: RpcHandlers; + events: EventSources; + resolveWorkspacePath: (relPath: string) => string; + serverVersion: string; + /** Test overrides; production callers rely on config/server.json. */ + port?: number; + host?: string; + helloTimeoutMs?: number; +} + +export interface RowboatServer { + port: number; + host: string; + lanEnabled: boolean; + key: string; + hub: WsHub; + close(): Promise; +} + +const PORT_FALLBACK_ATTEMPTS = 10; + +function listenOnce(server: HttpServer, host: string, port: number): Promise { + return new Promise((resolve, reject) => { + const onError = (err: Error) => { + server.off('listening', onListening); + reject(err); + }; + const onListening = () => { + server.off('error', onError); + resolve(); + }; + server.once('error', onError); + server.once('listening', onListening); + server.listen(port, host); + }); +} + +export async function createRowboatServer(opts: RowboatServerOptions): Promise { + const config = await loadServerConfig(opts.workDir); + const key = await loadOrCreateServerKey(opts.workDir); + const host = opts.host ?? (config.lanEnabled ? '0.0.0.0' : '127.0.0.1'); + const startPort = opts.port ?? config.port; + + const app = new Hono(); + app.use('*', async (c, next) => { + await next(); + c.header('x-rowboat-api-version', '0'); + }); + + // Unauthenticated on purpose: the phone probes candidate URLs with it + // during pairing, before it can prove it holds the key. + app.get('/health', (c) => + c.json({ ok: true, name: 'rowboat-server', apiVersion: 0, serverVersion: opts.serverVersion }), + ); + + app.use('*', async (c, next) => { + const token = extractBearer(c.req.header('authorization'), c.req.query('token')); + if (!token || !tokenMatches(token, key)) { + return c.json({ error: { code: 'unauthorized', message: 'missing or invalid bearer token' } }, 401); + } + await next(); + }); + + app.route('/', createRpcRoutes(opts.handlers)); + app.route('/', createWorkspaceRoutes(opts.resolveWorkspacePath)); + + const httpServer = createAdaptorServer({ fetch: app.fetch }) as HttpServer; + + for (let attempt = 0; ; attempt++) { + try { + await listenOnce(httpServer, host, startPort + attempt); + break; + } catch (err) { + const code = (err as NodeJS.ErrnoException).code; + if (code !== 'EADDRINUSE' || attempt >= PORT_FALLBACK_ATTEMPTS - 1) throw err; + } + } + const address = httpServer.address(); + const boundPort = typeof address === 'object' && address ? address.port : startPort; + + const hub = createWsHub(); + hub.attach(httpServer, { + serverKey: key, + serverVersion: opts.serverVersion, + helloTimeoutMs: opts.helloTimeoutMs, + }); + + const unsubscribers = [ + opts.events.subscribeTurnEvents((e) => hub.handleTurnEvent(e)), + opts.events.subscribeSessionEvents((e) => hub.broadcast('sessions:events', e)), + opts.events.subscribeWorkspaceEvents?.((e) => hub.broadcast('workspace:didChange', e)), + ]; + + return { + port: boundPort, + host, + lanEnabled: config.lanEnabled, + key, + hub, + close: async () => { + for (const unsub of unsubscribers) unsub?.(); + hub.close(); + await new Promise((resolve) => httpServer.close(() => resolve())); + }, + }; +} diff --git a/apps/x/apps/server/src/standalone.ts b/apps/x/apps/server/src/standalone.ts new file mode 100644 index 000000000..6e38b0d7c --- /dev/null +++ b/apps/x/apps/server/src/standalone.ts @@ -0,0 +1,93 @@ +import fs from 'node:fs/promises'; +import path from 'node:path'; +import process from 'node:process'; +import { WorkDir } from '@x/core/dist/config/config.js'; +import { initConfigs } from '@x/core/dist/config/initConfigs.js'; +import container, { + registerBrowserControlService, + registerNotificationService, +} from '@x/core/dist/di/container.js'; +import type { ISessions } from '@x/core/dist/runtime/sessions/index.js'; +import { createCoreEventSources, createCoreRpcHandlers, resolveWorkspacePath } from './core-deps.js'; +import { createRowboatServer } from './server.js'; + +// Headless rowboat-server: the RFC's end-state entrypoint, where main spawns +// this as a child process (or it runs on a remote box) and core lives here. +// +// UNTIL that flip lands, this must never run against a workdir a live +// Electron app is using — two core instances over one ~/.rowboat double-run +// schedulers and split-brain the session index. The pid lockfile plus the +// Electron app's own single-instance lock make that mistake loud instead of +// silent. Intended use today: integration tests and dev, always with an +// isolated ROWBOAT_WORKDIR. +// +// Deliberately NOT started here (Phase 1 work, moves over with the flip): +// schedulers, knowledge sync (gmail/calendar/granola/fireflies), event +// processor, live-note + bg-task agents. + +const LOCK_FILE = 'server.lock'; + +async function acquireLock(workDir: string): Promise<() => Promise> { + const lockPath = path.join(workDir, LOCK_FILE); + try { + const existing = parseInt(await fs.readFile(lockPath, 'utf8'), 10); + if (Number.isFinite(existing)) { + try { + process.kill(existing, 0); // throws if the pid is gone + throw new Error( + `another rowboat-server (pid ${existing}) already owns ${workDir} — refusing to split-brain`, + ); + } catch (err) { + if ((err as NodeJS.ErrnoException).code !== 'ESRCH') throw err; + // stale lock from a dead process — take over + } + } + } catch (err) { + if ((err as NodeJS.ErrnoException).code !== 'ENOENT') throw err; + } + await fs.mkdir(workDir, { recursive: true }); + await fs.writeFile(lockPath, String(process.pid)); + return async () => { + await fs.rm(lockPath, { force: true }); + }; +} + +async function main(): Promise { + const releaseLock = await acquireLock(WorkDir); + + await initConfigs(); + registerNotificationService({ isSupported: () => false, notify: () => {} }); + registerBrowserControlService({ + execute: async () => { + throw new Error('browser control is unavailable on a headless server'); + }, + }); + + const sessions = container.resolve('sessions'); + const sessionsIndexReady = sessions.initialize().catch((err: unknown) => { + console.error('[server] session index scan failed:', err); + }); + + const server = await createRowboatServer({ + workDir: WorkDir, + handlers: createCoreRpcHandlers({ sessionsIndexReady }), + events: createCoreEventSources(), + resolveWorkspacePath, + serverVersion: process.env.npm_package_version ?? '0.0.0', + }); + + console.log(`[server] rowboat-server listening on http://${server.host}:${server.port} (workdir: ${WorkDir})`); + + const shutdown = async () => { + await server.close(); + await releaseLock(); + process.exit(0); + }; + process.on('SIGINT', () => void shutdown()); + process.on('SIGTERM', () => void shutdown()); +} + +main().catch((err) => { + console.error('[server] fatal:', err); + process.exit(1); +}); diff --git a/apps/x/apps/server/src/workspace-route.ts b/apps/x/apps/server/src/workspace-route.ts new file mode 100644 index 000000000..7e06cba82 --- /dev/null +++ b/apps/x/apps/server/src/workspace-route.ts @@ -0,0 +1,56 @@ +import fs from 'node:fs/promises'; +import path from 'node:path'; +import { Hono } from 'hono'; + +// GET /workspace/{rel-path} — the network twin of the Electron app://workspace +// protocol (apps/main/src/main.ts): serves note attachments/media to paired +// clients. Same traversal guard, authenticated like every other route. + +const CONTENT_TYPES: Record = { + '.md': 'text/markdown; charset=utf-8', + '.txt': 'text/plain; charset=utf-8', + '.json': 'application/json', + '.png': 'image/png', + '.jpg': 'image/jpeg', + '.jpeg': 'image/jpeg', + '.gif': 'image/gif', + '.webp': 'image/webp', + '.svg': 'image/svg+xml', + '.pdf': 'application/pdf', + '.mp4': 'video/mp4', + '.mov': 'video/quicktime', + '.mp3': 'audio/mpeg', + '.m4a': 'audio/mp4', + '.wav': 'audio/wav', +}; + +export function createWorkspaceRoutes(resolveWorkspacePath: (relPath: string) => string): Hono { + const app = new Hono(); + + app.get('/workspace/*', async (c) => { + const relPath = decodeURIComponent(c.req.path.replace(/^\/workspace\/+/, '')); + if (!relPath) return c.text('Not Found', 404); + + let absPath: string; + try { + absPath = resolveWorkspacePath(relPath); + } catch { + return c.text('Forbidden', 403); + } + + try { + const stats = await fs.stat(absPath); + if (!stats.isFile()) return c.text('Not Found', 404); + const data = await fs.readFile(absPath); + const type = CONTENT_TYPES[path.extname(absPath).toLowerCase()] ?? 'application/octet-stream'; + return c.body(new Uint8Array(data), 200, { + 'Content-Type': type, + 'Content-Length': String(stats.size), + }); + } catch { + return c.text('Not Found', 404); + } + }); + + return app; +} diff --git a/apps/x/apps/server/src/ws-hub.ts b/apps/x/apps/server/src/ws-hub.ts new file mode 100644 index 000000000..a418ccae2 --- /dev/null +++ b/apps/x/apps/server/src/ws-hub.ts @@ -0,0 +1,182 @@ +import type { IncomingMessage, Server as HttpServer } from 'node:http'; +import type { Duplex } from 'node:stream'; +import { WebSocketServer, WebSocket } from 'ws'; +import { z } from 'zod'; +import { isDurableTurnEvent, type TurnBusEvent } from '@x/shared/dist/turns.js'; +import { extractBearer, tokenMatches } from './auth.js'; + +// One WebSocket at /events carries every push channel. Delivery mirrors the +// Electron-window semantics in apps/main/src/ipc.ts: durable events broadcast +// to every authenticated client; high-volume turn deltas (text_delta / +// reasoning_delta) go only to connections that subscribed to that turnId. +// +// Every server→client message is stamped with a per-connection monotonic +// `seq`. Broadcast is fire-and-forget with no replay buffer — a client that +// detects a gap refetches what it displays (the event-sourced turn design +// makes that exact; see @x/shared turn-follower). + +export type PushChannel = 'turns:events' | 'sessions:events' | 'workspace:didChange'; + +const ClientMessage = z.discriminatedUnion('type', [ + z.object({ + type: z.literal('hello'), + v: z.literal(1), + client: z.object({ name: z.string(), version: z.string().optional() }).optional(), + // Declared but unused in v1 — the handshake slot for reverse-call + // capabilities (notifications, browser-control) per the RFC. + capabilities: z.array(z.string()).optional(), + }), + z.object({ + type: z.literal('subscribe'), + topic: z.literal('turn-deltas'), + turnId: z.string(), + }), + z.object({ + type: z.literal('unsubscribe'), + topic: z.literal('turn-deltas'), + turnId: z.string(), + }), +]); + +interface Connection { + socket: WebSocket; + seq: number; + helloed: boolean; + deltaSubs: Set; +} + +const HELLO_TIMEOUT_MS = 5000; + +// Close codes (4xxx = application-defined). +export const WS_CLOSE_UNAUTHORIZED = 4401; +export const WS_CLOSE_NO_HELLO = 4400; + +export interface WsHub { + attach( + server: HttpServer, + opts: { path?: string; serverKey: string; serverVersion: string; helloTimeoutMs?: number }, + ): void; + /** Broadcast a push-channel event to every fully-connected client. */ + broadcast(channel: PushChannel, payload: unknown): void; + /** Route one turn-spine event: durable → broadcast, delta → subscribers only. */ + handleTurnEvent(event: TurnBusEvent): void; + connectionCount(): number; + close(): void; +} + +export function createWsHub(): WsHub { + const connections = new Set(); + let wss: WebSocketServer | null = null; + + const send = (conn: Connection, message: Record) => { + if (conn.socket.readyState !== WebSocket.OPEN) return; + conn.seq += 1; + conn.socket.send(JSON.stringify({ seq: conn.seq, ...message })); + }; + + const broadcast = (channel: PushChannel, payload: unknown) => { + for (const conn of connections) { + if (conn.helloed) send(conn, { type: 'event', channel, payload }); + } + }; + + const handleTurnEvent = (event: TurnBusEvent) => { + if (isDurableTurnEvent(event.event)) { + broadcast('turns:events', event); + return; + } + for (const conn of connections) { + if (conn.helloed && conn.deltaSubs.has(event.turnId)) { + send(conn, { type: 'event', channel: 'turns:events', payload: event }); + } + } + }; + + const attach: WsHub['attach'] = (server, opts) => { + const wsPath = opts.path ?? '/events'; + wss = new WebSocketServer({ noServer: true }); + + server.on('upgrade', (request: IncomingMessage, socket: Duplex, head: Buffer) => { + const url = new URL(request.url ?? '/', 'http://localhost'); + if (url.pathname !== wsPath) { + socket.destroy(); + return; + } + const token = extractBearer(request.headers.authorization, url.searchParams.get('token')); + if (!token || !tokenMatches(token, opts.serverKey)) { + // Complete the handshake so the client sees a clean close code + // instead of a socket error, then reject. + wss!.handleUpgrade(request, socket, head, (ws) => { + ws.close(WS_CLOSE_UNAUTHORIZED, 'unauthorized'); + }); + return; + } + wss!.handleUpgrade(request, socket, head, (ws) => { + wss!.emit('connection', ws, request); + }); + }); + + wss.on('connection', (socket: WebSocket) => { + const conn: Connection = { socket, seq: 0, helloed: false, deltaSubs: new Set() }; + connections.add(conn); + + const helloTimer = setTimeout(() => { + if (!conn.helloed) socket.close(WS_CLOSE_NO_HELLO, 'hello required'); + }, opts.helloTimeoutMs ?? HELLO_TIMEOUT_MS); + + socket.on('message', (data) => { + let parsed: z.infer; + try { + parsed = ClientMessage.parse(JSON.parse(String(data))); + } catch { + send(conn, { type: 'error', code: 'bad_message', message: 'unrecognized message' }); + return; + } + switch (parsed.type) { + case 'hello': + if (!conn.helloed) { + conn.helloed = true; + clearTimeout(helloTimer); + send(conn, { + type: 'welcome', + apiVersion: 0, + serverVersion: opts.serverVersion, + capabilities: [], + }); + } + break; + case 'subscribe': + conn.deltaSubs.add(parsed.turnId); + break; + case 'unsubscribe': + conn.deltaSubs.delete(parsed.turnId); + break; + } + }); + + socket.on('close', () => { + clearTimeout(helloTimer); + connections.delete(conn); + }); + socket.on('error', () => { + clearTimeout(helloTimer); + connections.delete(conn); + }); + }); + }; + + return { + attach, + broadcast, + handleTurnEvent, + connectionCount: () => connections.size, + close: () => { + for (const conn of connections) { + conn.socket.close(1001, 'server shutting down'); + } + connections.clear(); + wss?.close(); + wss = null; + }, + }; +} diff --git a/apps/x/apps/server/tsconfig.build.json b/apps/x/apps/server/tsconfig.build.json new file mode 100644 index 000000000..4838eeca1 --- /dev/null +++ b/apps/x/apps/server/tsconfig.build.json @@ -0,0 +1,7 @@ +{ + "extends": "./tsconfig.json", + "exclude": [ + "src/**/*.test.ts", + "src/**/*.spec.ts" + ] +} diff --git a/apps/x/apps/server/tsconfig.json b/apps/x/apps/server/tsconfig.json new file mode 100644 index 000000000..71cd83b98 --- /dev/null +++ b/apps/x/apps/server/tsconfig.json @@ -0,0 +1,12 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "declaration": true, + "outDir": "dist", + "rootDir": "src", + "types": ["node"] + }, + "include": [ + "src" + ] +} diff --git a/apps/x/package.json b/apps/x/package.json index fbead12c9..3e7f4238f 100644 --- a/apps/x/package.json +++ b/apps/x/package.json @@ -8,18 +8,23 @@ "renderer": "cd apps/renderer && npm run dev", "shared": "cd packages/shared && npm run build", "core": "cd packages/core && npm run build", + "server": "cd apps/server && npm run build", + "client": "cd packages/client && npm run build", "preload": "cd apps/preload && npm run build", - "deps": "npm run shared && npm run core && npm run preload", + "deps": "npm run shared && npm run core && npm run server && npm run client && npm run preload", "main": "wait-on http://localhost:5173 && cd apps/main && npm run build && npm run start", "lint": "eslint .", "lint:fix": "eslint . --fix", - "test": "npm run shared && npm run test:shared && npm run test:core && npm run test:renderer", + "test": "npm run shared && npm run client && npm run test:shared && npm run test:core && npm run test:server && npm run test:renderer", "test:shared": "cd packages/shared && npm test", "test:core": "cd packages/core && npm test", + "test:server": "cd apps/server && npm test", "test:renderer": "cd apps/renderer && npm test", - "typecheck": "npm run shared && npm run typecheck:shared && npm run typecheck:core && npm run typecheck:renderer", + "typecheck": "npm run shared && npm run core && npm run client && npm run typecheck:shared && npm run typecheck:core && npm run typecheck:server && npm run typecheck:client && npm run typecheck:renderer", + "typecheck:client": "cd packages/client && npm run typecheck", "typecheck:shared": "cd packages/shared && npm run typecheck", "typecheck:core": "cd packages/core && npm run typecheck", + "typecheck:server": "cd apps/server && npm run typecheck", "typecheck:renderer": "cd apps/renderer && npm run typecheck" }, "devDependencies": { diff --git a/apps/x/packages/client/.gitignore b/apps/x/packages/client/.gitignore new file mode 100644 index 000000000..b94707787 --- /dev/null +++ b/apps/x/packages/client/.gitignore @@ -0,0 +1,2 @@ +node_modules/ +dist/ diff --git a/apps/x/packages/client/package.json b/apps/x/packages/client/package.json new file mode 100644 index 000000000..f618719a8 --- /dev/null +++ b/apps/x/packages/client/package.json @@ -0,0 +1,21 @@ +{ + "name": "@x/client", + "private": true, + "type": "module", + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "scripts": { + "build": "rm -rf dist && tsc -p tsconfig.build.json", + "dev": "tsc -w -p tsconfig.build.json", + "typecheck": "tsc --noEmit -p tsconfig.json", + "test": "vitest run", + "test:watch": "vitest" + }, + "dependencies": { + "@x/shared": "workspace:*", + "zod": "^4.2.1" + }, + "devDependencies": { + "vitest": "catalog:" + } +} diff --git a/apps/x/packages/client/src/events.ts b/apps/x/packages/client/src/events.ts new file mode 100644 index 000000000..55cf63dcc --- /dev/null +++ b/apps/x/packages/client/src/events.ts @@ -0,0 +1,231 @@ +import type { turns } from '@x/shared'; + +// WebSocket client for the rowboat-server /events feed. Mirrors the wire +// protocol in @x/server ws-hub.ts: hello → welcome, seq-stamped messages, +// per-turn delta subscriptions. Handles what Electron IPC never had to — +// drops, reconnects, and gaps — with the RFC's refetch-on-reconnect model: +// this client only *detects* gaps; consumers (turn-follower, list views) +// refetch what they display. + +export type ConnectionStatus = 'connecting' | 'connected' | 'disconnected'; + +export type PushChannel = 'turns:events' | 'sessions:events' | 'workspace:didChange'; + +interface ServerMessage { + seq: number; + type: 'welcome' | 'event' | 'error'; + channel?: PushChannel; + payload?: unknown; +} + +export interface EventsClient { + /** Listen to one push channel. Returns unsubscribe. */ + on(channel: PushChannel, listener: (payload: unknown) => void): () => void; + onStatus(listener: (status: ConnectionStatus) => void): () => void; + /** + * Fired after a reconnect or a seq gap — consumers must refetch what they + * display (snapshots make this exact; there is no server replay). + */ + onResync(listener: () => void): () => void; + /** Refcounted turn-delta subscription (text/reasoning deltas for one turn). */ + subscribeTurnDeltas(turnId: string): () => void; + status(): ConnectionStatus; + /** Force an immediate reconnect attempt (e.g. app returned to foreground). */ + reconnectNow(): void; + close(): void; +} + +const BACKOFF_MIN_MS = 1000; +const BACKOFF_MAX_MS = 30_000; + +export function createEventsClient(opts: { + baseUrl: string; + token: string; + clientName: string; + clientVersion?: string; + /** Fired on a 4401 close — the server key was rotated; stop reconnecting. */ + onUnauthorized?: () => void; +}): EventsClient { + const wsUrl = `${opts.baseUrl.replace(/\/+$/, '').replace(/^http/, 'ws')}/events`; + + const channelListeners = new Map void>>(); + const statusListeners = new Set<(status: ConnectionStatus) => void>(); + const resyncListeners = new Set<() => void>(); + const deltaRefs = new Map(); + + let socket: WebSocket | null = null; + let currentStatus: ConnectionStatus = 'connecting'; + let lastSeq = 0; + let everConnected = false; + let backoff = BACKOFF_MIN_MS; + let retryTimer: ReturnType | null = null; + let closed = false; + + const setStatus = (status: ConnectionStatus) => { + if (status === currentStatus) return; + currentStatus = status; + for (const l of statusListeners) l(status); + }; + + const fireResync = () => { + for (const l of resyncListeners) l(); + }; + + const send = (message: Record) => { + if (socket?.readyState === WebSocket.OPEN) { + socket.send(JSON.stringify(message)); + } + }; + + const connect = () => { + if (closed) return; + setStatus('connecting'); + lastSeq = 0; + // React Native's WebSocket accepts a headers option; browsers don't. + // The ?token= fallback works everywhere, so use it unconditionally. + const ws = new WebSocket(`${wsUrl}?token=${encodeURIComponent(opts.token)}`); + socket = ws; + + ws.onopen = () => { + send({ + type: 'hello', + v: 1, + client: { name: opts.clientName, version: opts.clientVersion }, + capabilities: [], + }); + }; + + ws.onmessage = (event: MessageEvent) => { + let msg: ServerMessage; + try { + msg = JSON.parse(String(event.data)) as ServerMessage; + } catch { + return; + } + if (typeof msg.seq === 'number') { + if (lastSeq !== 0 && msg.seq !== lastSeq + 1) { + // Transport-level gap: something was dropped between stamped + // messages. Tell consumers to refetch; keep the socket. + fireResync(); + } + lastSeq = msg.seq; + } + if (msg.type === 'welcome') { + backoff = BACKOFF_MIN_MS; + setStatus('connected'); + // Re-arm delta subscriptions that outlived the previous socket, and + // let consumers reconcile anything missed while disconnected. + for (const turnId of deltaRefs.keys()) { + send({ type: 'subscribe', topic: 'turn-deltas', turnId }); + } + if (everConnected) fireResync(); + everConnected = true; + return; + } + if (msg.type === 'event' && msg.channel) { + const listeners = channelListeners.get(msg.channel); + if (listeners) { + for (const l of listeners) l(msg.payload); + } + } + }; + + const scheduleRetry = () => { + if (closed || retryTimer) return; + setStatus('disconnected'); + retryTimer = setTimeout(() => { + retryTimer = null; + connect(); + }, backoff); + backoff = Math.min(backoff * 2, BACKOFF_MAX_MS); + }; + + ws.onclose = (event: { code?: number }) => { + if (event?.code === 4401) { + closed = true; + setStatus('disconnected'); + opts.onUnauthorized?.(); + return; + } + scheduleRetry(); + }; + ws.onerror = () => { + // onclose follows onerror; nothing else to do here. + }; + }; + + connect(); + + return { + on(channel, listener) { + let set = channelListeners.get(channel); + if (!set) { + set = new Set(); + channelListeners.set(channel, set); + } + set.add(listener); + return () => set.delete(listener); + }, + onStatus(listener) { + statusListeners.add(listener); + listener(currentStatus); + return () => statusListeners.delete(listener); + }, + onResync(listener) { + resyncListeners.add(listener); + return () => resyncListeners.delete(listener); + }, + subscribeTurnDeltas(turnId) { + const refs = deltaRefs.get(turnId) ?? 0; + deltaRefs.set(turnId, refs + 1); + if (refs === 0) { + send({ type: 'subscribe', topic: 'turn-deltas', turnId }); + } + let released = false; + return () => { + if (released) return; + released = true; + const current = deltaRefs.get(turnId) ?? 0; + if (current <= 1) { + deltaRefs.delete(turnId); + send({ type: 'unsubscribe', topic: 'turn-deltas', turnId }); + } else { + deltaRefs.set(turnId, current - 1); + } + }; + }, + status: () => currentStatus, + reconnectNow() { + if (closed || currentStatus === 'connected') return; + if (retryTimer) { + clearTimeout(retryTimer); + retryTimer = null; + } + backoff = BACKOFF_MIN_MS; + socket?.close(); + connect(); + }, + close() { + closed = true; + if (retryTimer) clearTimeout(retryTimer); + socket?.close(); + setStatus('disconnected'); + }, + }; +} + +/** + * Adapts the events client to the turn-follower's `subscribe` dependency: + * filters turns:events to TurnBusEvents and manages the delta subscription + * for the followed turn alongside. + */ +export function turnFeedFromEvents( + events: EventsClient, +): (listener: (e: turns.TurnBusEvent) => void) => () => void { + return (listener) => { + const offEvents = events.on('turns:events', (payload) => { + listener(payload as turns.TurnBusEvent); + }); + return offEvents; + }; +} diff --git a/apps/x/packages/client/src/index.ts b/apps/x/packages/client/src/index.ts new file mode 100644 index 000000000..f6664cb9a --- /dev/null +++ b/apps/x/packages/client/src/index.ts @@ -0,0 +1,9 @@ +export { createRpcClient, RpcError, type RpcClient } from './rpc.js'; +export { + createEventsClient, + turnFeedFromEvents, + type ConnectionStatus, + type EventsClient, + type PushChannel, +} from './events.js'; +export { createSessionsClient, type SessionsClient, type SendMessageConfig } from './sessions.js'; diff --git a/apps/x/packages/client/src/rpc.ts b/apps/x/packages/client/src/rpc.ts new file mode 100644 index 000000000..fd73e6c13 --- /dev/null +++ b/apps/x/packages/client/src/rpc.ts @@ -0,0 +1,71 @@ +import { ipc } from '@x/shared'; + +// Typed HTTP twin of window.ipc.invoke: POST /rpc/{channel} against a +// rowboat-server, request/response shapes taken from the same ipcSchemas the +// desktop IPC uses. Portable across React Native and Node (global fetch) — +// this is also what Electron main's strangler-fig forwarder becomes when it +// moves out of process. + +export class RpcError extends Error { + constructor( + message: string, + readonly status: number, + readonly code: string, + ) { + super(message); + this.name = 'RpcError'; + } +} + +export interface RpcClient { + call( + channel: K, + args: ipc.IPCChannels[K]['req'], + ): Promise; + readonly baseUrl: string; +} + +export function createRpcClient(opts: { + baseUrl: string; + token: string; + /** Fired on any 401 — the server key was rotated; the pairing is dead. */ + onUnauthorized?: () => void; +}): RpcClient { + const baseUrl = opts.baseUrl.replace(/\/+$/, ''); + return { + baseUrl, + async call(channel, args) { + let res: Response; + try { + res = await fetch(`${baseUrl}/rpc/${channel}`, { + method: 'POST', + headers: { + 'content-type': 'application/json', + authorization: `Bearer ${opts.token}`, + }, + body: JSON.stringify(args ?? null), + }); + } catch (err) { + throw new RpcError( + err instanceof Error ? err.message : String(err), + 0, + 'network', + ); + } + const body = (await res.json().catch(() => null)) as + | { error?: { code?: string; message?: string } } + | null; + if (!res.ok) { + if (res.status === 401) opts.onUnauthorized?.(); + throw new RpcError( + body?.error?.message ?? `rpc ${channel} failed with status ${res.status}`, + res.status, + body?.error?.code ?? 'internal', + ); + } + // The server validated the response against the channel schema already; + // trust it rather than re-parse (z.custom channels can't re-parse anyway). + return body as ipc.IPCChannels[typeof channel]['res']; + }, + }; +} diff --git a/apps/x/packages/client/src/sessions.ts b/apps/x/packages/client/src/sessions.ts new file mode 100644 index 000000000..0346e0efb --- /dev/null +++ b/apps/x/packages/client/src/sessions.ts @@ -0,0 +1,65 @@ +import type { z } from 'zod'; +import type { message, sessions, turns } from '@x/shared'; +import type { RpcClient } from './rpc.js'; + +// HTTP implementation of the renderer's SessionsClient seam +// (apps/renderer/src/lib/session-chat/client.ts) so session/chat store logic +// ports to the phone with only this constructor swapped in. + +export interface SendMessageConfig { + agent: z.infer; + autoPermission?: boolean; + maxModelCalls?: number; +} + +export interface SessionsClient { + create(input: { title?: string }): Promise<{ sessionId: string }>; + list(): Promise<{ sessions: sessions.SessionIndexEntry[] }>; + get(sessionId: string): Promise; + getTurn(turnId: string): Promise<{ turnId: string; events: Array> }>; + sendMessage( + sessionId: string, + input: z.infer, + config: SendMessageConfig, + ): Promise<{ turnId: string }>; + respondToPermission( + turnId: string, + toolCallId: string, + decision: 'allow' | 'deny', + metadata?: turns.JsonValue, + ): Promise; + respondToAskHuman(turnId: string, toolCallId: string, answer: string): Promise; + stopTurn(turnId: string, reason?: string): Promise; + resumeTurn(sessionId: string): Promise; + setTitle(sessionId: string, title: string): Promise; + delete(sessionId: string): Promise; +} + +export function createSessionsClient(rpc: RpcClient): SessionsClient { + return { + create: (input) => rpc.call('sessions:create', input), + list: () => rpc.call('sessions:list', {}), + get: (sessionId) => rpc.call('sessions:get', { sessionId }), + getTurn: (turnId) => rpc.call('sessions:getTurn', { turnId }), + sendMessage: (sessionId, input, config) => + rpc.call('sessions:sendMessage', { sessionId, input, config }), + respondToPermission: async (turnId, toolCallId, decision, metadata) => { + await rpc.call('sessions:respondToPermission', { turnId, toolCallId, decision, metadata }); + }, + respondToAskHuman: async (turnId, toolCallId, answer) => { + await rpc.call('sessions:respondToAskHuman', { turnId, toolCallId, answer }); + }, + stopTurn: async (turnId, reason) => { + await rpc.call('sessions:stopTurn', { turnId, reason }); + }, + resumeTurn: async (sessionId) => { + await rpc.call('sessions:resumeTurn', { sessionId }); + }, + setTitle: async (sessionId, title) => { + await rpc.call('sessions:setTitle', { sessionId, title }); + }, + delete: async (sessionId) => { + await rpc.call('sessions:delete', { sessionId }); + }, + }; +} diff --git a/apps/x/packages/client/tsconfig.build.json b/apps/x/packages/client/tsconfig.build.json new file mode 100644 index 000000000..4838eeca1 --- /dev/null +++ b/apps/x/packages/client/tsconfig.build.json @@ -0,0 +1,7 @@ +{ + "extends": "./tsconfig.json", + "exclude": [ + "src/**/*.test.ts", + "src/**/*.spec.ts" + ] +} diff --git a/apps/x/packages/client/tsconfig.json b/apps/x/packages/client/tsconfig.json new file mode 100644 index 000000000..1b210a449 --- /dev/null +++ b/apps/x/packages/client/tsconfig.json @@ -0,0 +1,12 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "declaration": true, + "outDir": "dist", + "rootDir": "src", + "lib": ["ES2022", "DOM"] + }, + "include": [ + "src" + ] +} diff --git a/apps/x/packages/shared/src/index.ts b/apps/x/packages/shared/src/index.ts index 2725d2648..94ea2afe1 100644 --- a/apps/x/packages/shared/src/index.ts +++ b/apps/x/packages/shared/src/index.ts @@ -27,4 +27,9 @@ export * as time from './time.js'; export * as todo from './todo.js'; export * as rowboatApp from './rowboat-app.js'; export * as quickAskShortcut from './quick-ask-shortcut.js'; +export * as turns from './turns.js'; +export * as sessions from './sessions.js'; +export * as message from './message.js'; +export * as rowboatAccount from './rowboat-account.js'; +export * as turnFollower from './turn-follower.js'; export { PrefixLogger }; diff --git a/apps/x/packages/shared/src/ipc.ts b/apps/x/packages/shared/src/ipc.ts index 910a720a7..9284a6587 100644 --- a/apps/x/packages/shared/src/ipc.ts +++ b/apps/x/packages/shared/src/ipc.ts @@ -126,7 +126,7 @@ const UpdaterStatusSchema = z.object({ lastCheckedAt: z.number().optional(), }); -const ipcSchemas = { +export const ipcSchemas = { 'app:getVersions': { req: z.null(), res: z.object({ @@ -3388,6 +3388,36 @@ const ipcSchemas = { chatDays: z.number().nullable(), }), }, + // Rowboat server (phone pairing) channels — client-local: answered by main, + // which hosts the HTTP/WS transport for external clients. + 'server:getPairingInfo': { + req: z.null(), + res: z.object({ + running: z.boolean(), + // Hostname shown on the phone during pairing. + name: z.string(), + port: z.number().nullable(), + lanEnabled: z.boolean(), + // Reachable base URLs, loopback first; LAN/Tailscale entries only when + // lanEnabled. + urls: z.array(z.string()), + token: z.string().nullable(), + }), + }, + 'server:setLanEnabled': { + req: z.object({ enabled: z.boolean() }), + res: z.object({ + success: z.literal(true), + }), + }, + // Mints a new server key and rebinds — every paired phone is revoked and + // must re-pair. This is the recovery path for a leaked QR/token. + 'server:rotateKey': { + req: z.null(), + res: z.object({ + success: z.literal(true), + }), + }, } as const; // ============================================================================ @@ -3438,3 +3468,11 @@ export function validateResponse( const schema = ipcSchemas[channel].res; return schema.parse(data) as IPCChannels[K]['res']; } + +/** + * Push channels (res schema is z.null()) flow server→client and map to the + * WebSocket event feed; invoke channels map to POST /rpc/{channel}. + */ +export function isPushChannel(channel: keyof IPCChannels): boolean { + return ipcSchemas[channel].res instanceof z.ZodNull; +} diff --git a/apps/x/apps/renderer/src/lib/turn-follower.ts b/apps/x/packages/shared/src/turn-follower.ts similarity index 83% rename from apps/x/apps/renderer/src/lib/turn-follower.ts rename to apps/x/packages/shared/src/turn-follower.ts index e0a2878c9..120afef8e 100644 --- a/apps/x/apps/renderer/src/lib/turn-follower.ts +++ b/apps/x/packages/shared/src/turn-follower.ts @@ -4,8 +4,8 @@ import { reduceTurn, type TurnBusEvent, type TurnEvent, -} from '@x/shared/src/turns.js' -import type { TurnState } from '@x/shared/src/turns.js' +} from './turns.js' +import type { TurnState } from './turns.js' // Follows one turn live, regardless of where it runs — session chat, headless // background/knowledge runners, spawned sub-agents. @@ -34,7 +34,16 @@ export interface TurnFollowerDeps { const DEFAULT_RETRY_DELAY_MS = 1000 const DEFAULT_MAX_RETRIES = 3 -export function followTurn(turnId: string, deps: TurnFollowerDeps): () => void { +export interface TurnFollower { + stop: () => void + // Forces a fresh snapshot fetch. For transports that can drop (WebSocket): + // if the turn reached a terminal event while the feed was down, no later + // event for it ever arrives, so the offset-gap detection can't fire — the + // consumer must call this on reconnect to re-converge. + refetch: () => void +} + +export function followTurn(turnId: string, deps: TurnFollowerDeps): TurnFollower { const retryDelayMs = deps.retryDelayMs ?? DEFAULT_RETRY_DELAY_MS const maxRetries = deps.maxRetries ?? DEFAULT_MAX_RETRIES @@ -126,9 +135,20 @@ export function followTurn(turnId: string, deps: TurnFollowerDeps): () => void { }) void fetchSnapshot() - return () => { - alive = false - if (retryTimer) clearTimeout(retryTimer) - unsubscribe() + return { + stop: () => { + alive = false + if (retryTimer) clearTimeout(retryTimer) + unsubscribe() + }, + refetch: () => { + if (!alive) return + retries = 0 + if (retryTimer) { + clearTimeout(retryTimer) + retryTimer = null + } + resync() + }, } } diff --git a/apps/x/pnpm-lock.yaml b/apps/x/pnpm-lock.yaml index 511f4c036..d039fd5a0 100644 --- a/apps/x/pnpm-lock.yaml +++ b/apps/x/pnpm-lock.yaml @@ -54,13 +54,16 @@ importers: dependencies: '@agentclientprotocol/claude-agent-acp': specifier: ^0.67.0 - version: 0.67.0(@anthropic-ai/sdk@0.100.1(zod@4.2.1))(@modelcontextprotocol/sdk@1.25.1(hono@4.11.3)(zod@4.2.1)) + version: 0.67.0(@anthropic-ai/sdk@0.100.1(zod@4.2.1))(@modelcontextprotocol/sdk@1.25.1(hono@4.13.3)(zod@4.2.1)) '@agentclientprotocol/codex-acp': specifier: ^1.2.0 version: 1.2.0 '@x/core': specifier: workspace:* version: link:../../packages/core + '@x/server': + specifier: workspace:* + version: link:../server '@x/shared': specifier: workspace:* version: link:../../packages/shared @@ -141,6 +144,109 @@ importers: specifier: ^0.24.2 version: 0.24.2 + apps/mobile: + dependencies: + '@expo/ui': + specifier: ~57.0.6 + version: 57.0.12(@babel/core@7.28.5)(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(expo@57.0.15)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.10.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3) + '@react-native-async-storage/async-storage': + specifier: ^3.1.1 + version: 3.1.1(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3) + '@x/client': + specifier: workspace:* + version: link:../../packages/client + '@x/shared': + specifier: workspace:* + version: link:../../packages/shared + expo: + specifier: ~57.0.6 + version: 57.0.15(@babel/core@7.28.5)(@expo/dom-webview@57.0.1)(@expo/metro-runtime@57.0.12)(expo-router@57.0.15)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.10.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) + expo-camera: + specifier: ~57.0.2 + version: 57.0.4(@types/emscripten@1.41.5)(expo@57.0.15)(react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3) + expo-constants: + specifier: ~57.0.5 + version: 57.0.13(expo@57.0.15)(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3)) + expo-device: + specifier: ~57.0.1 + version: 57.0.1(expo@57.0.15) + expo-font: + specifier: ~57.0.1 + version: 57.0.1(expo@57.0.15)(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3) + expo-glass-effect: + specifier: ~57.0.1 + version: 57.0.1(expo@57.0.15)(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3) + expo-image: + specifier: ~57.0.1 + version: 57.0.3(expo@57.0.15)(react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3) + expo-linking: + specifier: ~57.0.3 + version: 57.0.7(expo@57.0.15)(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3) + expo-router: + specifier: ~57.0.6 + version: 57.0.15(176cd5c8b192935c21a50d7b789b2dca) + expo-secure-store: + specifier: ~57.0.1 + version: 57.0.1(expo@57.0.15) + expo-splash-screen: + specifier: ~57.0.4 + version: 57.0.7(expo@57.0.15)(typescript@6.0.3) + expo-status-bar: + specifier: ~57.0.1 + version: 57.0.1(expo@57.0.15)(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3) + expo-symbols: + specifier: ~57.0.1 + version: 57.0.2(expo-font@57.0.1)(expo@57.0.15)(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3) + expo-system-ui: + specifier: ~57.0.1 + version: 57.0.2(expo@57.0.15)(react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3)) + expo-web-browser: + specifier: ~57.0.1 + version: 57.0.2(expo@57.0.15)(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3)) + posthog-react-native: + specifier: ^4.56.2 + version: 4.63.3(@react-native-async-storage/async-storage@3.1.1(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3))(expo-device@57.0.1(expo@57.0.15))(expo-file-system@57.0.5(expo@57.0.15)(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3)))(react-native-safe-area-context@5.7.0(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3)) + react: + specifier: 19.2.3 + version: 19.2.3 + react-dom: + specifier: 19.2.3 + version: 19.2.3(react@19.2.3) + react-native: + specifier: 0.86.0 + version: 0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3) + react-native-gesture-handler: + specifier: ~2.32.0 + version: 2.32.0(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3) + react-native-markdown-display: + specifier: ^7.0.2 + version: 7.0.2(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3) + react-native-reanimated: + specifier: 4.5.0 + version: 4.5.0(react-native-worklets@0.10.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3) + react-native-safe-area-context: + specifier: ~5.7.0 + version: 5.7.0(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3) + react-native-screens: + specifier: 4.25.2 + version: 4.25.2(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3) + react-native-web: + specifier: ~0.21.0 + version: 0.21.2(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + react-native-worklets: + specifier: 0.10.0 + version: 0.10.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3) + zod: + specifier: ^4.4.3 + version: 4.4.3 + devDependencies: + '@types/react': + specifier: ~19.2.2 + version: 19.2.7 + typescript: + specifier: ~6.0.3 + version: 6.0.3 + apps/preload: dependencies: '@x/shared': @@ -333,6 +439,9 @@ importers: prosemirror-view: specifier: ^1.41.8 version: 1.41.8 + qrcode.react: + specifier: ^4.2.0 + version: 4.2.0(react@19.2.3) radix-ui: specifier: ^1.4.3 version: 1.4.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) @@ -434,11 +543,58 @@ importers: specifier: 'catalog:' version: 4.1.7(@opentelemetry/api@1.9.0)(@types/node@24.10.4)(jsdom@29.1.1)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2)) + apps/server: + dependencies: + '@hono/node-server': + specifier: ^1.19.7 + version: 1.19.7(hono@4.13.3) + '@x/core': + specifier: workspace:* + version: link:../../packages/core + '@x/shared': + specifier: workspace:* + version: link:../../packages/shared + hono: + specifier: ^4.11.9 + version: 4.13.3 + ws: + specifier: ^8.18.3 + version: 8.21.0 + zod: + specifier: ^4.2.1 + version: 4.4.3 + devDependencies: + '@types/node': + specifier: ^25.0.3 + version: 25.0.3 + '@types/ws': + specifier: ^8.18.1 + version: 8.18.1 + '@x/client': + specifier: workspace:* + version: link:../../packages/client + vitest: + specifier: 'catalog:' + version: 4.1.7(@opentelemetry/api@1.9.0)(@types/node@25.0.3)(jsdom@29.1.1)(vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2)) + + packages/client: + dependencies: + '@x/shared': + specifier: workspace:* + version: link:../shared + zod: + specifier: ^4.2.1 + version: 4.4.3 + devDependencies: + vitest: + specifier: 'catalog:' + version: 4.1.7(@opentelemetry/api@1.9.0)(@types/node@25.0.3)(jsdom@29.1.1)(vite@7.3.0(@types/node@25.0.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2)) + packages/core: dependencies: '@agentclientprotocol/claude-agent-acp': specifier: ^0.67.0 - version: 0.67.0(@anthropic-ai/sdk@0.100.1(zod@4.2.1))(@modelcontextprotocol/sdk@1.25.1(hono@4.11.3)(zod@4.2.1)) + version: 0.67.0(@anthropic-ai/sdk@0.100.1(zod@4.2.1))(@modelcontextprotocol/sdk@1.25.1(hono@4.13.3)(zod@4.2.1)) '@agentclientprotocol/codex-acp': specifier: ^1.2.0 version: 1.2.0 @@ -468,7 +624,7 @@ importers: version: 3.0.1(encoding@0.1.13) '@modelcontextprotocol/sdk': specifier: ^1.25.1 - version: 1.25.1(hono@4.11.3)(zod@4.2.1) + version: 1.25.1(hono@4.13.3)(zod@4.2.1) '@openrouter/ai-sdk-provider': specifier: ^3.0.0 version: 3.0.0(ai@7.0.22(zod@4.2.1))(zod@4.2.1) @@ -915,10 +1071,18 @@ packages: resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} + '@babel/code-frame@7.29.7': + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} + engines: {node: '>=6.9.0'} + '@babel/compat-data@7.28.5': resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==} engines: {node: '>=6.9.0'} + '@babel/compat-data@7.29.7': + resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==} + engines: {node: '>=6.9.0'} + '@babel/core@7.28.5': resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==} engines: {node: '>=6.9.0'} @@ -927,40 +1091,127 @@ packages: resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} engines: {node: '>=6.9.0'} + '@babel/generator@7.29.8': + resolution: {integrity: sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.29.7': + resolution: {integrity: sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==} + engines: {node: '>=6.9.0'} + '@babel/helper-compilation-targets@7.27.2': resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} engines: {node: '>=6.9.0'} + '@babel/helper-compilation-targets@7.29.7': + resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-create-class-features-plugin@7.29.7': + resolution: {integrity: sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-create-regexp-features-plugin@7.29.7': + resolution: {integrity: sha512-907Uymvqgg1dwUA+7IGwFAOSYzQOuzPXKNJ1yxzwPffzkYFg2q2eHi1fIOs6sXkG9NbIUMunnUlkYsfRFNvomg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-define-polyfill-provider@0.6.8': + resolution: {integrity: sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + '@babel/helper-globals@7.28.0': resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} engines: {node: '>=6.9.0'} + '@babel/helper-globals@7.29.7': + resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-member-expression-to-functions@7.29.7': + resolution: {integrity: sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==} + engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.27.1': resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.29.7': + resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==} + engines: {node: '>=6.9.0'} + '@babel/helper-module-transforms@7.28.3': resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 + '@babel/helper-module-transforms@7.29.7': + resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-optimise-call-expression@7.29.7': + resolution: {integrity: sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==} + engines: {node: '>=6.9.0'} + '@babel/helper-plugin-utils@7.27.1': resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} engines: {node: '>=6.9.0'} + '@babel/helper-plugin-utils@7.29.7': + resolution: {integrity: sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-remap-async-to-generator@7.29.7': + resolution: {integrity: sha512-16AMiW26DbXWBbr3B8wNozKM0ydMLB892vaOaJW/fPJdnT8vJk5sdkQcU/isqUxyCE0cEoa8wZOcbgDuC4b6Og==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-replace-supers@7.29.7': + resolution: {integrity: sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-skip-transparent-expression-wrappers@7.29.7': + resolution: {integrity: sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==} + engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.27.1': resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.28.5': resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@7.27.1': resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@7.29.7': + resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-wrap-function@7.29.7': + resolution: {integrity: sha512-iES0Skag9ERIF68aXadpO6dbXa03mNWK3sEqJaMnLNs/eC3l0lkImdfoy6Y09/SfkpawdAB4RjQ7PVA7TcVGdw==} + engines: {node: '>=6.9.0'} + '@babel/helpers@7.28.4': resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} engines: {node: '>=6.9.0'} @@ -970,116 +1221,382 @@ packages: engines: {node: '>=6.0.0'} hasBin: true - '@babel/plugin-transform-react-jsx-self@7.27.1': - resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} + '@babel/parser@7.29.8': + resolution: {integrity: sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-proposal-decorators@7.29.7': + resolution: {integrity: sha512-EtU0Hi3GvrTqD56xKmZvV/uCXK2ZbwVNPNLAquVItcAZpUhkXwWlo3Fmj0c2LxgSf2I8IDULeAepwNP1OefLXg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-source@7.27.1': - resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==} + '@babel/plugin-proposal-export-default-from@7.29.7': + resolution: {integrity: sha512-p+G5BNXDcy3bOXplhY4HybQ1GxH3i2Tppmdm/3epyRu2VgJJZuUlZ61MqRTg582Q7ZLBdP7fePYvsumSEkMxcQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime@7.28.6': - resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} + '@babel/plugin-syntax-decorators@7.29.7': + resolution: {integrity: sha512-9MTTLbF39X6sqM92JPEsoI7++26hjZvzkxKZy64aMhWLH2mPkJ/Q3AV4QLmls3R14FpSpkOwQQfUh962JGQxxg==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@babel/template@7.27.2': - resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} - engines: {node: '>=6.9.0'} + '@babel/plugin-syntax-dynamic-import@7.8.3': + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@babel/traverse@7.28.5': - resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==} + '@babel/plugin-syntax-export-default-from@7.29.7': + resolution: {integrity: sha512-foag0BB37ROhdeIX9O8G0jX7hw0UekJc04cHMrYLOnrErsnBKqJGHJ8eDRpoCFZBvEPPygmmtw4qyU97qa4oOw==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@babel/types@7.28.5': - resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} + '@babel/plugin-syntax-flow@7.29.7': + resolution: {integrity: sha512-ajMX6QPcyomotqwpzhkYGxcK2i/us0rs1Qo9QvUpa+Fca0FTmqrzKrctoIYLMxcOhGZldGT/BAVkRGTWBiR8gQ==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@borewit/text-codec@0.2.2': - resolution: {integrity: sha512-DDaRehssg1aNrH4+2hnj1B7vnUGEjU6OIlyRdkMd0aUdIUvKXrJfXsy8LVtXAy7DRvYVluWbMspsRhz2lcW0mQ==} + '@babel/plugin-syntax-jsx@7.29.7': + resolution: {integrity: sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@braintree/sanitize-url@7.1.1': - resolution: {integrity: sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw==} + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@bramus/specificity@2.4.2': - resolution: {integrity: sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==} - hasBin: true + '@babel/plugin-syntax-optional-chaining@7.8.3': + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@cacheable/memory@2.2.0': - resolution: {integrity: sha512-CTLKqLItRCEixEAewD3/j9DB3/o96gpTPD4eJ1v+DGOlxZRZncRQkGYqqnAGCscYd6RNeXfGeiuCphsPtqyIfQ==} + '@babel/plugin-syntax-typescript@7.29.7': + resolution: {integrity: sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@cacheable/node-cache@1.7.6': - resolution: {integrity: sha512-6Omk2SgNnjtxB5f/E6bTIWIt5xhdpx39fGNRQgU9lojvRxU68v+qY+SXXLsp3ZGukqoPjsK21wZ6XABFr/Ge3A==} - engines: {node: '>=18'} + '@babel/plugin-transform-arrow-functions@7.29.7': + resolution: {integrity: sha512-N7zArUXWzAMzm+/N0uPBeVB3Fam5lMxtUwMmDK5f/IBBS7a7p1qeUoxd/6CckXoxUdgsntq1Dh8xNW06maZbDQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@cacheable/utils@2.5.0': - resolution: {integrity: sha512-buipgOVDkkPXNR5+xBpDw7Zk2n1EvU7qBJCNUcL7rhQ//kfpOXPAvQ511Os0vpLYJ1pZnvudNytkQt2hst3wqA==} + '@babel/plugin-transform-async-generator-functions@7.29.7': + resolution: {integrity: sha512-d98gXZkgswvkyohMBABkhm3GeXhYj8psWfwQ2C7gtfrKGTykQa/iOIi+JJhwMjPlZ6Vm2XN+DCf3Es1EoG4ZLA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@chevrotain/cst-dts-gen@12.0.0': - resolution: {integrity: sha512-fSL4KXjTl7cDgf0B5Rip9Q05BOrYvkJV/RrBTE/bKDN096E4hN/ySpcBK5B24T76dlQ2i32Zc3PAE27jFnFrKg==} + '@babel/plugin-transform-async-to-generator@7.29.7': + resolution: {integrity: sha512-pcUb2SS+RMo9TWVBwKGI5ShtoG7R+zBsFmCKDa6fe8c+hPr3XJlZgoE5j6i8W7gDjhyvy+85vmYexanvXh3d1w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@chevrotain/gast@12.0.0': - resolution: {integrity: sha512-1ne/m3XsIT8aEdrvT33so0GUC+wkctpUPK6zU9IlOyJLUbR0rg4G7ZiApiJbggpgPir9ERy3FRjT6T7lpgetnQ==} + '@babel/plugin-transform-block-scoping@7.29.7': + resolution: {integrity: sha512-ONyr4+AZhKh8yKWInVxU9AXA9EbsyeLcL6V0dJy6M2/62vuvpGm29zzuymbTpdc451GEpDIdAyPLP3r+P61yKQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@chevrotain/regexp-to-ast@12.0.0': - resolution: {integrity: sha512-p+EW9MaJwgaHguhoqwOtx/FwuGr+DnNn857sXWOi/mClXIkPGl3rn7hGNWvo31HA3vyeQxjqe+H36yZJwYU8cA==} + '@babel/plugin-transform-class-properties@7.29.7': + resolution: {integrity: sha512-GtcpjFvanPfzNQi3eTitsCqtRRmmqzpy/A+yhTR1HaZo1Ly3EA8ZXxlPyHdR8/IuRMYc3E4wdGBewB2QKQjAaA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@chevrotain/types@12.0.0': - resolution: {integrity: sha512-S+04vjFQKeuYw0/eW3U52LkAHQsB1ASxsPGsLPUyQgrZ2iNNibQrsidruDzjEX2JYfespXMG0eZmXlhA6z7nWA==} + '@babel/plugin-transform-class-static-block@7.29.7': + resolution: {integrity: sha512-kibJgmEdX2iMwsHY2tSZNDgj8PwIlCQz7FK9KuGKO8zsuoUwSEhoNnNVp/emKWrbY4HeO6kkXfdMqRKKKXBm2A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 - '@chevrotain/utils@12.0.0': - resolution: {integrity: sha512-lB59uJoaGIfOOL9knQqQRfhl9g7x8/wqFkp13zTdkRu1huG9kg6IJs1O8hqj9rs6h7orGxHJUKb+mX3rPbWGhA==} + '@babel/plugin-transform-classes@7.29.7': + resolution: {integrity: sha512-qV0OGGBVacduzQHE649JyCneOFI/maT+YKsO+K4Yi3xv2wTPNjM/W2o2gdzMwEAZz7fXNTHAe0NcSg30bIN69g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@codemirror/autocomplete@6.20.3': - resolution: {integrity: sha512-tlosUqb+3BbxCxZdu4tKeRghPFC+QM7q4X5YhKV2eCmPG+1r2F3f4AaSz5sCrFqUtX4Jh20VFTKecl16MgiV9g==} + '@babel/plugin-transform-destructuring@7.29.7': + resolution: {integrity: sha512-iPX8aD6H9zV5s7ZsqTdNocPN/MGQ5sSMnElKrktxjJRMnB2jN/1p2+R7GkfD6CAYoVFqy5A4XnSIUeGgJzIWpg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@codemirror/commands@6.10.3': - resolution: {integrity: sha512-JFRiqhKu+bvSkDLI+rUhJwSxQxYb759W5GBezE8Uc8mHLqC9aV/9aTC7yJSqCtB3F00pylrLCwnyS91Ap5ej4Q==} + '@babel/plugin-transform-export-namespace-from@7.29.7': + resolution: {integrity: sha512-24B2nOy2TeJSMheqwPD4DDQOV/elLSIlKxjZt4i05H5AgdPdWR3n18HnNrcJ+j76WJd9gbwb9jPjNYUy6RautA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@codemirror/lang-angular@0.1.4': - resolution: {integrity: sha512-oap+gsltb/fzdlTQWD6BFF4bSLKcDnlxDsLdePiJpCVNKWXSTAbiiQeYI3UmES+BLAdkmIC1WjyztC1pi/bX4g==} + '@babel/plugin-transform-flow-strip-types@7.29.7': + resolution: {integrity: sha512-wRHeUjUjCZnMHmiO5bRgjFLcoEh7JyTdByOW11ahhwNa4V0bmeGEaIvt51yq0zQp2yWIpqfxXXPyUP6GFJZHOQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@codemirror/lang-cpp@6.0.3': - resolution: {integrity: sha512-URM26M3vunFFn9/sm6rzqrBzDgfWuDixp85uTY49wKudToc2jTHUrKIGGKs+QWND+YLofNNZpxcNGRynFJfvgA==} + '@babel/plugin-transform-for-of@7.29.7': + resolution: {integrity: sha512-zeSIHh0+E1Um1WJRXCFlHQYu2ieJNdivLLjlBEp+dIBu3S51n+SZZmIXjxnItw6pz56Cn+KvK68BIBVsxq2JiQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@codemirror/lang-css@6.3.1': - resolution: {integrity: sha512-kr5fwBGiGtmz6l0LSJIbno9QrifNMUusivHbnA1H6Dmqy4HZFte3UAICix1VuKo0lMPKQr2rqB+0BkKi/S3Ejg==} + '@babel/plugin-transform-logical-assignment-operators@7.29.7': + resolution: {integrity: sha512-A0H91hh6W8MFRkp5TqJmMr39jzGD1A1E1Ysiv2O06Sfbhkapm+XyIzxWCEh5kqwOZ1/8QZ0dY3SeQ7XBqfJd5Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@codemirror/lang-go@6.0.1': - resolution: {integrity: sha512-7fNvbyNylvqCphW9HD6WFnRpcDjr+KXX/FgqXy5H5ZS0eC5edDljukm/yNgYkwTsgp2busdod50AOTIy6Jikfg==} + '@babel/plugin-transform-modules-commonjs@7.29.7': + resolution: {integrity: sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@codemirror/lang-html@6.4.11': - resolution: {integrity: sha512-9NsXp7Nwp891pQchI7gPdTwBuSuT3K65NGTHWHNJ55HjYcHLllr0rbIZNdOzas9ztc1EUVBlHou85FFZS4BNnw==} + '@babel/plugin-transform-named-capturing-groups-regex@7.29.7': + resolution: {integrity: sha512-vuFoLwr4qnv2xbZ16SQd6uPcH5FNrLHhk/Jzo++0XJFcaDsr4gjJVg6j398oMHiC+83k/GiBzviwF5KBJkPUtQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 - '@codemirror/lang-java@6.0.2': - resolution: {integrity: sha512-m5Nt1mQ/cznJY7tMfQTJchmrjdjQ71IDs+55d1GAa8DGaB8JXWsVCkVT284C3RTASaY43YknrK2X3hPO/J3MOQ==} + '@babel/plugin-transform-nullish-coalescing-operator@7.29.7': + resolution: {integrity: sha512-idmp1dFaekP9GbcMvG24Kvw2BfhFZjHnNJCkV4WuIY4PskJzwI3f1N5OdgYke38T7rftO6ERulFRn2cFeZwRkg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@codemirror/lang-javascript@6.2.5': - resolution: {integrity: sha512-zD4e5mS+50htS7F+TYjBPsiIFGanfVqg4HyUz6WNFikgOPf2BgKlx+TQedI1w6n/IqRBVBbBWmGFdLB/7uxO4A==} + '@babel/plugin-transform-object-rest-spread@7.29.7': + resolution: {integrity: sha512-Ld98jn4c0smUywL57m7SgsHq3OpThOa6LqZJif3G6jYOovPleoFhVrBJ1WegRApSFB2wu4+RelAj9AC9G08Z4A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@codemirror/lang-jinja@6.0.1': - resolution: {integrity: sha512-P5kyHLObzjtbGj16h+hyvZTxJhSjBEeSx4wMjbnAf3b0uwTy2+F0zGjMZL4PQOm/mh2eGZ5xUDVZXgwP783Nsw==} + '@babel/plugin-transform-optional-catch-binding@7.29.7': + resolution: {integrity: sha512-sLsyndxK2VwX6yNUOakMb7Sh553ZTe/vVM1XJ+9Z5aW1ytsc8xOIwmyk05NNjN60vkc5/KqoTH6hB4V41LJhng==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@codemirror/lang-json@6.0.2': - resolution: {integrity: sha512-x2OtO+AvwEHrEwR0FyyPtfDUiloG3rnVTSZV1W8UteaLL8/MajQd8DpvUb2YVzC+/T18aSDv0H9mu+xw0EStoQ==} + '@babel/plugin-transform-optional-chaining@7.29.7': + resolution: {integrity: sha512-6GM1dhvK3gNODkXcEcMCOLEDCLSoZ/sBbro2Ax8HURyasQ4NshagQixkRFdh5niI6E4gmA/jYI/4aT7rRos3ZQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@codemirror/lang-less@6.0.2': - resolution: {integrity: sha512-EYdQTG22V+KUUk8Qq582g7FMnCZeEHsyuOJisHRft/mQ+ZSZ2w51NupvDUHiqtsOy7It5cHLPGfHQLpMh9bqpQ==} + '@babel/plugin-transform-parameters@7.29.7': + resolution: {integrity: sha512-ZDOBqV/qLYJI0YElr8DcENEyARsFQeESqWXH6gZlghYXuPPjvweuDhP4VyEi4BlUBlLRFZVjxoZDMjxhLW766g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@codemirror/lang-liquid@6.3.2': - resolution: {integrity: sha512-6PDVU3ZnfeYyz1at1E/ttorErZvZFXXt1OPhtfe1EZJ2V2iDFa0CwPqPgG5F7NXN0yONGoBogKmFAafKTqlwIw==} + '@babel/plugin-transform-private-methods@7.29.7': + resolution: {integrity: sha512-/6Rz4DK1ETDEM/bWHsPHcaEe7ZaT1EqSXjtSP/L0DijOYuaUhiRiOKcwpZ8P7zR4xXEHc2ITdiCgBm9Tpyv9ug==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@codemirror/lang-markdown@6.5.0': - resolution: {integrity: sha512-0K40bZ35jpHya6FriukbgaleaqzBLZfOh7HuzqbMxBXkbYMJDxfF39c23xOgxFezR+3G+tR2/Mup+Xk865OMvw==} + '@babel/plugin-transform-private-property-in-object@7.29.7': + resolution: {integrity: sha512-+BNo06dnrzdNNqCm1X6YUaVv0DKk8Q+JYcoZfOkLhYWNCXzlwTSRq8zGWayT1csjcpNXV9CQTBRRbmTLZac5cA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@codemirror/lang-php@6.0.2': - resolution: {integrity: sha512-ZKy2v1n8Fc8oEXj0Th0PUMXzQJ0AIR6TaZU+PbDHExFwdu+guzOA4jmCHS1Nz4vbFezwD7LyBdDnddSJeScMCA==} + '@babel/plugin-transform-react-display-name@7.29.7': + resolution: {integrity: sha512-+1wdDMGNb4UPeY3Q4L5yLiYe6TXPXubs4NjrgRFw13hPRLJfEMw2Q5OXkee6/IfdqePIeW4Jjwe3aBh7SdKz4Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@codemirror/lang-python@6.2.1': - resolution: {integrity: sha512-IRjC8RUBhn9mGR9ywecNhB51yePWCGgvHfY1lWN/Mrp3cKuHr0isDKia+9HnvhiWNnMpbGhWrkhuWOc09exRyw==} + '@babel/plugin-transform-react-jsx-development@7.29.7': + resolution: {integrity: sha512-Xfy3UVMF04+ypnFbkhvfqtmvwfe92qwQdbGZVonhE+6v35GzlofmOnA1szaZqzb9xYWr0nl1e5EMmzi0DNON1g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-self@7.27.1': + resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-source@7.27.1': + resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx@7.29.7': + resolution: {integrity: sha512-WsZulLVBUHXVj2cUcPVx6UE21TpalB6bHbSFErKT0Ib++ax24jjXe73FqlWvdylFOjiuPHYi6VCcgRad1ItN+A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-pure-annotations@7.29.7': + resolution: {integrity: sha512-H5E+HBgDpr6Q5t+Aj11tL7XkIui1jhbIoArVQnqjgXo5/3YxkN7ZEBcWF4RQlB0T4rrxJQbXS6kiFV6B7XTqUA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-regenerator@7.29.8': + resolution: {integrity: sha512-0UpIXPtdDtMXfnV2OJAVMLpj3H/92vmkA6lpSRakmycJvj3VUy6Xs1dM8tXRugupykr5WB+LpiVl0J8LMVg2mg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-runtime@7.29.7': + resolution: {integrity: sha512-xmAscdE/AsqRW7vutbPNoUmu/nF5SrLKPs7aoJgEjo35lLKA/Bc0i2rMv/hr1+Y0o1bQCiVtith3u2vdgRL39Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-shorthand-properties@7.29.7': + resolution: {integrity: sha512-I+WYbGBAiCn7nA6xBrlgPH+MB7HWb4u8pv5S0Pv7OtwNvIFvCCb24YlttKEeUFVurfBCEaOTnuhlqsb7f0Z5Dg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-template-literals@7.29.7': + resolution: {integrity: sha512-NCSEJ4sLFU2gqAub45HYh4fus2yQ36rr6ei6vpU7NdoJqCpxvEG8E6eJpscGyXP3VHD2Ny+fSXr04k1hoUrFqA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typescript@7.29.7': + resolution: {integrity: sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-regex@7.29.7': + resolution: {integrity: sha512-7D/x/23/d/3VqZ0QA+LGbZMlGwZjztBygSWWWsfTPoQ1oQ6Q1P6Mr3d0kk42XabyUVw+fha3LqdRsFqeKqvCyA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-typescript@7.29.7': + resolution: {integrity: sha512-/Foi8vKY2EVbed/1eZx0gJEEwHAIxogrySI7rULcRIvhZzbvoE/b5qG5Ghc0WKAFKOHA9SD1x7RsFlOYdutIiQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/runtime@7.28.6': + resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.29.7': + resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.28.5': + resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.29.8': + resolution: {integrity: sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.28.5': + resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.29.8': + resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==} + engines: {node: '>=6.9.0'} + + '@borewit/text-codec@0.2.2': + resolution: {integrity: sha512-DDaRehssg1aNrH4+2hnj1B7vnUGEjU6OIlyRdkMd0aUdIUvKXrJfXsy8LVtXAy7DRvYVluWbMspsRhz2lcW0mQ==} + + '@braintree/sanitize-url@7.1.1': + resolution: {integrity: sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw==} + + '@bramus/specificity@2.4.2': + resolution: {integrity: sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==} + hasBin: true + + '@cacheable/memory@2.2.0': + resolution: {integrity: sha512-CTLKqLItRCEixEAewD3/j9DB3/o96gpTPD4eJ1v+DGOlxZRZncRQkGYqqnAGCscYd6RNeXfGeiuCphsPtqyIfQ==} + + '@cacheable/node-cache@1.7.6': + resolution: {integrity: sha512-6Omk2SgNnjtxB5f/E6bTIWIt5xhdpx39fGNRQgU9lojvRxU68v+qY+SXXLsp3ZGukqoPjsK21wZ6XABFr/Ge3A==} + engines: {node: '>=18'} + + '@cacheable/utils@2.5.0': + resolution: {integrity: sha512-buipgOVDkkPXNR5+xBpDw7Zk2n1EvU7qBJCNUcL7rhQ//kfpOXPAvQ511Os0vpLYJ1pZnvudNytkQt2hst3wqA==} + + '@chevrotain/cst-dts-gen@12.0.0': + resolution: {integrity: sha512-fSL4KXjTl7cDgf0B5Rip9Q05BOrYvkJV/RrBTE/bKDN096E4hN/ySpcBK5B24T76dlQ2i32Zc3PAE27jFnFrKg==} + + '@chevrotain/gast@12.0.0': + resolution: {integrity: sha512-1ne/m3XsIT8aEdrvT33so0GUC+wkctpUPK6zU9IlOyJLUbR0rg4G7ZiApiJbggpgPir9ERy3FRjT6T7lpgetnQ==} + + '@chevrotain/regexp-to-ast@12.0.0': + resolution: {integrity: sha512-p+EW9MaJwgaHguhoqwOtx/FwuGr+DnNn857sXWOi/mClXIkPGl3rn7hGNWvo31HA3vyeQxjqe+H36yZJwYU8cA==} + + '@chevrotain/types@12.0.0': + resolution: {integrity: sha512-S+04vjFQKeuYw0/eW3U52LkAHQsB1ASxsPGsLPUyQgrZ2iNNibQrsidruDzjEX2JYfespXMG0eZmXlhA6z7nWA==} + + '@chevrotain/utils@12.0.0': + resolution: {integrity: sha512-lB59uJoaGIfOOL9knQqQRfhl9g7x8/wqFkp13zTdkRu1huG9kg6IJs1O8hqj9rs6h7orGxHJUKb+mX3rPbWGhA==} + + '@codemirror/autocomplete@6.20.3': + resolution: {integrity: sha512-tlosUqb+3BbxCxZdu4tKeRghPFC+QM7q4X5YhKV2eCmPG+1r2F3f4AaSz5sCrFqUtX4Jh20VFTKecl16MgiV9g==} + + '@codemirror/commands@6.10.3': + resolution: {integrity: sha512-JFRiqhKu+bvSkDLI+rUhJwSxQxYb759W5GBezE8Uc8mHLqC9aV/9aTC7yJSqCtB3F00pylrLCwnyS91Ap5ej4Q==} + + '@codemirror/lang-angular@0.1.4': + resolution: {integrity: sha512-oap+gsltb/fzdlTQWD6BFF4bSLKcDnlxDsLdePiJpCVNKWXSTAbiiQeYI3UmES+BLAdkmIC1WjyztC1pi/bX4g==} + + '@codemirror/lang-cpp@6.0.3': + resolution: {integrity: sha512-URM26M3vunFFn9/sm6rzqrBzDgfWuDixp85uTY49wKudToc2jTHUrKIGGKs+QWND+YLofNNZpxcNGRynFJfvgA==} + + '@codemirror/lang-css@6.3.1': + resolution: {integrity: sha512-kr5fwBGiGtmz6l0LSJIbno9QrifNMUusivHbnA1H6Dmqy4HZFte3UAICix1VuKo0lMPKQr2rqB+0BkKi/S3Ejg==} + + '@codemirror/lang-go@6.0.1': + resolution: {integrity: sha512-7fNvbyNylvqCphW9HD6WFnRpcDjr+KXX/FgqXy5H5ZS0eC5edDljukm/yNgYkwTsgp2busdod50AOTIy6Jikfg==} + + '@codemirror/lang-html@6.4.11': + resolution: {integrity: sha512-9NsXp7Nwp891pQchI7gPdTwBuSuT3K65NGTHWHNJ55HjYcHLllr0rbIZNdOzas9ztc1EUVBlHou85FFZS4BNnw==} + + '@codemirror/lang-java@6.0.2': + resolution: {integrity: sha512-m5Nt1mQ/cznJY7tMfQTJchmrjdjQ71IDs+55d1GAa8DGaB8JXWsVCkVT284C3RTASaY43YknrK2X3hPO/J3MOQ==} + + '@codemirror/lang-javascript@6.2.5': + resolution: {integrity: sha512-zD4e5mS+50htS7F+TYjBPsiIFGanfVqg4HyUz6WNFikgOPf2BgKlx+TQedI1w6n/IqRBVBbBWmGFdLB/7uxO4A==} + + '@codemirror/lang-jinja@6.0.1': + resolution: {integrity: sha512-P5kyHLObzjtbGj16h+hyvZTxJhSjBEeSx4wMjbnAf3b0uwTy2+F0zGjMZL4PQOm/mh2eGZ5xUDVZXgwP783Nsw==} + + '@codemirror/lang-json@6.0.2': + resolution: {integrity: sha512-x2OtO+AvwEHrEwR0FyyPtfDUiloG3rnVTSZV1W8UteaLL8/MajQd8DpvUb2YVzC+/T18aSDv0H9mu+xw0EStoQ==} + + '@codemirror/lang-less@6.0.2': + resolution: {integrity: sha512-EYdQTG22V+KUUk8Qq582g7FMnCZeEHsyuOJisHRft/mQ+ZSZ2w51NupvDUHiqtsOy7It5cHLPGfHQLpMh9bqpQ==} + + '@codemirror/lang-liquid@6.3.2': + resolution: {integrity: sha512-6PDVU3ZnfeYyz1at1E/ttorErZvZFXXt1OPhtfe1EZJ2V2iDFa0CwPqPgG5F7NXN0yONGoBogKmFAafKTqlwIw==} + + '@codemirror/lang-markdown@6.5.0': + resolution: {integrity: sha512-0K40bZ35jpHya6FriukbgaleaqzBLZfOh7HuzqbMxBXkbYMJDxfF39c23xOgxFezR+3G+tR2/Mup+Xk865OMvw==} + + '@codemirror/lang-php@6.0.2': + resolution: {integrity: sha512-ZKy2v1n8Fc8oEXj0Th0PUMXzQJ0AIR6TaZU+PbDHExFwdu+guzOA4jmCHS1Nz4vbFezwD7LyBdDnddSJeScMCA==} + + '@codemirror/lang-python@6.2.1': + resolution: {integrity: sha512-IRjC8RUBhn9mGR9ywecNhB51yePWCGgvHfY1lWN/Mrp3cKuHr0isDKia+9HnvhiWNnMpbGhWrkhuWOc09exRyw==} '@codemirror/lang-rust@6.0.2': resolution: {integrity: sha512-EZaGjCUegtiU7kSMvOfEZpaCReowEf3yNidYu7+vfuGTm9ow4mthAparY5hisJqOHmJowVH3Upu+eJlUji6qqA==} @@ -1175,6 +1692,10 @@ packages: resolution: {integrity: sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==} engines: {node: '>=20.19.0'} + '@egjs/hammerjs@2.0.17': + resolution: {integrity: sha512-XQsZgjm2EcVUiZQf11UBJQfmZeEmOW8DpI1gsFeln6w0ae0ii4dMQEQ0kjl6DspdWX1aGY1/loyXnP0JS06e/A==} + engines: {node: '>=0.8.0'} + '@eigenpal/docx-editor-agents@1.0.3': resolution: {integrity: sha512-Bk/J9/PBnMCOxb6w4cHQiCTuN/1C4FtZM9evC9EXXcLP13yFMdqoEqsYs+Lh3HyaRRAaCZTrkfgOZyTqqyjtwQ==} deprecated: deprecated @@ -1721,6 +2242,194 @@ packages: '@noble/hashes': optional: true + '@expo-google-fonts/material-symbols@0.4.44': + resolution: {integrity: sha512-36JP9Chcy/QEVZ9ZGY4i6zInlyFPbQjkIm6gRNuWWltScIj0WR8rddcD57EIjSC5YKCe2ZKLO6eO/N5r8Jit0A==} + + '@expo/cli@57.0.17': + resolution: {integrity: sha512-PQc7if117dNh2qe+CHdlmSWpgwhFiP9CJ7XbwNF0w4KSKxFpJ2qUjDPoAcCMW1VZg1x30mEJ907bT8G1iDIZBQ==} + hasBin: true + peerDependencies: + expo: '*' + expo-router: '*' + react-native: '*' + peerDependenciesMeta: + expo-router: + optional: true + react-native: + optional: true + + '@expo/code-signing-certificates@0.0.6': + resolution: {integrity: sha512-iNe0puxwBNEcuua9gmTGzq+SuMDa0iATai1FlFTMHJ/vUmKvN/V//drXoLJkVb5i5H3iE/n/qIJxyoBnXouD0w==} + + '@expo/config-plugins@57.0.8': + resolution: {integrity: sha512-x6lx4s/19i39/+1dMPwb9tFCc4WR843dG5Yi+C64lhKL3YHX+6oKrT2Kv72PCEalnUY+usQDkB3NrLSrYOWtDg==} + + '@expo/config-types@57.0.2': + resolution: {integrity: sha512-ewW08OonrcRIsRKIlFvvcmmafE5zemb1ocu3HkNwtVPyRtj2w42pZCAkMIROYpcVBaPnc3mDT9UZDzwXWC3i6g==} + + '@expo/config@57.0.8': + resolution: {integrity: sha512-7VpAu2ZMXNZI0+Kn+nD3vQBIyST89LATNkZpnp/cXh8/aj7zUXO8d/T+hOxsvhOFwR8eQO+jKXEw8tQbidiMxA==} + + '@expo/devcert@1.2.1': + resolution: {integrity: sha512-qC4eaxmKMTmJC2ahwyui6ud8f3W60Ss7pMkpBq40Hu3zyiAaugPXnZ24145U7K36qO9UHdZUVxsCvIpz2RYYCA==} + + '@expo/devtools@57.0.1': + resolution: {integrity: sha512-GyUf+wFNkbttaX0jR7MZa9bm77U0IrLg6d2AjpxdyoXw/w4abHoXG0oFufwLMgP9zLTd5+Ct4X/ffNUTnlzZgg==} + peerDependencies: + react: '*' + react-native: '*' + peerDependenciesMeta: + react: + optional: true + react-native: + optional: true + + '@expo/dom-webview@57.0.1': + resolution: {integrity: sha512-lAKsME4SAq+8sf56oN0DX5TBYyruupoRxbWbD2xf9RnKY8y6x8eb9LCE5pxSN0qyWdqnp+0wmyWzDkKboThKAw==} + peerDependencies: + expo: '*' + react: '*' + react-native: '*' + + '@expo/env@2.4.2': + resolution: {integrity: sha512-28pqaEqwnmLduZ00Pq9HkSzE5wbj1MTwp5/n8nm8rD8MCjR9eUnVOwmNksPI3Be2ReAPO/DbPn1puy0mvoocsQ==} + engines: {node: '>=20.12.0'} + + '@expo/expo-modules-macros-plugin@0.6.1': + resolution: {integrity: sha512-cpsLZE4rqkc1Y3eZTkxB98jrqY1YXgetmtxFt8q89jBRmk3quRuk1BZo+VcnCSObZardjg99r1k5xijEMONFGA==} + + '@expo/fingerprint@0.20.9': + resolution: {integrity: sha512-h+YvPyNmeAUCCqaXvftiXklA2zGyRcIPv1B8fFS0YSIgNhwcxFGh1EyLOMsvJ2aWsBViNtIJ1HIFLzNu43/r4w==} + hasBin: true + + '@expo/image-utils@0.11.4': + resolution: {integrity: sha512-pn/4770DIEOcYZr484uazuwg20FX/qaDkeMRF6J+oxejynDmEmO8wLsCudaNShFE0BhyKGQTYrs2rsRhqrqESw==} + + '@expo/inline-modules@0.1.6': + resolution: {integrity: sha512-5f6EiOIKsFj9zlrCBet4ZIQRPEa9dBUdQgTzpjYwdZ8Z/M8W5lqMVL9dEs4HYKvEmDnqv0dQuDkFLyRSwu/DAQ==} + + '@expo/json-file@11.0.1': + resolution: {integrity: sha512-zxHWj4MKKMAL29ZQSY/Fssx4Thluk40JmuGNaeS078wy/NhlFhnVi+rHHunulE3xJAJ0CM73m8VK2+GkF9eRwQ==} + + '@expo/local-build-cache-provider@57.0.7': + resolution: {integrity: sha512-Hq5xWhXJWuyH3CWh3uqDWoHtxM0XYqLs9h2OzRWImBJahCPfePOo4kmw2uTEB6qHT5T47eqO4jtDG3MRGGZCpw==} + + '@expo/log-box@57.0.3': + resolution: {integrity: sha512-qv/cMliNax6es07Un/4IGJIcs4PUuhTKKTrJZX/0X2YRcOT5cqm/QicibZwTIbiZWi1i8P4YBRQTfFT2B17giw==} + peerDependencies: + '@expo/dom-webview': ^57.0.1 + expo: '*' + react: '*' + react-native: '*' + + '@expo/metro-config@57.0.9': + resolution: {integrity: sha512-+lalXZdoMaKTG1uKXsi2KWO0f7H3KiWrhZzAla4EmNSkcUMRx6K1rhZuBYoaJaKIp9BHZ333KbqRPron7slKQA==} + peerDependencies: + expo: '*' + peerDependenciesMeta: + expo: + optional: true + + '@expo/metro-file-map@57.0.1': + resolution: {integrity: sha512-8JXfVstZN7QnP4NianZZnlTVboOWR0sG8trUDNajOjnbGlPln29vponXM84tY+3tAHapz5/TxE53L0ixUwqPtA==} + + '@expo/metro-runtime@57.0.12': + resolution: {integrity: sha512-WpgjfRFh88B5tKJrbsypvyxx0MKuXMo+ru9Gbjq4Qwj7OboJmrQ+g555YCgiQD3uk3J1ThzgEU06yZOV43suGA==} + peerDependencies: + '@expo/log-box': ^57.0.3 + expo: '*' + react: '*' + react-dom: '*' + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + + '@expo/metro@56.0.0': + resolution: {integrity: sha512-5gIgQHtEpjjvsjKfVtIv23a98LLRV0/y07PDShEwYSytAMlE3FSF8RHXqtHc1sUJL6dn7hnuIBpIbrLXXuVi0A==} + + '@expo/osascript@2.7.1': + resolution: {integrity: sha512-Zn03EX6In7ts2lPUW2ESUSkEhEWQN1qqsiXjadtZMJOuZRkMiAg1ZQHuvz9DjByDWNJ2pBwAGyrts9lj9k389g==} + engines: {node: '>=12'} + + '@expo/package-manager@1.13.1': + resolution: {integrity: sha512-y/K+CaYYpZpNGZhSX4HyLT/vyIunFjNfyoxNysPBCefeLKI/VCx6f9LNPzrxayr3rCYO5bl9O8H+HRQK265Nkg==} + + '@expo/plist@0.8.1': + resolution: {integrity: sha512-3gTReGIUm0oRaMClsAJYxBnVPCl6fVpsl8HS+DTVxDhW4GyVyxg9E/Znm3BvcHtUJ51RJJI14pC1wvrNilCRHw==} + + '@expo/prebuild-config@57.0.13': + resolution: {integrity: sha512-VhSySuXqOwK4fIc+9rgms7zN+c1Khj2xpuIgpVLPNyWRtpS8wB+eyV5CSohjSUBa3h+NsFdPk/VG6p0ZwlMDrg==} + + '@expo/require-utils@57.0.4': + resolution: {integrity: sha512-e7xbg/9BTQcsZE/oErafZXtI7kh5IgfasLJ97J5sFSzX2cA74pDvdlhW1KHVSaDkQyQv6h1LSLhsY7dEeOk7hw==} + peerDependencies: + typescript: ^5.0.0 || ^5.0.0-0 || ^6.0.0 || ^7.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@expo/router-server@57.0.7': + resolution: {integrity: sha512-QFHwt6V7UovmYA7+8BoMeKj3fh6WtkM9zksKjNAlZdcEI/hUhcW4uged6So5yc4tq+eA60kA7gIVZPKgBIZdrQ==} + peerDependencies: + '@expo/metro-runtime': ^57.0.12 + expo: '*' + expo-constants: ^57.0.13 + expo-font: ^57.0.1 + expo-router: '*' + expo-server: ^57.0.3 + react: '*' + react-dom: '*' + react-server-dom-webpack: ~19.0.1 || ~19.1.2 || ~19.2.1 + peerDependenciesMeta: + '@expo/metro-runtime': + optional: true + expo-router: + optional: true + react-dom: + optional: true + react-server-dom-webpack: + optional: true + + '@expo/schema-utils@57.0.2': + resolution: {integrity: sha512-fMu/jyN0l1Wzv7XkeWR4IYCx1M8ryui3FdBNGrWwbRgJ7EhxXxK8E2jxP2W3pbgUwUY0V3hG8+GyfCZwny+Lxw==} + + '@expo/sdk-runtime-versions@1.0.0': + resolution: {integrity: sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ==} + + '@expo/spawn-async@1.8.0': + resolution: {integrity: sha512-eb9xxd/LbuEGSdua4NumCu/McVB9EM+F/JxB9pWgnERw4HQ9XyTNH1KapG6oqLWR8TuRK2LQfzJlmNi94CVobw==} + engines: {node: '>=12'} + + '@expo/sudo-prompt@9.3.2': + resolution: {integrity: sha512-HHQigo3rQWKMDzYDLkubN5WQOYXJJE2eNqIQC2axC2iO3mHdwnIR7FgZVvHWtBwAdzBgAP0ECp8KqS8TiMKvgw==} + + '@expo/ui@57.0.12': + resolution: {integrity: sha512-ZkrECV6xZe0+Drq6C0hrBKvz1534/VyARNp9ziKihC6Db69W29+jBDZm8k9cyRyS1Hh23q6LP8J+2wDyUM8eAA==} + peerDependencies: + '@babel/core': '*' + expo: '*' + react: '*' + react-dom: '*' + react-native: '*' + react-native-worklets: '*' + peerDependenciesMeta: + '@babel/core': + optional: true + react-dom: + optional: true + react-native-worklets: + optional: true + + '@expo/ws-tunnel@2.0.0': + resolution: {integrity: sha512-j+JfTRdCk820J9dU0sA2SqshQIKFOMo7ED84w9MJFcebfbNQgsLztEY/SABDkGnjatrW4xGqnUhVRxSBVyCkXw==} + peerDependencies: + ws: ^8.0.0 + + '@expo/xcpretty@4.4.4': + resolution: {integrity: sha512-4aQzz9vgxcNXFfo/iyNgDDYfsU5XGKKxWxZopw0cVotHiW+U8IJbIxMaxsINs6bHhtkG3StKNPcOrn3eBuxKPw==} + hasBin: true + '@floating-ui/core@1.7.3': resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==} @@ -2031,6 +2740,18 @@ packages: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} + '@isaacs/ttlcache@1.4.1': + resolution: {integrity: sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==} + engines: {node: '>=12'} + + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/types@29.6.3': + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -2470,9 +3191,15 @@ packages: '@posthog/core@1.13.0': resolution: {integrity: sha512-knjncrk7qRmssFRbGzBl1Tunt21GRpe0Wv+uVelyL0Rh7PdQUsgguulzXFTps8hA6wPwTU4kq85qnbAJ3eH6Wg==} + '@posthog/core@1.48.6': + resolution: {integrity: sha512-lvSO1nrxxakrAfB51fetHC29gSqdDtT+AyRrGlnc5nDSWhiBGtyqKNjDqsbnlTQoj14bAaWXS7RtzuGoTo5IsQ==} + '@posthog/types@1.332.0': resolution: {integrity: sha512-X6LFnT4B6d7vBph2v2NjajArzliZmOZieoNDHPV5e8JOcsOYichtWq38WLLe0B0iQBnF8Ofo5QIWsbNDjfJISw==} + '@posthog/types@1.405.0': + resolution: {integrity: sha512-4rZ/taVXKQxs9Jrf7ZjlCRgrOSL69oKAgIWJQa5kRNJ6wll1UANbrJTSY+Su1e88LIG4zZVjKKKjyQHCkHdHcw==} + '@protobufjs/aspromise@1.1.2': resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} @@ -3288,29 +4015,145 @@ packages: '@radix-ui/rect@1.1.1': resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==} - '@react-pdf/fns@3.1.2': - resolution: {integrity: sha512-qTKGUf0iAMGg2+OsUcp9ffKnKi41RukM/zYIWMDJ4hRVYSr89Q7e3wSDW/Koqx3ea3Uy/z3h2y3wPX6Bdfxk6g==} + '@react-native-async-storage/async-storage@3.1.1': + resolution: {integrity: sha512-z+PnLz1n6ECKhgoHZHkfc+dijXZEyZnNFSajbtE0NEbsJhmX8x9GlOeiMQIKX2E4DUqPSgfIh4FYBv1M49KgPQ==} + peerDependencies: + react: '*' + react-native: '*' - '@react-pdf/font@4.0.4': - resolution: {integrity: sha512-8YtgGtL511txIEc9AjiilpZ7yjid8uCd8OGUl6jaL3LIHnrToUupSN4IzsMQpVTCMYiDLFnDNQzpZsOYtRS/Pg==} + '@react-native-masked-view/masked-view@0.3.2': + resolution: {integrity: sha512-XwuQoW7/GEgWRMovOQtX3A4PrXhyaZm0lVUiY8qJDvdngjLms9Cpdck6SmGAUNqQwcj2EadHC1HwL0bEyoa/SQ==} + peerDependencies: + react: '>=16' + react-native: '>=0.57' - '@react-pdf/image@3.0.4': - resolution: {integrity: sha512-z0ogVQE0bKqgXQ5smgzIU857rLV7bMgVdrYsu3UfXDDLSzI7QPvzf6MFTFllX6Dx2rcsF13E01dqKPtJEM799g==} + '@react-native/assets-registry@0.86.0': + resolution: {integrity: sha512-nIaXbm2jX1OTYp0qbviJ3O6KZivoE8z3BnhUQ2LsqfZSWRoOK/n1qsiAr6oALiNKWnXY3j2KPwtYORnZzp8xew==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - '@react-pdf/layout@4.4.2': - resolution: {integrity: sha512-gNu2oh8MiGR+NJZYTJ4c4q0nWCESBI6rKFiodVhE7OeVAjtzZzd6l65wsN7HXdWJqOZD3ttD97iE+tf5SOd/Yg==} + '@react-native/babel-plugin-codegen@0.86.0': + resolution: {integrity: sha512-qdsABWNW7uTll90l4Vh03gjeyu3WVDi2CyiiyvYGMRDcoYbjbQi6df3BMAm9lQI2yslZ1T14LlDDAsgTwNxplA==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - '@react-pdf/pdfkit@4.1.0': - resolution: {integrity: sha512-Wm/IOAv0h/U5Ra94c/PltFJGcpTUd/fwVMVeFD6X9tTTPCttIwg0teRG1Lqq617J8K4W7jpL/B0HTH0mjp3QpQ==} + '@react-native/babel-plugin-codegen@0.86.2': + resolution: {integrity: sha512-NNDZqOlNbH5SzgPks1jFDYH3234Rpa5e/nhZymxhIiBH3NcE3uD+rGj/HWXhH7nHF2ToGK6XbUpqy7nmJPeh+g==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - '@react-pdf/png-js@3.0.0': - resolution: {integrity: sha512-eSJnEItZ37WPt6Qv5pncQDxLJRK15eaRwPT+gZoujP548CodenOVp49GST8XJvKMFt9YqIBzGBV/j9AgrOQzVA==} + '@react-native/babel-preset@0.86.0': + resolution: {integrity: sha512-bYQcWiPySNvF4dns9Ls9gMmwgq66ohvM9Fwc/Kn8r85t66UNHxch3p1QwPiSorDelFauZwJbgo9+ReibTgvpbA==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + peerDependencies: + '@babel/core': '*' - '@react-pdf/primitives@4.1.1': - resolution: {integrity: sha512-IuhxYls1luJb7NUWy6q5avb1XrNaVj9bTNI40U9qGRuS6n7Hje/8H8Qi99Z9UKFV74bBP3DOf3L1wV2qZVgVrQ==} + '@react-native/codegen@0.86.0': + resolution: {integrity: sha512-uTs9DBo3+/lUqinsGZK0FKJRBVClrwMXoZToaDxE1Q2SL2e55vs2GwyZfIKzPl5uJnbu4PfFMIp0/mLXLWUMuA==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + peerDependencies: + '@babel/core': '*' - '@react-pdf/reconciler@2.0.0': - resolution: {integrity: sha512-7zaPRujpbHSmCpIrZ+b9HSTJHthcVZzX0Wx7RzvQGsGBUbHP4p6s5itXrAIOuQuPvDepoHGNOvf6xUuMVvdoyw==} + '@react-native/codegen@0.86.2': + resolution: {integrity: sha512-xKkudsahUJ1n//55g4fXk5BStVqqmZlz8HQveL45ZxcfDnwvhuYe2GymksQANFsSN+slvrarjrfq8kIxJzbceA==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + peerDependencies: + '@babel/core': '*' + + '@react-native/community-cli-plugin@0.86.0': + resolution: {integrity: sha512-Jv8p1ebEPfTzs8gmrjsdT2XMXFfeAg45Pman+XPLFGaSeGAZkutRFRyX9Cs9aGTSOyIA9YPJ6vDNb1ayTf1FKQ==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + peerDependencies: + '@react-native-community/cli': '*' + '@react-native/metro-config': 0.86.0 + peerDependenciesMeta: + '@react-native-community/cli': + optional: true + '@react-native/metro-config': + optional: true + + '@react-native/debugger-frontend@0.86.0': + resolution: {integrity: sha512-7Mb3nDfyJeys+ELF75Ageu7VKERlnIMoO+aNPoXqTXvz+b41L6l2CqMyLpDHxkBSlenij6gEepPNgaIyWHbJZw==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + '@react-native/debugger-frontend@0.86.2': + resolution: {integrity: sha512-KGS1aV5F6cIqpnoIUhLBXyVzy1oAj8jBFGau6vX4Vy0HXRJN7p+68RU7x6NuyraHvQcR14ccMGT5TkFuNjQ4gA==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + '@react-native/debugger-shell@0.86.0': + resolution: {integrity: sha512-Y0zEkZzLz8ou6o/VLml1A31X/rMgc6DRjwxwzPMa94qRTMY070WeBCNTITQo4kKTBAUgbxh07oXPQqp0Tpja8w==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + '@react-native/debugger-shell@0.86.2': + resolution: {integrity: sha512-/TaVJ2+gGajZPJGrFaObUQmHmlaxAlfmOPZicl6pNKDUjzSgFMpcLkdTOExvb+USYTVdGX1XwxXyvjQdUO2bvg==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + '@react-native/dev-middleware@0.86.0': + resolution: {integrity: sha512-20pTO6yTybmvXvro520H6C7jydIQnLKOl5qFtVEcHSdFrY63r3OGei+Rx9bILgSRmH6jgnfEcijcMx7pwWuQtw==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + '@react-native/dev-middleware@0.86.2': + resolution: {integrity: sha512-B7L0vKvg+IcEElT7Vpqh1xj5yJAqWUegjbP+bQRaorJMAYnv11GkliTnZV2AdTDfZQJWgOEx8i8LGkHkUg7bnA==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + '@react-native/gradle-plugin@0.86.0': + resolution: {integrity: sha512-a1RcfaEDqWExCGfCwadIxt4l8FvKYgFqeMf2uzeKyAOnb+vTGNIeCvifFL2MqvgaeYxlER437HbMIajGcuJ1pQ==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + '@react-native/js-polyfills@0.86.0': + resolution: {integrity: sha512-zYy/Cjd1VTnZ2iCNaG9bDF9C3l2ntESiPRscjIlI5FKugu6aeTwsDSv1aI8Bc4Kp3vEdoVg+UQhLAhE4svREaQ==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + '@react-native/metro-babel-transformer@0.86.0': + resolution: {integrity: sha512-SjKej3E5qIahqo/G+rSOrmJUQM44RyKtWtO+VfmKAAMoJWkBFomM22hTLKCIS5cdbIAJ9COAmU+KAi2wVSO0wQ==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + peerDependencies: + '@babel/core': '*' + + '@react-native/metro-config@0.86.0': + resolution: {integrity: sha512-7v+xbTeEci9ZcQ/Z1OqI4RXcqN69wSMDYL5BAMvOReZ7U04+aDQ0/SQhClYPn6x2/RxM4WzMKSAuNyLKqvYVtw==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + '@react-native/normalize-colors@0.74.89': + resolution: {integrity: sha512-qoMMXddVKVhZ8PA1AbUCk83trpd6N+1nF2A6k1i6LsQObyS92fELuk8kU/lQs6M7BsMHwqyLCpQJ1uFgNvIQXg==} + + '@react-native/normalize-colors@0.86.0': + resolution: {integrity: sha512-kG0wfCGghUKlfxkJyyHCDVutWVYWK7/DG58ojA/4v9EfulgF+osuSQmlbNb3rcKX58qutm7JcldSeVLgGFha9g==} + + '@react-native/normalize-colors@0.86.2': + resolution: {integrity: sha512-EzPFc9Y6lzYOWeso2almwXI7f8+qReHxWvT+algsOczb2UhWXIWXDoSvkdwoSfiwwmGt/ijJgKJoeHlzPkLwRg==} + + '@react-native/virtualized-lists@0.86.0': + resolution: {integrity: sha512-4/ZLXdf/OSpPDVO0AsQ1SJdRIzt5t9BNQ46QwGgxvX7/cirYR5k8KXctNGGgW8lQo2gZChEfY2zFCZg9nM/jiw==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + peerDependencies: + '@types/react': ^19.2.0 + react: '*' + react-native: 0.86.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@react-pdf/fns@3.1.2': + resolution: {integrity: sha512-qTKGUf0iAMGg2+OsUcp9ffKnKi41RukM/zYIWMDJ4hRVYSr89Q7e3wSDW/Koqx3ea3Uy/z3h2y3wPX6Bdfxk6g==} + + '@react-pdf/font@4.0.4': + resolution: {integrity: sha512-8YtgGtL511txIEc9AjiilpZ7yjid8uCd8OGUl6jaL3LIHnrToUupSN4IzsMQpVTCMYiDLFnDNQzpZsOYtRS/Pg==} + + '@react-pdf/image@3.0.4': + resolution: {integrity: sha512-z0ogVQE0bKqgXQ5smgzIU857rLV7bMgVdrYsu3UfXDDLSzI7QPvzf6MFTFllX6Dx2rcsF13E01dqKPtJEM799g==} + + '@react-pdf/layout@4.4.2': + resolution: {integrity: sha512-gNu2oh8MiGR+NJZYTJ4c4q0nWCESBI6rKFiodVhE7OeVAjtzZzd6l65wsN7HXdWJqOZD3ttD97iE+tf5SOd/Yg==} + + '@react-pdf/pdfkit@4.1.0': + resolution: {integrity: sha512-Wm/IOAv0h/U5Ra94c/PltFJGcpTUd/fwVMVeFD6X9tTTPCttIwg0teRG1Lqq617J8K4W7jpL/B0HTH0mjp3QpQ==} + + '@react-pdf/png-js@3.0.0': + resolution: {integrity: sha512-eSJnEItZ37WPt6Qv5pncQDxLJRK15eaRwPT+gZoujP548CodenOVp49GST8XJvKMFt9YqIBzGBV/j9AgrOQzVA==} + + '@react-pdf/primitives@4.1.1': + resolution: {integrity: sha512-IuhxYls1luJb7NUWy6q5avb1XrNaVj9bTNI40U9qGRuS6n7Hje/8H8Qi99Z9UKFV74bBP3DOf3L1wV2qZVgVrQ==} + + '@react-pdf/reconciler@2.0.0': + resolution: {integrity: sha512-7zaPRujpbHSmCpIrZ+b9HSTJHthcVZzX0Wx7RzvQGsGBUbHP4p6s5itXrAIOuQuPvDepoHGNOvf6xUuMVvdoyw==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -3487,6 +4330,9 @@ packages: '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + '@sinclair/typebox@0.27.12': + resolution: {integrity: sha512-hhyNJ+nbR6ZR7pToHvllEFun9TL0sbL+tk/ON75lo+Xas054uez98qRbsuNt7MBCyZKK4+8Yli/OAGZhmfBZ/g==} + '@sindresorhus/is@4.6.0': resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} engines: {node: '>=10'} @@ -4197,6 +5043,9 @@ packages: '@types/electron-squirrel-startup@1.0.2': resolution: {integrity: sha512-AzxnvBzNh8K/0SmxMmZtpJf1/IWoGXLP+pQDuUaVkPyotI8ryvAtBSqgxR/qOSvxWHYWrxkeNsJ+Ca5xOuUxJQ==} + '@types/emscripten@1.41.5': + resolution: {integrity: sha512-cMQm7pxu6BxtHyqJ7mQZ2kXWV5SLmugybFdHCBbJ5eHzOo6VhBckEgAT3//rP5FwPHNPeEiq4SmQ5ucBwsOo4Q==} + '@types/eslint-scope@3.7.7': resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} @@ -4221,6 +5070,9 @@ packages: '@types/geojson@7946.0.16': resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==} + '@types/hammerjs@2.0.46': + resolution: {integrity: sha512-ynRvcq6wvqexJ9brDMS4BnBLzmr0e14d6ZJTEShTBWKymQiHwlAyGu0ZPEFI2Fh1U53F7tN9ufClWM5KvqkKOw==} + '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} @@ -4230,6 +5082,15 @@ packages: '@types/http-errors@2.0.5': resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} + '@types/istanbul-lib-coverage@2.0.6': + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + + '@types/istanbul-lib-report@3.0.3': + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + + '@types/istanbul-reports@3.0.4': + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -4295,6 +5156,9 @@ packages: peerDependencies: '@types/react': ^19.2.0 + '@types/react-test-renderer@19.1.0': + resolution: {integrity: sha512-XD0WZrHqjNrxA/MaR9O22w/RNidWR9YZmBdRGI7wcnWGrv/3dA8wKCJ8m63Sn+tLJhcjmuhOi629N66W6kgWzQ==} + '@types/react@19.2.7': resolution: {integrity: sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==} @@ -4325,6 +5189,15 @@ packages: '@types/wrap-ansi@3.0.0': resolution: {integrity: sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==} + '@types/ws@8.18.1': + resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} + + '@types/yargs-parser@21.0.3': + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + + '@types/yargs@17.0.35': + resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==} + '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} @@ -4522,6 +5395,10 @@ packages: abs-svg-path@0.1.1: resolution: {integrity: sha512-d8XPSGjfyzlXC3Xx891DJRyZfqk5JU0BJrDQcsWomFIV1/BIzPW5HDH5iDdWpqWaav0YVIEzT1RHTwWr0FFshA==} + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + accepts@2.0.0: resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} engines: {node: '>= 0.6'} @@ -4554,6 +5431,11 @@ packages: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} + agent-cli-detector@0.1.6: + resolution: {integrity: sha512-vKrPeEVN3upDF3GjWxsWBbwQgMtNJ8VB1cduPvK3svmmz4ENpS7yaPxbogsbe3w+xp9xp2Cu+0Ar41rjAR4+lA==} + engines: {node: '>=18.18'} + hasBin: true + agent-slack@0.9.3: resolution: {integrity: sha512-A9ts5J7RVUf3Oyja/sPxyr4oCxvJy66s0p9c1YeYmlKTqBsUoHRGcAM+198rH6DiYTLOOTIJbT/mL8Lo0bRlHg==} engines: {node: '>=22.5'} @@ -4600,6 +5482,9 @@ packages: ajv@8.17.1: resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + anser@1.4.10: + resolution: {integrity: sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==} + ansi-escapes@4.3.2: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} @@ -4608,6 +5493,10 @@ packages: resolution: {integrity: sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==} engines: {node: '>=12'} + ansi-regex@4.1.1: + resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} + engines: {node: '>=6'} + ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -4616,6 +5505,10 @@ packages: resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} engines: {node: '>=12'} + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} @@ -4637,6 +5530,9 @@ packages: os: [darwin] hasBin: true + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} @@ -4658,6 +5554,9 @@ packages: resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} engines: {node: '>=8'} + asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} @@ -4700,6 +5599,51 @@ packages: axios@1.17.0: resolution: {integrity: sha512-J8SwNxprqqpbfenehxWYXE7CW+wM1BB4w3+N+g+/Wx40xM4rsLrfPmHHxSWIxJLYDgSY/HqlFPIYb2/S3rxafw==} + babel-plugin-polyfill-corejs2@0.4.17: + resolution: {integrity: sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-corejs3@0.13.0: + resolution: {integrity: sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-regenerator@0.6.8: + resolution: {integrity: sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-react-compiler@1.0.0: + resolution: {integrity: sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw==} + + babel-plugin-react-native-web@0.21.2: + resolution: {integrity: sha512-SPD0J6qjJn8231i0HZhlAGH6NORe+QvRSQM2mwQEzJ2Fb3E4ruWTiiicPlHjmeWShDXLcvoorOCXjeR7k/lyWA==} + + babel-plugin-syntax-hermes-parser@0.36.0: + resolution: {integrity: sha512-LhD0xdoedDw7ansQgXbB2DADLZIK/LRXuWNBPuVzMc5S2WK5GyT89tCM+cQzxFGO0mGyLK6D5TrVOJJzAoDy8Q==} + + babel-plugin-syntax-hermes-parser@0.36.1: + resolution: {integrity: sha512-ycduwJbvdvIMmVvlAZqGggS+pm5Eu4Bk9pcV9Sm2Z4PJNRVsKkv0g7vHj+LeuC1gHTeF67sJXFOq61IlqCa2hA==} + + babel-plugin-transform-flow-enums@0.0.2: + resolution: {integrity: sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==} + + babel-preset-expo@57.0.7: + resolution: {integrity: sha512-/1RLnZTJVoTNo6nCdSv27BSA2LBzM/qEkNLznwWvztg64DhsAz7ByZIiAqdbau9FK3YqF+IV5a2ZsPXFclwq4A==} + peerDependencies: + '@babel/runtime': ^7.20.0 + expo: '*' + expo-widgets: ^57.0.10 + react-refresh: '>=0.14.0 <1.0.0' + peerDependenciesMeta: + '@babel/runtime': + optional: true + expo: + optional: true + expo-widgets: + optional: true + bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} @@ -4722,6 +5666,13 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + + barcode-detector@3.2.2: + resolution: {integrity: sha512-/4QOrrNrCRmDSBWiiP4aC72dnkuXUEdcFRidHgbPRXUpy82XcCMvJssI6fEs6JT42LS7DvBVZO70qasJbYKyrA==} + base32-encode@1.2.0: resolution: {integrity: sha512-cHFU8XeRyx0GgmoWi5qHMCVRiqU6J3MHWxVgun7jggCBUpVzm1Ir7M9dYr2whjSNc3tFeXfQ/oZjQu/4u55h9A==} @@ -4732,6 +5683,11 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + baseline-browser-mapping@2.11.16: + resolution: {integrity: sha512-H/bNPUFHewJHyCTdjn1n3Pit5+2GmWT6mmeHImPX+8MA9NA6b67jO4gYmi4jTbCJb2otq34KMZnovndDPqJwhQ==} + engines: {node: '>=6.0.0'} + hasBin: true + baseline-browser-mapping@2.9.11: resolution: {integrity: sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==} hasBin: true @@ -4742,6 +5698,10 @@ packages: bidi-js@1.0.3: resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} + big-integer@1.6.52: + resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} + engines: {node: '>=0.6'} + bignumber.js@9.3.1: resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==} @@ -4774,12 +5734,27 @@ packages: bplist-creator@0.0.8: resolution: {integrity: sha512-Za9JKzD6fjLC16oX2wsXfc+qBEhJBJB1YPInoAQpMLhDuj5aVOv1baGeIQSq1Fr3OCqzvsoQcSBSwGId/Ja2PA==} + bplist-creator@0.1.0: + resolution: {integrity: sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==} + + bplist-parser@0.3.1: + resolution: {integrity: sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==} + engines: {node: '>= 5.10.0'} + + bplist-parser@0.3.2: + resolution: {integrity: sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==} + engines: {node: '>= 5.10.0'} + brace-expansion@1.1.12: resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} brace-expansion@2.0.2: resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + brace-expansion@5.0.9: + resolution: {integrity: sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==} + engines: {node: 20 || >=22} + braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} @@ -4798,6 +5773,14 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + browserslist@4.28.8: + resolution: {integrity: sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} @@ -4866,12 +5849,19 @@ packages: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + camelize@1.0.1: resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} caniuse-lite@1.0.30001761: resolution: {integrity: sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g==} + caniuse-lite@1.0.30001809: + resolution: {integrity: sha512-xxWVywk6a6Arlk+hymeycyn/VgqEfLDxupvhH/xiY5SJ/18kmi9o6MiO320DCUzypORHLtvh0I4i04tUhCNHNQ==} + ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -4883,6 +5873,10 @@ packages: resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} engines: {node: '>=18'} + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} @@ -4923,10 +5917,25 @@ packages: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} + chrome-launcher@0.15.2: + resolution: {integrity: sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==} + engines: {node: '>=12.13.0'} + hasBin: true + chrome-trace-event@1.0.4: resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} engines: {node: '>=6.0'} + chromium-edge-launcher@0.3.0: + resolution: {integrity: sha512-p03azHlGjtyRvFEee3cyvtsRYdniSkwjkzmM/KmVnqT5d7QkkwpJBhis/zCLMYdQMVJ5tt140TBNqqrZPaWeFA==} + + ci-info@2.0.0: + resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} + + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + class-variance-authority@0.7.1: resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} @@ -4937,6 +5946,10 @@ packages: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} + cli-cursor@2.1.0: + resolution: {integrity: sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==} + engines: {node: '>=4'} + cli-cursor@3.1.0: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} engines: {node: '>=8'} @@ -4957,6 +5970,9 @@ packages: resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} engines: {node: '>= 12'} + client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + cliui@6.0.0: resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} @@ -4998,16 +6014,26 @@ packages: color-convert@0.5.3: resolution: {integrity: sha512-RwBeO/B/vZR3dfKL1ye/vx8MHZ40ugzpyfeVG5GsiuGnrlMWe2o8wxBbLCpw9CsxV+wHuzYlCiWnybrIA0ling==} + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} color-string@1.9.1: resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} @@ -5022,6 +6048,10 @@ packages: resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} engines: {node: '>=16'} + commander@12.1.0: + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} + commander@14.0.3: resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} engines: {node: '>=20'} @@ -5049,6 +6079,14 @@ packages: resolution: {integrity: sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==} engines: {node: '>=0.10.0'} + compressible@2.0.18: + resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} + engines: {node: '>= 0.6'} + + compression@1.8.1: + resolution: {integrity: sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==} + engines: {node: '>= 0.8.0'} + concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -5060,6 +6098,10 @@ packages: confbox@0.1.8: resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + connect@3.7.0: + resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==} + engines: {node: '>= 0.10.0'} + content-disposition@1.0.1: resolution: {integrity: sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==} engines: {node: '>=18'} @@ -5083,6 +6125,10 @@ packages: resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} engines: {node: '>= 0.6'} + core-js-compat@3.50.0: + resolution: {integrity: sha512-XGpFGbMLHwSt74YLTKho7Ib242qi6O8MSX+sRokV4oz7iKXvQWGYZthjIhjRGMxjzVkAubBO512dKGYcefmX3Q==} + engines: {node: '>=6.4.0'} + core-js@3.47.0: resolution: {integrity: sha512-c3Q2VVkGAUyupsjRnaNX6u8Dq2vAdzm9iuPj5FW0fRxzlxgq9Q39MDq10IvmQSpLgHQNyQzQmOo6bgGHmH3NNg==} @@ -5114,6 +6160,9 @@ packages: cross-dirname@0.1.0: resolution: {integrity: sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q==} + cross-fetch@3.2.0: + resolution: {integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==} + cross-spawn@6.0.6: resolution: {integrity: sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==} engines: {node: '>=4.8'} @@ -5130,9 +6179,19 @@ packages: resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} deprecated: Active development of CryptoJS has been discontinued. This library is no longer maintained. + css-color-keywords@1.0.0: + resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} + engines: {node: '>=4'} + + css-in-js-utils@3.1.0: + resolution: {integrity: sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==} + css-select@5.2.2: resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} + css-to-react-native@3.2.0: + resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==} + css-tree@3.2.1: resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} @@ -5325,6 +6384,14 @@ packages: supports-color: optional: true + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} @@ -5347,6 +6414,10 @@ packages: decode-named-character-reference@1.2.0: resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==} + decode-uri-component@0.2.2: + resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} + engines: {node: '>=0.10'} + decompress-response@6.0.0: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} @@ -5354,6 +6425,10 @@ packages: deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + default-browser-id@5.0.1: resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==} engines: {node: '>=18'} @@ -5399,6 +6474,10 @@ packages: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + detect-libc@2.1.2: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} @@ -5431,6 +6510,9 @@ packages: dir-compare@4.2.0: resolution: {integrity: sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ==} + dnssd-advertise@1.1.6: + resolution: {integrity: sha512-Ndrrf6BMPalkQPd/zubL+4YghH2J9NspapQ09uDXwYbvOPkP0oaqf5CkcwJ0b50kS2O3ul6yVu+jz+RY62Cejg==} + docxtemplater@3.68.7: resolution: {integrity: sha512-FwgeAKqY2vc9eVm2V2XGg8bq25B0OQjtSDITGi9zNnvu5GbtR4WvGjM5QNld/ALB6ZbsSuHskBPK9SvPpKhsbA==} engines: {node: '>=0.10'} @@ -5521,6 +6603,9 @@ packages: electron-to-chromium@1.5.267: resolution: {integrity: sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==} + electron-to-chromium@1.5.411: + resolution: {integrity: sha512-gglkxzokjHfawpGxq75XdBV2/l3BAPzrsMs70qgaZdTW5rpV1tC4MdgJVP9fN126bODA4ZJQkn1wryEzJyQXIg==} + electron-winstaller@5.4.0: resolution: {integrity: sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg==} engines: {node: '>=8.0.0'} @@ -5545,6 +6630,10 @@ packages: encode-utf8@1.0.3: resolution: {integrity: sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==} + encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + encodeurl@2.0.0: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} @@ -5566,6 +6655,9 @@ packages: entities@1.1.2: resolution: {integrity: sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==} + entities@2.0.3: + resolution: {integrity: sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==} + entities@2.2.0: resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} @@ -5591,6 +6683,9 @@ packages: error-ex@1.3.4: resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} + error-stack-parser@2.1.4: + resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} + error@4.4.0: resolution: {integrity: sha512-SNDKualLUtT4StGFP7xNfuFybL2f6iJujFtrWuvJqGbVQGaN+adE23veqzPz1hjUjTunLi2EnJ+0SJxtbJreKw==} @@ -5678,6 +6773,7 @@ packages: eslint@9.39.2: resolution: {integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true peerDependencies: jiti: '*' @@ -5755,6 +6851,197 @@ packages: resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} engines: {node: '>=12.0.0'} + expo-asset@57.0.13: + resolution: {integrity: sha512-RPjMcmPXRMb6UbQdTIkmSDEnQL5LKGTu7ZXatq3U67V6ldlSdQeQ9pQV7zlmk0DrbnaMEh3HYiEh2YxWLNyCzA==} + peerDependencies: + expo: '*' + react: '*' + react-native: '*' + + expo-camera@57.0.4: + resolution: {integrity: sha512-MqbbQ63O+cA8JbK3lfFHiD0f2jv8jB+EG/ILK6f5xnOPV9IR37yaG5+lGtRZNoOeYBzGypyOi17USItleMyuGw==} + peerDependencies: + expo: '*' + react: '*' + react-native: '*' + react-native-web: '*' + peerDependenciesMeta: + react-native-web: + optional: true + + expo-constants@57.0.13: + resolution: {integrity: sha512-eB5AHp7kKxsVIBjTetUgj5WQSw8joI2ekzgTlcUv+Hc0x2t0jZU6IiL4DpyOT2yZQ71n0WJZCkmOKLgxlajIzg==} + peerDependencies: + expo: '*' + react-native: '*' + + expo-device@57.0.1: + resolution: {integrity: sha512-jyEMDUticH+dhcL3GHa2aiifOvGXJsmb3oVT2R2q4i8bN7Bddy61+NkpMmuS2VAZrvoLQwf0TJJ/1vi1ukvutA==} + peerDependencies: + expo: '*' + + expo-file-system@57.0.5: + resolution: {integrity: sha512-XjGrCClF0935y5wLB9qNQQUVptNEy+0OloBstXlCd+IeNXLo3uNOod6cX4N0hofIhNIrN1Al8fwfay7R0Z1a2A==} + peerDependencies: + expo: '*' + react-native: '*' + + expo-font@57.0.1: + resolution: {integrity: sha512-QyS9L1Kh9sKJg4gfU6rdbpxpmH+DyzBX8z6jVvXMUDoqLr1GqmkO/Wu379KCXjL///kWbhpNlbi7AgBuj4VdIQ==} + peerDependencies: + expo: '*' + react: '*' + react-native: '*' + + expo-glass-effect@57.0.1: + resolution: {integrity: sha512-m/n8maxqNcHk6ZDhuqXBfD5Kt1Iz3M8xykVgdB0iSCIXvF70IqWXmQhX8Psswhrp8eZ+3r0mAD0Jh/2gFA3QaA==} + peerDependencies: + expo: '*' + react: '*' + react-native: '*' + + expo-image@57.0.3: + resolution: {integrity: sha512-EYfV8tIQxXLQPHhgZxc+bESUn2NcVw1U0RM28qqFeFfHyD1sBpIYJC2JTy24OtfBowYVoUyTvgf2ykWydiZVCw==} + peerDependencies: + expo: '*' + react: '*' + react-native: '*' + react-native-web: '*' + peerDependenciesMeta: + react-native-web: + optional: true + + expo-keep-awake@57.0.1: + resolution: {integrity: sha512-28lkFImeXTS+bhAjuCFV7w7tW5bXg27BJVrxv+nC/nyYa86qEa0oFeHwqol6ha5k4pdVDQgBF09GM4A1k76Ssg==} + peerDependencies: + expo: '*' + react: '*' + + expo-linking@57.0.7: + resolution: {integrity: sha512-Ujn4kY0bd1MoJFLYuvIUWamlZH61pkahrUpug3hBtOeS89LDbPyKNjjmWef6+CPTGQfed2PlfuMZuPO1BCrg5w==} + peerDependencies: + react: '*' + react-native: '*' + + expo-modules-autolinking@57.0.10: + resolution: {integrity: sha512-jNqLswMx8QHN8VXRgud+xT+9q+J9U63CEGlx+k4V/IE9Qyt9HrKbWp+pIDma0fOquta5HBfSfsShcI+NkEpTiA==} + hasBin: true + + expo-modules-core@57.0.12: + resolution: {integrity: sha512-hKqCdu8+78oNKWCgM4xSeblfmD/audgNVCn6uUCJuNBS/hc4DyC0Ia1X96SSZF9w9bGTLjNS8j2b7DshiC3WJA==} + peerDependencies: + react: '*' + react-native: '*' + react-native-worklets: ^0.7.4 || ^0.8.0 || ^0.9.0 || ^0.10.0 + peerDependenciesMeta: + react-native-worklets: + optional: true + + expo-modules-jsi@57.0.5: + resolution: {integrity: sha512-NQF7MUF0j3rQHV8KJqETYA1SrJr3USvQ/AWEhODo+unMRFBDP9BKpn8+aNGGmx6fa2XLnqC2qulVw4DT6Gp13Q==} + peerDependencies: + react-native: '*' + + expo-router@57.0.15: + resolution: {integrity: sha512-vwr2HL2U7hqv3QTkuz0e8hQc5hkgpXztisy30VwhdXJVDPdP0/m8wSiYUm6GKyZAbcXfD4fn44ZYcJsSESY6cA==} + peerDependencies: + '@expo/log-box': ^57.0.3 + '@expo/metro-runtime': ^57.0.12 + '@testing-library/react-native': '>= 13.2.0' + expo: '*' + expo-constants: ^57.0.13 + expo-linking: ^57.0.7 + react: '*' + react-dom: '*' + react-native: '*' + react-native-gesture-handler: '*' + react-native-reanimated: '*' + react-native-safe-area-context: '>= 5.4.0' + react-native-screens: ^4.26.0 + react-native-web: '*' + react-server-dom-webpack: ~19.0.4 || ~19.1.5 || ~19.2.4 + peerDependenciesMeta: + '@testing-library/react-native': + optional: true + react-dom: + optional: true + react-native-gesture-handler: + optional: true + react-native-reanimated: + optional: true + react-native-web: + optional: true + react-server-dom-webpack: + optional: true + + expo-secure-store@57.0.1: + resolution: {integrity: sha512-tLa1VmSadOq19mA/dwkl99RbHyjLE0T1qqBYMY3/OsguZTI+rlrDy/DDJjupqlVtmr95hD7o1pYqx5aL+B4YMA==} + peerDependencies: + expo: '*' + + expo-server@57.0.3: + resolution: {integrity: sha512-aK+LdKzauHSGmsOStZtyxdzv0zWssCkxTw3m4QuOhfDSJsZaMRTd9O41d8ixU/QfELTbaJ0oRNcF7JFV/7O9YQ==} + engines: {node: '>=20.16.0'} + + expo-splash-screen@57.0.7: + resolution: {integrity: sha512-QxqfjOCTnTGnqK2BxfEtxUJOcnsJbUXO873Q342r3VkgHAG877eozsNzgYWQXcCFj/asMwx2uy9OXxBShxc5rQ==} + peerDependencies: + expo: '*' + + expo-status-bar@57.0.1: + resolution: {integrity: sha512-Xwaq1gAoVRWx5dPG5VhT5RSbnI9OilhZnO5qoPBnUaBAa5VzRzfdS8q0/bsPt0jR2DKLtGuP0bQ6efMJ4RIMDg==} + peerDependencies: + expo: '*' + react: '*' + react-native: '*' + + expo-symbols@57.0.2: + resolution: {integrity: sha512-qZ0iqOflm5lZGwRsQ5Y8sDksw3GAUKwHSX1bJBoocXf7gu14vafIXXYWte+JT9VfXAUGyKodJhLHP/GoOrcNWg==} + peerDependencies: + expo: '*' + expo-font: '*' + react: '*' + react-native: '*' + + expo-system-ui@57.0.2: + resolution: {integrity: sha512-zABCRqFSioDBAo/RtmS0dQiGgDtDPZUVk01Y3Ti4ducobNM4HTM2sNAtq+YPpEUhaVW3hccPVsEUH4LK/ADVhA==} + peerDependencies: + expo: '*' + react-native: '*' + react-native-web: '*' + peerDependenciesMeta: + react-native-web: + optional: true + + expo-web-browser@57.0.2: + resolution: {integrity: sha512-3vl5kvd7PB48ub6PpNIJUuPxO8xVa6D8RnIgNba6SXRwqFprOfeEZgwTgtm41kz0AAtvMOztUVNEUkwrHKjqMQ==} + peerDependencies: + expo: '*' + react-native: '*' + + expo@57.0.15: + resolution: {integrity: sha512-9UooISw8S8Gxo9wpsPcGkyRlf2UzNr+F26LSU2+M8iaiZ1WAjPR0I75NKFX8ETbrSgthZ2lQHgy5IU2KE/mpBA==} + hasBin: true + peerDependencies: + '@expo/dom-webview': '*' + '@expo/metro-runtime': '*' + react: '*' + react-dom: '*' + react-native: '*' + react-native-web: '*' + react-native-webview: '*' + peerDependenciesMeta: + '@expo/dom-webview': + optional: true + '@expo/metro-runtime': + optional: true + react-dom: + optional: true + react-native-web: + optional: true + react-native-webview: + optional: true + exponential-backoff@3.1.3: resolution: {integrity: sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==} @@ -5817,6 +7104,20 @@ packages: fastq@1.20.1: resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + fb-dotslash@0.5.8: + resolution: {integrity: sha512-XHYLKk9J4BupDxi9bSEhkfss0m+Vr9ChTrjhf9l2iw3jB5C7BnY4GVPoMcqbrTutsKJso6yj2nAB6BI/F2oZaA==} + engines: {node: '>=20'} + hasBin: true + + fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + + fbjs-css-vars@1.0.2: + resolution: {integrity: sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==} + + fbjs@3.0.5: + resolution: {integrity: sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==} + fd-slicer@1.1.0: resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} @@ -5833,6 +7134,9 @@ packages: resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} engines: {node: ^12.20 || >= 14.13} + fetch-nodeshim@0.4.10: + resolution: {integrity: sha512-m6I8ALe4L4XpdETy7MJZWs6L1IVMbjs99bwbpIKphxX+0CTns4IKDWJY0LWfr4YsFjfg+z1TjzTMU8lKl8rG0w==} + fflate@0.4.8: resolution: {integrity: sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==} @@ -5856,6 +7160,14 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} + filter-obj@1.1.0: + resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==} + engines: {node: '>=0.10.0'} + + finalhandler@1.1.2: + resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==} + engines: {node: '>= 0.8'} + finalhandler@2.1.1: resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} engines: {node: '>= 18.0.0'} @@ -5883,6 +7195,9 @@ packages: resolution: {integrity: sha512-dz4HxH6pOvbUzZpZ/yXhafjbR2I8cenK5xL0KtBFb7U2ADsR+OwXifnxZjij/pZWF775uSCMzWVd+jDik2H2IA==} engines: {node: '>= 12'} + flow-enums-runtime@0.0.6: + resolution: {integrity: sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==} + fmix@0.1.0: resolution: {integrity: sha512-Y6hyofImk9JdzU8k5INtTXX1cu8LDlePWDFU5sftm9H+zKCr5SGrVjdhkvsim646cw5zD0nADj8oHyXMZmCZ9w==} @@ -5904,6 +7219,9 @@ packages: debug: optional: true + fontfaceobserver@2.3.0: + resolution: {integrity: sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg==} + fontkit@2.0.4: resolution: {integrity: sha512-syetQadaUEDNdxdugga9CpEYVaQIxOwk7GlwZWWZ19//qW4zE5bknOKeMBDYAASwnpaSHKJITRLMF9m1fp3s6g==} @@ -5945,6 +7263,10 @@ packages: react-dom: optional: true + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + fresh@2.0.0: resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} engines: {node: '>= 0.8'} @@ -6062,6 +7384,10 @@ packages: resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} engines: {node: '>=8'} + getenv@2.0.0: + resolution: {integrity: sha512-VilgtJj/ALgGY77fiLam5iD336eSWi96Q15JSAG1zi8NRBysm3LXKdGnHb4m5cuyxvOLQQKWpBZAT6ni4FI2iQ==} + engines: {node: '>=6'} + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -6160,6 +7486,10 @@ packages: hachure-fill@0.5.2: resolution: {integrity: sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==} + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} @@ -6230,14 +7560,38 @@ packages: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true + hermes-compiler@250829098.0.14: + resolution: {integrity: sha512-5meXwsZxgiqFaJjNzwjzI9IyUkuGGBisu+z9BvQWmGVpjH6nz11hgqkyxe4dl8UAdyIV4lTbz91+Dlnjz0VxqA==} + hermes-estree@0.25.1: resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==} + hermes-estree@0.35.0: + resolution: {integrity: sha512-xVx5Opwy8Oo1I5yGpVRhCvWL/iV3M+ylksSKVNlxxD90cpDpR/AR1jLYqK8HWihm065a6UI3HeyAmYzwS8NOOg==} + + hermes-estree@0.36.0: + resolution: {integrity: sha512-A1+8zn5oss2CFP7pKsOaxorQG6FNIz1WU1VDqruLPPZl3LVgeE2C5xfFg8Ow6/Ow4mSslLLtYP1J3n38eKyW9w==} + + hermes-estree@0.36.1: + resolution: {integrity: sha512-guv1nQ6IJ7S83NRFPWc3SA7IBZrdNC9kapwOq6uXvF4wP+sDCgjzQbKPCoyYmoyZRzztF/n/c36l/rccCZSiCw==} + hermes-parser@0.25.1: resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} - hono@4.11.3: - resolution: {integrity: sha512-PmQi306+M/ct/m5s66Hrg+adPnkD5jiO6IjA7WhWw0gSBSo1EcRegwuI1deZ+wd5pzCGynCcn2DprnE4/yEV4w==} + hermes-parser@0.35.0: + resolution: {integrity: sha512-9JLjeHxBx8T4CAsydZR49PNZUaix+WpQJwu9p2010lu+7Kwl6D/7wYFFJxoz+aXkaaClp9Zfg6W6/zVlSJORaA==} + + hermes-parser@0.36.0: + resolution: {integrity: sha512-GdpwMmH5x6IpC1cijvcvYnlPB60Mh6kTSF/NFdYV/j56gYdi+0RIakYs+eqOV+bbO0SW7mgVVGSsTJxyPQfo3w==} + + hermes-parser@0.36.1: + resolution: {integrity: sha512-GApNk4zLHi2UWoWZZkx7LNCOSzLSc5lB55pZ/PhK7ycFeg7u5LcF88p/WbpIi1XUDtE0MpHE3uRR3u3KB7TjSQ==} + + hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + + hono@4.13.3: + resolution: {integrity: sha512-r8AO2mYHoLxSHkgafNeC/BXyb2vWRxD3jem4Ts+ptav8oTG5FIRifAjuJEmZI4bSvvc2ns0GxmIYiZnHqN3mMw==} engines: {node: '>=16.9.0'} hookified@1.15.1: @@ -6249,6 +7603,10 @@ packages: hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + hosted-git-info@7.0.2: + resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} + engines: {node: ^16.14.0 || >=18.0.0} + hsl-to-hex@1.0.0: resolution: {integrity: sha512-K6GVpucS5wFf44X0h2bLVRDsycgJmf9FF2elg+CrqD8GcFU8c6vYhgXn8NjUkFCwj+xDFb70qgLbTUm6sxwPmA==} @@ -6306,6 +7664,9 @@ packages: hyphen@1.14.1: resolution: {integrity: sha512-kvL8xYl5QMTh+LwohVN72ciOxC0OEV79IPdJSTwEXok9y9QHebXGdFgrED4sWfiax/ODx++CAMk3hMy4XPJPOw==} + hyphenate-style-name@1.1.0: + resolution: {integrity: sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==} + hysnappy@1.1.1: resolution: {integrity: sha512-/V9XcN2NtRyWjR4LYMfvnvasVVF8jbT/ej0eofBQjZel91E3D813FQ3mQC6gDSMMTCq/FJh28XHeyqr3I/oBRw==} @@ -6321,6 +7682,9 @@ packages: resolution: {integrity: sha512-2Tth85cXwGFHfvRgZWszZSvdo+0Xsqmw8k8ZwxScfcBneNUraK+dxRxRm24nszx80Y0TVio8kKLt5sLE7ZCLlw==} engines: {node: '>=0.10.0'} + idb@8.0.3: + resolution: {integrity: sha512-LtwtVyVYO5BqRvcsKuB2iUMnHwPVByPCXFXOpuU96IZPPoPN6xjOGxZQ74pgSVVLQWtUOYgyeL4GE98BY5D3wg==} + ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -6390,6 +7754,9 @@ packages: inline-style-parser@0.2.7: resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==} + inline-style-prefixer@7.0.1: + resolution: {integrity: sha512-lhYo5qNTQp3EvSSp3sRvXMbVQTLrvGV6DycRMJ5dm2BLMiJ30wpXKdDdgX+GmJZ5uQMucwRKHamXSst3Sj/Giw==} + internmap@1.0.1: resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} @@ -6401,6 +7768,9 @@ packages: resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==} engines: {node: '>=10.13.0'} + invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + ip-address@10.1.0: resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==} engines: {node: '>= 12'} @@ -6564,10 +7934,29 @@ packages: jay-peg@1.1.1: resolution: {integrity: sha512-D62KEuBxz/ip2gQKOEhk/mx14o7eiFRaU+VNNSP4MOiIkwb/D6B3G1Mfas7C/Fit8EsSV2/IWjZElx/Gs6A4ww==} + jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-util@29.7.0: + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-validate@29.7.0: + resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-worker@27.5.1: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} + jest-worker@29.7.0: + resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jimp-compact@0.16.1: + resolution: {integrity: sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww==} + jiti@2.6.1: resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true @@ -6586,6 +7975,9 @@ packages: resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true + jsc-safe-url@0.2.4: + resolution: {integrity: sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==} + jsdom@29.1.1: resolution: {integrity: sha512-ECi4Fi2f7BdJtUKTflYRTiaMxIB0O6zfR1fX0GXpUrf6flp8QIYn1UT20YQqdSOfk2dfkCwS8LAFoJDEppNK5Q==} engines: {node: ^20.19.0 || ^22.13.0 || >=24.0.0} @@ -6672,6 +8064,14 @@ packages: khroma@2.1.0: resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==} + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + lan-network@0.2.1: + resolution: {integrity: sha512-ONPnazC96VKDntab9j9JKwIWhZ4ZUceB4A9Epu4Ssg0hYFmtHZSeQ+n15nIwTFmcBUKtExOer8WTJ4GF9MO64A==} + hasBin: true + langium@4.2.2: resolution: {integrity: sha512-JUshTRAfHI4/MF9dH2WupvjSXyn8JBuUEWazB8ZVJUtXutT0doDlAv1XKbZ1Pb5sMexa8FF4CFBc0iiul7gbUQ==} engines: {node: '>=20.10.0', npm: '>=10.2.3'} @@ -6682,6 +8082,10 @@ packages: layout-base@2.0.1: resolution: {integrity: sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==} + leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -6692,6 +8096,9 @@ packages: lie@3.3.0: resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + lighthouse-logger@1.4.2: + resolution: {integrity: sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==} + lightningcss-android-arm64@1.30.2: resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==} engines: {node: '>= 12.0.0'} @@ -6769,6 +8176,9 @@ packages: linebreak@1.1.0: resolution: {integrity: sha512-MHp03UImeVhB7XZtjd0E4n6+3xr5Dq/9xI/5FptGk5FrbDR3zagPa2DS6U8ks/3HjbKWG9Q1M2ufOzxV2qLYSQ==} + linkify-it@2.2.0: + resolution: {integrity: sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==} + linkify-it@5.0.0: resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} @@ -6802,6 +8212,9 @@ packages: lodash-es@4.18.1: resolution: {integrity: sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==} + lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + lodash.get@4.4.2: resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} deprecated: This package is deprecated. Use the optional chaining (?.) operator instead. @@ -6809,9 +8222,16 @@ packages: lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + lodash.throttle@4.1.1: + resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} + lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + log-symbols@2.2.0: + resolution: {integrity: sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==} + engines: {node: '>=4'} + log-symbols@4.1.0: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} @@ -6887,6 +8307,9 @@ packages: resolution: {integrity: sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + mammoth@1.11.0: resolution: {integrity: sha512-BcEqqY/BOwIcI1iR5tqyVlqc3KIaMRa4egSoK83YAVrBf6+yqdAAbtUcFDCWX8Zef8/fgNZ6rl4VUv+vVX8ddQ==} engines: {node: '>=12.0.0'} @@ -6899,6 +8322,10 @@ packages: markdown-it-task-lists@2.1.1: resolution: {integrity: sha512-TxFAc76Jnhb2OUu+n3yz9RMu4CwGfaT788br6HhEDlvWfdeJcLUsxk1Hgw2yJio0OXsxv7pyIPmvECY7bMbluA==} + markdown-it@10.0.0: + resolution: {integrity: sha512-YWOP1j7UbDNz+TumYP1kpwnP0aEa711cJjrAQrzd0UXlbJfc5aAq0F/PZHjiioqDC1NKgvIMX+o+9Bk7yuM2dg==} + hasBin: true + markdown-it@14.1.0: resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} hasBin: true @@ -6911,6 +8338,9 @@ packages: engines: {node: '>= 20'} hasBin: true + marky@1.3.0: + resolution: {integrity: sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==} + matcher@3.0.0: resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==} engines: {node: '>=10'} @@ -6973,6 +8403,9 @@ packages: mdn-data@2.27.1: resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} + mdurl@1.0.1: + resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} + mdurl@2.0.0: resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} @@ -6991,6 +8424,12 @@ packages: resolution: {integrity: sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==} engines: {node: '>=6'} + memoize-one@5.2.1: + resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==} + + memoize-one@6.0.0: + resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==} + merge-descriptors@2.0.0: resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} engines: {node: '>=18'} @@ -7005,6 +8444,122 @@ packages: mermaid@11.14.0: resolution: {integrity: sha512-GSGloRsBs+JINmmhl0JDwjpuezCsHB4WGI4NASHxL3fHo3o/BRXTxhDLKnln8/Q0lRFRyDdEjmk1/d5Sn1Xz8g==} + metro-babel-transformer@0.84.4: + resolution: {integrity: sha512-rvCfz8snl9h20VcvpOHxZuHP1SlAkv4HXbzw7nyyVwu6Eqo5PRerbakQ9XmUCOsRy70spJ37O+G1TK8oMzo48g==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + metro-babel-transformer@0.84.5: + resolution: {integrity: sha512-2WbHILKMiJUzfdjmGOQOqU1bWi9//gqiclc/tkk/AIsrrVw3efhZ1uhkOwMTxUEPOzqoo091H0olLmVZH5FHGQ==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + metro-cache-key@0.84.4: + resolution: {integrity: sha512-wVO79aGrkYImpnaVS4+d5RrRBRPX31QtvKB3wKGBuiNSznduZTQHzsrJZRroFJSwnygrzdsGUtDQPuqqFjFdvw==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + metro-cache-key@0.84.5: + resolution: {integrity: sha512-3dPB2TnvGjjf0/9O7AXVQURKXuQNauTZE7WpTGTlR017Gh/B5y0m/2wcqxfveUguHSpu89KhVxCAlr2k/H7uhQ==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + metro-cache@0.84.4: + resolution: {integrity: sha512-gpcFQdSLUwUCk71saKoE64jLFbx2nwTfVCcPSULMNT8QYq0p1eZZE29Jvd0HtT/UlhC3ZOutLxJME5xqD2JUZg==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + metro-cache@0.84.5: + resolution: {integrity: sha512-WHS0n2OxQqtwEjSeQFPePNrMvEFhmQcUQM9cRJMHByWoi/GMWFBEWOf7hVkAM/0KRutAXNbDlSu/cZB6CyxgQQ==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + metro-config@0.84.4: + resolution: {integrity: sha512-PMotGDjXcXLWo2TMRH+VR99phFNgYTwqh4OoieIKK3yTJa1Jmkl+fZJxDO0jfBvNF+WESHciHvpNuBtXaF3B0Q==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + metro-config@0.84.5: + resolution: {integrity: sha512-zie+uN6oohscowi2S7ByU+wUw6CrT4ZxW9uAbONOObSxx86RGmnIAmjXHLkfmcdYoY7jzOPEbqcI6oeVmqyBQA==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + metro-core@0.84.4: + resolution: {integrity: sha512-HONpWC5LGXZn3ffkd4Hu6AIrfE7j4Z0g0wMo/goV24WOB3lhuFZ40KgvaDiSw8iyQHloMYay5N/wPX+z8oN/PQ==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + metro-core@0.84.5: + resolution: {integrity: sha512-xwm605hCi5Y6eJTTb8ZWo6pkUcoBEIyiQOfkZh5GwtDwUrP9SNhTQZhzJHrBCwwxlf3Ptl/pxWJgQ1rsNYMnrA==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + metro-file-map@0.84.4: + resolution: {integrity: sha512-KSVDi/u60hKPx++NLu3MTIvyjzNoJnFAF8PQFxaj1jiSka/wjw+Ua6sNuJ0TDHQv+7AAoFQxeMgaRAe8Yic5wQ==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + metro-file-map@0.84.5: + resolution: {integrity: sha512-mlm/JL8toSbSc2akpKIGmzvrVRSCgZ5vkbycI34oMLoOnLGuLyC8WTyVJ6P0hZG/usDaGwZSl/s9BCRriqjGJA==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + metro-minify-terser@0.84.4: + resolution: {integrity: sha512-5qpbaVOMC7CPitIpuewzVeGw7E+C3ykbv2mqTjQLl85Z3annSVGlSCTcsZjqXZzjupfK4Ztj3dDc4kc44NZwtQ==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + metro-minify-terser@0.84.5: + resolution: {integrity: sha512-BJoFwCEDsYnagPqarayInv2+diCDNDdLlaof/p6s9w4gh+gc9HXYM+pDvsKGKKUumpZswNF3Z/ftTMqKl/5IBg==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + metro-resolver@0.84.4: + resolution: {integrity: sha512-1qLgbxQ5ZGhhutuPot1Yp348ofDsATL2WkrHF65TobqTT9K3P9qJXw38bomk7ncp5B7OYMfWwtyBZo1lCV792A==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + metro-resolver@0.84.5: + resolution: {integrity: sha512-VSSnepg1k6LyCwtb6eirWdAWlpKwBG8Rdtsr1mU38rMelFyWgh3/QuMSiZIZAIjwg/fsa8GhW5/FO54CAUPCEA==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + metro-runtime@0.84.4: + resolution: {integrity: sha512-Jibypds4g7AhzdRKY+kDoj51s5EXMwgyp5ddtlreDAsWefMdOx+agWqgm0H2XSZ/ueanHHVM89fnf5OJnlxa8Q==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + metro-runtime@0.84.5: + resolution: {integrity: sha512-U1m2+d1Pr+JO2/iVXBB2OfXXityz7tqwIorxfrT15IEgaHvpJBq/OHiqnOWPKJbUl3JcxjcdviZZOKk85oK4Qg==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + metro-source-map@0.84.4: + resolution: {integrity: sha512-jbWkPxIesVuo1IWkvezmMJld6iu8nD62GsrZiV6jP37AOdbo4OBq1FJ+qkOg8sV05wAHB//jAbziuW0SlJfW4g==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + metro-source-map@0.84.5: + resolution: {integrity: sha512-2BtV5L9uPc49F13Gn5wiP6bX/EncqzqTIk2VL/0F/96Vo0YEOjluT/qktQjFODfqGFsucwnh5mPEAl/2jVEfeg==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + metro-symbolicate@0.84.4: + resolution: {integrity: sha512-OnfpacxUqGPZQ27t8qK9mFa7uqHIlVWeqRqkCbvMvreEBiamEeOn8krKtcwgP5M4cYDPwuSmCTopHMVthqG4zA==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + hasBin: true + + metro-symbolicate@0.84.5: + resolution: {integrity: sha512-rQ40zYDAkaWBN9yvjUuAD0ZpzBMZSoKyGYXnb5JrfbKjun7fTvfoLHL3KXFYenBTYZkQtlp4cKSCv/1utxFyOw==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + hasBin: true + + metro-transform-plugins@0.84.4: + resolution: {integrity: sha512-kehr6HbAecqD0/a3xLXobELdPaAmRAl8bel0qagPF4vhZtux93nS8S4eq2kgKt6J2GnQpVjSoW1PXdst04mwow==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + metro-transform-plugins@0.84.5: + resolution: {integrity: sha512-+InaSVGaOyt0DyRo4Y/zIdPI6CZwnbNho5LAL23tgmuGwv7fyfkF7kKfPjZcfxXBcoYdTLLFnCfCH/dHSiCqNg==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + metro-transform-worker@0.84.4: + resolution: {integrity: sha512-W1IYMvvXTu4MxYr7d9h7CeG2vpIr3bmLLIavkPY4O1ilzDrvS8z/NEe6y+pC44Ff7raMXQgYSfdqDUwN/i39gg==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + metro-transform-worker@0.84.5: + resolution: {integrity: sha512-ui1Z8x4s5RL36gMmKLaMMO7O9NNDHNdthEZSCDQHAau3JcAsTaFOK6I+2q4I/kW5u8hSEjJk9L45TXSVJw6g1A==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + metro@0.84.4: + resolution: {integrity: sha512-8ETTubqfD6ornDy2zYDvRcKnVDOXdFJsjetYDBsY4oAsb6NJkiwFR+FaMESyGppFmQUyBQA4H4sFGxzcQSGtFA==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + hasBin: true + + metro@0.84.5: + resolution: {integrity: sha512-r1liLkyFZMVSEMNjU1CJU5pRzs3NdkxHqXS60O25c0rCIqAR+cGk7rPydw/g0WAIKVXojIBIF45yYBPagJGcgw==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + hasBin: true + micromark-core-commonmark@2.0.3: resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} @@ -7141,6 +8696,15 @@ packages: resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} engines: {node: '>=18'} + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + mimic-fn@1.2.0: + resolution: {integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==} + engines: {node: '>=4'} + mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} @@ -7164,6 +8728,10 @@ packages: resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==} engines: {node: 20 || >=22} + minimatch@10.2.6: + resolution: {integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==} + engines: {node: 18 || 20 || >=22} + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -7255,6 +8823,9 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + multitars@1.0.2: + resolution: {integrity: sha512-6GwVw5eLi9sThdtlS4PKwC7yRLaf45pYhIEzKBHdKxi+YOXGKFX8acIniH+Uh/+k9mS2lQOupTccjoe5r0/1IQ==} + murmur-32@0.2.0: resolution: {integrity: sha512-ZkcWZudylwF+ir3Ld1n7gL6bI2mQAzXvSobPwVtu8aYi2sbXeipeSkdcanRLzIofLcM5F53lGaKm2dk7orBi7Q==} @@ -7274,6 +8845,11 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + nanoid@3.3.18: + resolution: {integrity: sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + nanoid@5.1.6: resolution: {integrity: sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==} engines: {node: ^18 || >=20} @@ -7282,6 +8858,10 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + negotiator@0.6.4: resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} engines: {node: '>= 0.6'} @@ -7334,6 +8914,10 @@ packages: resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + node-forge@1.4.0: + resolution: {integrity: sha512-LarFH0+6VfriEhqMMcLX2F7SwSXeWwnEAJEsYm5QKWchiVYVvJyV9v7UDvUv+w5HO23ZpQTXDv/GxdDdMyOuoQ==} + engines: {node: '>= 6.13.0'} + node-gyp-build@4.8.4: resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} hasBin: true @@ -7345,12 +8929,19 @@ packages: node-html-parser@6.1.13: resolution: {integrity: sha512-qIsTMOY4C/dAa5Q5vsobRpOOvPfC4pB61UVW2uSwZNUp0QU/jCekTal1vMmbO0DgdHeLUJpv/ARmDqErVxA3Sg==} + node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + node-pty@1.1.0: resolution: {integrity: sha512-20JqtutY6JPXTUnL0ij1uad7Qe1baT46lyolh2sSENDd4sTzKZ4nmAFkeAARDKwmlLjPx6XKRlwRUxwjOy+lUg==} node-releases@2.0.27: resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} + node-releases@2.0.53: + resolution: {integrity: sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ==} + engines: {node: '>=18'} + nopt@6.0.0: resolution: {integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -7366,6 +8957,10 @@ packages: resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} engines: {node: '>=10'} + npm-package-arg@11.0.3: + resolution: {integrity: sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==} + engines: {node: ^16.14.0 || >=18.0.0} + npm-run-path@2.0.2: resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} engines: {node: '>=4'} @@ -7373,9 +8968,20 @@ packages: nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + nullthrows@1.1.1: + resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} + oauth4webapi@3.8.3: resolution: {integrity: sha512-pQ5BsX3QRTgnt5HxgHwgunIRaDXBdkT23tf8dfzmtTIL2LTpdmxgbpbBm0VgFWAIDlezQvQCTgnVIUmHupXHxw==} + ob1@0.84.4: + resolution: {integrity: sha512-eJXMpz4aQHXF/YBB9ddqZDIS+ooO91hObo9FoW/xBkr54/zCwYYCDqT/O54vNo8kOkWs5Ou/y28NgdrV0edQNA==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + ob1@0.84.5: + resolution: {integrity: sha512-aH9RkoZc7w/90HBamFxTw8ZLFr05wXS+iOnvmrgo53Ep8Pyrm5FieQSaPIVROkfFVQISeD/zo92fes26TOwe+A==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -7402,13 +9008,25 @@ packages: resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} engines: {node: '>=14.0.0'} + on-finished@2.3.0: + resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} + engines: {node: '>= 0.8'} + on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} + on-headers@1.1.0: + resolution: {integrity: sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==} + engines: {node: '>= 0.8'} + once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + onetime@2.0.1: + resolution: {integrity: sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==} + engines: {node: '>=4'} + onetime@5.1.2: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} @@ -7449,6 +9067,10 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} + ora@3.4.0: + resolution: {integrity: sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==} + engines: {node: '>=6'} + ora@5.4.1: resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} engines: {node: '>=10'} @@ -7568,6 +9190,10 @@ packages: resolution: {integrity: sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==} engines: {node: '>=0.10.0'} + parse-png@2.1.0: + resolution: {integrity: sha512-Nt/a5SfCLiTnQAjx3fHlqp8hRgTL3z7kTQZzvIMS9uCAepnCyjpdEc6M/sz69WqMBdaDBw9sF1F1UaHROYzGkQ==} + engines: {node: '>=10'} + parse-svg-path@0.1.2: resolution: {integrity: sha512-JyPSBnkTJ0AI8GGJLfMXvKq42cj5c006fnLz6fXy6zfoVjJizi8BNTpu8on8ziI1cKy9d9DGNuY17Ce7wuejpQ==} @@ -7659,6 +9285,10 @@ packages: resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} + picomatch@4.0.5: + resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} + engines: {node: '>=12'} + pify@2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} @@ -7691,6 +9321,10 @@ packages: resolution: {integrity: sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==} engines: {node: '>=10.4.0'} + pngjs@3.4.0: + resolution: {integrity: sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==} + engines: {node: '>=4.0.0'} + pngjs@5.0.0: resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} engines: {node: '>=10.13.0'} @@ -7708,6 +9342,10 @@ packages: postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + postcss@8.5.26: + resolution: {integrity: sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==} + engines: {node: ^10 || ^12 || >=14} + postcss@8.5.6: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} @@ -7719,6 +9357,51 @@ packages: resolution: {integrity: sha512-XROs1h+DNatgKh/AlIlCtDxWzwrKdYDb2mOs58n4yN8BkGN9ewqeQwG5ApS4/IzwCb7HPttUkOVulkYatd2PIw==} engines: {node: '>=15.0.0'} + posthog-react-native@4.63.3: + resolution: {integrity: sha512-HUnR3UmUVz3Q0mfpQrNI27ktBFsDIuC6zrxWUKSXJbjiib+28vE+5ElwGg9j5bObMkXvRaBfvkve/nRo6M0Xfg==} + hasBin: true + peerDependencies: + '@posthog/react-native-plugin': '>= 2.3.0' + '@react-native-async-storage/async-storage': '>=1.0.0' + '@react-navigation/native': '>= 5.0.0' + expo-application: '>= 4.0.0' + expo-device: '>= 4.0.0' + expo-file-system: '>= 13.0.0' + expo-localization: '>= 11.0.0' + posthog-react-native-session-replay: '>= 1.6.0' + react-native-device-info: '>= 10.0.0' + react-native-localize: '>= 3.0.0' + react-native-navigation: '>= 6.0.0' + react-native-safe-area-context: '>= 4.0.0' + react-native-svg: '>= 15.0.0' + peerDependenciesMeta: + '@posthog/react-native-plugin': + optional: true + '@react-native-async-storage/async-storage': + optional: true + '@react-navigation/native': + optional: true + expo-application: + optional: true + expo-device: + optional: true + expo-file-system: + optional: true + expo-localization: + optional: true + posthog-react-native-session-replay: + optional: true + react-native-device-info: + optional: true + react-native-localize: + optional: true + react-native-navigation: + optional: true + react-native-safe-area-context: + optional: true + react-native-svg: + optional: true + postject@1.0.0-alpha.6: resolution: {integrity: sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A==} engines: {node: '>=14.0.0'} @@ -7744,10 +9427,18 @@ packages: resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + proc-log@2.0.1: resolution: {integrity: sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + proc-log@4.2.0: + resolution: {integrity: sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} @@ -7774,6 +9465,16 @@ packages: resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} engines: {node: '>=10'} + promise@7.3.1: + resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} + + promise@8.3.0: + resolution: {integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==} + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} @@ -7859,6 +9560,11 @@ packages: resolution: {integrity: sha512-+Owyggi9IxT1ePKGafcI87ubSmxol6smwJ+RAHDQlx9+9cPwFWDiKFFCPuWhr9ignlGpZ9vDQLw67N4dcTVFEA==} engines: {node: '>=20'} + qrcode.react@4.2.0: + resolution: {integrity: sha512-QpgqWi8rD9DsS9EP3z7BT+5lY5SFhsqGjpgW5DY/i3mK4M9DTBNz3ErMi8BWYEfI3L0d8GIbGmcdFAS1uIRGjA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + qrcode@1.5.4: resolution: {integrity: sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==} engines: {node: '>=10.13.0'} @@ -7871,6 +9577,10 @@ packages: query-selector-shadow-dom@1.0.1: resolution: {integrity: sha512-lT5yCqEBgfoMYpf3F2xQRK7zEr1rhIIZuceDK6+xRkJQ4NMbHTwXqk4NkwDwQMNqXgG9r9fyHnzwNVs6zV5KRw==} + query-string@7.1.3: + resolution: {integrity: sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==} + engines: {node: '>=6'} + queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -7911,17 +9621,111 @@ packages: resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} engines: {node: '>= 0.10'} + react-devtools-core@6.1.5: + resolution: {integrity: sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA==} + react-dom@19.2.3: resolution: {integrity: sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==} peerDependencies: react: ^19.2.3 + react-fast-compare@3.2.2: + resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==} + + react-freeze@1.0.4: + resolution: {integrity: sha512-r4F0Sec0BLxWicc7HEyo2x3/2icUTrRmDjaaRyzzn+7aDyFZliszMDOgLVwSnQnYENOlL1o569Ze2HZefk8clA==} + engines: {node: '>=10'} + peerDependencies: + react: '>=17.0.0' + react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} react-is@17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + + react-is@19.2.8: + resolution: {integrity: sha512-s5un28nYxKJw5gvUHyW5PCC28CvBqLu9r3cWgzHT4Vo/5fqqkFcdRYsGcKf50WMPpjjFZS5d76fn3YCo2njKwQ==} + + react-native-drawer-layout@4.2.10: + resolution: {integrity: sha512-O6TQdZ5LSm3dqnuR4rX9KPtE+9dVg7jsezEYz1l01rkQTe4fQvYZIoPu2sZFl5X2N70uhRdjnPULySVR3sBUwA==} + peerDependencies: + react: '>= 18.2.0' + react-native: '*' + react-native-gesture-handler: '>= 2.0.0' + react-native-reanimated: '>= 2.0.0' + + react-native-fit-image@1.5.5: + resolution: {integrity: sha512-Wl3Vq2DQzxgsWKuW4USfck9zS7YzhvLNPpkwUUCF90bL32e1a0zOVQ3WsJILJOwzmPdHfzZmWasiiAUNBkhNkg==} + + react-native-gesture-handler@2.32.0: + resolution: {integrity: sha512-uYIMOKlKENORq2SABE+jIjbPU+h5I/sQKcq2v16zRq848nwEp1fWRVwML4QWqijc8UcXJC25o54S8GQd4Mf2OA==} + peerDependencies: + react: '*' + react-native: '*' + + react-native-is-edge-to-edge@1.3.1: + resolution: {integrity: sha512-NIXU/iT5+ORyCc7p0z2nnlkouYKX425vuU1OEm6bMMtWWR9yvb+Xg5AZmImTKoF9abxCPqrKC3rOZsKzUYgYZA==} + peerDependencies: + react: '*' + react-native: '*' + + react-native-markdown-display@7.0.2: + resolution: {integrity: sha512-Mn4wotMvMfLAwbX/huMLt202W5DsdpMO/kblk+6eUs55S57VVNni1gzZCh5qpznYLjIQELNh50VIozEfY6fvaQ==} + peerDependencies: + react: '>=16.2.0' + react-native: '>=0.50.4' + + react-native-reanimated@4.5.0: + resolution: {integrity: sha512-+iPfvK34PKKYP/p/4TaBliFkbfvjGDIvXuiiaxvISP5ip7sWegvlacwU/uAV6zNDSSmX0tDyER7PurPMKGDipA==} + peerDependencies: + react: '*' + react-native: 0.83 - 0.86 + react-native-worklets: 0.10.x + + react-native-safe-area-context@5.7.0: + resolution: {integrity: sha512-/9/MtQz8ODphjsLdZ+GZAIcC/RtoqW9EeShf7Uvnfgm/pzYrJ75y3PV/J1wuAV1T5Dye5ygq4EAW20RoBq0ABQ==} + peerDependencies: + react: '*' + react-native: '*' + + react-native-screens@4.25.2: + resolution: {integrity: sha512-1Nj1fusFd+rIMKU/qC9yGKVG+3ofh11d3OdBQKL1iVvQfKvcB8vhvTGQf2TkfxW3bamxN+hCZIXmNuU0mRkyDg==} + peerDependencies: + react: '*' + react-native: '>=0.82.0' + + react-native-web@0.21.2: + resolution: {integrity: sha512-SO2t9/17zM4iEnFvlu2DA9jqNbzNhoUP+AItkoCOyFmDMOhUnBBznBDCYN92fGdfAkfQlWzPoez6+zLxFNsZEg==} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + + react-native-worklets@0.10.0: + resolution: {integrity: sha512-JhE6IxDf6iabC0qu3+TAKA4v9RlluXmoIngPQX7/QUByf75lfrsHZ6/dQhyjEWnp1EEQiwzz8Cpew140ZcewDw==} + peerDependencies: + '@babel/core': '*' + '@react-native/metro-config': '*' + react: '*' + react-native: 0.83 - 0.86 + + react-native@0.86.0: + resolution: {integrity: sha512-17ALh/dd6AO4pgOVmOO5Axll5PbErEo3XFyLokyzW6usyi+OShIEPwUW26wLPlhVifgSOIfECCH0WN+0IqtJ1w==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + hasBin: true + peerDependencies: + '@react-native/jest-preset': 0.86.0 + '@types/react': ^19.1.1 + react: ^19.2.3 + peerDependenciesMeta: + '@react-native/jest-preset': + optional: true + '@types/react': + optional: true + react-redux@9.2.0: resolution: {integrity: sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==} peerDependencies: @@ -7934,6 +9738,10 @@ packages: redux: optional: true + react-refresh@0.14.2: + resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} + engines: {node: '>=0.10.0'} + react-refresh@0.18.0: resolution: {integrity: sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==} engines: {node: '>=0.10.0'} @@ -8033,6 +9841,16 @@ packages: redux@5.0.1: resolution: {integrity: sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==} + regenerate-unicode-properties@10.2.2: + resolution: {integrity: sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==} + engines: {node: '>=4'} + + regenerate@1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + + regenerator-runtime@0.13.11: + resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + regex-recursion@6.0.2: resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} @@ -8042,6 +9860,17 @@ packages: regex@6.1.0: resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==} + regexpu-core@6.4.0: + resolution: {integrity: sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==} + engines: {node: '>=4'} + + regjsgen@0.8.0: + resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} + + regjsparser@0.13.2: + resolution: {integrity: sha512-NgRBy2Nx/bE+9F27nVHnqcN5HjyLmecqsqx2PJHu3/IEtADD4WuxuXIVExD5PoSDFVrl78dOonfcOe5O+5nbzQ==} + hasBin: true + rehype-harden@1.1.7: resolution: {integrity: sha512-j5DY0YSK2YavvNGV+qBHma15J9m0WZmRe8posT5AtKDS6TNWtMVTo6RiqF8SidfcASYz8f3k2J/1RWmq5zTXUw==} @@ -8121,6 +9950,13 @@ packages: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve-workspace-root@2.0.1: + resolution: {integrity: sha512-nR23LHAvaI6aHtMg6RWoaHpdR4D881Nydkzi2CixINyg9T00KgaJdJI6Vwty+Ps8WLxZHuxsS0BseWjxSA4C+w==} + resolve@1.22.11: resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} engines: {node: '>= 0.4'} @@ -8129,6 +9965,10 @@ packages: responselike@2.0.1: resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} + restore-cursor@2.0.0: + resolution: {integrity: sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==} + engines: {node: '>=4'} + restore-cursor@3.1.0: resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} engines: {node: '>=8'} @@ -8221,6 +10061,11 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + sandbox-cli-detector@0.2.0: + resolution: {integrity: sha512-4lyHX0ZU0AZKwjgZ1InxZAa3PNpyEb8rOQ+Zss1ReYmhNzW0Q+h1zE5nvniXN0HaAWZaZE1zgVNEirb0R7LmNg==} + engines: {node: '>=18.18'} + hasBin: true + sax@1.6.0: resolution: {integrity: sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==} engines: {node: '>=11.0.0'} @@ -8260,10 +10105,18 @@ packages: engines: {node: '>=10'} hasBin: true + send@0.19.2: + resolution: {integrity: sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==} + engines: {node: '>= 0.8.0'} + send@1.2.1: resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} engines: {node: '>= 18'} + serialize-error@2.1.0: + resolution: {integrity: sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==} + engines: {node: '>=0.10.0'} + serialize-error@7.0.1: resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} engines: {node: '>=10'} @@ -8271,6 +10124,10 @@ packages: serialize-javascript@6.0.2: resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + serve-static@1.16.3: + resolution: {integrity: sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==} + engines: {node: '>= 0.8.0'} + serve-static@2.2.1: resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} engines: {node: '>= 18'} @@ -8278,6 +10135,9 @@ packages: server-destroy@1.0.1: resolution: {integrity: sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==} + server-only@0.0.1: + resolution: {integrity: sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==} + set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} @@ -8291,11 +10151,18 @@ packages: setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + sf-symbols-typescript@2.2.0: + resolution: {integrity: sha512-TPbeg0b7ylrswdGCji8FRGFAKuqbpQlLbL8SOle3j1iHSs5Ob5mhvMAxWN2UItOjgALAB5Zp3fmMfj8mbWvXKw==} + engines: {node: '>=10'} + sha.js@2.4.12: resolution: {integrity: sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==} engines: {node: '>= 0.10'} hasBin: true + shallowequal@1.1.0: + resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} + sharp@0.35.3: resolution: {integrity: sha512-ej0zVHuZGHCiABXcNxeYhpRnPNPAcvbG8RMdBAhDAxLKkCRVSpK3Iyu7qbqw3JMzoj0REeM6f3tJLtVwl0023Q==} engines: {node: '>=20.9.0'} @@ -8360,9 +10227,15 @@ packages: simple-get@4.0.1: resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + simple-plist@1.3.1: + resolution: {integrity: sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==} + simple-swizzle@0.2.4: resolution: {integrity: sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==} + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + skin-tone@2.0.0: resolution: {integrity: sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==} engines: {node: '>=8'} @@ -8371,6 +10244,10 @@ packages: resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} engines: {node: '>=12'} + slugify@1.6.9: + resolution: {integrity: sha512-vZ7rfeehZui7wQs438JXBckYLkIIdfHOXsaVEUMyS5fHo1483l1bMdo0EDSWYclY0yZKFOipDy4KHuKs6ssvdg==} + engines: {node: '>=8.0.0'} + smart-buffer@4.2.0: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} @@ -8399,6 +10276,10 @@ packages: source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} @@ -8418,6 +10299,10 @@ packages: spdx-license-ids@3.0.22: resolution: {integrity: sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==} + split-on-first@1.1.0: + resolution: {integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==} + engines: {node: '>=6'} + split2@4.2.0: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} @@ -8439,9 +10324,23 @@ packages: stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + stackframe@1.3.4: + resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} + + stacktrace-parser@0.1.11: + resolution: {integrity: sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==} + engines: {node: '>=6'} + + standard-navigation@0.0.5: + resolution: {integrity: sha512-YAmzwAiiQVocZxO/VGPFiQHcu5pKiz09QIGC0MK6aRMoa3E0QkoTQgcqJr7ZZ3OMiNhu4DkaGElFI5htjOIDbw==} + standardwebhooks@1.0.0: resolution: {integrity: sha512-BbHGOQK9olHPMvQNHWul6MYlrRTAOKn03rOe4A8O3CLWhNf4YHBqq2HJKKC+sfqpxiBY52pNeesD6jIiLDz8jg==} + statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + statuses@2.0.2: resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} engines: {node: '>= 0.8'} @@ -8461,6 +10360,10 @@ packages: peerDependencies: react: ^18.0.0 || ^19.0.0 + strict-uri-encode@2.0.0: + resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} + engines: {node: '>=4'} + string-template@0.2.1: resolution: {integrity: sha512-Yptehjogou2xm4UJbxJ4CxgZx12HBfeystp0y3x7s4Dj32ltVVG1Gg8YhKjHZkHicuKpZX/ffilA8505VbUbpw==} @@ -8481,6 +10384,10 @@ packages: stringify-entities@4.0.4: resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + strip-ansi@5.2.0: + resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} + engines: {node: '>=6'} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -8519,6 +10426,9 @@ packages: resolution: {integrity: sha512-ki4hZQfh5rX0QDLLkOCj+h+CVNkqmp/CMf8v8kZpkNVK6jGQooMytqzLZYUVYIZcFZ6yDB70EfD8POcFXiF5oA==} engines: {node: '>=18'} + structured-headers@0.4.1: + resolution: {integrity: sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg==} + style-mod@4.1.3: resolution: {integrity: sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==} @@ -8528,6 +10438,9 @@ packages: style-to-object@1.0.14: resolution: {integrity: sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==} + styleq@0.1.3: + resolution: {integrity: sha512-3ZUifmCDCQanjeej1f6kyl/BeP/Vae5EYkQ9iJfUm/QwZvlgnZzyflqAsAWYURdtea8Vkvswu2GrC57h3qffcA==} + stylis@4.3.6: resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==} @@ -8535,6 +10448,10 @@ packages: resolution: {integrity: sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==} engines: {node: '>= 8.0'} + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -8543,6 +10460,10 @@ packages: resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} engines: {node: '>=10'} + supports-hyperlinks@2.3.0: + resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} + engines: {node: '>=8'} + supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} @@ -8558,6 +10479,10 @@ packages: symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + tagged-tag@1.0.0: + resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} + engines: {node: '>=20'} + tailwind-merge@3.4.0: resolution: {integrity: sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==} @@ -8577,6 +10502,10 @@ packages: resolution: {integrity: sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==} engines: {node: '>=6.0.0'} + terminal-link@2.1.1: + resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} + engines: {node: '>=8'} + terser-webpack-plugin@5.3.16: resolution: {integrity: sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==} engines: {node: '>= 10.13.0'} @@ -8601,6 +10530,9 @@ packages: thread-stream@3.2.0: resolution: {integrity: sha512-zLBvqpwr4Esa0kRjcrzGU6zL25lePWaCLMx0RQFrmteozIfeNdaMLpG5U7PeHzvlFkAWaRKA9/KVW4F60iB+qw==} + throat@5.0.0: + resolution: {integrity: sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==} + tiny-each-async@2.0.3: resolution: {integrity: sha512-5ROII7nElnAirvFn8g7H7MtpfV1daMcyfTGQwsn/x2VtyV+VPiO5CjReCJtWLvoKTDEDmZocf3cNPraiMnBXLA==} @@ -8648,6 +10580,9 @@ packages: resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==} engines: {node: '>=14.14'} + tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + tn1150@0.1.0: resolution: {integrity: sha512-DbplOfQFkqG5IHcDyyrs/lkvSr3mPUVsFf/RbDppOshs22yTPnSJWEe6FkYd1txAwU/zcnR905ar2fi4kwF29w==} engines: {node: '>=0.12'} @@ -8674,6 +10609,9 @@ packages: tokenlens@1.3.1: resolution: {integrity: sha512-7oxmsS5PNCX3z+b+z07hL5vCzlgHKkCGrEQjQmWl5l+v5cUrtL7S1cuST4XThaL1XyjbTX8J5hfP0cjDJRkaLA==} + toqr@0.1.1: + resolution: {integrity: sha512-FWAPzCIHZHnrE/5/w9MPk0kK25hSQSH2IKhYh9PyjS3SG/+IEMvlwIHbhz+oF7xl54I+ueZlVnMjyzdSwLmAwA==} + tough-cookie@6.0.1: resolution: {integrity: sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==} engines: {node: '>=16'} @@ -8740,10 +10678,18 @@ packages: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} + type-fest@0.7.1: + resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} + engines: {node: '>=8'} + type-fest@1.4.0: resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} engines: {node: '>=10'} + type-fest@5.8.0: + resolution: {integrity: sha512-YGYEVz3Fm5iy/AybuA0oyNFq7H4CgQNfRp/qfe8nurE1kuCeNm3/vfm9X4Mtl+qLyaKJUh5xrFZwogr41SMjYA==} + engines: {node: '>=20'} + type-is@2.0.1: resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} engines: {node: '>= 0.6'} @@ -8769,6 +10715,22 @@ packages: engines: {node: '>=14.17'} hasBin: true + typescript@6.0.3: + resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} + engines: {node: '>=14.17'} + hasBin: true + + ua-parser-js@0.7.41: + resolution: {integrity: sha512-O3oYyCMPYgNNHuO7Jjk3uacJWZF8loBgwrfd/5LE/HyZ3lUIOdniQ7DNXJcIgZbwioZxk0fLfI4EVnetdiX5jg==} + hasBin: true + + ua-parser-js@1.0.41: + resolution: {integrity: sha512-LbBDqdIC5s8iROCUjMbW1f5dJQTEFB1+KO9ogbvlb3nm9n4YHa5p4KTvFPWvh2Hs8gZMBuiB1/8+pdfe/tDPug==} + hasBin: true + + uc.micro@1.0.6: + resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==} + uc.micro@2.1.0: resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} @@ -8796,13 +10758,29 @@ packages: resolution: {integrity: sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==} engines: {node: '>=20.18.1'} + unicode-canonical-property-names-ecmascript@2.0.1: + resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} + engines: {node: '>=4'} + unicode-emoji-modifier-base@1.0.0: resolution: {integrity: sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==} engines: {node: '>=4'} + unicode-match-property-ecmascript@2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + + unicode-match-property-value-ecmascript@2.2.1: + resolution: {integrity: sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==} + engines: {node: '>=4'} + unicode-properties@1.4.1: resolution: {integrity: sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==} + unicode-property-aliases-ecmascript@2.2.0: + resolution: {integrity: sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==} + engines: {node: '>=4'} + unicode-trie@2.0.0: resolution: {integrity: sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==} @@ -8863,6 +10841,12 @@ packages: peerDependencies: browserslist: '>= 4.21.0' + update-browserslist-db@1.3.1: + resolution: {integrity: sha512-ZZ61DsRsOnakl74HAmp3oSN4aXUmEWXf+i/yv0h7tIBfICc3VdrFErQKUUKPgu3AMsTUMbcongALEN4l6GSUrQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -8879,6 +10863,11 @@ packages: '@types/react': optional: true + use-latest-callback@0.2.6: + resolution: {integrity: sha512-FvRG9i1HSo0wagmX63Vrm8SnlUU3LMM3WyZkQ76RnslpBrX694AdG4A0zQBx2B3ZifFA0yv/BaEHGBnEax5rZg==} + peerDependencies: + react: '>=16.8' + use-sidecar@1.1.3: resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} engines: {node: '>=10'} @@ -8906,10 +10895,19 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + uuid@11.1.0: resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} hasBin: true + uuid@7.0.3: + resolution: {integrity: sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==} + deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). + hasBin: true + uuid@9.0.1: resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). @@ -8918,10 +10916,20 @@ packages: validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + validate-npm-package-name@5.0.1: + resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} + vaul@1.1.2: + resolution: {integrity: sha512-ZFkClGpWyI2WUQjdLJ/BaGuV6AVQiJ3uELGk3OYtP+B6yCO7Cmn9vPFXVJkRaGkOJu3m8bQMgtyzNHixULceQA==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc + vfile-location@5.0.3: resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} @@ -9022,6 +11030,9 @@ packages: jsdom: optional: true + vlq@1.0.1: + resolution: {integrity: sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==} + vscode-jsonrpc@8.2.0: resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==} engines: {node: '>=14.0.0'} @@ -9054,6 +11065,12 @@ packages: engines: {node: '>=20.0.0'} hasBin: true + walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + + warn-once@0.1.1: + resolution: {integrity: sha512-VkQZJbO8zVImzYFteBXvBOZEl1qL175WH8VmZcxF2fZAoudNhNDvHi+doCaAEdU2l2vtcIwa2zn0QK5+I1HQ3Q==} + watchpack@2.5.1: resolution: {integrity: sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==} engines: {node: '>=10.13.0'} @@ -9095,10 +11112,16 @@ packages: whatsapp-rust-bridge@0.5.4: resolution: {integrity: sha512-yYO1qSs0Fe7tGtnxOFHomocUD6IZtoAgmA4oDFyGIRZ67D3QZk3w7swA6XXFXNQngiyrg2k7tul6IrM3eUFh7A==} + whatwg-fetch@3.6.20: + resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==} + whatwg-mimetype@5.0.0: resolution: {integrity: sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==} engines: {node: '>=20'} + whatwg-url-minimum@0.1.2: + resolution: {integrity: sha512-XPEm0XFQWNVG292lII1PrRRJl3sItrs7CettZ4ncYxuDVpLyy+NwlGyut2hXI0JswcJUxeCH+CyOJK0ZzAXD6A==} + whatwg-url@16.0.1: resolution: {integrity: sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} @@ -9157,9 +11180,21 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - ws@8.21.0: - resolution: {integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==} - engines: {node: '>=10.0.0'} + ws@7.5.13: + resolution: {integrity: sha512-rsKI6xDBFVf4r/x8XyChGK04QR/XHroxs/jUcoWvtEZM8TPU/X/uIY9B1CsSzYws9ZJb/6bbBu7dPhFW00CAoA==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + 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' @@ -9179,6 +11214,10 @@ packages: x-is-string@0.1.0: resolution: {integrity: sha512-GojqklwG8gpzOVEVki5KudKNoq7MbbjYZCbyWzEz7tyPA7eleiE0+ePwOWQQRb5fm86rD3S8Tc0tSFf3AOv50w==} + xcode@3.0.1: + resolution: {integrity: sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA==} + engines: {node: '>=10.0.0'} + xlsx@0.18.5: resolution: {integrity: sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==} engines: {node: '>=0.8'} @@ -9196,6 +11235,10 @@ packages: resolution: {integrity: sha512-ghig2TBE/H11aOVgmahA3MhimvkBr6JIYknH/Dhdk10nXwdbIqBJsbfMxpvFPG8bAw77gN29aQWvKpmVoPlvPQ==} engines: {node: '>=16.0.0'} + xml2js@0.6.0: + resolution: {integrity: sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==} + engines: {node: '>=4.0.0'} + xmlbuilder2@2.1.2: resolution: {integrity: sha512-PI710tmtVlQ5VmwzbRTuhmVhKnj9pM8Si+iOZCV2g2SNo3gCrpzR2Ka9wNzZtqfD+mnP+xkrqoNy0sjKZqP4Dg==} engines: {node: '>=8.0'} @@ -9204,6 +11247,10 @@ packages: resolution: {integrity: sha512-OyzrcFLL/nb6fMGHbiRDuPup9ljBycsdCypwuyg5AAHvyWzGfChJpCXMG88AGTIMFhGZ9RccFN1e6lhg3hkwKg==} engines: {node: '>=4.0'} + xmlbuilder@11.0.1: + resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} + engines: {node: '>=4.0'} + xmlbuilder@15.1.1: resolution: {integrity: sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==} engines: {node: '>=8.0'} @@ -9289,6 +11336,9 @@ packages: peerDependencies: zod: ^3.25.0 || ^4.0.0 + zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + zod@4.2.1: resolution: {integrity: sha512-0wZ1IRqGGhMP76gLqz8EyfBXKk0J2qo2+H3fi4mcUP/KtTocoX08nmIAHl1Z2kJIZbZee8KOpBCSNPRgauucjw==} @@ -9298,14 +11348,19 @@ packages: zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + zxing-wasm@3.1.3: + resolution: {integrity: sha512-3lC9BJk4fR5ZJxcGjb0hVnDFOW7KpLXHIebiBmVd4FDRQZVeObztoTKxRUPxlWwSgxrMRONK0u50hBD1aTYEKg==} + peerDependencies: + '@types/emscripten': '>=1.39.6' + snapshots: '@adobe/css-tools@4.5.0': {} - '@agentclientprotocol/claude-agent-acp@0.67.0(@anthropic-ai/sdk@0.100.1(zod@4.2.1))(@modelcontextprotocol/sdk@1.25.1(hono@4.11.3)(zod@4.2.1))': + '@agentclientprotocol/claude-agent-acp@0.67.0(@anthropic-ai/sdk@0.100.1(zod@4.2.1))(@modelcontextprotocol/sdk@1.25.1(hono@4.13.3)(zod@4.2.1))': dependencies: '@agentclientprotocol/sdk': 1.3.0(zod@4.4.3) - '@anthropic-ai/claude-agent-sdk': 0.3.232(@anthropic-ai/sdk@0.100.1(zod@4.2.1))(@modelcontextprotocol/sdk@1.25.1(hono@4.11.3)(zod@4.2.1))(zod@4.4.3) + '@anthropic-ai/claude-agent-sdk': 0.3.232(@anthropic-ai/sdk@0.100.1(zod@4.2.1))(@modelcontextprotocol/sdk@1.25.1(hono@4.13.3)(zod@4.2.1))(zod@4.4.3) zod: 4.4.3 transitivePeerDependencies: - '@anthropic-ai/sdk' @@ -9400,10 +11455,10 @@ snapshots: '@anthropic-ai/claude-agent-sdk-win32-x64@0.3.232': optional: true - '@anthropic-ai/claude-agent-sdk@0.3.232(@anthropic-ai/sdk@0.100.1(zod@4.2.1))(@modelcontextprotocol/sdk@1.25.1(hono@4.11.3)(zod@4.2.1))(zod@4.4.3)': + '@anthropic-ai/claude-agent-sdk@0.3.232(@anthropic-ai/sdk@0.100.1(zod@4.2.1))(@modelcontextprotocol/sdk@1.25.1(hono@4.13.3)(zod@4.2.1))(zod@4.4.3)': dependencies: '@anthropic-ai/sdk': 0.100.1(zod@4.2.1) - '@modelcontextprotocol/sdk': 1.25.1(hono@4.11.3)(zod@4.2.1) + '@modelcontextprotocol/sdk': 1.25.1(hono@4.13.3)(zod@4.2.1) zod: 4.4.3 optionalDependencies: '@anthropic-ai/claude-agent-sdk-darwin-arm64': 0.3.232 @@ -9915,117 +11970,541 @@ snapshots: dependencies: tslib: 2.8.1 - '@aws-sdk/util-user-agent-browser@3.969.0': + '@aws-sdk/util-user-agent-browser@3.969.0': + dependencies: + '@aws-sdk/types': 3.969.0 + '@smithy/types': 4.12.0 + bowser: 2.13.1 + tslib: 2.8.1 + + '@aws-sdk/util-user-agent-node@3.971.0': + dependencies: + '@aws-sdk/middleware-user-agent': 3.970.0 + '@aws-sdk/types': 3.969.0 + '@smithy/node-config-provider': 4.3.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@aws-sdk/xml-builder@3.969.0': + dependencies: + '@smithy/types': 4.12.0 + fast-xml-parser: 5.2.5 + tslib: 2.8.1 + + '@aws/lambda-invoke-store@0.2.3': {} + + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/code-frame@7.29.7': + dependencies: + '@babel/helper-validator-identifier': 7.29.7 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.28.5': {} + + '@babel/compat-data@7.29.7': {} + + '@babel/core@7.28.5': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.5 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) + '@babel/helpers': 7.28.4 + '@babel/parser': 7.28.5 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.28.5': + dependencies: + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/generator@7.29.8': + dependencies: + '@babel/parser': 7.29.8 + '@babel/types': 7.29.8 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-annotate-as-pure@7.29.7': + dependencies: + '@babel/types': 7.29.8 + + '@babel/helper-compilation-targets@7.27.2': + dependencies: + '@babel/compat-data': 7.28.5 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.28.1 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-compilation-targets@7.29.7': + dependencies: + '@babel/compat-data': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + browserslist: 4.28.1 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-create-class-features-plugin@7.29.7(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-member-expression-to-functions': 7.29.7 + '@babel/helper-optimise-call-expression': 7.29.7 + '@babel/helper-replace-supers': 7.29.7(@babel/core@7.28.5) + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + '@babel/traverse': 7.29.8 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-create-regexp-features-plugin@7.29.7(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-annotate-as-pure': 7.29.7 + regexpu-core: 6.4.0 + semver: 6.3.1 + + '@babel/helper-define-polyfill-provider@0.6.8(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + debug: 4.4.3 + lodash.debounce: 4.0.8 + resolve: 1.22.11 + transitivePeerDependencies: + - supports-color + + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-globals@7.29.7': {} + + '@babel/helper-member-expression-to-functions@7.29.7': + dependencies: + '@babel/traverse': 7.29.8 + '@babel/types': 7.29.8 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-imports@7.27.1': + dependencies: + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-imports@7.29.7': + dependencies: + '@babel/traverse': 7.29.8 + '@babel/types': 7.29.8 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.29.7(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@babel/traverse': 7.29.8 + transitivePeerDependencies: + - supports-color + + '@babel/helper-optimise-call-expression@7.29.7': + dependencies: + '@babel/types': 7.29.8 + + '@babel/helper-plugin-utils@7.27.1': {} + + '@babel/helper-plugin-utils@7.29.7': {} + + '@babel/helper-remap-async-to-generator@7.29.7(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-wrap-function': 7.29.7 + '@babel/traverse': 7.29.8 + transitivePeerDependencies: + - supports-color + + '@babel/helper-replace-supers@7.29.7(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-member-expression-to-functions': 7.29.7 + '@babel/helper-optimise-call-expression': 7.29.7 + '@babel/traverse': 7.29.8 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.29.7': + dependencies: + '@babel/traverse': 7.29.8 + '@babel/types': 7.29.8 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-string-parser@7.29.7': {} + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/helper-validator-identifier@7.29.7': {} + + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helper-validator-option@7.29.7': {} + + '@babel/helper-wrap-function@7.29.7': + dependencies: + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.8 + '@babel/types': 7.29.8 + transitivePeerDependencies: + - supports-color + + '@babel/helpers@7.28.4': + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.28.5 + + '@babel/parser@7.28.5': + dependencies: + '@babel/types': 7.28.5 + + '@babel/parser@7.29.8': + dependencies: + '@babel/types': 7.29.8 + + '@babel/plugin-proposal-decorators@7.29.7(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/plugin-syntax-decorators': 7.29.7(@babel/core@7.28.5) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-proposal-export-default-from@7.29.7(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-syntax-decorators@7.29.7(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-export-default-from@7.29.7(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-syntax-flow@7.29.7(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-arrow-functions@7.29.7(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-async-generator-functions@7.29.7(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-remap-async-to-generator': 7.29.7(@babel/core@7.28.5) + '@babel/traverse': 7.29.8 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-async-to-generator@7.29.7(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-remap-async-to-generator': 7.29.7(@babel/core@7.28.5) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-block-scoping@7.29.7(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-class-properties@7.29.7(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-class-static-block@7.29.7(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-classes@7.29.7(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-globals': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-replace-supers': 7.29.7(@babel/core@7.28.5) + '@babel/traverse': 7.29.8 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-destructuring@7.29.7(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/traverse': 7.29.8 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-export-namespace-from@7.29.7(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-flow-strip-types@7.29.7(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/plugin-syntax-flow': 7.29.7(@babel/core@7.28.5) + + '@babel/plugin-transform-for-of@7.29.7(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-logical-assignment-operators@7.29.7(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-modules-commonjs@7.29.7(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-named-capturing-groups-regex@7.29.7(@babel/core@7.28.5)': dependencies: - '@aws-sdk/types': 3.969.0 - '@smithy/types': 4.12.0 - bowser: 2.13.1 - tslib: 2.8.1 + '@babel/core': 7.28.5 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.29.7 - '@aws-sdk/util-user-agent-node@3.971.0': + '@babel/plugin-transform-nullish-coalescing-operator@7.29.7(@babel/core@7.28.5)': dependencies: - '@aws-sdk/middleware-user-agent': 3.970.0 - '@aws-sdk/types': 3.969.0 - '@smithy/node-config-provider': 4.3.8 - '@smithy/types': 4.12.0 - tslib: 2.8.1 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.29.7 - '@aws-sdk/xml-builder@3.969.0': + '@babel/plugin-transform-object-rest-spread@7.29.7(@babel/core@7.28.5)': dependencies: - '@smithy/types': 4.12.0 - fast-xml-parser: 5.2.5 - tslib: 2.8.1 + '@babel/core': 7.28.5 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.28.5) + '@babel/plugin-transform-parameters': 7.29.7(@babel/core@7.28.5) + '@babel/traverse': 7.29.8 + transitivePeerDependencies: + - supports-color - '@aws/lambda-invoke-store@0.2.3': {} + '@babel/plugin-transform-optional-catch-binding@7.29.7(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/code-frame@7.27.1': + '@babel/plugin-transform-optional-chaining@7.29.7(@babel/core@7.28.5)': dependencies: - '@babel/helper-validator-identifier': 7.28.5 - js-tokens: 4.0.0 - picocolors: 1.1.1 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + transitivePeerDependencies: + - supports-color - '@babel/compat-data@7.28.5': {} + '@babel/plugin-transform-parameters@7.29.7(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/core@7.28.5': + '@babel/plugin-transform-private-methods@7.29.7(@babel/core@7.28.5)': dependencies: - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.5 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) - '@babel/helpers': 7.28.4 - '@babel/parser': 7.28.5 - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 - '@jridgewell/remapping': 2.3.5 - convert-source-map: 2.0.0 - debug: 4.4.3 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 + '@babel/core': 7.28.5 + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/generator@7.28.5': + '@babel/plugin-transform-private-property-in-object@7.29.7(@babel/core@7.28.5)': dependencies: - '@babel/parser': 7.28.5 - '@babel/types': 7.28.5 - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - jsesc: 3.1.0 + '@babel/core': 7.28.5 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.29.7 + transitivePeerDependencies: + - supports-color - '@babel/helper-compilation-targets@7.27.2': + '@babel/plugin-transform-react-display-name@7.29.7(@babel/core@7.28.5)': dependencies: - '@babel/compat-data': 7.28.5 - '@babel/helper-validator-option': 7.27.1 - browserslist: 4.28.1 - lru-cache: 5.1.1 - semver: 6.3.1 - - '@babel/helper-globals@7.28.0': {} + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/helper-module-imports@7.27.1': + '@babel/plugin-transform-react-jsx-development@7.29.7(@babel/core@7.28.5)': dependencies: - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 + '@babel/core': 7.28.5 + '@babel/plugin-transform-react-jsx': 7.29.7(@babel/core@7.28.5) transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5)': + '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-react-jsx@7.29.7(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.28.5) + '@babel/types': 7.29.8 transitivePeerDependencies: - supports-color - '@babel/helper-plugin-utils@7.27.1': {} + '@babel/plugin-transform-react-pure-annotations@7.29.7(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/helper-string-parser@7.27.1': {} + '@babel/plugin-transform-regenerator@7.29.8(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/helper-validator-identifier@7.28.5': {} + '@babel/plugin-transform-runtime@7.29.7(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + babel-plugin-polyfill-corejs2: 0.4.17(@babel/core@7.28.5) + babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.28.5) + babel-plugin-polyfill-regenerator: 0.6.8(@babel/core@7.28.5) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color - '@babel/helper-validator-option@7.27.1': {} + '@babel/plugin-transform-shorthand-properties@7.29.7(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/helpers@7.28.4': + '@babel/plugin-transform-template-literals@7.29.7(@babel/core@7.28.5)': dependencies: - '@babel/template': 7.27.2 - '@babel/types': 7.28.5 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/parser@7.28.5': + '@babel/plugin-transform-typescript@7.29.7(@babel/core@7.28.5)': dependencies: - '@babel/types': 7.28.5 + '@babel/core': 7.28.5 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.28.5) + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-unicode-regex@7.29.7(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.5)': + '@babel/preset-typescript@7.29.7(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.28.5) + '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.28.5) + '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.28.5) + transitivePeerDependencies: + - supports-color '@babel/runtime@7.28.6': {} @@ -10035,6 +12514,12 @@ snapshots: '@babel/parser': 7.28.5 '@babel/types': 7.28.5 + '@babel/template@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/parser': 7.29.8 + '@babel/types': 7.29.8 + '@babel/traverse@7.28.5': dependencies: '@babel/code-frame': 7.27.1 @@ -10047,11 +12532,28 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/traverse@7.29.8': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.8 + '@babel/helper-globals': 7.29.7 + '@babel/parser': 7.29.8 + '@babel/template': 7.29.7 + '@babel/types': 7.29.8 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + '@babel/types@7.28.5': dependencies: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 + '@babel/types@7.29.8': + dependencies: + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@borewit/text-codec@0.2.2': {} '@braintree/sanitize-url@7.1.1': {} @@ -10396,6 +12898,10 @@ snapshots: '@csstools/css-tokenizer@4.0.0': {} + '@egjs/hammerjs@2.0.17': + dependencies: + '@types/hammerjs': 2.0.46 + '@eigenpal/docx-editor-agents@1.0.3(ai@7.0.22(zod@4.2.1))(react@19.2.3)': dependencies: docxtemplater: 3.68.7 @@ -10668,7 +13174,7 @@ snapshots: '@malept/cross-spawn-promise': 2.0.0 debug: 4.4.3 fs-extra: 10.1.0 - semver: 7.7.3 + semver: 7.8.5 username: 5.1.0 transitivePeerDependencies: - bluebird @@ -10810,7 +13316,7 @@ snapshots: prettier: 3.8.0 resedit: 2.0.3 resolve: 1.22.11 - semver: 7.7.3 + semver: 7.8.5 yargs-parser: 21.1.1 transitivePeerDependencies: - supports-color @@ -10828,7 +13334,7 @@ snapshots: node-api-version: 0.2.1 ora: 5.4.1 read-binary-file-arch: 1.0.6 - semver: 7.7.3 + semver: 7.8.5 tar: 6.2.1 yargs: 17.7.2 transitivePeerDependencies: @@ -10976,92 +13482,474 @@ snapshots: '@esbuild/netbsd-x64@0.27.2': optional: true - '@esbuild/openbsd-arm64@0.24.2': - optional: true + '@esbuild/openbsd-arm64@0.24.2': + optional: true + + '@esbuild/openbsd-arm64@0.27.2': + optional: true + + '@esbuild/openbsd-x64@0.24.2': + optional: true + + '@esbuild/openbsd-x64@0.27.2': + optional: true + + '@esbuild/openharmony-arm64@0.27.2': + optional: true + + '@esbuild/sunos-x64@0.24.2': + optional: true + + '@esbuild/sunos-x64@0.27.2': + optional: true + + '@esbuild/win32-arm64@0.24.2': + optional: true + + '@esbuild/win32-arm64@0.27.2': + optional: true + + '@esbuild/win32-ia32@0.24.2': + optional: true + + '@esbuild/win32-ia32@0.27.2': + optional: true + + '@esbuild/win32-x64@0.24.2': + optional: true + + '@esbuild/win32-x64@0.27.2': + optional: true + + '@eslint-community/eslint-utils@4.9.0(eslint@9.39.2(jiti@2.6.1))': + dependencies: + eslint: 9.39.2(jiti@2.6.1) + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.2': {} + + '@eslint/config-array@0.21.1': + dependencies: + '@eslint/object-schema': 2.1.7 + debug: 4.4.3 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.4.2': + dependencies: + '@eslint/core': 0.17.0 + + '@eslint/core@0.17.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/eslintrc@3.3.3': + dependencies: + ajv: 6.12.6 + debug: 4.4.3 + espree: 10.4.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.1 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@9.39.2': {} + + '@eslint/object-schema@2.1.7': {} + + '@eslint/plugin-kit@0.4.1': + dependencies: + '@eslint/core': 0.17.0 + levn: 0.4.1 + + '@exodus/bytes@1.15.1': {} + + '@expo-google-fonts/material-symbols@0.4.44': {} + + '@expo/cli@57.0.17(@expo/dom-webview@57.0.1)(@expo/metro-runtime@57.0.12)(expo-constants@57.0.13)(expo-font@57.0.1)(expo-router@57.0.15)(expo@57.0.15)(react-dom@19.2.3(react@19.2.3))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3)(typescript@6.0.3)': + dependencies: + '@expo/code-signing-certificates': 0.0.6 + '@expo/config': 57.0.8(typescript@6.0.3) + '@expo/config-plugins': 57.0.8(typescript@6.0.3) + '@expo/devcert': 1.2.1 + '@expo/env': 2.4.2 + '@expo/image-utils': 0.11.4(typescript@6.0.3) + '@expo/inline-modules': 0.1.6(typescript@6.0.3) + '@expo/json-file': 11.0.1 + '@expo/log-box': 57.0.3(@expo/dom-webview@57.0.1)(expo@57.0.15)(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3) + '@expo/metro': 56.0.0 + '@expo/metro-config': 57.0.9(expo@57.0.15)(typescript@6.0.3) + '@expo/metro-file-map': 57.0.1 + '@expo/osascript': 2.7.1 + '@expo/package-manager': 1.13.1 + '@expo/plist': 0.8.1 + '@expo/prebuild-config': 57.0.13(typescript@6.0.3) + '@expo/require-utils': 57.0.4(typescript@6.0.3) + '@expo/router-server': 57.0.7(@expo/metro-runtime@57.0.12)(expo-constants@57.0.13)(expo-font@57.0.1)(expo-router@57.0.15)(expo-server@57.0.3)(expo@57.0.15)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@expo/schema-utils': 57.0.2 + '@expo/spawn-async': 1.8.0 + '@expo/ws-tunnel': 2.0.0(ws@8.21.0) + '@expo/xcpretty': 4.4.4 + '@react-native/dev-middleware': 0.86.2 + accepts: 1.3.8 + agent-cli-detector: 0.1.6 + arg: 5.0.2 + bplist-creator: 0.1.0 + bplist-parser: 0.3.2 + chalk: 4.1.2 + ci-info: 3.9.0 + compression: 1.8.1 + connect: 3.7.0 + debug: 4.4.3 + dnssd-advertise: 1.1.6 + expo: 57.0.15(@babel/core@7.28.5)(@expo/dom-webview@57.0.1)(@expo/metro-runtime@57.0.12)(expo-router@57.0.15)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.10.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) + expo-server: 57.0.3 + fetch-nodeshim: 0.4.10 + getenv: 2.0.0 + glob: 13.0.0 + lan-network: 0.2.1 + multitars: 1.0.2 + node-forge: 1.4.0 + npm-package-arg: 11.0.3 + ora: 3.4.0 + picomatch: 4.0.5 + pretty-format: 29.7.0 + progress: 2.0.3 + prompts: 2.4.2 + resolve-from: 5.0.0 + sandbox-cli-detector: 0.2.0 + semver: 7.8.5 + send: 0.19.2 + slugify: 1.6.9 + stacktrace-parser: 0.1.11 + structured-headers: 0.4.1 + terminal-link: 2.1.1 + toqr: 0.1.1 + wrap-ansi: 7.0.0 + ws: 8.21.0 + zod: 3.25.76 + optionalDependencies: + expo-router: 57.0.15(176cd5c8b192935c21a50d7b789b2dca) + react-native: 0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3) + transitivePeerDependencies: + - '@expo/dom-webview' + - '@expo/metro-runtime' + - bufferutil + - expo-constants + - expo-font + - react + - react-dom + - react-server-dom-webpack + - supports-color + - typescript + - utf-8-validate + + '@expo/code-signing-certificates@0.0.6': + dependencies: + node-forge: 1.4.0 + + '@expo/config-plugins@57.0.8(typescript@6.0.3)': + dependencies: + '@expo/config-types': 57.0.2 + '@expo/json-file': 11.0.1 + '@expo/plist': 0.8.1 + '@expo/require-utils': 57.0.4(typescript@6.0.3) + '@expo/sdk-runtime-versions': 1.0.0 + chalk: 4.1.2 + debug: 4.4.3 + getenv: 2.0.0 + glob: 13.0.0 + semver: 7.8.5 + slugify: 1.6.9 + xcode: 3.0.1 + xml2js: 0.6.0 + transitivePeerDependencies: + - supports-color + - typescript + + '@expo/config-types@57.0.2': {} + + '@expo/config@57.0.8(typescript@6.0.3)': + dependencies: + '@expo/config-plugins': 57.0.8(typescript@6.0.3) + '@expo/config-types': 57.0.2 + '@expo/json-file': 11.0.1 + '@expo/require-utils': 57.0.4(typescript@6.0.3) + deepmerge: 4.3.1 + getenv: 2.0.0 + glob: 13.0.0 + resolve-workspace-root: 2.0.1 + semver: 7.8.5 + slugify: 1.6.9 + transitivePeerDependencies: + - supports-color + - typescript + + '@expo/devcert@1.2.1': + dependencies: + '@expo/sudo-prompt': 9.3.2 + debug: 3.2.7 + transitivePeerDependencies: + - supports-color + + '@expo/devtools@57.0.1(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3)': + dependencies: + chalk: 4.1.2 + optionalDependencies: + react: 19.2.3 + react-native: 0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3) + + '@expo/dom-webview@57.0.1(expo@57.0.15)(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3)': + dependencies: + expo: 57.0.15(@babel/core@7.28.5)(@expo/dom-webview@57.0.1)(@expo/metro-runtime@57.0.12)(expo-router@57.0.15)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.10.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) + react: 19.2.3 + react-native: 0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3) - '@esbuild/openbsd-arm64@0.27.2': - optional: true + '@expo/env@2.4.2': + dependencies: + chalk: 4.1.2 + debug: 4.4.3 + getenv: 2.0.0 + transitivePeerDependencies: + - supports-color - '@esbuild/openbsd-x64@0.24.2': - optional: true + '@expo/expo-modules-macros-plugin@0.6.1': {} - '@esbuild/openbsd-x64@0.27.2': - optional: true + '@expo/fingerprint@0.20.9': + dependencies: + '@expo/env': 2.4.2 + '@expo/spawn-async': 1.8.0 + arg: 5.0.2 + chalk: 4.1.2 + debug: 4.4.3 + getenv: 2.0.0 + glob: 13.0.0 + ignore: 5.3.2 + minimatch: 10.2.6 + resolve-from: 5.0.0 + semver: 7.8.5 + transitivePeerDependencies: + - supports-color - '@esbuild/openharmony-arm64@0.27.2': - optional: true + '@expo/image-utils@0.11.4(typescript@6.0.3)': + dependencies: + '@expo/require-utils': 57.0.4(typescript@6.0.3) + '@expo/spawn-async': 1.8.0 + chalk: 4.1.2 + getenv: 2.0.0 + jimp-compact: 0.16.1 + parse-png: 2.1.0 + semver: 7.8.5 + transitivePeerDependencies: + - supports-color + - typescript - '@esbuild/sunos-x64@0.24.2': - optional: true + '@expo/inline-modules@0.1.6(typescript@6.0.3)': + dependencies: + '@expo/config-plugins': 57.0.8(typescript@6.0.3) + transitivePeerDependencies: + - supports-color + - typescript - '@esbuild/sunos-x64@0.27.2': - optional: true + '@expo/json-file@11.0.1': + dependencies: + '@babel/code-frame': 7.27.1 + json5: 2.2.3 - '@esbuild/win32-arm64@0.24.2': - optional: true + '@expo/local-build-cache-provider@57.0.7(typescript@6.0.3)': + dependencies: + '@expo/config': 57.0.8(typescript@6.0.3) + chalk: 4.1.2 + transitivePeerDependencies: + - supports-color + - typescript - '@esbuild/win32-arm64@0.27.2': - optional: true + '@expo/log-box@57.0.3(@expo/dom-webview@57.0.1)(expo@57.0.15)(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3)': + dependencies: + '@expo/dom-webview': 57.0.1(expo@57.0.15)(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3) + anser: 1.4.10 + expo: 57.0.15(@babel/core@7.28.5)(@expo/dom-webview@57.0.1)(@expo/metro-runtime@57.0.12)(expo-router@57.0.15)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.10.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) + react: 19.2.3 + react-native: 0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3) + stacktrace-parser: 0.1.11 - '@esbuild/win32-ia32@0.24.2': - optional: true + '@expo/metro-config@57.0.9(expo@57.0.15)(typescript@6.0.3)': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/core': 7.28.5 + '@babel/generator': 7.28.5 + '@expo/config': 57.0.8(typescript@6.0.3) + '@expo/env': 2.4.2 + '@expo/json-file': 11.0.1 + '@expo/metro': 56.0.0 + '@expo/require-utils': 57.0.4(typescript@6.0.3) + '@expo/spawn-async': 1.8.0 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/remapping': 2.3.5 + '@jridgewell/sourcemap-codec': 1.5.5 + browserslist: 4.28.1 + chalk: 4.1.2 + debug: 4.4.3 + getenv: 2.0.0 + glob: 13.0.0 + hermes-parser: 0.36.1 + jsc-safe-url: 0.2.4 + lightningcss: 1.30.2 + picomatch: 4.0.5 + postcss: 8.5.26 + resolve-from: 5.0.0 + optionalDependencies: + expo: 57.0.15(@babel/core@7.28.5)(@expo/dom-webview@57.0.1)(@expo/metro-runtime@57.0.12)(expo-router@57.0.15)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.10.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) + transitivePeerDependencies: + - bufferutil + - supports-color + - typescript + - utf-8-validate - '@esbuild/win32-ia32@0.27.2': - optional: true + '@expo/metro-file-map@57.0.1': + dependencies: + debug: 4.4.3 + fb-watchman: 2.0.2 + invariant: 2.2.4 + jest-worker: 29.7.0 + micromatch: 4.0.8 + walker: 1.0.8 + transitivePeerDependencies: + - supports-color - '@esbuild/win32-x64@0.24.2': - optional: true + '@expo/metro-runtime@57.0.12(@expo/log-box@57.0.3)(expo@57.0.15)(react-dom@19.2.3(react@19.2.3))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3)': + dependencies: + '@expo/log-box': 57.0.3(@expo/dom-webview@57.0.1)(expo@57.0.15)(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3) + anser: 1.4.10 + expo: 57.0.15(@babel/core@7.28.5)(@expo/dom-webview@57.0.1)(@expo/metro-runtime@57.0.12)(expo-router@57.0.15)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.10.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) + pretty-format: 29.7.0 + react: 19.2.3 + react-native: 0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3) + stacktrace-parser: 0.1.11 + whatwg-fetch: 3.6.20 + optionalDependencies: + react-dom: 19.2.3(react@19.2.3) - '@esbuild/win32-x64@0.27.2': - optional: true + '@expo/metro@56.0.0': + dependencies: + metro: 0.84.4 + metro-babel-transformer: 0.84.4 + metro-cache: 0.84.4 + metro-cache-key: 0.84.4 + metro-config: 0.84.4 + metro-core: 0.84.4 + metro-file-map: 0.84.4 + metro-minify-terser: 0.84.4 + metro-resolver: 0.84.4 + metro-runtime: 0.84.4 + metro-source-map: 0.84.4 + metro-symbolicate: 0.84.4 + metro-transform-plugins: 0.84.4 + metro-transform-worker: 0.84.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate - '@eslint-community/eslint-utils@4.9.0(eslint@9.39.2(jiti@2.6.1))': + '@expo/osascript@2.7.1': dependencies: - eslint: 9.39.2(jiti@2.6.1) - eslint-visitor-keys: 3.4.3 + '@expo/spawn-async': 1.8.0 - '@eslint-community/regexpp@4.12.2': {} + '@expo/package-manager@1.13.1': + dependencies: + '@expo/json-file': 11.0.1 + '@expo/spawn-async': 1.8.0 + chalk: 4.1.2 + npm-package-arg: 11.0.3 + ora: 3.4.0 + resolve-workspace-root: 2.0.1 - '@eslint/config-array@0.21.1': + '@expo/plist@0.8.1': dependencies: - '@eslint/object-schema': 2.1.7 + '@xmldom/xmldom': 0.8.11 + base64-js: 1.5.1 + xmlbuilder: 15.1.1 + + '@expo/prebuild-config@57.0.13(typescript@6.0.3)': + dependencies: + '@expo/config': 57.0.8(typescript@6.0.3) + '@expo/config-plugins': 57.0.8(typescript@6.0.3) + '@expo/config-types': 57.0.2 + '@expo/image-utils': 0.11.4(typescript@6.0.3) + '@expo/json-file': 11.0.1 + '@react-native/normalize-colors': 0.86.2 debug: 4.4.3 - minimatch: 3.1.2 + expo-modules-autolinking: 57.0.10(typescript@6.0.3) + resolve-from: 5.0.0 + semver: 7.8.5 transitivePeerDependencies: - supports-color + - typescript - '@eslint/config-helpers@0.4.2': - dependencies: - '@eslint/core': 0.17.0 - - '@eslint/core@0.17.0': + '@expo/require-utils@57.0.4(typescript@6.0.3)': dependencies: - '@types/json-schema': 7.0.15 + '@babel/code-frame': 7.27.1 + '@babel/core': 7.28.5 + '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.28.5) + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color - '@eslint/eslintrc@3.3.3': + '@expo/router-server@57.0.7(@expo/metro-runtime@57.0.12)(expo-constants@57.0.13)(expo-font@57.0.1)(expo-router@57.0.15)(expo-server@57.0.3)(expo@57.0.15)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: - ajv: 6.12.6 debug: 4.4.3 - espree: 10.4.0 - globals: 14.0.0 - ignore: 5.3.2 - import-fresh: 3.3.1 - js-yaml: 4.1.1 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 + expo: 57.0.15(@babel/core@7.28.5)(@expo/dom-webview@57.0.1)(@expo/metro-runtime@57.0.12)(expo-router@57.0.15)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.10.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) + expo-constants: 57.0.13(expo@57.0.15)(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3)) + expo-font: 57.0.1(expo@57.0.15)(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3) + expo-server: 57.0.3 + react: 19.2.3 + optionalDependencies: + '@expo/metro-runtime': 57.0.12(@expo/log-box@57.0.3)(expo@57.0.15)(react-dom@19.2.3(react@19.2.3))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3) + expo-router: 57.0.15(176cd5c8b192935c21a50d7b789b2dca) + react-dom: 19.2.3(react@19.2.3) transitivePeerDependencies: - supports-color - '@eslint/js@9.39.2': {} + '@expo/schema-utils@57.0.2': {} - '@eslint/object-schema@2.1.7': {} + '@expo/sdk-runtime-versions@1.0.0': {} - '@eslint/plugin-kit@0.4.1': + '@expo/spawn-async@1.8.0': dependencies: - '@eslint/core': 0.17.0 - levn: 0.4.1 + cross-spawn: 7.0.6 - '@exodus/bytes@1.15.1': {} + '@expo/sudo-prompt@9.3.2': {} + + '@expo/ui@57.0.12(@babel/core@7.28.5)(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(expo@57.0.15)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.10.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3)': + dependencies: + expo: 57.0.15(@babel/core@7.28.5)(@expo/dom-webview@57.0.1)(@expo/metro-runtime@57.0.12)(expo-router@57.0.15)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.10.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) + react: 19.2.3 + react-native: 0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3) + sf-symbols-typescript: 2.2.0 + vaul: 1.1.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + optionalDependencies: + '@babel/core': 7.28.5 + react-dom: 19.2.3(react@19.2.3) + react-native-worklets: 0.10.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + + '@expo/ws-tunnel@2.0.0(ws@8.21.0)': + dependencies: + ws: 8.21.0 + + '@expo/xcpretty@4.4.4': + dependencies: + '@babel/code-frame': 7.27.1 + chalk: 4.1.2 + js-yaml: 4.1.1 '@floating-ui/core@1.7.3': dependencies: @@ -11114,9 +14002,9 @@ snapshots: dependencies: '@hapi/hoek': 11.0.7 - '@hono/node-server@1.19.7(hono@4.11.3)': + '@hono/node-server@1.19.7(hono@4.13.3)': dependencies: - hono: 4.11.3 + hono: 4.13.3 '@humanfs/core@0.19.1': {} @@ -11358,6 +14246,21 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 + '@isaacs/ttlcache@1.4.1': {} + + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.12 + + '@jest/types@29.6.3': + dependencies: + '@jest/schemas': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 25.0.3 + '@types/yargs': 17.0.35 + chalk: 4.1.2 + '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -11505,9 +14408,9 @@ snapshots: '@mixmark-io/domino@2.2.0': {} - '@modelcontextprotocol/sdk@1.25.1(hono@4.11.3)(zod@4.2.1)': + '@modelcontextprotocol/sdk@1.25.1(hono@4.13.3)(zod@4.2.1)': dependencies: - '@hono/node-server': 1.19.7(hono@4.11.3) + '@hono/node-server': 1.19.7(hono@4.13.3) ajv: 8.17.1 ajv-formats: 3.0.1(ajv@8.17.1) content-type: 1.0.5 @@ -11822,8 +14725,14 @@ snapshots: dependencies: cross-spawn: 7.0.6 + '@posthog/core@1.48.6': + dependencies: + '@posthog/types': 1.405.0 + '@posthog/types@1.332.0': {} + '@posthog/types@1.405.0': {} + '@protobufjs/aspromise@1.1.2': {} '@protobufjs/base64@1.1.2': {} @@ -12656,16 +15565,217 @@ snapshots: optionalDependencies: '@types/react': 19.2.7 - '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + optionalDependencies: + '@types/react': 19.2.7 + '@types/react-dom': 19.2.3(@types/react@19.2.7) + + '@radix-ui/rect@1.1.1': {} + + '@react-native-async-storage/async-storage@3.1.1(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3)': + dependencies: + idb: 8.0.3 + react: 19.2.3 + react-native: 0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3) + + '@react-native-masked-view/masked-view@0.3.2(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3)': + dependencies: + react: 19.2.3 + react-native: 0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3) + + '@react-native/assets-registry@0.86.0': {} + + '@react-native/babel-plugin-codegen@0.86.0(@babel/core@7.28.5)': + dependencies: + '@babel/traverse': 7.29.8 + '@react-native/codegen': 0.86.0(@babel/core@7.28.5) + transitivePeerDependencies: + - '@babel/core' + - supports-color + + '@react-native/babel-plugin-codegen@0.86.2(@babel/core@7.28.5)': + dependencies: + '@babel/traverse': 7.29.8 + '@react-native/codegen': 0.86.2(@babel/core@7.28.5) + transitivePeerDependencies: + - '@babel/core' + - supports-color + + '@react-native/babel-preset@0.86.0(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/plugin-proposal-export-default-from': 7.29.7(@babel/core@7.28.5) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.28.5) + '@babel/plugin-syntax-export-default-from': 7.29.7(@babel/core@7.28.5) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.5) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.5) + '@babel/plugin-transform-async-generator-functions': 7.29.7(@babel/core@7.28.5) + '@babel/plugin-transform-async-to-generator': 7.29.7(@babel/core@7.28.5) + '@babel/plugin-transform-block-scoping': 7.29.7(@babel/core@7.28.5) + '@babel/plugin-transform-class-properties': 7.29.7(@babel/core@7.28.5) + '@babel/plugin-transform-classes': 7.29.7(@babel/core@7.28.5) + '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.28.5) + '@babel/plugin-transform-flow-strip-types': 7.29.7(@babel/core@7.28.5) + '@babel/plugin-transform-for-of': 7.29.7(@babel/core@7.28.5) + '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.28.5) + '@babel/plugin-transform-named-capturing-groups-regex': 7.29.7(@babel/core@7.28.5) + '@babel/plugin-transform-nullish-coalescing-operator': 7.29.7(@babel/core@7.28.5) + '@babel/plugin-transform-optional-catch-binding': 7.29.7(@babel/core@7.28.5) + '@babel/plugin-transform-optional-chaining': 7.29.7(@babel/core@7.28.5) + '@babel/plugin-transform-private-methods': 7.29.7(@babel/core@7.28.5) + '@babel/plugin-transform-private-property-in-object': 7.29.7(@babel/core@7.28.5) + '@babel/plugin-transform-react-display-name': 7.29.7(@babel/core@7.28.5) + '@babel/plugin-transform-react-jsx': 7.29.7(@babel/core@7.28.5) + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-regenerator': 7.29.8(@babel/core@7.28.5) + '@babel/plugin-transform-runtime': 7.29.7(@babel/core@7.28.5) + '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.28.5) + '@babel/plugin-transform-unicode-regex': 7.29.7(@babel/core@7.28.5) + '@react-native/babel-plugin-codegen': 0.86.0(@babel/core@7.28.5) + babel-plugin-syntax-hermes-parser: 0.36.0 + babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.28.5) + react-refresh: 0.14.2 + transitivePeerDependencies: + - supports-color + + '@react-native/codegen@0.86.0(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/parser': 7.29.8 + hermes-parser: 0.36.0 + invariant: 2.2.4 + nullthrows: 1.1.1 + tinyglobby: 0.2.15 + yargs: 17.7.2 + + '@react-native/codegen@0.86.2(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/parser': 7.29.8 + hermes-parser: 0.36.0 + invariant: 2.2.4 + nullthrows: 1.1.1 + tinyglobby: 0.2.15 + yargs: 17.7.2 + + '@react-native/community-cli-plugin@0.86.0(@react-native/metro-config@0.86.0(@babel/core@7.28.5))': + dependencies: + '@react-native/dev-middleware': 0.86.0 + debug: 4.4.3 + invariant: 2.2.4 + metro: 0.84.5 + metro-config: 0.84.5 + metro-core: 0.84.5 + semver: 7.8.5 + optionalDependencies: + '@react-native/metro-config': 0.86.0(@babel/core@7.28.5) + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@react-native/debugger-frontend@0.86.0': {} + + '@react-native/debugger-frontend@0.86.2': {} + + '@react-native/debugger-shell@0.86.0': + dependencies: + cross-spawn: 7.0.6 + debug: 4.4.3 + fb-dotslash: 0.5.8 + transitivePeerDependencies: + - supports-color + + '@react-native/debugger-shell@0.86.2': + dependencies: + cross-spawn: 7.0.6 + debug: 4.4.3 + fb-dotslash: 0.5.8 + transitivePeerDependencies: + - supports-color + + '@react-native/dev-middleware@0.86.0': + dependencies: + '@isaacs/ttlcache': 1.4.1 + '@react-native/debugger-frontend': 0.86.0 + '@react-native/debugger-shell': 0.86.0 + chrome-launcher: 0.15.2 + chromium-edge-launcher: 0.3.0 + connect: 3.7.0 + debug: 4.4.3 + invariant: 2.2.4 + nullthrows: 1.1.1 + open: 7.4.2 + serve-static: 1.16.3 + ws: 7.5.13 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@react-native/dev-middleware@0.86.2': + dependencies: + '@isaacs/ttlcache': 1.4.1 + '@react-native/debugger-frontend': 0.86.2 + '@react-native/debugger-shell': 0.86.2 + chrome-launcher: 0.15.2 + chromium-edge-launcher: 0.3.0 + connect: 3.7.0 + debug: 4.4.3 + invariant: 2.2.4 + nullthrows: 1.1.1 + open: 7.4.2 + serve-static: 1.16.3 + ws: 7.5.13 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@react-native/gradle-plugin@0.86.0': {} + + '@react-native/js-polyfills@0.86.0': {} + + '@react-native/metro-babel-transformer@0.86.0(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@react-native/babel-preset': 0.86.0(@babel/core@7.28.5) + hermes-parser: 0.36.0 + nullthrows: 1.1.1 + transitivePeerDependencies: + - supports-color + + '@react-native/metro-config@0.86.0(@babel/core@7.28.5)': + dependencies: + '@react-native/js-polyfills': 0.86.0 + '@react-native/metro-babel-transformer': 0.86.0(@babel/core@7.28.5) + metro-config: 0.84.5 + metro-runtime: 0.84.5 + transitivePeerDependencies: + - '@babel/core' + - bufferutil + - supports-color + - utf-8-validate + + '@react-native/normalize-colors@0.74.89': {} + + '@react-native/normalize-colors@0.86.0': {} + + '@react-native/normalize-colors@0.86.2': {} + + '@react-native/virtualized-lists@0.86.0(@types/react@19.2.7)(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + invariant: 2.2.4 + nullthrows: 1.1.1 react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) + react-native: 0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3) optionalDependencies: '@types/react': 19.2.7 - '@types/react-dom': 19.2.3(@types/react@19.2.7) - - '@radix-ui/rect@1.1.1': {} '@react-pdf/fns@3.1.2': {} @@ -12881,6 +15991,8 @@ snapshots: '@shikijs/vscode-textmate@10.0.2': {} + '@sinclair/typebox@0.27.12': {} + '@sindresorhus/is@4.6.0': {} '@slack/logger@4.0.1': @@ -13763,6 +16875,8 @@ snapshots: '@types/electron-squirrel-startup@1.0.2': {} + '@types/emscripten@1.41.5': {} + '@types/eslint-scope@3.7.7': dependencies: '@types/eslint': 9.6.1 @@ -13799,6 +16913,8 @@ snapshots: '@types/geojson@7946.0.16': {} + '@types/hammerjs@2.0.46': {} + '@types/hast@3.0.4': dependencies: '@types/unist': 3.0.3 @@ -13807,6 +16923,16 @@ snapshots: '@types/http-errors@2.0.5': {} + '@types/istanbul-lib-coverage@2.0.6': {} + + '@types/istanbul-lib-report@3.0.3': + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + + '@types/istanbul-reports@3.0.4': + dependencies: + '@types/istanbul-lib-report': 3.0.3 + '@types/json-schema@7.0.15': {} '@types/katex@0.16.7': {} @@ -13875,6 +17001,10 @@ snapshots: dependencies: '@types/react': 19.2.7 + '@types/react-test-renderer@19.1.0': + dependencies: + '@types/react': 19.2.7 + '@types/react@19.2.7': dependencies: csstype: 3.2.3 @@ -13905,6 +17035,16 @@ snapshots: '@types/wrap-ansi@3.0.0': {} + '@types/ws@8.18.1': + dependencies: + '@types/node': 25.0.3 + + '@types/yargs-parser@21.0.3': {} + + '@types/yargs@17.0.35': + dependencies: + '@types/yargs-parser': 21.0.3 + '@types/yauzl@2.10.3': dependencies: '@types/node': 25.0.3 @@ -14179,6 +17319,11 @@ snapshots: abs-svg-path@0.1.1: {} + accepts@1.3.8: + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + accepts@2.0.0: dependencies: mime-types: 3.0.2 @@ -14204,6 +17349,8 @@ snapshots: agent-base@7.1.4: {} + agent-cli-detector@0.1.6: {} + agent-slack@0.9.3: dependencies: '@slack/web-api': 7.17.0 @@ -14260,6 +17407,8 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 + anser@1.4.10: {} + ansi-escapes@4.3.2: dependencies: type-fest: 0.21.3 @@ -14268,10 +17417,16 @@ snapshots: dependencies: type-fest: 1.4.0 + ansi-regex@4.1.1: {} + ansi-regex@5.0.1: {} ansi-regex@6.2.2: {} + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 @@ -14297,6 +17452,8 @@ snapshots: repeat-string: 1.6.1 optional: true + arg@5.0.2: {} + argparse@1.0.10: dependencies: sprintf-js: 1.0.3 @@ -14315,6 +17472,8 @@ snapshots: arrify@2.0.1: {} + asap@2.0.6: {} + assertion-error@2.0.1: {} async-lock@1.4.1: {} @@ -14361,6 +17520,102 @@ snapshots: - debug - supports-color + babel-plugin-polyfill-corejs2@0.4.17(@babel/core@7.28.5): + dependencies: + '@babel/compat-data': 7.29.7 + '@babel/core': 7.28.5 + '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.28.5) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.28.5): + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.28.5) + core-js-compat: 3.50.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-regenerator@0.6.8(@babel/core@7.28.5): + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.28.5) + transitivePeerDependencies: + - supports-color + + babel-plugin-react-compiler@1.0.0: + dependencies: + '@babel/types': 7.28.5 + + babel-plugin-react-native-web@0.21.2: {} + + babel-plugin-syntax-hermes-parser@0.36.0: + dependencies: + hermes-parser: 0.36.0 + + babel-plugin-syntax-hermes-parser@0.36.1: + dependencies: + hermes-parser: 0.36.1 + + babel-plugin-transform-flow-enums@0.0.2(@babel/core@7.28.5): + dependencies: + '@babel/plugin-syntax-flow': 7.29.7(@babel/core@7.28.5) + transitivePeerDependencies: + - '@babel/core' + + babel-preset-expo@57.0.7(@babel/core@7.28.5)(@babel/runtime@7.28.6)(expo@57.0.15)(react-refresh@0.14.2): + dependencies: + '@babel/generator': 7.28.5 + '@babel/helper-module-imports': 7.27.1 + '@babel/plugin-proposal-decorators': 7.29.7(@babel/core@7.28.5) + '@babel/plugin-proposal-export-default-from': 7.29.7(@babel/core@7.28.5) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.28.5) + '@babel/plugin-syntax-export-default-from': 7.29.7(@babel/core@7.28.5) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.5) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.5) + '@babel/plugin-transform-async-generator-functions': 7.29.7(@babel/core@7.28.5) + '@babel/plugin-transform-async-to-generator': 7.29.7(@babel/core@7.28.5) + '@babel/plugin-transform-block-scoping': 7.29.7(@babel/core@7.28.5) + '@babel/plugin-transform-class-properties': 7.29.7(@babel/core@7.28.5) + '@babel/plugin-transform-class-static-block': 7.29.7(@babel/core@7.28.5) + '@babel/plugin-transform-classes': 7.29.7(@babel/core@7.28.5) + '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.28.5) + '@babel/plugin-transform-export-namespace-from': 7.29.7(@babel/core@7.28.5) + '@babel/plugin-transform-flow-strip-types': 7.29.7(@babel/core@7.28.5) + '@babel/plugin-transform-for-of': 7.29.7(@babel/core@7.28.5) + '@babel/plugin-transform-logical-assignment-operators': 7.29.7(@babel/core@7.28.5) + '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.28.5) + '@babel/plugin-transform-named-capturing-groups-regex': 7.29.7(@babel/core@7.28.5) + '@babel/plugin-transform-nullish-coalescing-operator': 7.29.7(@babel/core@7.28.5) + '@babel/plugin-transform-object-rest-spread': 7.29.7(@babel/core@7.28.5) + '@babel/plugin-transform-optional-catch-binding': 7.29.7(@babel/core@7.28.5) + '@babel/plugin-transform-optional-chaining': 7.29.7(@babel/core@7.28.5) + '@babel/plugin-transform-parameters': 7.29.7(@babel/core@7.28.5) + '@babel/plugin-transform-private-methods': 7.29.7(@babel/core@7.28.5) + '@babel/plugin-transform-private-property-in-object': 7.29.7(@babel/core@7.28.5) + '@babel/plugin-transform-react-display-name': 7.29.7(@babel/core@7.28.5) + '@babel/plugin-transform-react-jsx': 7.29.7(@babel/core@7.28.5) + '@babel/plugin-transform-react-jsx-development': 7.29.7(@babel/core@7.28.5) + '@babel/plugin-transform-react-pure-annotations': 7.29.7(@babel/core@7.28.5) + '@babel/plugin-transform-runtime': 7.29.7(@babel/core@7.28.5) + '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.28.5) + '@babel/plugin-transform-unicode-regex': 7.29.7(@babel/core@7.28.5) + '@babel/preset-typescript': 7.29.7(@babel/core@7.28.5) + '@react-native/babel-plugin-codegen': 0.86.2(@babel/core@7.28.5) + babel-plugin-react-compiler: 1.0.0 + babel-plugin-react-native-web: 0.21.2 + babel-plugin-syntax-hermes-parser: 0.36.1 + babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.28.5) + debug: 4.4.3 + react-refresh: 0.14.2 + optionalDependencies: + '@babel/runtime': 7.28.6 + expo: 57.0.15(@babel/core@7.28.5)(@expo/dom-webview@57.0.1)(@expo/metro-runtime@57.0.12)(expo-router@57.0.15)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.10.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) + transitivePeerDependencies: + - '@babel/core' + - supports-color + bail@2.0.2: {} baileys@7.0.0-rc13(sharp@0.35.3(@types/node@25.0.3)): @@ -14384,6 +17639,14 @@ snapshots: balanced-match@1.0.2: {} + balanced-match@4.0.4: {} + + barcode-detector@3.2.2(@types/emscripten@1.41.5): + dependencies: + zxing-wasm: 3.1.3(@types/emscripten@1.41.5) + transitivePeerDependencies: + - '@types/emscripten' + base32-encode@1.2.0: dependencies: to-data-view: 1.1.0 @@ -14393,6 +17656,8 @@ snapshots: base64-js@1.5.1: {} + baseline-browser-mapping@2.11.16: {} + baseline-browser-mapping@2.9.11: {} before-after-hook@2.2.3: {} @@ -14401,6 +17666,8 @@ snapshots: dependencies: require-from-string: 2.0.2 + big-integer@1.6.52: {} + bignumber.js@9.3.1: {} bl@4.1.0: @@ -14441,6 +17708,18 @@ snapshots: stream-buffers: 2.2.0 optional: true + bplist-creator@0.1.0: + dependencies: + stream-buffers: 2.2.0 + + bplist-parser@0.3.1: + dependencies: + big-integer: 1.6.52 + + bplist-parser@0.3.2: + dependencies: + big-integer: 1.6.52 + brace-expansion@1.1.12: dependencies: balanced-match: 1.0.2 @@ -14450,6 +17729,10 @@ snapshots: dependencies: balanced-match: 1.0.2 + brace-expansion@5.0.9: + dependencies: + balanced-match: 4.0.4 + braces@3.0.3: dependencies: fill-range: 7.1.1 @@ -14472,6 +17755,18 @@ snapshots: node-releases: 2.0.27 update-browserslist-db: 1.2.3(browserslist@4.28.1) + browserslist@4.28.8: + dependencies: + baseline-browser-mapping: 2.11.16 + caniuse-lite: 1.0.30001809 + electron-to-chromium: 1.5.411 + node-releases: 2.0.53 + update-browserslist-db: 1.3.1(browserslist@4.28.8) + + bser@2.1.1: + dependencies: + node-int64: 0.4.0 + buffer-crc32@0.2.13: {} buffer-crc32@1.0.0: {} @@ -14570,10 +17865,14 @@ snapshots: camelcase@5.3.1: {} + camelcase@6.3.0: {} + camelize@1.0.1: {} caniuse-lite@1.0.30001761: {} + caniuse-lite@1.0.30001809: {} + ccount@2.0.1: {} cfb@1.2.2: @@ -14583,6 +17882,12 @@ snapshots: chai@6.2.2: {} + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 @@ -14619,8 +17924,31 @@ snapshots: chownr@2.0.0: {} + chrome-launcher@0.15.2: + dependencies: + '@types/node': 25.0.3 + escape-string-regexp: 4.0.0 + is-wsl: 2.2.0 + lighthouse-logger: 1.4.2 + transitivePeerDependencies: + - supports-color + chrome-trace-event@1.0.4: {} + chromium-edge-launcher@0.3.0: + dependencies: + '@types/node': 25.0.3 + escape-string-regexp: 4.0.0 + is-wsl: 2.2.0 + lighthouse-logger: 1.4.2 + mkdirp: 1.0.4 + transitivePeerDependencies: + - supports-color + + ci-info@2.0.0: {} + + ci-info@3.9.0: {} + class-variance-authority@0.7.1: dependencies: clsx: 2.1.1 @@ -14629,6 +17957,10 @@ snapshots: clean-stack@2.2.0: {} + cli-cursor@2.1.0: + dependencies: + restore-cursor: 2.0.0 + cli-cursor@3.1.0: dependencies: restore-cursor: 3.1.0 @@ -14646,6 +17978,8 @@ snapshots: cli-width@4.1.0: {} + client-only@0.0.1: {} + cliui@6.0.0: dependencies: string-width: 4.2.3 @@ -14702,10 +18036,16 @@ snapshots: color-convert@0.5.3: optional: true + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + color-convert@2.0.1: dependencies: color-name: 1.1.4 + color-name@1.1.3: {} + color-name@1.1.4: {} color-string@1.9.1: @@ -14713,6 +18053,11 @@ snapshots: color-name: 1.1.4 simple-swizzle: 0.2.4 + color@4.2.3: + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + colorette@2.0.20: {} combined-stream@1.0.8: @@ -14723,6 +18068,8 @@ snapshots: commander@11.1.0: {} + commander@12.1.0: {} + commander@14.0.3: {} commander@2.20.3: {} @@ -14737,6 +18084,22 @@ snapshots: compare-version@0.1.2: {} + compressible@2.0.18: + dependencies: + mime-db: 1.54.0 + + compression@1.8.1: + dependencies: + bytes: 3.1.2 + compressible: 2.0.18 + debug: 2.6.9 + negotiator: 0.6.4 + on-headers: 1.1.0 + safe-buffer: 5.2.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + concat-map@0.0.1: {} concurrently@9.2.1: @@ -14750,6 +18113,15 @@ snapshots: confbox@0.1.8: {} + connect@3.7.0: + dependencies: + debug: 2.6.9 + finalhandler: 1.1.2 + parseurl: 1.3.3 + utils-merge: 1.0.1 + transitivePeerDependencies: + - supports-color + content-disposition@1.0.1: {} content-type@1.0.5: {} @@ -14762,6 +18134,10 @@ snapshots: cookie@0.7.2: {} + core-js-compat@3.50.0: + dependencies: + browserslist: 4.28.8 + core-js@3.47.0: {} core-util-is@1.0.3: {} @@ -14789,6 +18165,12 @@ snapshots: cross-dirname@0.1.0: {} + cross-fetch@3.2.0(encoding@0.1.13): + dependencies: + node-fetch: 2.7.0(encoding@0.1.13) + transitivePeerDependencies: + - encoding + cross-spawn@6.0.6: dependencies: nice-try: 1.0.5 @@ -14807,6 +18189,12 @@ snapshots: crypto-js@4.2.0: {} + css-color-keywords@1.0.0: {} + + css-in-js-utils@3.1.0: + dependencies: + hyphenate-style-name: 1.1.0 + css-select@5.2.2: dependencies: boolbase: 1.0.0 @@ -14815,6 +18203,12 @@ snapshots: domutils: 3.2.2 nth-check: 2.1.1 + css-to-react-native@3.2.0: + dependencies: + camelize: 1.0.1 + css-color-keywords: 1.0.0 + postcss-value-parser: 4.2.0 + css-tree@3.2.1: dependencies: mdn-data: 2.27.1 @@ -15027,6 +18421,10 @@ snapshots: dependencies: ms: 2.0.0 + debug@3.2.7: + dependencies: + ms: 2.1.3 + debug@4.4.3: dependencies: ms: 2.1.3 @@ -15041,12 +18439,16 @@ snapshots: dependencies: character-entities: 2.0.2 + decode-uri-component@0.2.2: {} + decompress-response@6.0.0: dependencies: mimic-response: 3.1.0 deep-is@0.1.4: {} + deepmerge@4.3.1: {} + default-browser-id@5.0.1: {} default-browser@5.5.0: @@ -15087,6 +18489,8 @@ snapshots: dequal@2.0.3: {} + destroy@1.2.0: {} + detect-libc@2.1.2: {} detect-node-es@1.1.0: {} @@ -15113,6 +18517,8 @@ snapshots: minimatch: 3.1.2 p-limit: 3.1.0 + dnssd-advertise@1.1.6: {} + docxtemplater@3.68.7: dependencies: '@xmldom/xmldom': 0.9.10 @@ -15201,7 +18607,7 @@ snapshots: glob: 7.2.3 lodash: 4.17.21 parse-author: 2.0.0 - semver: 7.7.3 + semver: 7.8.5 tmp-promise: 3.0.3 optionalDependencies: '@types/fs-extra': 9.0.13 @@ -15255,6 +18661,8 @@ snapshots: electron-to-chromium@1.5.267: {} + electron-to-chromium@1.5.411: {} + electron-winstaller@5.4.0: dependencies: '@electron/asar': 3.4.1 @@ -15287,6 +18695,8 @@ snapshots: encode-utf8@1.0.3: optional: true + encodeurl@1.0.2: {} + encodeurl@2.0.0: {} encoding@0.1.13: @@ -15312,6 +18722,8 @@ snapshots: entities@1.1.2: {} + entities@2.0.3: {} + entities@2.2.0: {} entities@4.5.0: {} @@ -15328,6 +18740,10 @@ snapshots: dependencies: is-arrayish: 0.2.1 + error-stack-parser@2.1.4: + dependencies: + stackframe: 1.3.4 + error@4.4.0: dependencies: camelize: 1.0.1 @@ -15529,29 +18945,267 @@ snapshots: eventemitter3@4.0.7: {} - eventemitter3@5.0.1: {} + eventemitter3@5.0.1: {} + + eventemitter3@5.0.4: {} + + events@3.3.0: {} + + eventsource-parser@3.1.0: {} + + eventsource@3.0.7: + dependencies: + eventsource-parser: 3.1.0 + + execa@1.0.0: + dependencies: + cross-spawn: 6.0.6 + get-stream: 4.1.0 + is-stream: 1.1.0 + npm-run-path: 2.0.2 + p-finally: 1.0.0 + signal-exit: 3.0.7 + strip-eof: 1.0.0 + + expect-type@1.3.0: {} + + expo-asset@57.0.13(expo@57.0.15)(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3)(typescript@6.0.3): + dependencies: + '@expo/image-utils': 0.11.4(typescript@6.0.3) + expo: 57.0.15(@babel/core@7.28.5)(@expo/dom-webview@57.0.1)(@expo/metro-runtime@57.0.12)(expo-router@57.0.15)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.10.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) + expo-constants: 57.0.13(expo@57.0.15)(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3)) + react: 19.2.3 + react-native: 0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3) + transitivePeerDependencies: + - supports-color + - typescript + + expo-camera@57.0.4(@types/emscripten@1.41.5)(expo@57.0.15)(react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3): + dependencies: + barcode-detector: 3.2.2(@types/emscripten@1.41.5) + expo: 57.0.15(@babel/core@7.28.5)(@expo/dom-webview@57.0.1)(@expo/metro-runtime@57.0.12)(expo-router@57.0.15)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.10.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) + react: 19.2.3 + react-native: 0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3) + optionalDependencies: + react-native-web: 0.21.2(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + transitivePeerDependencies: + - '@types/emscripten' + + expo-constants@57.0.13(expo@57.0.15)(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3)): + dependencies: + '@expo/env': 2.4.2 + expo: 57.0.15(@babel/core@7.28.5)(@expo/dom-webview@57.0.1)(@expo/metro-runtime@57.0.12)(expo-router@57.0.15)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.10.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) + react-native: 0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3) + transitivePeerDependencies: + - supports-color + + expo-device@57.0.1(expo@57.0.15): + dependencies: + expo: 57.0.15(@babel/core@7.28.5)(@expo/dom-webview@57.0.1)(@expo/metro-runtime@57.0.12)(expo-router@57.0.15)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.10.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) + ua-parser-js: 0.7.41 + + expo-file-system@57.0.5(expo@57.0.15)(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3)): + dependencies: + expo: 57.0.15(@babel/core@7.28.5)(@expo/dom-webview@57.0.1)(@expo/metro-runtime@57.0.12)(expo-router@57.0.15)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.10.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) + react-native: 0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3) + + expo-font@57.0.1(expo@57.0.15)(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3): + dependencies: + expo: 57.0.15(@babel/core@7.28.5)(@expo/dom-webview@57.0.1)(@expo/metro-runtime@57.0.12)(expo-router@57.0.15)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.10.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) + fontfaceobserver: 2.3.0 + react: 19.2.3 + react-native: 0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3) + + expo-glass-effect@57.0.1(expo@57.0.15)(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3): + dependencies: + expo: 57.0.15(@babel/core@7.28.5)(@expo/dom-webview@57.0.1)(@expo/metro-runtime@57.0.12)(expo-router@57.0.15)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.10.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) + react: 19.2.3 + react-native: 0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3) + + expo-image@57.0.3(expo@57.0.15)(react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3): + dependencies: + expo: 57.0.15(@babel/core@7.28.5)(@expo/dom-webview@57.0.1)(@expo/metro-runtime@57.0.12)(expo-router@57.0.15)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.10.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) + react: 19.2.3 + react-native: 0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3) + sf-symbols-typescript: 2.2.0 + optionalDependencies: + react-native-web: 0.21.2(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + + expo-keep-awake@57.0.1(expo@57.0.15)(react@19.2.3): + dependencies: + expo: 57.0.15(@babel/core@7.28.5)(@expo/dom-webview@57.0.1)(@expo/metro-runtime@57.0.12)(expo-router@57.0.15)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.10.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) + react: 19.2.3 + + expo-linking@57.0.7(expo@57.0.15)(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3): + dependencies: + expo-constants: 57.0.13(expo@57.0.15)(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3)) + invariant: 2.2.4 + react: 19.2.3 + react-native: 0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3) + transitivePeerDependencies: + - expo + - supports-color + + expo-modules-autolinking@57.0.10(typescript@6.0.3): + dependencies: + '@expo/require-utils': 57.0.4(typescript@6.0.3) + '@expo/spawn-async': 1.8.0 + chalk: 4.1.2 + commander: 7.2.0 + transitivePeerDependencies: + - supports-color + - typescript + + expo-modules-core@57.0.12(react-native-worklets@0.10.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3): + dependencies: + '@expo/expo-modules-macros-plugin': 0.6.1 + expo-modules-jsi: 57.0.5(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3)) + invariant: 2.2.4 + react: 19.2.3 + react-native: 0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3) + optionalDependencies: + react-native-worklets: 0.10.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3) + + expo-modules-jsi@57.0.5(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3)): + dependencies: + react-native: 0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3) + + expo-router@57.0.15(176cd5c8b192935c21a50d7b789b2dca): + dependencies: + '@expo/log-box': 57.0.3(@expo/dom-webview@57.0.1)(expo@57.0.15)(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3) + '@expo/metro-runtime': 57.0.12(@expo/log-box@57.0.3)(expo@57.0.15)(react-dom@19.2.3(react@19.2.3))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3) + '@expo/schema-utils': 57.0.2 + '@expo/ui': 57.0.12(@babel/core@7.28.5)(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(expo@57.0.15)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.10.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3) + '@radix-ui/react-slot': 1.2.4(@types/react@19.2.7)(react@19.2.3) + '@radix-ui/react-tabs': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@react-native-masked-view/masked-view': 0.3.2(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3) + client-only: 0.0.1 + color: 4.2.3 + debug: 4.4.3 + escape-string-regexp: 4.0.0 + expo: 57.0.15(@babel/core@7.28.5)(@expo/dom-webview@57.0.1)(@expo/metro-runtime@57.0.12)(expo-router@57.0.15)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.10.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) + expo-constants: 57.0.13(expo@57.0.15)(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3)) + expo-glass-effect: 57.0.1(expo@57.0.15)(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3) + expo-linking: 57.0.7(expo@57.0.15)(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3) + expo-server: 57.0.3 + expo-symbols: 57.0.2(expo-font@57.0.1)(expo@57.0.15)(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3) + fast-deep-equal: 3.1.3 + invariant: 2.2.4 + nanoid: 3.3.11 + query-string: 7.1.3 + react: 19.2.3 + react-fast-compare: 3.2.2 + react-is: 19.2.8 + react-native: 0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3) + react-native-drawer-layout: 4.2.10(react-native-gesture-handler@2.32.0(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3))(react-native-reanimated@4.5.0(react-native-worklets@0.10.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3) + react-native-safe-area-context: 5.7.0(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3) + react-native-screens: 4.25.2(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3) + server-only: 0.0.1 + sf-symbols-typescript: 2.2.0 + shallowequal: 1.1.0 + standard-navigation: 0.0.5 + vaul: 1.1.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + optionalDependencies: + react-dom: 19.2.3(react@19.2.3) + react-native-gesture-handler: 2.32.0(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3) + react-native-reanimated: 4.5.0(react-native-worklets@0.10.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3) + react-native-web: 0.21.2(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + transitivePeerDependencies: + - '@babel/core' + - '@types/react' + - '@types/react-dom' + - expo-font + - react-native-worklets + - supports-color + + expo-secure-store@57.0.1(expo@57.0.15): + dependencies: + expo: 57.0.15(@babel/core@7.28.5)(@expo/dom-webview@57.0.1)(@expo/metro-runtime@57.0.12)(expo-router@57.0.15)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.10.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) + + expo-server@57.0.3: {} - eventemitter3@5.0.4: {} + expo-splash-screen@57.0.7(expo@57.0.15)(typescript@6.0.3): + dependencies: + '@expo/config-plugins': 57.0.8(typescript@6.0.3) + '@expo/image-utils': 0.11.4(typescript@6.0.3) + expo: 57.0.15(@babel/core@7.28.5)(@expo/dom-webview@57.0.1)(@expo/metro-runtime@57.0.12)(expo-router@57.0.15)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.10.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) + xml2js: 0.6.0 + transitivePeerDependencies: + - supports-color + - typescript - events@3.3.0: {} + expo-status-bar@57.0.1(expo@57.0.15)(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3): + dependencies: + expo: 57.0.15(@babel/core@7.28.5)(@expo/dom-webview@57.0.1)(@expo/metro-runtime@57.0.12)(expo-router@57.0.15)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.10.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) + react: 19.2.3 + react-native: 0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3) - eventsource-parser@3.1.0: {} + expo-symbols@57.0.2(expo-font@57.0.1)(expo@57.0.15)(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3): + dependencies: + '@expo-google-fonts/material-symbols': 0.4.44 + expo: 57.0.15(@babel/core@7.28.5)(@expo/dom-webview@57.0.1)(@expo/metro-runtime@57.0.12)(expo-router@57.0.15)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.10.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) + expo-font: 57.0.1(expo@57.0.15)(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3) + react: 19.2.3 + react-native: 0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3) + sf-symbols-typescript: 2.2.0 - eventsource@3.0.7: + expo-system-ui@57.0.2(expo@57.0.15)(react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3)): dependencies: - eventsource-parser: 3.1.0 + '@react-native/normalize-colors': 0.86.2 + debug: 4.4.3 + expo: 57.0.15(@babel/core@7.28.5)(@expo/dom-webview@57.0.1)(@expo/metro-runtime@57.0.12)(expo-router@57.0.15)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.10.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) + react-native: 0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3) + optionalDependencies: + react-native-web: 0.21.2(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + transitivePeerDependencies: + - supports-color - execa@1.0.0: + expo-web-browser@57.0.2(expo@57.0.15)(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3)): dependencies: - cross-spawn: 6.0.6 - get-stream: 4.1.0 - is-stream: 1.1.0 - npm-run-path: 2.0.2 - p-finally: 1.0.0 - signal-exit: 3.0.7 - strip-eof: 1.0.0 + expo: 57.0.15(@babel/core@7.28.5)(@expo/dom-webview@57.0.1)(@expo/metro-runtime@57.0.12)(expo-router@57.0.15)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.10.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) + react-native: 0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3) - expect-type@1.3.0: {} + expo@57.0.15(@babel/core@7.28.5)(@expo/dom-webview@57.0.1)(@expo/metro-runtime@57.0.12)(expo-router@57.0.15)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.10.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3)(typescript@6.0.3): + dependencies: + '@babel/runtime': 7.28.6 + '@expo/cli': 57.0.17(@expo/dom-webview@57.0.1)(@expo/metro-runtime@57.0.12)(expo-constants@57.0.13)(expo-font@57.0.1)(expo-router@57.0.15)(expo@57.0.15)(react-dom@19.2.3(react@19.2.3))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) + '@expo/config': 57.0.8(typescript@6.0.3) + '@expo/config-plugins': 57.0.8(typescript@6.0.3) + '@expo/devtools': 57.0.1(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3) + '@expo/fingerprint': 0.20.9 + '@expo/local-build-cache-provider': 57.0.7(typescript@6.0.3) + '@expo/log-box': 57.0.3(@expo/dom-webview@57.0.1)(expo@57.0.15)(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3) + '@expo/metro': 56.0.0 + '@expo/metro-config': 57.0.9(expo@57.0.15)(typescript@6.0.3) + '@ungap/structured-clone': 1.3.0 + babel-preset-expo: 57.0.7(@babel/core@7.28.5)(@babel/runtime@7.28.6)(expo@57.0.15)(react-refresh@0.14.2) + expo-asset: 57.0.13(expo@57.0.15)(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) + expo-constants: 57.0.13(expo@57.0.15)(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3)) + expo-file-system: 57.0.5(expo@57.0.15)(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3)) + expo-font: 57.0.1(expo@57.0.15)(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3) + expo-keep-awake: 57.0.1(expo@57.0.15)(react@19.2.3) + expo-modules-autolinking: 57.0.10(typescript@6.0.3) + expo-modules-core: 57.0.12(react-native-worklets@0.10.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3) + pretty-format: 29.7.0 + react: 19.2.3 + react-native: 0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3) + react-refresh: 0.14.2 + whatwg-url-minimum: 0.1.2 + optionalDependencies: + '@expo/dom-webview': 57.0.1(expo@57.0.15)(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3) + '@expo/metro-runtime': 57.0.12(@expo/log-box@57.0.3)(expo@57.0.15)(react-dom@19.2.3(react@19.2.3))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3) + react-dom: 19.2.3(react@19.2.3) + react-native-web: 0.21.2(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + transitivePeerDependencies: + - '@babel/core' + - bufferutil + - expo-router + - expo-widgets + - react-native-worklets + - react-server-dom-webpack + - supports-color + - typescript + - utf-8-validate exponential-backoff@3.1.3: {} @@ -15652,6 +19306,26 @@ snapshots: dependencies: reusify: 1.1.0 + fb-dotslash@0.5.8: {} + + fb-watchman@2.0.2: + dependencies: + bser: 2.1.1 + + fbjs-css-vars@1.0.2: {} + + fbjs@3.0.5(encoding@0.1.13): + dependencies: + cross-fetch: 3.2.0(encoding@0.1.13) + fbjs-css-vars: 1.0.2 + loose-envify: 1.4.0 + object-assign: 4.1.1 + promise: 7.3.1 + setimmediate: 1.0.5 + ua-parser-js: 1.0.41 + transitivePeerDependencies: + - encoding + fd-slicer@1.1.0: dependencies: pend: 1.2.0 @@ -15665,6 +19339,8 @@ snapshots: node-domexception: 1.0.0 web-streams-polyfill: 3.3.3 + fetch-nodeshim@0.4.10: {} + fflate@0.4.8: {} file-entry-cache@8.0.0: @@ -15692,6 +19368,20 @@ snapshots: dependencies: to-regex-range: 5.0.1 + filter-obj@1.1.0: {} + + finalhandler@1.1.2: + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.3.0 + parseurl: 1.3.3 + statuses: 1.5.0 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + finalhandler@2.1.1: dependencies: debug: 4.4.3 @@ -15731,6 +19421,8 @@ snapshots: transitivePeerDependencies: - supports-color + flow-enums-runtime@0.0.6: {} + fmix@0.1.0: dependencies: imul: 1.0.1 @@ -15740,6 +19432,8 @@ snapshots: follow-redirects@1.16.0: {} + fontfaceobserver@2.3.0: {} + fontkit@2.0.4: dependencies: '@swc/helpers': 0.5.18 @@ -15786,6 +19480,8 @@ snapshots: react: 19.2.3 react-dom: 19.2.3(react@19.2.3) + fresh@0.5.2: {} + fresh@2.0.0: {} fs-extra@10.1.0: @@ -15946,6 +19642,8 @@ snapshots: dependencies: pump: 3.0.3 + getenv@2.0.0: {} + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -15994,7 +19692,7 @@ snapshots: es6-error: 4.1.1 matcher: 3.0.0 roarr: 2.15.4 - semver: 7.7.3 + semver: 7.8.5 serialize-error: 7.0.1 optional: true @@ -16097,6 +19795,8 @@ snapshots: hachure-fill@0.5.2: {} + has-flag@3.0.0: {} + has-flag@4.0.0: {} has-property-descriptors@1.0.2: @@ -16241,13 +19941,37 @@ snapshots: he@1.2.0: {} + hermes-compiler@250829098.0.14: {} + hermes-estree@0.25.1: {} + hermes-estree@0.35.0: {} + + hermes-estree@0.36.0: {} + + hermes-estree@0.36.1: {} + hermes-parser@0.25.1: dependencies: hermes-estree: 0.25.1 - hono@4.11.3: {} + hermes-parser@0.35.0: + dependencies: + hermes-estree: 0.35.0 + + hermes-parser@0.36.0: + dependencies: + hermes-estree: 0.36.0 + + hermes-parser@0.36.1: + dependencies: + hermes-estree: 0.36.1 + + hoist-non-react-statics@3.3.2: + dependencies: + react-is: 16.13.1 + + hono@4.13.3: {} hookified@1.15.1: {} @@ -16255,6 +19979,10 @@ snapshots: hosted-git-info@2.8.9: {} + hosted-git-info@7.0.2: + dependencies: + lru-cache: 10.4.3 + hsl-to-hex@1.0.0: dependencies: hsl-to-rgb-for-reals: 1.1.1 @@ -16348,6 +20076,8 @@ snapshots: hyphen@1.14.1: {} + hyphenate-style-name@1.1.0: {} + hysnappy@1.1.1: {} iconv-lite@0.4.24: @@ -16362,6 +20092,8 @@ snapshots: dependencies: safer-buffer: 2.1.2 + idb@8.0.3: {} + ieee754@1.2.1: {} ignore@5.3.2: {} @@ -16414,12 +20146,20 @@ snapshots: inline-style-parser@0.2.7: {} + inline-style-prefixer@7.0.1: + dependencies: + css-in-js-utils: 3.1.0 + internmap@1.0.1: {} internmap@2.0.3: {} interpret@3.1.1: {} + invariant@2.2.4: + dependencies: + loose-envify: 1.4.0 + ip-address@10.1.0: {} ipaddr.js@1.9.1: {} @@ -16557,12 +20297,41 @@ snapshots: dependencies: restructure: 3.0.2 + jest-get-type@29.6.3: {} + + jest-util@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/node': 25.0.3 + chalk: 4.1.2 + ci-info: 3.9.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + + jest-validate@29.7.0: + dependencies: + '@jest/types': 29.6.3 + camelcase: 6.3.0 + chalk: 4.1.2 + jest-get-type: 29.6.3 + leven: 3.1.0 + pretty-format: 29.7.0 + jest-worker@27.5.1: dependencies: '@types/node': 25.0.3 merge-stream: 2.0.0 supports-color: 8.1.1 + jest-worker@29.7.0: + dependencies: + '@types/node': 25.0.3 + jest-util: 29.7.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + jimp-compact@0.16.1: {} + jiti@2.6.1: {} joi@18.0.2: @@ -16583,6 +20352,8 @@ snapshots: dependencies: argparse: 2.0.1 + jsc-safe-url@0.2.4: {} + jsdom@29.1.1: dependencies: '@asamuzakjp/css-color': 5.1.11 @@ -16686,6 +20457,10 @@ snapshots: khroma@2.1.0: {} + kleur@3.0.3: {} + + lan-network@0.2.1: {} + langium@4.2.2: dependencies: '@chevrotain/regexp-to-ast': 12.0.0 @@ -16700,6 +20475,8 @@ snapshots: layout-base@2.0.1: {} + leven@3.1.0: {} + levn@0.4.1: dependencies: prelude-ls: 1.2.1 @@ -16714,6 +20491,13 @@ snapshots: dependencies: immediate: 3.0.6 + lighthouse-logger@1.4.2: + dependencies: + debug: 2.6.9 + marky: 1.3.0 + transitivePeerDependencies: + - supports-color + lightningcss-android-arm64@1.30.2: optional: true @@ -16768,6 +20552,10 @@ snapshots: base64-js: 0.0.8 unicode-trie: 2.0.0 + linkify-it@2.2.0: + dependencies: + uc.micro: 1.0.6 + linkify-it@5.0.0: dependencies: uc.micro: 2.1.0 @@ -16807,12 +20595,20 @@ snapshots: lodash-es@4.18.1: {} + lodash.debounce@4.0.8: {} + lodash.get@4.4.2: {} lodash.merge@4.6.2: {} + lodash.throttle@4.1.1: {} + lodash@4.17.21: {} + log-symbols@2.2.0: + dependencies: + chalk: 2.4.2 + log-symbols@4.1.0: dependencies: chalk: 4.1.2 @@ -16901,6 +20697,10 @@ snapshots: - bluebird - supports-color + makeerror@1.0.12: + dependencies: + tmpl: 1.0.5 + mammoth@1.11.0: dependencies: '@xmldom/xmldom': 0.8.11 @@ -16920,6 +20720,14 @@ snapshots: markdown-it-task-lists@2.1.1: {} + markdown-it@10.0.0: + dependencies: + argparse: 1.0.10 + entities: 2.0.3 + linkify-it: 2.2.0 + mdurl: 1.0.1 + uc.micro: 1.0.6 + markdown-it@14.1.0: dependencies: argparse: 2.0.1 @@ -16933,6 +20741,8 @@ snapshots: marked@16.4.2: {} + marky@1.3.0: {} + matcher@3.0.0: dependencies: escape-string-regexp: 4.0.0 @@ -17112,6 +20922,8 @@ snapshots: mdn-data@2.27.1: {} + mdurl@1.0.1: {} + mdurl@2.0.0: {} media-engine@1.0.3: {} @@ -17126,6 +20938,10 @@ snapshots: mimic-fn: 2.1.0 p-is-promise: 2.1.0 + memoize-one@5.2.1: {} + + memoize-one@6.0.0: {} + merge-descriptors@2.0.0: {} merge-stream@2.0.0: {} @@ -17156,6 +20972,353 @@ snapshots: ts-dedent: 2.2.0 uuid: 11.1.0 + metro-babel-transformer@0.84.4: + dependencies: + '@babel/core': 7.28.5 + flow-enums-runtime: 0.0.6 + hermes-parser: 0.35.0 + metro-cache-key: 0.84.4 + nullthrows: 1.1.1 + transitivePeerDependencies: + - supports-color + + metro-babel-transformer@0.84.5: + dependencies: + '@babel/core': 7.28.5 + flow-enums-runtime: 0.0.6 + hermes-parser: 0.35.0 + metro-cache-key: 0.84.5 + nullthrows: 1.1.1 + transitivePeerDependencies: + - supports-color + + metro-cache-key@0.84.4: + dependencies: + flow-enums-runtime: 0.0.6 + + metro-cache-key@0.84.5: + dependencies: + flow-enums-runtime: 0.0.6 + + metro-cache@0.84.4: + dependencies: + exponential-backoff: 3.1.3 + flow-enums-runtime: 0.0.6 + https-proxy-agent: 7.0.6 + metro-core: 0.84.4 + transitivePeerDependencies: + - supports-color + + metro-cache@0.84.5: + dependencies: + exponential-backoff: 3.1.3 + flow-enums-runtime: 0.0.6 + https-proxy-agent: 7.0.6 + metro-core: 0.84.5 + transitivePeerDependencies: + - supports-color + + metro-config@0.84.4: + dependencies: + connect: 3.7.0 + flow-enums-runtime: 0.0.6 + jest-validate: 29.7.0 + metro: 0.84.4 + metro-cache: 0.84.4 + metro-core: 0.84.4 + metro-runtime: 0.84.4 + yaml: 2.8.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + metro-config@0.84.5: + dependencies: + connect: 3.7.0 + flow-enums-runtime: 0.0.6 + jest-validate: 29.7.0 + metro: 0.84.5 + metro-cache: 0.84.5 + metro-core: 0.84.5 + metro-runtime: 0.84.5 + yaml: 2.8.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + metro-core@0.84.4: + dependencies: + flow-enums-runtime: 0.0.6 + lodash.throttle: 4.1.1 + metro-resolver: 0.84.4 + + metro-core@0.84.5: + dependencies: + flow-enums-runtime: 0.0.6 + lodash.throttle: 4.1.1 + metro-resolver: 0.84.5 + + metro-file-map@0.84.4: + dependencies: + debug: 4.4.3 + fb-watchman: 2.0.2 + flow-enums-runtime: 0.0.6 + graceful-fs: 4.2.11 + invariant: 2.2.4 + jest-worker: 29.7.0 + micromatch: 4.0.8 + nullthrows: 1.1.1 + walker: 1.0.8 + transitivePeerDependencies: + - supports-color + + metro-file-map@0.84.5: + dependencies: + debug: 4.4.3 + fb-watchman: 2.0.2 + flow-enums-runtime: 0.0.6 + graceful-fs: 4.2.11 + invariant: 2.2.4 + jest-worker: 29.7.0 + micromatch: 4.0.8 + nullthrows: 1.1.1 + walker: 1.0.8 + transitivePeerDependencies: + - supports-color + + metro-minify-terser@0.84.4: + dependencies: + flow-enums-runtime: 0.0.6 + terser: 5.46.0 + + metro-minify-terser@0.84.5: + dependencies: + flow-enums-runtime: 0.0.6 + terser: 5.46.0 + + metro-resolver@0.84.4: + dependencies: + flow-enums-runtime: 0.0.6 + + metro-resolver@0.84.5: + dependencies: + flow-enums-runtime: 0.0.6 + + metro-runtime@0.84.4: + dependencies: + '@babel/runtime': 7.28.6 + flow-enums-runtime: 0.0.6 + + metro-runtime@0.84.5: + dependencies: + '@babel/runtime': 7.28.6 + flow-enums-runtime: 0.0.6 + + metro-source-map@0.84.4: + dependencies: + '@babel/traverse': 7.29.8 + '@babel/types': 7.29.8 + flow-enums-runtime: 0.0.6 + invariant: 2.2.4 + metro-symbolicate: 0.84.4 + nullthrows: 1.1.1 + ob1: 0.84.4 + source-map: 0.5.7 + vlq: 1.0.1 + transitivePeerDependencies: + - supports-color + + metro-source-map@0.84.5: + dependencies: + '@babel/traverse': 7.29.8 + '@babel/types': 7.29.8 + flow-enums-runtime: 0.0.6 + invariant: 2.2.4 + metro-symbolicate: 0.84.5 + nullthrows: 1.1.1 + ob1: 0.84.5 + source-map: 0.5.7 + vlq: 1.0.1 + transitivePeerDependencies: + - supports-color + + metro-symbolicate@0.84.4: + dependencies: + flow-enums-runtime: 0.0.6 + invariant: 2.2.4 + metro-source-map: 0.84.4 + nullthrows: 1.1.1 + source-map: 0.5.7 + vlq: 1.0.1 + transitivePeerDependencies: + - supports-color + + metro-symbolicate@0.84.5: + dependencies: + flow-enums-runtime: 0.0.6 + invariant: 2.2.4 + metro-source-map: 0.84.5 + nullthrows: 1.1.1 + source-map: 0.5.7 + vlq: 1.0.1 + transitivePeerDependencies: + - supports-color + + metro-transform-plugins@0.84.4: + dependencies: + '@babel/core': 7.28.5 + '@babel/generator': 7.29.8 + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.8 + flow-enums-runtime: 0.0.6 + nullthrows: 1.1.1 + transitivePeerDependencies: + - supports-color + + metro-transform-plugins@0.84.5: + dependencies: + '@babel/core': 7.28.5 + '@babel/generator': 7.29.8 + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.8 + flow-enums-runtime: 0.0.6 + nullthrows: 1.1.1 + transitivePeerDependencies: + - supports-color + + metro-transform-worker@0.84.4: + dependencies: + '@babel/core': 7.28.5 + '@babel/generator': 7.29.8 + '@babel/parser': 7.29.8 + '@babel/types': 7.29.8 + flow-enums-runtime: 0.0.6 + metro: 0.84.4 + metro-babel-transformer: 0.84.4 + metro-cache: 0.84.4 + metro-cache-key: 0.84.4 + metro-minify-terser: 0.84.4 + metro-source-map: 0.84.4 + metro-transform-plugins: 0.84.4 + nullthrows: 1.1.1 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + metro-transform-worker@0.84.5: + dependencies: + '@babel/core': 7.28.5 + '@babel/generator': 7.29.8 + '@babel/parser': 7.29.8 + '@babel/types': 7.29.8 + flow-enums-runtime: 0.0.6 + metro: 0.84.5 + metro-babel-transformer: 0.84.5 + metro-cache: 0.84.5 + metro-cache-key: 0.84.5 + metro-minify-terser: 0.84.5 + metro-source-map: 0.84.5 + metro-transform-plugins: 0.84.5 + nullthrows: 1.1.1 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + metro@0.84.4: + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/core': 7.28.5 + '@babel/generator': 7.29.8 + '@babel/parser': 7.29.8 + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.8 + '@babel/types': 7.29.8 + accepts: 2.0.0 + ci-info: 2.0.0 + connect: 3.7.0 + debug: 4.4.3 + error-stack-parser: 2.1.4 + flow-enums-runtime: 0.0.6 + graceful-fs: 4.2.11 + hermes-parser: 0.35.0 + image-size: 1.2.1 + invariant: 2.2.4 + jest-worker: 29.7.0 + jsc-safe-url: 0.2.4 + lodash.throttle: 4.1.1 + metro-babel-transformer: 0.84.4 + metro-cache: 0.84.4 + metro-cache-key: 0.84.4 + metro-config: 0.84.4 + metro-core: 0.84.4 + metro-file-map: 0.84.4 + metro-resolver: 0.84.4 + metro-runtime: 0.84.4 + metro-source-map: 0.84.4 + metro-symbolicate: 0.84.4 + metro-transform-plugins: 0.84.4 + metro-transform-worker: 0.84.4 + mime-types: 3.0.2 + nullthrows: 1.1.1 + serialize-error: 2.1.0 + source-map: 0.5.7 + throat: 5.0.0 + ws: 7.5.13 + yargs: 17.7.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + metro@0.84.5: + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/core': 7.28.5 + '@babel/generator': 7.29.8 + '@babel/parser': 7.29.8 + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.8 + '@babel/types': 7.29.8 + accepts: 2.0.0 + ci-info: 2.0.0 + connect: 3.7.0 + debug: 4.4.3 + error-stack-parser: 2.1.4 + flow-enums-runtime: 0.0.6 + graceful-fs: 4.2.11 + hermes-parser: 0.35.0 + invariant: 2.2.4 + jest-worker: 29.7.0 + jsc-safe-url: 0.2.4 + lodash.throttle: 4.1.1 + metro-babel-transformer: 0.84.5 + metro-cache: 0.84.5 + metro-cache-key: 0.84.5 + metro-config: 0.84.5 + metro-core: 0.84.5 + metro-file-map: 0.84.5 + metro-resolver: 0.84.5 + metro-runtime: 0.84.5 + metro-source-map: 0.84.5 + metro-symbolicate: 0.84.5 + metro-transform-plugins: 0.84.5 + metro-transform-worker: 0.84.5 + mime-types: 3.0.2 + nullthrows: 1.1.1 + serialize-error: 2.1.0 + source-map: 0.5.7 + throat: 5.0.0 + ws: 7.5.13 + yargs: 17.7.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + micromark-core-commonmark@2.0.3: dependencies: decode-named-character-reference: 1.2.0 @@ -17406,6 +21569,10 @@ snapshots: dependencies: mime-db: 1.54.0 + mime@1.6.0: {} + + mimic-fn@1.2.0: {} + mimic-fn@2.1.0: {} mimic-response@1.0.1: {} @@ -17422,6 +21589,10 @@ snapshots: dependencies: '@isaacs/brace-expansion': 5.0.0 + minimatch@10.2.6: + dependencies: + brace-expansion: 5.0.9 + minimatch@3.1.2: dependencies: brace-expansion: 1.1.12 @@ -17509,6 +21680,8 @@ snapshots: ms@2.1.3: {} + multitars@1.0.2: {} + murmur-32@0.2.0: dependencies: encode-utf8: 1.0.3 @@ -17538,10 +21711,14 @@ snapshots: nanoid@3.3.11: {} + nanoid@3.3.18: {} + nanoid@5.1.6: {} natural-compare@1.4.0: {} + negotiator@0.6.3: {} + negotiator@0.6.4: {} negotiator@1.0.0: {} @@ -17559,13 +21736,13 @@ snapshots: node-abi@3.86.0: dependencies: - semver: 7.7.3 + semver: 7.8.5 node-addon-api@7.1.1: {} node-api-version@0.2.1: dependencies: - semver: 7.7.3 + semver: 7.8.5 node-domexception@1.0.0: {} @@ -17588,6 +21765,8 @@ snapshots: fetch-blob: 3.2.0 formdata-polyfill: 4.0.10 + node-forge@1.4.0: {} + node-gyp-build@4.8.4: {} node-html-markdown@2.0.0: @@ -17599,12 +21778,16 @@ snapshots: css-select: 5.2.2 he: 1.2.0 + node-int64@0.4.0: {} + node-pty@1.1.0: dependencies: node-addon-api: 7.1.1 node-releases@2.0.27: {} + node-releases@2.0.53: {} + nopt@6.0.0: dependencies: abbrev: 1.1.1 @@ -17622,6 +21805,13 @@ snapshots: normalize-url@6.1.0: {} + npm-package-arg@11.0.3: + dependencies: + hosted-git-info: 7.0.2 + proc-log: 4.2.0 + semver: 7.8.5 + validate-npm-package-name: 5.0.1 + npm-run-path@2.0.2: dependencies: path-key: 2.0.1 @@ -17630,8 +21820,18 @@ snapshots: dependencies: boolbase: 1.0.0 + nullthrows@1.1.1: {} + oauth4webapi@3.8.3: {} + ob1@0.84.4: + dependencies: + flow-enums-runtime: 0.0.6 + + ob1@0.84.5: + dependencies: + flow-enums-runtime: 0.0.6 + object-assign@4.1.1: {} object-inspect@1.13.4: {} @@ -17650,14 +21850,24 @@ snapshots: on-exit-leak-free@2.1.2: {} + on-finished@2.3.0: + dependencies: + ee-first: 1.1.1 + on-finished@2.4.1: dependencies: ee-first: 1.1.1 + on-headers@1.1.0: {} + once@1.4.0: dependencies: wrappy: 1.0.2 + onetime@2.0.1: + dependencies: + mimic-fn: 1.2.0 + onetime@5.1.2: dependencies: mimic-fn: 2.1.0 @@ -17705,6 +21915,15 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 + ora@3.4.0: + dependencies: + chalk: 2.4.2 + cli-cursor: 2.1.0 + cli-spinners: 2.9.2 + log-symbols: 2.2.0 + strip-ansi: 5.2.0 + wcwidth: 1.0.1 + ora@5.4.1: dependencies: bl: 4.1.0 @@ -17821,6 +22040,10 @@ snapshots: dependencies: error-ex: 1.3.4 + parse-png@2.1.0: + dependencies: + pngjs: 3.4.0 + parse-svg-path@0.1.2: {} parse5@7.3.0: @@ -17891,6 +22114,8 @@ snapshots: picomatch@4.0.3: {} + picomatch@4.0.5: {} + pify@2.3.0: {} pify@4.0.1: {} @@ -17933,6 +22158,8 @@ snapshots: base64-js: 1.5.1 xmlbuilder: 15.1.1 + pngjs@3.4.0: {} + pngjs@5.0.0: {} points-on-curve@0.2.0: {} @@ -17946,6 +22173,12 @@ snapshots: postcss-value-parser@4.2.0: {} + postcss@8.5.26: + dependencies: + nanoid: 3.3.18 + picocolors: 1.1.1 + source-map-js: 1.2.1 + postcss@8.5.6: dependencies: nanoid: 3.3.11 @@ -17974,6 +22207,16 @@ snapshots: transitivePeerDependencies: - debug + posthog-react-native@4.63.3(@react-native-async-storage/async-storage@3.1.1(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3))(expo-device@57.0.1(expo@57.0.15))(expo-file-system@57.0.5(expo@57.0.15)(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3)))(react-native-safe-area-context@5.7.0(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3)): + dependencies: + '@posthog/core': 1.48.6 + '@posthog/types': 1.405.0 + optionalDependencies: + '@react-native-async-storage/async-storage': 3.1.1(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3) + expo-device: 57.0.1(expo@57.0.15) + expo-file-system: 57.0.5(expo@57.0.15)(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3)) + react-native-safe-area-context: 5.7.0(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3) + postject@1.0.0-alpha.6: dependencies: commander: 9.5.0 @@ -17992,8 +22235,16 @@ snapshots: ansi-styles: 5.2.0 react-is: 17.0.2 + pretty-format@29.7.0: + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.3.1 + proc-log@2.0.1: {} + proc-log@4.2.0: {} + process-nextick-args@2.0.1: {} process-warning@5.0.0: {} @@ -18009,6 +22260,19 @@ snapshots: err-code: 2.0.3 retry: 0.12.0 + promise@7.3.1: + dependencies: + asap: 2.0.6 + + promise@8.3.0: + dependencies: + asap: 2.0.6 + + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + prop-types@15.8.1: dependencies: loose-envify: 1.4.0 @@ -18149,6 +22413,10 @@ snapshots: dependencies: hookified: 2.2.0 + qrcode.react@4.2.0(react@19.2.3): + dependencies: + react: 19.2.3 + qrcode@1.5.4: dependencies: dijkstrajs: 1.0.3 @@ -18161,6 +22429,13 @@ snapshots: query-selector-shadow-dom@1.0.1: {} + query-string@7.1.3: + dependencies: + decode-uri-component: 0.2.2 + filter-obj: 1.1.0 + split-on-first: 1.1.0 + strict-uri-encode: 2.0.0 + queue-microtask@1.2.3: {} queue@6.0.2: @@ -18253,15 +22528,170 @@ snapshots: iconv-lite: 0.7.1 unpipe: 1.0.0 + react-devtools-core@6.1.5: + dependencies: + shell-quote: 1.8.3 + ws: 7.5.13 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + react-dom@19.2.3(react@19.2.3): dependencies: react: 19.2.3 scheduler: 0.27.0 + react-fast-compare@3.2.2: {} + + react-freeze@1.0.4(react@19.2.3): + dependencies: + react: 19.2.3 + react-is@16.13.1: {} react-is@17.0.2: {} + react-is@18.3.1: {} + + react-is@19.2.8: {} + + react-native-drawer-layout@4.2.10(react-native-gesture-handler@2.32.0(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3))(react-native-reanimated@4.5.0(react-native-worklets@0.10.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3): + dependencies: + color: 4.2.3 + react: 19.2.3 + react-native: 0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3) + react-native-gesture-handler: 2.32.0(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3) + react-native-reanimated: 4.5.0(react-native-worklets@0.10.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3) + use-latest-callback: 0.2.6(react@19.2.3) + + react-native-fit-image@1.5.5: + dependencies: + prop-types: 15.8.1 + + react-native-gesture-handler@2.32.0(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3): + dependencies: + '@egjs/hammerjs': 2.0.17 + '@types/react-test-renderer': 19.1.0 + hoist-non-react-statics: 3.3.2 + invariant: 2.2.4 + react: 19.2.3 + react-native: 0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3) + + react-native-is-edge-to-edge@1.3.1(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3): + dependencies: + react: 19.2.3 + react-native: 0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3) + + react-native-markdown-display@7.0.2(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3): + dependencies: + css-to-react-native: 3.2.0 + markdown-it: 10.0.0 + prop-types: 15.8.1 + react: 19.2.3 + react-native: 0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3) + react-native-fit-image: 1.5.5 + + react-native-reanimated@4.5.0(react-native-worklets@0.10.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3): + dependencies: + react: 19.2.3 + react-native: 0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3) + react-native-is-edge-to-edge: 1.3.1(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3) + react-native-worklets: 0.10.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3) + semver: 7.8.5 + + react-native-safe-area-context@5.7.0(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3): + dependencies: + react: 19.2.3 + react-native: 0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3) + + react-native-screens@4.25.2(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3): + dependencies: + react: 19.2.3 + react-freeze: 1.0.4(react@19.2.3) + react-native: 0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3) + warn-once: 0.1.1 + + react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3): + dependencies: + '@babel/runtime': 7.28.6 + '@react-native/normalize-colors': 0.74.89 + fbjs: 3.0.5(encoding@0.1.13) + inline-style-prefixer: 7.0.1 + memoize-one: 6.0.0 + nullthrows: 1.1.1 + postcss-value-parser: 4.2.0 + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + styleq: 0.1.3 + transitivePeerDependencies: + - encoding + + react-native-worklets@0.10.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3): + dependencies: + '@babel/core': 7.28.5 + '@babel/plugin-transform-arrow-functions': 7.29.7(@babel/core@7.28.5) + '@babel/plugin-transform-class-properties': 7.29.7(@babel/core@7.28.5) + '@babel/plugin-transform-classes': 7.29.7(@babel/core@7.28.5) + '@babel/plugin-transform-nullish-coalescing-operator': 7.29.7(@babel/core@7.28.5) + '@babel/plugin-transform-optional-chaining': 7.29.7(@babel/core@7.28.5) + '@babel/plugin-transform-shorthand-properties': 7.29.7(@babel/core@7.28.5) + '@babel/plugin-transform-template-literals': 7.29.7(@babel/core@7.28.5) + '@babel/plugin-transform-unicode-regex': 7.29.7(@babel/core@7.28.5) + '@babel/preset-typescript': 7.29.7(@babel/core@7.28.5) + '@babel/types': 7.28.5 + '@react-native/metro-config': 0.86.0(@babel/core@7.28.5) + convert-source-map: 2.0.0 + react: 19.2.3 + react-native: 0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3) + semver: 7.8.5 + transitivePeerDependencies: + - supports-color + + react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3): + dependencies: + '@react-native/assets-registry': 0.86.0 + '@react-native/codegen': 0.86.0(@babel/core@7.28.5) + '@react-native/community-cli-plugin': 0.86.0(@react-native/metro-config@0.86.0(@babel/core@7.28.5)) + '@react-native/gradle-plugin': 0.86.0 + '@react-native/js-polyfills': 0.86.0 + '@react-native/normalize-colors': 0.86.0 + '@react-native/virtualized-lists': 0.86.0(@types/react@19.2.7)(react-native@0.86.0(@babel/core@7.28.5)(@react-native/metro-config@0.86.0(@babel/core@7.28.5))(@types/react@19.2.7)(react@19.2.3))(react@19.2.3) + abort-controller: 3.0.0 + anser: 1.4.10 + ansi-regex: 5.0.1 + babel-plugin-syntax-hermes-parser: 0.36.0 + base64-js: 1.5.1 + commander: 12.1.0 + flow-enums-runtime: 0.0.6 + hermes-compiler: 250829098.0.14 + invariant: 2.2.4 + memoize-one: 5.2.1 + metro-runtime: 0.84.5 + metro-source-map: 0.84.5 + nullthrows: 1.1.1 + pretty-format: 29.7.0 + promise: 8.3.0 + react: 19.2.3 + react-devtools-core: 6.1.5 + react-refresh: 0.14.2 + regenerator-runtime: 0.13.11 + scheduler: 0.27.0 + semver: 7.8.5 + stacktrace-parser: 0.1.11 + tinyglobby: 0.2.15 + whatwg-fetch: 3.6.20 + ws: 7.5.13 + yargs: 17.7.2 + optionalDependencies: + '@types/react': 19.2.7 + transitivePeerDependencies: + - '@babel/core' + - '@react-native-community/cli' + - '@react-native/metro-config' + - bufferutil + - supports-color + - utf-8-validate + react-redux@9.2.0(@types/react@19.2.7)(react@19.2.3)(redux@5.0.1): dependencies: '@types/use-sync-external-store': 0.0.6 @@ -18271,6 +22701,8 @@ snapshots: '@types/react': 19.2.7 redux: 5.0.1 + react-refresh@0.14.2: {} + react-refresh@0.18.0: {} react-remove-scroll-bar@2.3.8(@types/react@19.2.7)(react@19.2.3): @@ -18390,6 +22822,14 @@ snapshots: redux@5.0.1: {} + regenerate-unicode-properties@10.2.2: + dependencies: + regenerate: 1.4.2 + + regenerate@1.4.2: {} + + regenerator-runtime@0.13.11: {} + regex-recursion@6.0.2: dependencies: regex-utilities: 2.3.0 @@ -18400,6 +22840,21 @@ snapshots: dependencies: regex-utilities: 2.3.0 + regexpu-core@6.4.0: + dependencies: + regenerate: 1.4.2 + regenerate-unicode-properties: 10.2.2 + regjsgen: 0.8.0 + regjsparser: 0.13.2 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.2.1 + + regjsgen@0.8.0: {} + + regjsparser@0.13.2: + dependencies: + jsesc: 3.1.0 + rehype-harden@1.1.7: dependencies: unist-util-visit: 5.0.0 @@ -18510,6 +22965,10 @@ snapshots: resolve-from@4.0.0: {} + resolve-from@5.0.0: {} + + resolve-workspace-root@2.0.1: {} + resolve@1.22.11: dependencies: is-core-module: 2.16.1 @@ -18520,6 +22979,11 @@ snapshots: dependencies: lowercase-keys: 2.0.0 + restore-cursor@2.0.0: + dependencies: + onetime: 2.0.1 + signal-exit: 3.0.7 + restore-cursor@3.1.0: dependencies: onetime: 5.1.2 @@ -18638,6 +23102,8 @@ snapshots: safer-buffer@2.1.2: {} + sandbox-cli-detector@0.2.0: {} + sax@1.6.0: {} saxes@6.0.0: @@ -18666,6 +23132,24 @@ snapshots: semver@7.8.5: {} + send@0.19.2: + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.1 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + send@1.2.1: dependencies: debug: 4.4.3 @@ -18682,6 +23166,8 @@ snapshots: transitivePeerDependencies: - supports-color + serialize-error@2.1.0: {} + serialize-error@7.0.1: dependencies: type-fest: 0.13.1 @@ -18691,6 +23177,15 @@ snapshots: dependencies: randombytes: 2.1.0 + serve-static@1.16.3: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.19.2 + transitivePeerDependencies: + - supports-color + serve-static@2.2.1: dependencies: encodeurl: 2.0.0 @@ -18702,6 +23197,8 @@ snapshots: server-destroy@1.0.1: {} + server-only@0.0.1: {} + set-blocking@2.0.0: {} set-function-length@1.2.2: @@ -18717,12 +23214,16 @@ snapshots: setprototypeof@1.2.0: {} + sf-symbols-typescript@2.2.0: {} + sha.js@2.4.12: dependencies: inherits: 2.0.4 safe-buffer: 5.2.1 to-buffer: 1.2.2 + shallowequal@1.1.0: {} + sharp@0.35.3(@types/node@25.0.3): dependencies: '@img/colour': 1.1.0 @@ -18823,10 +23324,18 @@ snapshots: once: 1.4.0 simple-concat: 1.0.1 + simple-plist@1.3.1: + dependencies: + bplist-creator: 0.1.0 + bplist-parser: 0.3.1 + plist: 3.1.0 + simple-swizzle@0.2.4: dependencies: is-arrayish: 0.3.4 + sisteransi@1.0.5: {} + skin-tone@2.0.0: dependencies: unicode-emoji-modifier-base: 1.0.0 @@ -18836,6 +23345,8 @@ snapshots: ansi-styles: 6.2.3 is-fullwidth-code-point: 4.0.0 + slugify@1.6.9: {} + smart-buffer@4.2.0: {} socks-proxy-agent@7.0.0: @@ -18867,6 +23378,8 @@ snapshots: buffer-from: 1.1.2 source-map: 0.6.1 + source-map@0.5.7: {} + source-map@0.6.1: {} space-separated-tokens@2.0.2: {} @@ -18885,6 +23398,8 @@ snapshots: spdx-license-ids@3.0.22: {} + split-on-first@1.1.0: {} + split2@4.2.0: {} sprintf-js@1.0.3: {} @@ -18902,11 +23417,21 @@ snapshots: stackback@0.0.2: {} + stackframe@1.3.4: {} + + stacktrace-parser@0.1.11: + dependencies: + type-fest: 0.7.1 + + standard-navigation@0.0.5: {} + standardwebhooks@1.0.0: dependencies: '@stablelib/base64': 1.0.1 fast-sha256: 1.3.0 + statuses@1.5.0: {} + statuses@2.0.2: {} std-env@4.1.0: {} @@ -18916,8 +23441,7 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 - stream-buffers@2.2.0: - optional: true + stream-buffers@2.2.0: {} streamdown@1.6.10(@types/mdast@4.0.4)(micromark-util-types@2.0.2)(micromark@4.0.2)(react@19.2.3): dependencies: @@ -18950,6 +23474,8 @@ snapshots: - micromark-util-types - supports-color + strict-uri-encode@2.0.0: {} + string-template@0.2.1: {} string-width@4.2.3: @@ -18977,6 +23503,10 @@ snapshots: character-entities-html4: 2.1.0 character-entities-legacy: 3.0.0 + strip-ansi@5.2.0: + dependencies: + ansi-regex: 4.1.1 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -19009,6 +23539,8 @@ snapshots: dependencies: '@tokenizer/token': 0.3.0 + structured-headers@0.4.1: {} + style-mod@4.1.3: {} style-to-js@1.1.21: @@ -19019,6 +23551,8 @@ snapshots: dependencies: inline-style-parser: 0.2.7 + styleq@0.1.3: {} + stylis@4.3.6: {} sumchecker@3.0.1: @@ -19027,6 +23561,10 @@ snapshots: transitivePeerDependencies: - supports-color + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -19035,6 +23573,11 @@ snapshots: dependencies: has-flag: 4.0.0 + supports-hyperlinks@2.3.0: + dependencies: + has-flag: 4.0.0 + supports-color: 7.2.0 + supports-preserve-symlinks-flag@1.0.0: {} svg-arc-to-cubic-bezier@3.2.0: {} @@ -19047,6 +23590,8 @@ snapshots: symbol-tree@3.2.4: {} + tagged-tag@1.0.0: {} + tailwind-merge@3.4.0: {} tailwindcss@4.1.18: {} @@ -19068,6 +23613,11 @@ snapshots: rimraf: 2.6.3 optional: true + terminal-link@2.1.1: + dependencies: + ansi-escapes: 4.3.2 + supports-hyperlinks: 2.3.0 + terser-webpack-plugin@5.3.16(esbuild@0.24.2)(webpack@5.104.1(esbuild@0.24.2)): dependencies: '@jridgewell/trace-mapping': 0.3.31 @@ -19090,6 +23640,8 @@ snapshots: dependencies: real-require: 0.2.0 + throat@5.0.0: {} + tiny-each-async@2.0.3: optional: true @@ -19134,6 +23686,8 @@ snapshots: tmp@0.2.5: optional: true + tmpl@1.0.5: {} + tn1150@0.1.0: dependencies: unorm: 1.6.0 @@ -19167,6 +23721,8 @@ snapshots: '@tokenlens/helpers': 1.3.1 '@tokenlens/models': 1.3.0 + toqr@0.1.1: {} + tough-cookie@6.0.1: dependencies: tldts: 7.4.5 @@ -19216,8 +23772,14 @@ snapshots: type-fest@0.21.3: {} + type-fest@0.7.1: {} + type-fest@1.4.0: {} + type-fest@5.8.0: + dependencies: + tagged-tag: 1.0.0 + type-is@2.0.1: dependencies: content-type: 1.0.5 @@ -19245,6 +23807,14 @@ snapshots: typescript@5.9.3: {} + typescript@6.0.3: {} + + ua-parser-js@0.7.41: {} + + ua-parser-js@1.0.41: {} + + uc.micro@1.0.6: {} + uc.micro@2.1.0: {} ufo@1.6.1: {} @@ -19263,13 +23833,24 @@ snapshots: undici@7.28.0: {} + unicode-canonical-property-names-ecmascript@2.0.1: {} + unicode-emoji-modifier-base@1.0.0: {} + unicode-match-property-ecmascript@2.0.0: + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.1 + unicode-property-aliases-ecmascript: 2.2.0 + + unicode-match-property-value-ecmascript@2.2.1: {} + unicode-properties@1.4.1: dependencies: base64-js: 1.5.1 unicode-trie: 2.0.0 + unicode-property-aliases-ecmascript@2.2.0: {} + unicode-trie@2.0.0: dependencies: pako: 0.2.9 @@ -19343,6 +23924,12 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 + update-browserslist-db@1.3.1(browserslist@4.28.8): + dependencies: + browserslist: 4.28.8 + escalade: 3.2.0 + picocolors: 1.1.1 + uri-js@4.4.1: dependencies: punycode: 2.3.1 @@ -19356,6 +23943,10 @@ snapshots: optionalDependencies: '@types/react': 19.2.7 + use-latest-callback@0.2.6(react@19.2.3): + dependencies: + react: 19.2.3 + use-sidecar@1.1.3(@types/react@19.2.7)(react@19.2.3): dependencies: detect-node-es: 1.1.0 @@ -19379,8 +23970,12 @@ snapshots: util-deprecate@1.0.2: {} + utils-merge@1.0.1: {} + uuid@11.1.0: {} + uuid@7.0.3: {} + uuid@9.0.1: {} validate-npm-package-license@3.0.4: @@ -19388,8 +23983,19 @@ snapshots: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 + validate-npm-package-name@5.0.1: {} + vary@1.1.2: {} + vaul@1.1.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3): + dependencies: + '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + vfile-location@5.0.3: dependencies: '@types/unist': 3.0.3 @@ -19529,6 +24135,8 @@ snapshots: transitivePeerDependencies: - msw + vlq@1.0.1: {} + vscode-jsonrpc@8.2.0: {} vscode-languageserver-protocol@3.17.5: @@ -19562,6 +24170,12 @@ snapshots: transitivePeerDependencies: - debug + walker@1.0.8: + dependencies: + makeerror: 1.0.12 + + warn-once@0.1.1: {} + watchpack@2.5.1: dependencies: glob-to-regexp: 0.4.1 @@ -19617,8 +24231,12 @@ snapshots: whatsapp-rust-bridge@0.5.4: {} + whatwg-fetch@3.6.20: {} + whatwg-mimetype@5.0.0: {} + whatwg-url-minimum@0.1.2: {} + whatwg-url@16.0.1: dependencies: '@exodus/bytes': 1.15.1 @@ -19685,6 +24303,8 @@ snapshots: wrappy@1.0.2: {} + ws@7.5.13: {} + ws@8.21.0: {} wsl-utils@0.3.1: @@ -19696,6 +24316,11 @@ snapshots: x-is-string@0.1.0: {} + xcode@3.0.1: + dependencies: + simple-plist: 1.3.1 + uuid: 7.0.3 + xlsx@0.18.5: dependencies: adler-32: 1.3.1 @@ -19714,6 +24339,11 @@ snapshots: xml-naming@0.3.0: {} + xml2js@0.6.0: + dependencies: + sax: 1.6.0 + xmlbuilder: 11.0.1 + xmlbuilder2@2.1.2: dependencies: '@oozcitak/dom': 1.15.5 @@ -19722,6 +24352,8 @@ snapshots: xmlbuilder@10.1.1: {} + xmlbuilder@11.0.1: {} + xmlbuilder@15.1.1: {} xmlchars@2.2.0: {} @@ -19810,8 +24442,15 @@ snapshots: dependencies: zod: 4.2.1 + zod@3.25.76: {} + zod@4.2.1: {} zod@4.4.3: {} zwitch@2.0.4: {} + + zxing-wasm@3.1.3(@types/emscripten@1.41.5): + dependencies: + '@types/emscripten': 1.41.5 + type-fest: 5.8.0 diff --git a/apps/x/pnpm-workspace.yaml b/apps/x/pnpm-workspace.yaml index 6803ae13c..09e0b4b5d 100644 --- a/apps/x/pnpm-workspace.yaml +++ b/apps/x/pnpm-workspace.yaml @@ -51,3 +51,50 @@ minimumReleaseAgeExclude: - '@anthropic-ai/claude-agent-sdk-win32-arm64@0.3.232' - '@anthropic-ai/claude-agent-sdk-win32-x64@0.3.232' - '@anthropic-ai/claude-agent-sdk@0.3.232' + - '@expo/cli@57.0.8' + - '@expo/config-plugins@57.0.5' + - '@expo/config-types@57.0.2' + - '@expo/config@57.0.5' + - '@expo/devtools@57.0.1' + - '@expo/dom-webview@57.0.1' + - '@expo/env@2.4.2' + - '@expo/fingerprint@0.20.5' + - '@expo/image-utils@0.11.3' + - '@expo/inline-modules@0.1.3' + - '@expo/json-file@11.0.1' + - '@expo/local-build-cache-provider@57.0.4' + - '@expo/log-box@57.0.1' + - '@expo/metro-config@57.0.5' + - '@expo/metro-file-map@57.0.1' + - '@expo/metro-runtime@57.0.5' + - '@expo/osascript@2.7.1' + - '@expo/package-manager@1.13.1' + - '@expo/plist@0.8.1' + - '@expo/prebuild-config@57.0.7' + - '@expo/require-utils@57.0.3' + - '@expo/router-server@57.0.3' + - '@expo/schema-utils@57.0.2' + - '@expo/ui@57.0.6' + - babel-preset-expo@57.0.3 + - expo-asset@57.0.5 + - expo-constants@57.0.5 + - expo-device@57.0.1 + - expo-file-system@57.0.1 + - expo-font@57.0.1 + - expo-glass-effect@57.0.1 + - expo-image@57.0.1 + - expo-keep-awake@57.0.1 + - expo-linking@57.0.3 + - expo-modules-autolinking@57.0.7 + - expo-modules-core@57.0.5 + - expo-modules-jsi@57.0.3 + - expo-router@57.0.6 + - expo-server@57.0.1 + - expo-splash-screen@57.0.4 + - expo-status-bar@57.0.1 + - expo-symbols@57.0.1 + - expo-system-ui@57.0.1 + - expo-web-browser@57.0.1 + - expo@57.0.6 + - expo-camera@57.0.2 + - expo-secure-store@57.0.1