diff --git a/app/(tabs)/codex.tsx b/app/(tabs)/codex.tsx index be1e209..4f505a6 100644 --- a/app/(tabs)/codex.tsx +++ b/app/(tabs)/codex.tsx @@ -15,6 +15,44 @@ import { LastUpdated } from "@/components/LastUpdated"; import { ScreenErrorBoundary } from "@/components/ScreenErrorBoundary"; import { COLORS } from "@/lib/constants"; import { windowLabel } from "@/lib/timeUtils"; +import type { CodexResetCredit } from "@/types/codex"; + +function formatResetStatus(status?: string) { + if (!status) return "Unknown"; + return status.replace(/_/g, " ").replace(/\b\w/g, (char) => char.toUpperCase()); +} + +function ResetCreditRow({ credit }: { credit: CodexResetCredit }) { + return ( + + + + Credit {credit.index} + + + + {formatResetStatus(credit.status)} + + + + {credit.timeUntilExpiry && ( + + Expires in {credit.timeUntilExpiry} + + )} + {credit.expiresAtLocal && ( + + Expires {credit.expiresAtLocal} + + )} + {credit.grantedAtLocal && ( + + Granted {credit.grantedAtLocal} + + )} + + ); +} function CodexTabContent() { const { @@ -28,6 +66,9 @@ function CodexTabContent() { clearAuth, } = useCodexUsage(); + const resetCoupons = usage?.resetCoupons; + const availableResetCredits = + resetCoupons?.credits?.filter((credit) => credit.status === "available") ?? []; return ( - {usage.plan_type} + {usage.planType ?? "codex"} - - + {usage.primary && ( + + )} + {usage.secondary && ( + + )} {/* Credits */} @@ -162,7 +207,7 @@ function CodexTabContent() { Unlimited - ) : usage.credits.has_credits ? ( + ) : usage.credits.hasCredits ? ( ${Number(usage.credits.balance).toFixed(2)} remaining @@ -170,6 +215,47 @@ function CodexTabContent() { No credits )} + + {resetCoupons && ( + + + Reset Credits + + + {resetCoupons.availableCount ?? 0} available + + {typeof resetCoupons.totalEarnedCount === "number" && ( + + {resetCoupons.totalEarnedCount} earned total + + )} + {resetCoupons.nextExpiringCredit?.expiresAtLocal && ( + + Next expires {resetCoupons.nextExpiringCredit.expiresAtLocal} + + )} + {resetCoupons.nextExpiringCredit?.timeUntilExpiry && ( + + In {resetCoupons.nextExpiringCredit.timeUntilExpiry} + + )} + {availableResetCredits.length > 0 && ( + + + Available Now + + {availableResetCredits.map((credit) => ( + + ))} + + )} + {resetCoupons.source !== "live_api" && ( + + Source: {resetCoupons.sourceDescription} + + )} + + )} diff --git a/app/(tabs)/index.tsx b/app/(tabs)/index.tsx index c4b682b..a29d099 100644 --- a/app/(tabs)/index.tsx +++ b/app/(tabs)/index.tsx @@ -159,17 +159,17 @@ function DashboardTabContent() { - {codex.usage?.plan_type && ( + {codex.usage?.planType && ( - {codex.usage.plan_type} + {codex.usage.planType} )} {codex.auth && codex.status === "error" && ( )} - {codex.status === "success" && !codex.usage?.plan_type && ( + {codex.status === "success" && !codex.usage?.planType && ( )} @@ -189,22 +189,22 @@ function DashboardTabContent() { )} {codex.usage && ( - - + {codex.usage.primary && ( + + )} + {codex.usage.secondary && ( + + )} {!codex.usage.credits.unlimited && - codex.usage.credits.has_credits && ( + codex.usage.credits.hasCredits && ( @@ -226,6 +226,22 @@ function DashboardTabContent() { )} + {!!codex.usage.resetCoupons && ( + + + + + {codex.usage.resetCoupons.availableCount ?? 0} reset credits + available + + + {!!codex.usage.resetCoupons.nextExpiringCredit?.timeUntilExpiry && ( + + Next expires in {codex.usage.resetCoupons.nextExpiringCredit.timeUntilExpiry} + + )} + + )} diff --git a/app/(tabs)/settings.tsx b/app/(tabs)/settings.tsx index 8aae580..f3fc121 100644 --- a/app/(tabs)/settings.tsx +++ b/app/(tabs)/settings.tsx @@ -35,6 +35,12 @@ import { ScreenErrorBoundary } from "@/components/ScreenErrorBoundary"; import type { CodexAuth } from "@/types/codex"; import Constants from "expo-constants"; +function humanizeImportError(code: string): string { + if (code === "DOCUMENT_NOT_READABLE") { + return "The selected file could not be read. Try copying auth.json into Files or Downloads and import it again."; + } + return code; +} function SettingRow({ icon, label, @@ -160,7 +166,7 @@ function SettingsTabContent() { } catch (e: unknown) { const msg = e instanceof Error ? e.message : "UNKNOWN_ERROR"; if (msg !== "PICKER_CANCELLED") { - Alert.alert("Import failed", msg); + Alert.alert("Import failed", humanizeImportError(msg)); } } }; diff --git a/app/onboarding/codex.tsx b/app/onboarding/codex.tsx index ae54918..6c3f50a 100644 --- a/app/onboarding/codex.tsx +++ b/app/onboarding/codex.tsx @@ -8,6 +8,13 @@ import { saveCodexAuth, loadCodexAuth } from "@/lib/storage"; import type { CodexAuth } from "@/types/codex"; import { COLORS } from "@/lib/constants"; +function humanizeImportError(code: string): string { + if (code === "DOCUMENT_NOT_READABLE") { + return "The selected file could not be read. Try copying auth.json into Files or Downloads and import it again."; + } + return code; +} + export default function OnboardingCodexScreen() { const [auth, setAuth] = useState(null); const [loading, setLoading] = useState(false); @@ -28,7 +35,7 @@ export default function OnboardingCodexScreen() { setAuth(parsed); } catch (e: unknown) { const msg = e instanceof Error ? e.message : "UNKNOWN_ERROR"; - if (msg !== "PICKER_CANCELLED") setError(msg); + if (msg !== "PICKER_CANCELLED") setError(humanizeImportError(msg)); } finally { setLoading(false); } @@ -86,7 +93,7 @@ export default function OnboardingCodexScreen() { - Connected + Imported {auth.accountId && ( {auth.accountId.slice(0, 12)}… diff --git a/app/onboarding/done.tsx b/app/onboarding/done.tsx index 2cbebb2..f3dee71 100644 --- a/app/onboarding/done.tsx +++ b/app/onboarding/done.tsx @@ -77,7 +77,7 @@ export default function OnboardingDoneScreen() { Codex CLI - {codexConfigured ? "Connected" : "Not configured"} + {codexConfigured ? "Auth imported" : "Not configured"} @@ -105,7 +105,7 @@ export default function OnboardingDoneScreen() { Claude.ai - {claudeConfigured ? "Connected" : "Not configured"} + {claudeConfigured ? "Session saved" : "Not configured"} diff --git a/components/ErrorMessage.tsx b/components/ErrorMessage.tsx index 867a2af..14e2639 100644 --- a/components/ErrorMessage.tsx +++ b/components/ErrorMessage.tsx @@ -4,6 +4,8 @@ const ERROR_MESSAGES: Record = { TOKEN_EXPIRED: "Your session token has expired. Please reconfigure.", MISSING_ACCESS_TOKEN: "auth.json is missing the accessToken field.", INVALID_JSON: "The selected file is not valid JSON.", + DOCUMENT_NOT_READABLE: + "The selected file could not be read. Try copying auth.json into Files or Downloads and import it again.", NO_ORGS_FOUND: "No Claude organizations found for this session key.", INVALID_CODEX_RESPONSE: "Codex returned an unexpected response. The app was kept safe from invalid data.", diff --git a/hooks/useCodexUsage.ts b/hooks/useCodexUsage.ts index 9644ae7..d359162 100644 --- a/hooks/useCodexUsage.ts +++ b/hooks/useCodexUsage.ts @@ -19,10 +19,7 @@ type Status = "idle" | "loading" | "success" | "error"; function shouldRetry(error: unknown): boolean { const message = error instanceof Error ? error.message : ""; - return ( - message !== "TOKEN_EXPIRED" && - message !== "INVALID_CODEX_RESPONSE" - ); + return message !== "TOKEN_EXPIRED" && message !== "INVALID_CODEX_RESPONSE"; } function wait(ms: number): Promise { @@ -82,14 +79,6 @@ export function useCodexUsage() { } catch (caught: unknown) { if (version !== requestVersion.current) return; const message = caught instanceof Error ? caught.message : "UNKNOWN_ERROR"; - if (message === "TOKEN_EXPIRED") { - await clearCodexAuth(); - if (mounted.current) { - setAuth(null); - setUsage(null); - setLastFetchedAt(null); - } - } if (mounted.current) { setError(message); setStatus("error"); diff --git a/lib/api/codexApi.ts b/lib/api/codexApi.ts index 79ef483..0ed5c01 100644 --- a/lib/api/codexApi.ts +++ b/lib/api/codexApi.ts @@ -1,66 +1,86 @@ import type { CodexAuth, CodexUsageResponse } from "@/types/codex"; const USAGE_URL = "https://chatgpt.com/backend-api/wham/usage"; +const RESET_CREDITS_URL = + "https://chatgpt.com/backend-api/wham/rate-limit-reset-credits"; + +interface RawUsageWindow { + used_percent?: number; + limit_window_seconds?: number; + reset_at?: number; +} + +interface RawUsageResponse { + plan_type?: string | null; + rate_limit?: { + primary_window?: RawUsageWindow | null; + secondary_window?: RawUsageWindow | null; + } | null; + credits?: { + has_credits?: boolean; + unlimited?: boolean; + balance?: string | number; + } | null; + rate_limit_reached_type?: string | null; + rate_limit_reset_credits?: { + available_count?: number | null; + } | null; +} + +interface RawResetCredit { + status?: string; + granted_at?: string | null; + expires_at?: string | null; +} + +interface RawResetCreditsResponse { + available_count?: number | null; + total_earned_count?: number | null; + credits?: RawResetCredit[] | null; +} function isNumber(value: unknown): value is number { return typeof value === "number" && Number.isFinite(value); } -export function parseCodexUsageResponse(data: unknown): CodexUsageResponse { - if (!data || typeof data !== "object") { - throw new Error("INVALID_CODEX_RESPONSE"); - } +function formatDurationUntil(isoString: string | null | undefined): string | null { + if (!isoString) return null; - const value = data as Record; - const rateLimit = value.rate_limit as Record | undefined; - const primary = rateLimit?.primary_window as Record | undefined; - const secondary = rateLimit?.secondary_window as Record | undefined; - const credits = value.credits as Record | undefined; + const targetMs = new Date(isoString).getTime(); + if (Number.isNaN(targetMs)) return null; - const validWindow = (window: Record | undefined) => - !!window && - isNumber(window.used_percent) && - isNumber(window.reset_at) && - isNumber(window.limit_window_seconds); + let remainingSeconds = Math.max(Math.round((targetMs - Date.now()) / 1000), 0); + const days = Math.floor(remainingSeconds / 86400); + remainingSeconds -= days * 86400; + const hours = Math.floor(remainingSeconds / 3600); + remainingSeconds -= hours * 3600; + const minutes = Math.floor(remainingSeconds / 60); + remainingSeconds -= minutes * 60; - if ( - typeof value.plan_type !== "string" || - !validWindow(primary) || - !validWindow(secondary) || - !credits || - typeof credits.has_credits !== "boolean" || - typeof credits.unlimited !== "boolean" || - !isNumber(credits.balance) - ) { - throw new Error("INVALID_CODEX_RESPONSE"); - } + const parts: string[] = []; + if (days > 0) parts.push(`${days}d`); + if (hours > 0) parts.push(`${hours}h`); + if (minutes > 0) parts.push(`${minutes}m`); + if (remainingSeconds > 0 || parts.length === 0) parts.push(`${remainingSeconds}s`); + return parts.join(" "); +} - const primaryWindow = primary as Record; - const secondaryWindow = secondary as Record; +function normalizeWindow(window: RawUsageWindow | null | undefined) { + if (!window) return null; + + const windowSeconds = + typeof window.limit_window_seconds === "number" ? window.limit_window_seconds : 0; + const resetsAt = typeof window.reset_at === "number" ? window.reset_at : 0; return { - plan_type: value.plan_type, - rate_limit: { - primary_window: { - used_percent: primaryWindow.used_percent as number, - reset_at: primaryWindow.reset_at as number, - limit_window_seconds: primaryWindow.limit_window_seconds as number, - }, - secondary_window: { - used_percent: secondaryWindow.used_percent as number, - reset_at: secondaryWindow.reset_at as number, - limit_window_seconds: secondaryWindow.limit_window_seconds as number, - }, - }, - credits: { - has_credits: credits.has_credits, - unlimited: credits.unlimited, - balance: credits.balance, - }, + usedPercent: typeof window.used_percent === "number" ? window.used_percent : 0, + resetsAt, + windowMinutes: Math.round(windowSeconds / 60), + windowSeconds, }; } -export async function fetchCodexUsage(auth: CodexAuth): Promise { +function buildBaseHeaders(auth: CodexAuth): Record { const headers: Record = { Authorization: `Bearer ${auth.accessToken}`, "Content-Type": "application/json", @@ -70,6 +90,103 @@ export async function fetchCodexUsage(auth: CodexAuth): Promise ({ + index: index + 1, + status: credit.status, + grantedAt: credit.granted_at ?? null, + grantedAtLocal: credit.granted_at + ? new Date(credit.granted_at).toLocaleString() + : null, + expiresAt: credit.expires_at ?? null, + expiresAtLocal: credit.expires_at + ? new Date(credit.expires_at).toLocaleString() + : null, + timeUntilExpiry: formatDurationUntil(credit.expires_at), + })) + .sort((a, b) => { + const left = a.expiresAt ? new Date(a.expiresAt).getTime() : Number.MAX_SAFE_INTEGER; + const right = b.expiresAt ? new Date(b.expiresAt).getTime() : Number.MAX_SAFE_INTEGER; + return left - right; + }); + + const availableCredits = normalizedCredits.filter( + (credit) => credit.status === "available" + ); + + return { + source: "live_api" as const, + sourceDescription: "Live Codex reset-credit endpoint", + availableCount: + payload.available_count ?? usage.rate_limit_reset_credits?.available_count ?? null, + totalEarnedCount: payload.total_earned_count ?? null, + credits: normalizedCredits, + nextExpiringCredit: availableCredits[0] ?? normalizedCredits[0] ?? null, + }; + } catch (error) { + const message = error instanceof Error ? error.message : "UNKNOWN_ERROR"; + return { + source: "unavailable" as const, + sourceDescription: "Reset-credit endpoint unavailable", + availableCount: usage.rate_limit_reset_credits?.available_count ?? null, + fallbackReason: message, + error: message, + }; + } +} + +export function parseCodexUsageResponse(data: unknown): CodexUsageResponse { + if (!data || typeof data !== "object") { + throw new Error("INVALID_CODEX_RESPONSE"); + } + + const value = data as Record; + const primary = value.primary as Record | null | undefined; + const secondary = value.secondary as Record | null | undefined; + const credits = value.credits as Record | undefined; + + const validWindow = (window: Record | null | undefined) => + window === null || + window === undefined || + (isNumber(window.usedPercent) && + isNumber(window.resetsAt) && + isNumber(window.windowMinutes) && + isNumber(window.windowSeconds)); + + if ( + !validWindow(primary) || + !validWindow(secondary) || + !credits || + typeof credits.hasCredits !== "boolean" || + typeof credits.unlimited !== "boolean" || + !isNumber(credits.balance) + ) { + throw new Error("INVALID_CODEX_RESPONSE"); + } + + return value as unknown as CodexUsageResponse; +} + +export async function fetchCodexUsage(auth: CodexAuth): Promise { + const headers = buildBaseHeaders(auth); const response = await fetch(USAGE_URL, { headers }); if (response.status === 401 || response.status === 403) { @@ -80,6 +197,19 @@ export async function fetchCodexUsage(auth: CodexAuth): Promise { + try { + const response = await fetch(uri); + if (!response.ok) { + throw new Error(`HTTP_ERROR_${response.status}`); + } + return await response.text(); + } catch { + try { + return await LegacyFileSystem.readAsStringAsync(uri); + } catch { + const cacheDirectory = LegacyFileSystem.cacheDirectory; + if (!cacheDirectory) { + throw new Error("DOCUMENT_NOT_READABLE"); + } + + const destination = `${cacheDirectory}${Date.now()}-${sanitizeFileName( + fileName ?? "import.json" + )}`; + + try { + await LegacyFileSystem.copyAsync({ from: uri, to: destination }); + return await LegacyFileSystem.readAsStringAsync(destination); + } catch { + throw new Error("DOCUMENT_NOT_READABLE"); + } + } + } +} + export async function pickAndReadCodexAuth(): Promise { const result = await DocumentPicker.getDocumentAsync({ type: "application/json", @@ -9,9 +44,8 @@ export async function pickAndReadCodexAuth(): Promise { if (result.canceled) throw new Error("PICKER_CANCELLED"); - const { uri } = result.assets[0]; - const response = await fetch(uri); - const text = await response.text(); + const { uri, name } = result.assets[0]; + const text = await readPickedTextFile(uri, name); let parsed: Record; try { @@ -22,7 +56,11 @@ export async function pickAndReadCodexAuth(): Promise { const tokens = parsed["tokens"] as Record | undefined; const accessToken = (tokens?.["access_token"] ?? parsed["accessToken"]) as string | undefined; - const accountId = (tokens?.["account_id"] ?? parsed["accountId"]) as string | undefined; + const accountId = ( + tokens?.["account_id"] ?? + parsed["accountId"] ?? + parsed["account_id"] + ) as string | undefined; if (!accessToken || typeof accessToken !== "string") { throw new Error("MISSING_ACCESS_TOKEN"); diff --git a/lib/notifications.ts b/lib/notifications.ts index 82dcfd6..29f6358 100644 --- a/lib/notifications.ts +++ b/lib/notifications.ts @@ -56,7 +56,7 @@ export async function scheduleDailyDigest( } if (codexUsage) { parts.push( - `Codex: ${Math.round(codexUsage.rate_limit.secondary_window.used_percent)}% used` + `Codex: ${Math.round(codexUsage.secondary?.usedPercent ?? 0)}% used` ); } @@ -106,7 +106,7 @@ function buildThresholdAlerts( } if (codexUsage) { - const remaining = 100 - codexUsage.rate_limit.secondary_window.used_percent; + const remaining = 100 - (codexUsage.secondary?.usedPercent ?? 0); if (remaining <= thresholdPct) { alerts.push({ service: "Codex", window: "weekly", remaining }); } diff --git a/package-lock.json b/package-lock.json index d4f4b3b..0a57e3e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,14 +11,14 @@ "@expo/metro-runtime": "~56.0.15", "@expo/vector-icons": "^15.1.1", "babel-preset-expo": "~56.0.0", - "expo": "~56.0.12", - "expo-constants": "~56.0.18", + "expo": "~56.0.14", + "expo-constants": "~56.0.20", "expo-document-picker": "~56.0.4", "expo-file-system": "~56.0.8", "expo-font": "~56.0.7", - "expo-linking": "~56.0.14", - "expo-notifications": "~56.0.18", - "expo-router": "~56.2.11", + "expo-linking": "~56.0.15", + "expo-notifications": "~56.0.19", + "expo-router": "~56.2.13", "expo-secure-store": "~56.0.4", "expo-splash-screen": "~56.0.10", "expo-status-bar": "~56.0.4", @@ -85,6 +85,7 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/generator": "^7.29.7", @@ -969,7 +970,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.29.7.tgz", "integrity": "sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==", "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.29.7" }, @@ -985,7 +985,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.29.7.tgz", "integrity": "sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==", "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.29.7" }, @@ -1017,7 +1016,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.7.tgz", "integrity": "sha512-rNNFV0DBAJp988xW2DOntfDoYn1eR8GGF5AT5vYc+rjyfaQkM242c9tZUHHPe7KYaiJizXPWhQTzzdbXySyhBw==", "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.29.7" }, @@ -1211,15 +1209,15 @@ } }, "node_modules/@expo/config": { - "version": "56.0.9", - "resolved": "https://registry.npmjs.org/@expo/config/-/config-56.0.9.tgz", - "integrity": "sha512-/lqFeWGSrhpKJVP8tTN8LjuoIe8u8q2w7FzBL0C+wHgl+WM8l1qUIEYWy/sMvsG/NbpUIUsDHJRhQvOkU58eIw==", + "version": "56.0.11", + "resolved": "https://registry.npmjs.org/@expo/config/-/config-56.0.11.tgz", + "integrity": "sha512-Rt3U9Rqr6midz/sDeubFN5fefR0KzHpcEEgAUnV98XsLSSTnfzIxoC1blICb7pUUscKc8TtlVyn7/Gita2wnOQ==", "license": "MIT", "dependencies": { - "@expo/config-plugins": "~56.0.8", - "@expo/config-types": "^56.0.5", + "@expo/config-plugins": "~56.0.11", + "@expo/config-types": "^56.0.7", "@expo/json-file": "^10.2.0", - "@expo/require-utils": "^56.1.3", + "@expo/require-utils": "^56.1.4", "deepmerge": "^4.3.1", "getenv": "^2.0.0", "glob": "^13.0.0", @@ -1229,15 +1227,15 @@ } }, "node_modules/@expo/config-plugins": { - "version": "56.0.9", - "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-56.0.9.tgz", - "integrity": "sha512-/6a/S9USwx8OC9tGjHxbviLFiBHyueN3aoNWMLvWDEJoZ1CIVW800ZBzwXq/FYNK2qzcN1LxFmQtzD1zeFQKNA==", + "version": "56.0.11", + "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-56.0.11.tgz", + "integrity": "sha512-be/FpnTUCY0Qt6OH9qFknj9/R7v0OW0Tsxkf/V0CkXuhHjZtL3J8N4kZhhDj5KiHnw7lkbtMvgxGnCHqieF/7g==", "license": "MIT", "dependencies": { - "@expo/config-types": "^56.0.6", + "@expo/config-types": "^56.0.7", "@expo/json-file": "~10.2.0", "@expo/plist": "^0.7.0", - "@expo/require-utils": "^56.1.3", + "@expo/require-utils": "^56.1.4", "@expo/sdk-runtime-versions": "^1.0.0", "chalk": "^4.1.2", "debug": "^4.3.5", @@ -1250,9 +1248,9 @@ } }, "node_modules/@expo/config-types": { - "version": "56.0.6", - "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-56.0.6.tgz", - "integrity": "sha512-4Y6Aum5J4Re5NnxGVofRNe1aDwUBOmWhQYkynZsqzRtX/zEA1ADUeyHXuEckv9YD9djiyT7bKtLt5gKL3mA6VQ==", + "version": "56.0.7", + "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-56.0.7.tgz", + "integrity": "sha512-V7bxawNsNned/yMppAHdisIOxniZXgPKRWpIUiQOQBs45/A5MBd2gfDM4Ecq5gnbilnQUTaI6Zxn6JcW7L3TAA==", "license": "MIT" }, "node_modules/@expo/devcert": { @@ -1296,9 +1294,9 @@ } }, "node_modules/@expo/dom-webview": { - "version": "56.0.5", - "resolved": "https://registry.npmjs.org/@expo/dom-webview/-/dom-webview-56.0.5.tgz", - "integrity": "sha512-UIEJxkLg6cHqofKrpWpkn9E6ApxVRtCgZhZkARPr9VV7rBVloJgeroTHs31YgU/JpbI5lLQOnfOlGo54W6C2Ew==", + "version": "56.0.6", + "resolved": "https://registry.npmjs.org/@expo/dom-webview/-/dom-webview-56.0.6.tgz", + "integrity": "sha512-DQY3Tj5nrPbpIfEQiD9xbyEFTu25yEORa02Eyzl5rXszDzxDT4VkZDHkyErNQOyE1qjublJHNFhE5bDm4tRfqA==", "license": "MIT", "peerDependencies": { "expo": "*", @@ -1307,9 +1305,9 @@ } }, "node_modules/@expo/env": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@expo/env/-/env-2.3.0.tgz", - "integrity": "sha512-9HnnIbzwTTdbwSjNLXTk0fPm9ZwMJ7c1/31tsni8HZ8Q62KzYCyspahH+V365vg5J6lr001DzNwBxVWSaYCQLg==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@expo/env/-/env-2.3.1.tgz", + "integrity": "sha512-JvBdZa5OkTd+dGEtt3fLW9OF6RlIp9SNu9VyMSiWPV5szMDTSAYbX8Uj3cRvZcU1zzaRbqnTSsHk2AE8WXHfxQ==", "license": "MIT", "dependencies": { "chalk": "^4.0.0", @@ -1327,12 +1325,12 @@ "license": "MIT" }, "node_modules/@expo/fingerprint": { - "version": "0.19.4", - "resolved": "https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.19.4.tgz", - "integrity": "sha512-PsowRlO8+S7JlO8go7yhNEXp7sqlsWDE2AlCwoss7zH0dcajXFo74Fy0KdXEc4UXK7kKoHD37oDgsZ8aHSLr7A==", + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.19.6.tgz", + "integrity": "sha512-qNcb/8aDVi1QeQzS6bSkKU/7vld8WUSHYZnZbOtJx98BroztcN50yoj7PZ3ccuMB7PUHsWNAHJVM94VvDWnPPw==", "license": "MIT", "dependencies": { - "@expo/env": "^2.3.0", + "@expo/env": "^2.3.1", "@expo/spawn-async": "^1.8.0", "arg": "^5.0.2", "chalk": "^4.1.2", @@ -1349,12 +1347,12 @@ } }, "node_modules/@expo/image-utils": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@expo/image-utils/-/image-utils-0.10.1.tgz", - "integrity": "sha512-YDeefvmYdihS7Wp3ESDUVnOgOSWmj2Cczm9lVNDdm4MqQLdAKm/LPYg83HtFQPfefRlAxyHrQR/O9kIXN9C1Wg==", + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@expo/image-utils/-/image-utils-0.10.2.tgz", + "integrity": "sha512-qQUGaacqXduoFTCUQAMceIWYzlKU0xX4/BKTyh8TdVj0uHv9/W3MfHOy5yXoOqBVrSccXk++Gm4D/NfS5HnCNA==", "license": "MIT", "dependencies": { - "@expo/require-utils": "^56.1.3", + "@expo/require-utils": "^56.1.4", "@expo/spawn-async": "^1.8.0", "chalk": "^4.0.0", "getenv": "^2.0.0", @@ -1364,12 +1362,12 @@ } }, "node_modules/@expo/inline-modules": { - "version": "0.0.12", - "resolved": "https://registry.npmjs.org/@expo/inline-modules/-/inline-modules-0.0.12.tgz", - "integrity": "sha512-SNIZr/HWfIQPTZBwmukItxpc7ws1SgMUywYq1dnQvDknQDjJcuWAasIRFUjsK15yQ1xb4G5CP7VHtbN3V4lENg==", + "version": "0.0.13", + "resolved": "https://registry.npmjs.org/@expo/inline-modules/-/inline-modules-0.0.13.tgz", + "integrity": "sha512-26RllWesRmYsAAo70cRcR9DaqXPKJct9MIGxZteS+Tkg25ljOkFeG7fYEsSazZOLpAslKBiilqtZykVYrxSzCw==", "license": "MIT", "dependencies": { - "@expo/config-plugins": "~56.0.9" + "@expo/config-plugins": "~56.0.11" } }, "node_modules/@expo/json-file": { @@ -1383,27 +1381,27 @@ } }, "node_modules/@expo/local-build-cache-provider": { - "version": "56.0.8", - "resolved": "https://registry.npmjs.org/@expo/local-build-cache-provider/-/local-build-cache-provider-56.0.8.tgz", - "integrity": "sha512-UsuXwpNi57MNhzZ3be4XThc8xW6nzk3Wu37s1+2qcfZGeJcMLKDFfwO6n8YXeIiGlCsOi0Ee1rsTdgjrKt/YJQ==", + "version": "56.0.9", + "resolved": "https://registry.npmjs.org/@expo/local-build-cache-provider/-/local-build-cache-provider-56.0.9.tgz", + "integrity": "sha512-VMJC5ul7dXPfD2OO16ObPi6ym4H8vlnCBUuCM/KeKh0OvLRub35X8OB2uYrFQ+vbWkPemAEOWvk0oOptpPxbzA==", "license": "MIT", "dependencies": { - "@expo/config": "~56.0.9", + "@expo/config": "~56.0.11", "chalk": "^4.1.2" } }, "node_modules/@expo/log-box": { - "version": "56.0.13", - "resolved": "https://registry.npmjs.org/@expo/log-box/-/log-box-56.0.13.tgz", - "integrity": "sha512-QWRZSpWPyjkDLVQio4R7oAzg/Av2MOt/DciFkfjr8qQ3qxGVn1Rt1oHP/80hvcWDcHFV7N6PqpyxRXw6nbxzKQ==", + "version": "56.0.14", + "resolved": "https://registry.npmjs.org/@expo/log-box/-/log-box-56.0.14.tgz", + "integrity": "sha512-3Eadcxz0J2NESG2iKe8DnAggsRCWqY0mBLhgQPNzClPVjS6o4NyD0F8kuOvWNngFwpJBC08HhY2o8P1mgSgeJg==", "license": "MIT", "dependencies": { - "@expo/dom-webview": "^56.0.5", + "@expo/dom-webview": "^56.0.6", "anser": "^1.4.9", "stacktrace-parser": "^0.1.10" }, "peerDependencies": { - "@expo/dom-webview": "^56.0.5", + "@expo/dom-webview": "^56.0.6", "expo": "*", "react": "*", "react-native": "*" @@ -1431,6 +1429,72 @@ "metro-transform-worker": "0.84.4" } }, + "node_modules/@expo/metro-config": { + "version": "56.0.16", + "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-56.0.16.tgz", + "integrity": "sha512-mxPZ23exC6kkEpPYQOteamaiWYER3uDk2IqKys7EJwtIKc3F1207Xtsdko/DNNG04DLwpN/WM2UlNl+Ak8uPRg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.20.0", + "@babel/core": "^7.20.0", + "@babel/generator": "^7.20.5", + "@expo/config": "~56.0.11", + "@expo/env": "~2.3.1", + "@expo/json-file": "~10.2.0", + "@expo/metro": "~56.0.0", + "@expo/require-utils": "^56.1.4", + "@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.25.0", + "chalk": "^4.1.0", + "debug": "^4.3.2", + "getenv": "^2.0.0", + "glob": "^13.0.0", + "hermes-parser": "^0.33.3", + "jsc-safe-url": "^0.2.4", + "lightningcss": "^1.30.1", + "picomatch": "^4.0.4", + "postcss": "^8.5.14", + "resolve-from": "^5.0.0" + }, + "peerDependencies": { + "expo": "*" + }, + "peerDependenciesMeta": { + "expo": { + "optional": true + } + } + }, + "node_modules/@expo/metro-config/node_modules/hermes-estree": { + "version": "0.33.3", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.33.3.tgz", + "integrity": "sha512-6kzYZHCk8Fy1Uc+t3HGYyJn3OL4aeqKLTyina4UFtWl8I0kSL7OmKThaiX+Uh2f8nGw3mo4Ifxg0M5Zk3/Oeqg==", + "license": "MIT" + }, + "node_modules/@expo/metro-config/node_modules/hermes-parser": { + "version": "0.33.3", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.33.3.tgz", + "integrity": "sha512-Yg3HgaG4CqgyowtYjX/FsnPAuZdHOqSMtnbpylbptsQ9nwwSKsy6uRWcGO5RK0EqiX12q8HvDWKgeAVajRO5DA==", + "license": "MIT", + "dependencies": { + "hermes-estree": "0.33.3" + } + }, + "node_modules/@expo/metro-config/node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/@expo/metro-file-map": { "version": "56.0.3", "resolved": "https://registry.npmjs.org/@expo/metro-file-map/-/metro-file-map-56.0.3.tgz", @@ -1446,19 +1510,19 @@ } }, "node_modules/@expo/metro-runtime": { - "version": "56.0.15", - "resolved": "https://registry.npmjs.org/@expo/metro-runtime/-/metro-runtime-56.0.15.tgz", - "integrity": "sha512-WIWeVsL6kCSB57oYZdUA4MTkH7c67UFMIjdNoQzKXwxZYwBFE/xL2cGPDC3z8RWt0femzJTVxAVZUOW/hiqRzA==", + "version": "56.0.16", + "resolved": "https://registry.npmjs.org/@expo/metro-runtime/-/metro-runtime-56.0.16.tgz", + "integrity": "sha512-UsKrBLOCa+kAVHW1S0HdGkM0hkiQXeh3fZIpjcriOmoNg/CVRgdKQhUxUkNoXAoPfT85uW1x2fzNbiYhPQO1SA==", "license": "MIT", "dependencies": { - "@expo/log-box": "^56.0.13", + "@expo/log-box": "^56.0.14", "anser": "^1.4.9", "pretty-format": "^29.7.0", "stacktrace-parser": "^0.1.10", "whatwg-fetch": "^3.0.0" }, "peerDependencies": { - "@expo/log-box": "^56.0.13", + "@expo/log-box": "^56.0.14", "expo": "*", "react": "*", "react-dom": "*", @@ -1471,9 +1535,9 @@ } }, "node_modules/@expo/osascript": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@expo/osascript/-/osascript-2.6.0.tgz", - "integrity": "sha512-QvqDBlJXa8CS2vRORJ4wEflY1m0vVI07uSJdIRgBrLxRPBcsrXxrtU7+wXRXMqfq9zLwNP9XbvRsXF2omoDylg==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@expo/osascript/-/osascript-2.7.0.tgz", + "integrity": "sha512-wKIXL8UtbuX4KwavPasIW3CUcgTbYfjzLcgUhjyKUAYDEqMaf6gmU1bqz3ffBPTokmX+G8/vFG1ZuI9etQWukA==", "license": "MIT", "dependencies": { "@expo/spawn-async": "^1.8.0" @@ -1483,12 +1547,12 @@ } }, "node_modules/@expo/package-manager": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@expo/package-manager/-/package-manager-1.12.1.tgz", - "integrity": "sha512-fQLiFAcFRWF53mtuLK32SUJQ1ahhrTcBZPZPedYTiUT5ha5FF+UO6bPtCc0Y/hgj0/m3HCGBAuSHjbg2kI9oPQ==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/@expo/package-manager/-/package-manager-1.13.0.tgz", + "integrity": "sha512-s3W3eZafJDEyVL7W/jxj2Nz3eONKxSCU604S5xj8ijrVaRz83x0DnZznLf/UXQEI1w+FyibH68nHeQyk767b1A==", "license": "MIT", "dependencies": { - "@expo/json-file": "^10.2.0", + "@expo/json-file": "^11.0.0", "@expo/spawn-async": "^1.8.0", "chalk": "^4.0.0", "npm-package-arg": "^11.0.0", @@ -1496,6 +1560,16 @@ "resolve-workspace-root": "^2.0.0" } }, + "node_modules/@expo/package-manager/node_modules/@expo/json-file": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-11.0.0.tgz", + "integrity": "sha512-pHJCETqFL5x5BzNV6cEPwjwuECgGmnl0bNmfHIJ6LM1tlh2eVXi5HEdit3zby/JO/B8Otk5cgcqtJXgvvUat3A==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.20.0", + "json5": "^2.2.3" + } + }, "node_modules/@expo/plist": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.7.0.tgz", @@ -1508,27 +1582,27 @@ } }, "node_modules/@expo/prebuild-config": { - "version": "56.0.16", - "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-56.0.16.tgz", - "integrity": "sha512-ce9ENfPWO4WUWUVQz0OaqL3KYZ7YofP8O35ncnn7CHCaKwQ7BqxcCGJbh+qvP1UjlWeNB3CjHPrXXJ3bnZwlJw==", + "version": "56.0.18", + "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-56.0.18.tgz", + "integrity": "sha512-OnzuPMVUWbj8x5XeYkzxW4X36AUGkp1Kif2h9FrcyXNT67NoWOgxeTB8udQBBA1uodR+wcf8Hxz8H5TgIpp4ig==", "license": "MIT", "dependencies": { - "@expo/config": "~56.0.9", - "@expo/config-plugins": "~56.0.9", - "@expo/config-types": "^56.0.6", - "@expo/image-utils": "^0.10.1", + "@expo/config": "~56.0.11", + "@expo/config-plugins": "~56.0.11", + "@expo/config-types": "^56.0.7", + "@expo/image-utils": "^0.10.2", "@expo/json-file": "^10.2.0", "@react-native/normalize-colors": "0.85.3", "debug": "^4.3.1", - "expo-modules-autolinking": "~56.0.16", + "expo-modules-autolinking": "~56.0.18", "resolve-from": "^5.0.0", "semver": "^7.6.0" } }, "node_modules/@expo/require-utils": { - "version": "56.1.3", - "resolved": "https://registry.npmjs.org/@expo/require-utils/-/require-utils-56.1.3.tgz", - "integrity": "sha512-KyLeOn/zzQSvuPpV5YhB/FPKnpQytno4luN918bGdPDssLBoS3N/0UbC3W0rJAn9kSFu+XpfR81eABRVsSdfgQ==", + "version": "56.1.4", + "resolved": "https://registry.npmjs.org/@expo/require-utils/-/require-utils-56.1.4.tgz", + "integrity": "sha512-IX7XXg9obnrH3ni0TClBbVKgqk0nT0bjTEPTBtbD+WgIeZ0hpcgwxMJH3j5uBsUqEAq1jqUAkJWrPcg7ZRSV7g==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.20.0", @@ -1545,9 +1619,9 @@ } }, "node_modules/@expo/schema-utils": { - "version": "56.0.1", - "resolved": "https://registry.npmjs.org/@expo/schema-utils/-/schema-utils-56.0.1.tgz", - "integrity": "sha512-CZ/+mYbQmWeOnkCGlWy9K+lFxbJSMFY7+TqBZcKzBSTU5Q7IGRvn/sOG3TdNjIdLPmbA8xe7R/c3UUQ28R9i9w==", + "version": "56.0.2", + "resolved": "https://registry.npmjs.org/@expo/schema-utils/-/schema-utils-56.0.2.tgz", + "integrity": "sha512-WcOH1E6rwxRqNwBzPOVhd5GBbMlS04+5n+ZMdhdwKOg/Kt3suV+F8F6An+z8mUJ8eSuMM3HD9Sj09t7vc/Xjkw==", "license": "MIT" }, "node_modules/@expo/sdk-runtime-versions": { @@ -1574,6 +1648,35 @@ "integrity": "sha512-HHQigo3rQWKMDzYDLkubN5WQOYXJJE2eNqIQC2axC2iO3mHdwnIR7FgZVvHWtBwAdzBgAP0ECp8KqS8TiMKvgw==", "license": "MIT" }, + "node_modules/@expo/ui": { + "version": "56.0.20", + "resolved": "https://registry.npmjs.org/@expo/ui/-/ui-56.0.20.tgz", + "integrity": "sha512-GdQ0tE4YhI/Ij0Nl/NHoul0GC0N4riRN0d7gE+1mSOLykVtHsR19eD3MUWr6PwQZCC45uUxviSJ9c3hOztswPw==", + "license": "MIT", + "dependencies": { + "sf-symbols-typescript": "^2.1.0", + "vaul": "^1.1.2" + }, + "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 + } + } + }, "node_modules/@expo/vector-icons": { "version": "15.1.1", "resolved": "https://registry.npmjs.org/@expo/vector-icons/-/vector-icons-15.1.1.tgz", @@ -1734,14 +1837,14 @@ "license": "MIT" }, "node_modules/@radix-ui/react-collection": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.10.tgz", - "integrity": "sha512-IVVz4EvBcKjrzKgof714qDnz/SzQAkLA2Emh5edlHbgcE6fNd3Un6CJLlaYcnm8N4JmAtzQgse4dOKxcD2yc9g==", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.11.tgz", + "integrity": "sha512-djW9+zeg137KQdlPtmE8xnaD+K2rcXXMWFrSg0hsmYZ6HRbdTA7tDHFgpaW9+huWVEu0RCabL+985T4TA0BE7g==", "license": "MIT", "dependencies": { "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-primitive": "2.1.6", + "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-slot": "1.3.0" }, "peerDependencies": { @@ -1790,21 +1893,21 @@ } }, "node_modules/@radix-ui/react-dialog": { - "version": "1.1.17", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.17.tgz", - "integrity": "sha512-TDTYmpdq8dI2+Xgvgj9AJ8Ghqq+Eph/TRVEdaFQPDItIY+6QSkU7MJMeevw1568Yw/2Ijz8BTphPSP2XejKphw==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.18.tgz", + "integrity": "sha512-apa28mldjMgORmE6g/w3sCcA0Y9UAVeeDVoozN4i7kOw12mLl9RBchfzK3Nn6qxOWjrZhK1Lfy7f07kyzxtnBw==", "license": "MIT", "dependencies": { "@radix-ui/primitive": "1.1.4", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-dismissable-layer": "1.1.13", + "@radix-ui/react-dismissable-layer": "1.1.14", "@radix-ui/react-focus-guards": "1.1.4", - "@radix-ui/react-focus-scope": "1.1.10", + "@radix-ui/react-focus-scope": "1.1.11", "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-portal": "1.1.12", + "@radix-ui/react-portal": "1.1.13", "@radix-ui/react-presence": "1.1.6", - "@radix-ui/react-primitive": "2.1.6", + "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-slot": "1.3.0", "@radix-ui/react-use-controllable-state": "1.2.3", "aria-hidden": "^1.2.4", @@ -1841,16 +1944,16 @@ } }, "node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.13.tgz", - "integrity": "sha512-2v+zNAWWe0ySxgC0D0yeXMPQ23xZVgXZTerTz+JKlmdRj6gfTqmCcR29jb6d290DezXPGgruHWDX/vYUebtErg==", + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.14.tgz", + "integrity": "sha512-4lUhWTWAjbDIqFrAPWJ3WqBOpO5YchVZ88X3nh6H9Lu5AFi5nCUeTPj3D8FSDmabmFeRe9ME0BDA4MwKTha5GQ==", "license": "MIT", "dependencies": { "@radix-ui/primitive": "1.1.4", "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-primitive": "2.1.6", + "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-use-callback-ref": "1.1.2", - "@radix-ui/react-use-escape-keydown": "1.1.2" + "@radix-ui/react-use-effect-event": "0.0.3" }, "peerDependencies": { "@types/react": "*", @@ -1883,13 +1986,13 @@ } }, "node_modules/@radix-ui/react-focus-scope": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.10.tgz", - "integrity": "sha512-Fas/lXQqhVvqwAb64s5RFeHiHYElZ6SUQbZaNd6EkfhP/Al7wTIQ9WIR4QVX475tlu5yFCEdDcJH6/UwsZjMWw==", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.11.tgz", + "integrity": "sha512-Mn88Vg2whaRocGJNOH+DKFqYm6ySFPQaiwHNxZPyjn99B52KAEJWWY9NP83+nWdk2HM3rdov+STu9AG471Rt9w==", "license": "MIT", "dependencies": { "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-primitive": "2.1.6", + "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-use-callback-ref": "1.1.2" }, "peerDependencies": { @@ -1926,12 +2029,12 @@ } }, "node_modules/@radix-ui/react-portal": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.12.tgz", - "integrity": "sha512-m309havGzsjLHHaIX50G5PlvRs3xkgPCsGk/5PTvYm8D5q33yG0J7w/712PTOhid7NTaFETtnSXjngHQavvhVw==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.13.tgz", + "integrity": "sha512-z3oXfmaHLJTF1wktbjgD6cn9jiEbq3WSondB10LIuIt2m2Ym4iJlrW04/euMwENDdWDdE7z+OuY7Qyp1YpRSwA==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.6", + "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-use-layout-effect": "1.1.2" }, "peerDependencies": { @@ -1973,9 +2076,9 @@ } }, "node_modules/@radix-ui/react-primitive": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.6.tgz", - "integrity": "sha512-wetd0QI77DbvrPpTAvH1SqOxsYF2wZe5TNxqwOd5Ty4XDpV3dpV0s8K/1MGMJBeY5o7lg8ub5VIt1Ub+yVen6g==", + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.7.tgz", + "integrity": "sha512-bC3NiwsprbxKjuon9l7X6BUTw7FPVzEYaL92MPEY5SCd/9hUTPXVFtVwRix7778wtRsVao+zE062gL79FZleeQ==", "license": "MIT", "dependencies": { "@radix-ui/react-slot": "1.3.0" @@ -1996,18 +2099,18 @@ } }, "node_modules/@radix-ui/react-roving-focus": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.13.tgz", - "integrity": "sha512-9gkwneI0guf8JDmrFxPjJF6Ozzgioyw+/lonYNCwefS9ZHA05er0BVHiXr+LbWGHxUfczvMY6G1oiZZi1VzjRw==", + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.14.tgz", + "integrity": "sha512-8Qcnx9447tx/aCBgw6Jenfqg4Skq+vqab9mCBmuGNipIS5YXvL275wbKEu7+ICYHIlAPgCduUMJH1XOYewKF6Q==", "license": "MIT", "dependencies": { "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-collection": "1.1.10", + "@radix-ui/react-collection": "1.1.11", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.1.4", "@radix-ui/react-direction": "1.1.2", "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-primitive": "2.1.6", + "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-use-callback-ref": "1.1.2", "@radix-ui/react-use-controllable-state": "1.2.3" }, @@ -2044,6 +2147,36 @@ } } }, + "node_modules/@radix-ui/react-tabs": { + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.16.tgz", + "integrity": "sha512-v3Ab2l7z6U7tRB4xA0IyKdq0OsqaO1o9ZjsIEoKKnSZ/l96mZz8aCTX0NCXw+YVHJXr8Km4d+Mn6/Q8YjXa+gw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.4", + "@radix-ui/react-context": "1.1.4", + "@radix-ui/react-direction": "1.1.2", + "@radix-ui/react-id": "1.1.2", + "@radix-ui/react-presence": "1.1.6", + "@radix-ui/react-primitive": "2.1.7", + "@radix-ui/react-roving-focus": "1.1.14", + "@radix-ui/react-use-controllable-state": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-use-callback-ref": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.2.tgz", @@ -2096,24 +2229,6 @@ } } }, - "node_modules/@radix-ui/react-use-escape-keydown": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.2.tgz", - "integrity": "sha512-2uVLvLjgO7NZCWw01/FdqRwmA42J0BcjPMUCA+koFEOAb+zjqIP7SiFz/7zWPrKnVmSqr76Omq2ALyCuX4dhLw==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-callback-ref": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, "node_modules/@radix-ui/react-use-layout-effect": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.2.tgz", @@ -2166,7 +2281,6 @@ "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.85.3.tgz", "integrity": "sha512-fD7fxEhkJB/aF57tWoXjaAWpklfrExYZS3k6aXPP3BQ77DZY7gvf/b7dbirwjID6NVnP1JDRJyTuPBGr0K/vlw==", "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/plugin-proposal-export-default-from": "^7.24.7", @@ -2344,7 +2458,6 @@ "resolved": "https://registry.npmjs.org/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.85.3.tgz", "integrity": "sha512-omuKq+r7jM4XvCMIlNMPP7Up3SyB8o5EAdZtF7YXniKyq7UOMBqhYHFqgsdOXr0lT+3ADf7VCJG3sb82jlBrrQ==", "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@react-native/babel-preset": "0.85.3", @@ -2362,15 +2475,13 @@ "version": "0.33.3", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.33.3.tgz", "integrity": "sha512-6kzYZHCk8Fy1Uc+t3HGYyJn3OL4aeqKLTyina4UFtWl8I0kSL7OmKThaiX+Uh2f8nGw3mo4Ifxg0M5Zk3/Oeqg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@react-native/metro-babel-transformer/node_modules/hermes-parser": { "version": "0.33.3", "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.33.3.tgz", "integrity": "sha512-Yg3HgaG4CqgyowtYjX/FsnPAuZdHOqSMtnbpylbptsQ9nwwSKsy6uRWcGO5RK0EqiX12q8HvDWKgeAVajRO5DA==", "license": "MIT", - "peer": true, "dependencies": { "hermes-estree": "0.33.3" } @@ -2380,7 +2491,6 @@ "resolved": "https://registry.npmjs.org/@react-native/metro-config/-/metro-config-0.85.3.tgz", "integrity": "sha512-sVo6HepUmCcpdfozEf91lA0FjpLNNZYu/Zi9FiYiAQTK8pzATXDVTqhvdxpFrQn435p5eUTSbllvbH/KN+bnyA==", "license": "MIT", - "peer": true, "dependencies": { "@react-native/js-polyfills": "0.85.3", "@react-native/metro-babel-transformer": "0.85.3", @@ -2431,7 +2541,6 @@ "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", @@ -2451,7 +2560,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -2464,7 +2572,6 @@ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", @@ -2478,8 +2585,7 @@ "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@testing-library/jest-dom": { "version": "6.9.1", @@ -2523,8 +2629,7 @@ "version": "5.0.4", "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", @@ -2564,6 +2669,7 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.17.tgz", "integrity": "sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==", "license": "MIT", + "peer": true, "dependencies": { "csstype": "^3.2.2" } @@ -2573,7 +2679,6 @@ "resolved": "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-19.1.0.tgz", "integrity": "sha512-XD0WZrHqjNrxA/MaR9O22w/RNidWR9YZmBdRGI7wcnWGrv/3dA8wKCJ8m63Sn+tLJhcjmuhOi629N66W6kgWzQ==", "license": "MIT", - "peer": true, "dependencies": { "@types/react": "*" } @@ -2654,6 +2759,18 @@ "node": ">= 14" } }, + "node_modules/agent-cli-detector": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/agent-cli-detector/-/agent-cli-detector-0.1.2.tgz", + "integrity": "sha512-qdZ/9JFORtTKJNhT/IczMeEfEUbUU0K5umYeiIQHX+AjHs+Y9SXVzSgaYlpZeyNMrvuh2HpZiOTpvS57iPfBkQ==", + "license": "MIT", + "bin": { + "agent-cli-detector": "dist/cli.js" + }, + "engines": { + "node": ">=18.18" + } + }, "node_modules/anser": { "version": "1.4.10", "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", @@ -2872,9 +2989,9 @@ } }, "node_modules/babel-preset-expo": { - "version": "56.0.15", - "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-56.0.15.tgz", - "integrity": "sha512-0MqbQoM6nBUbKvgu2xJ4VixZnUTGTq3HB2WwvOikdO4CiPxbQ+wGA25fOoHHSni5iEFW39wy6y1ookTWlq3wVw==", + "version": "56.0.16", + "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-56.0.16.tgz", + "integrity": "sha512-HkTZP+nWVGTibw+JCiy2yCXPPXhFUbqG6xdZRSnnAv+tZUdsCdvGnfEl14shS1mZWIY0VSf/rWpkzIEsZKyqhQ==", "license": "MIT", "dependencies": { "@babel/generator": "^7.20.5", @@ -2923,7 +3040,7 @@ "peerDependencies": { "@babel/runtime": "^7.20.0", "expo": "*", - "expo-widgets": "^56.0.18", + "expo-widgets": "^56.0.20", "react-refresh": ">=0.14.0 <1.0.0" }, "peerDependenciesMeta": { @@ -3016,9 +3133,9 @@ } }, "node_modules/bplist-parser": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.1.tgz", - "integrity": "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz", + "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==", "license": "MIT", "dependencies": { "big-integer": "1.6.x" @@ -3028,9 +3145,9 @@ } }, "node_modules/brace-expansion": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", - "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.7.tgz", + "integrity": "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==", "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" @@ -3070,6 +3187,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.10.38", "caniuse-lite": "^1.0.30001799", @@ -3625,8 +3743,7 @@ "version": "0.5.16", "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ee-first": { "version": "1.1.1", @@ -3732,31 +3849,32 @@ } }, "node_modules/expo": { - "version": "56.0.12", - "resolved": "https://registry.npmjs.org/expo/-/expo-56.0.12.tgz", - "integrity": "sha512-FxgdI/Yqva6iJOThZIHfvxlKPxs4EC4uScUnEswwSArR/Fj9k430O13R590LcOQTsdNsjIs+GBHwjfoAY6vmAQ==", + "version": "56.0.14", + "resolved": "https://registry.npmjs.org/expo/-/expo-56.0.14.tgz", + "integrity": "sha512-YfjXv/owsBhys0HS2K9kd5ONi+FYTNKzoMOCZB5sza0K7JjzjQ1dVC+KzUA27B3GN2RuAyeBoW8jItNr56EBGg==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.20.0", - "@expo/cli": "^56.1.16", - "@expo/config": "~56.0.9", - "@expo/config-plugins": "~56.0.9", + "@expo/cli": "^56.1.18", + "@expo/config": "~56.0.11", + "@expo/config-plugins": "~56.0.11", "@expo/devtools": "~56.0.2", - "@expo/dom-webview": "~56.0.5", - "@expo/fingerprint": "^0.19.4", - "@expo/local-build-cache-provider": "^56.0.8", - "@expo/log-box": "^56.0.13", + "@expo/dom-webview": "~56.0.6", + "@expo/fingerprint": "^0.19.6", + "@expo/local-build-cache-provider": "^56.0.9", + "@expo/log-box": "^56.0.14", "@expo/metro": "~56.0.0", - "@expo/metro-config": "~56.0.14", + "@expo/metro-config": "~56.0.16", "@ungap/structured-clone": "^1.3.0", - "babel-preset-expo": "~56.0.15", - "expo-asset": "~56.0.17", - "expo-constants": "~56.0.18", + "babel-preset-expo": "~56.0.16", + "expo-asset": "~56.0.18", + "expo-constants": "~56.0.20", "expo-file-system": "~56.0.8", "expo-font": "~56.0.7", "expo-keep-awake": "~56.0.3", - "expo-modules-autolinking": "~56.0.16", - "expo-modules-core": "~56.0.17", + "expo-modules-autolinking": "~56.0.18", + "expo-modules-core": "~56.0.19", "pretty-format": "^29.7.0", "react-refresh": "^0.14.2", "whatwg-url-minimum": "^0.1.2" @@ -3802,13 +3920,29 @@ "expo": "*" } }, - "node_modules/expo-constants": { + "node_modules/expo-asset": { "version": "56.0.18", - "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-56.0.18.tgz", - "integrity": "sha512-8AMtbDGl/WVPnWlmbpGmvcdnNCy9E4PFnwdVwj600vljkMDPSxcAcjw8GVXEPk3PpZ+ngTqsrkltWyj0UKYAxw==", + "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-56.0.18.tgz", + "integrity": "sha512-koV8oOW/U4mPP+sWHhsSxk4GdYrO6s/vZU3/OMeDwiyjeqeNJWfjpVUS94HERzwvcthPiX419X3PNj0p9XKt+g==", "license": "MIT", "dependencies": { - "@expo/env": "~2.3.0" + "@expo/image-utils": "^0.10.1", + "expo-constants": "~56.0.19" + }, + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*" + } + }, + "node_modules/expo-constants": { + "version": "56.0.20", + "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-56.0.20.tgz", + "integrity": "sha512-4HgoVvUiMvcqujr/CUj7L1tumLWj8WX0PLM77OriDPoaJrMEwUHd841m4o4IoUyMPVT8XTiTiPFwJtGali8+9Q==", + "license": "MIT", + "peer": true, + "dependencies": { + "@expo/env": "~2.3.1" }, "peerDependencies": { "expo": "*", @@ -3839,6 +3973,7 @@ "resolved": "https://registry.npmjs.org/expo-font/-/expo-font-56.0.7.tgz", "integrity": "sha512-hpU/vRwPzsby9lPGkA4blDqLIIXYzoWnCZHr6PxvcWbY/uPObAiyhh6q+e0WYsB65SthK+PLH95jEnVag7fwEg==", "license": "MIT", + "peer": true, "dependencies": { "fontfaceobserver": "^2.1.0" }, @@ -3859,13 +3994,24 @@ "react-native": "*" } }, - "node_modules/expo-linking": { - "version": "56.0.14", - "resolved": "https://registry.npmjs.org/expo-linking/-/expo-linking-56.0.14.tgz", - "integrity": "sha512-IvVQHWC+Cj4fK5qD3iEVYqpU2a4rLW0IpAAlGJ4MH+H1fyZiHh3eN6qg2WmoclOEPfYATSuEa+dQT6wfgVpXlQ==", + "node_modules/expo-keep-awake": { + "version": "56.0.3", + "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-56.0.3.tgz", + "integrity": "sha512-CLMJXtEiMKknD3Rpm8CRwE6ZJUzu2yCEmRk1sgfHAJ1zIbuEWY3dpPDubtsnuzWm+2k6Sru+yaFbYsvPWmTiBA==", "license": "MIT", + "peerDependencies": { + "expo": "*", + "react": "*" + } + }, + "node_modules/expo-linking": { + "version": "56.0.15", + "resolved": "https://registry.npmjs.org/expo-linking/-/expo-linking-56.0.15.tgz", + "integrity": "sha512-V3tkCxHIWO624ayw2L5Nfi0/bPgYy/0MgmoQR7g3FAKF4nyAayK8IhgAInz4MZ5Ao5Bb+5uZWDdUaS4yyEb+Gw==", + "license": "MIT", + "peer": true, "dependencies": { - "expo-constants": "~56.0.18", + "expo-constants": "~56.0.20", "invariant": "^2.2.4" }, "peerDependencies": { @@ -3874,12 +4020,12 @@ } }, "node_modules/expo-modules-autolinking": { - "version": "56.0.16", - "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-56.0.16.tgz", - "integrity": "sha512-9JnL4N46P8ubDpDIfWolDn7nxU2j1rY67xY/dNVuyH0m+HG+r/JI16VYtjIf4COpZtEuFo4D3h3MBeFzGucMnw==", + "version": "56.0.18", + "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-56.0.18.tgz", + "integrity": "sha512-8+NyEpTKjrUpHRFw+WihXXnLa/nqPlUpFz4SdtzPovW24rJikyw160gVSCbuILp+AgC8yasjHT+C6xuqRSdiew==", "license": "MIT", "dependencies": { - "@expo/require-utils": "^56.1.3", + "@expo/require-utils": "^56.1.4", "@expo/spawn-async": "^1.8.0", "chalk": "^4.1.0", "commander": "^7.2.0" @@ -3889,13 +4035,13 @@ } }, "node_modules/expo-modules-core": { - "version": "56.0.17", - "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-56.0.17.tgz", - "integrity": "sha512-5J8whnT7Ccp+BrFClLmpF76omBqn95VZExroTm01Dgjm4vpty1Rb7U3we+ZUceNHtRd07Lw30u7FNfDgIhEbRQ==", + "version": "56.0.19", + "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-56.0.19.tgz", + "integrity": "sha512-nJCXHNK4y7X8/Z40zssp8hRpxzwEEpWGtA4b9b3gf67aaj4Z7l5PDstfv+8d5QnsAcOM+Vxum9E+itqNB27qXQ==", "license": "MIT", "dependencies": { "@expo/expo-modules-macros-plugin": "0.2.2", - "expo-modules-jsi": "~56.0.10", + "expo-modules-jsi": "~56.0.11", "invariant": "^2.2.4" }, "peerDependencies": { @@ -3910,25 +4056,25 @@ } }, "node_modules/expo-modules-jsi": { - "version": "56.0.10", - "resolved": "https://registry.npmjs.org/expo-modules-jsi/-/expo-modules-jsi-56.0.10.tgz", - "integrity": "sha512-fHZcFpYO/o62GYa6fJyAQJZcAShzhoN0iMMDzbr7vD3ewET6e1vAlTonbEakN9F0VHEgBFJ4NREy87uwVcpCuA==", + "version": "56.0.11", + "resolved": "https://registry.npmjs.org/expo-modules-jsi/-/expo-modules-jsi-56.0.11.tgz", + "integrity": "sha512-vhjaTb63ekITnSz8ah+k+GOUDRB9TB8NmY8Iq7cj5O8iKXcqJi/3ZyHyhiFSu0Pjb+UXEeFX+42KZ/a3XZDd4Q==", "license": "MIT", "peerDependencies": { "react-native": "*" } }, "node_modules/expo-notifications": { - "version": "56.0.18", - "resolved": "https://registry.npmjs.org/expo-notifications/-/expo-notifications-56.0.18.tgz", - "integrity": "sha512-HHnrwyCLC5srFojcHYS2KskbNroy9o2fwPKdyhjrdjjrBu4sNRKm4LepcuZjDy98cZKEm89WIPW8O45vut8Rgw==", + "version": "56.0.19", + "resolved": "https://registry.npmjs.org/expo-notifications/-/expo-notifications-56.0.19.tgz", + "integrity": "sha512-3sTegn8Wwu84TLIAxAqC725kqQ412U2NG9qUH4k3gQzBU49vROhvsslj7gARgvOJY8KohuJz82csuZfZnHDDHw==", "license": "MIT", "dependencies": { "@expo/image-utils": "^0.10.1", "abort-controller": "^3.0.0", "badgin": "^1.1.5", "expo-application": "~56.0.3", - "expo-constants": "~56.0.18" + "expo-constants": "~56.0.19" }, "peerDependencies": { "expo": "*", @@ -3937,15 +4083,15 @@ } }, "node_modules/expo-router": { - "version": "56.2.11", - "resolved": "https://registry.npmjs.org/expo-router/-/expo-router-56.2.11.tgz", - "integrity": "sha512-08DBTrKv3QanOc9u1JNxSEChW9c/qNFbQ0dO28OLvufWWfdSRkSdHmh365D2FgoZg1qaOzZPCDuL3tM6nGSfkQ==", + "version": "56.2.13", + "resolved": "https://registry.npmjs.org/expo-router/-/expo-router-56.2.13.tgz", + "integrity": "sha512-Iln0473krRnI8m1EnZ29Sg1kWRgQ2W9a8bsDkslPPnpdAHQee28HajkQHXZsNPxD1t4hii1lajRRHKNmJs37rA==", "license": "MIT", "dependencies": { - "@expo/log-box": "^56.0.13", - "@expo/metro-runtime": "^56.0.15", - "@expo/schema-utils": "^56.0.0", - "@expo/ui": "^56.0.18", + "@expo/log-box": "^56.0.14", + "@expo/metro-runtime": "^56.0.16", + "@expo/schema-utils": "^56.0.2", + "@expo/ui": "^56.0.20", "@radix-ui/react-slot": "^1.2.0", "@radix-ui/react-tabs": "^1.1.12", "@react-native-masked-view/masked-view": "^0.3.2", @@ -3973,12 +4119,12 @@ "vaul": "^1.1.2" }, "peerDependencies": { - "@expo/log-box": "^56.0.13", - "@expo/metro-runtime": "^56.0.15", + "@expo/log-box": "^56.0.14", + "@expo/metro-runtime": "^56.0.16", "@testing-library/react-native": ">= 13.2.0", "expo": "*", - "expo-constants": "^56.0.18", - "expo-linking": "^56.0.14", + "expo-constants": "^56.0.20", + "expo-linking": "^56.0.15", "react": "*", "react-dom": "*", "react-native": "*", @@ -4010,69 +4156,6 @@ } } }, - "node_modules/expo-router/node_modules/@expo/ui": { - "version": "56.0.18", - "resolved": "https://registry.npmjs.org/@expo/ui/-/ui-56.0.18.tgz", - "integrity": "sha512-2XgH5obigGtXm8zlb/V3g87NSiIcBcJ1xoQOEQYPoExL1DCNsHzaIecTh1XG/f/45ardo4OZNJwpbfYJ9X3qrQ==", - "license": "MIT", - "dependencies": { - "sf-symbols-typescript": "^2.1.0", - "vaul": "^1.1.2" - }, - "peerDependencies": { - "@babel/core": "*", - "expo": "*", - "react": "*", - "react-dom": "*", - "react-native": "*", - "react-native-reanimated": "*", - "react-native-worklets": "*" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "react-dom": { - "optional": true - }, - "react-native-reanimated": { - "optional": true - }, - "react-native-worklets": { - "optional": true - } - } - }, - "node_modules/expo-router/node_modules/@radix-ui/react-tabs": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.15.tgz", - "integrity": "sha512-kxc9gI6/HfcU4nfMMVS3AmQK414kbU1IE6UCJmMmxjhO3cRPXOyYnmvyKD+ODt7q56nRq9l7Wovi6uaGwKgMlg==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-presence": "1.1.6", - "@radix-ui/react-primitive": "2.1.6", - "@radix-ui/react-roving-focus": "1.1.13", - "@radix-ui/react-use-controllable-state": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, "node_modules/expo-router/node_modules/react-is": { "version": "19.2.7", "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.7.tgz", @@ -4093,18 +4176,19 @@ "resolved": "https://registry.npmjs.org/expo-server/-/expo-server-56.0.5.tgz", "integrity": "sha512-SmM2p2g3Jrktpiazcst+OxhjSzOHXKAY4BPURHYHXvApzzoybMmrNF4IEZ8DKZ145BhSe4ydAmlEFCRTsdtgUQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=20.16.0" } }, "node_modules/expo-splash-screen": { - "version": "56.0.10", - "resolved": "https://registry.npmjs.org/expo-splash-screen/-/expo-splash-screen-56.0.10.tgz", - "integrity": "sha512-vDIlo8hzt9HlCZQ0kSY66v83D1WEXOJbVMeyPDfXDu9tbDdPMNUyDpi4WGJXikAjxnAKfbt5Mv5NnEbxINy+VA==", + "version": "56.0.12", + "resolved": "https://registry.npmjs.org/expo-splash-screen/-/expo-splash-screen-56.0.12.tgz", + "integrity": "sha512-RvEtJ78aNpuxdVD8TCe9viKtlYGzS9hW20fbvqvkeXDN6WAaYo1CRitPdjWNkaNNSPKOolp3zfha4EGdhXOtxg==", "license": "MIT", "dependencies": { - "@expo/config-plugins": "~56.0.8", - "@expo/image-utils": "^0.10.1", + "@expo/config-plugins": "~56.0.11", + "@expo/image-utils": "^0.10.2", "xml2js": "0.6.0" }, "peerDependencies": { @@ -4159,35 +4243,36 @@ } }, "node_modules/expo/node_modules/@expo/cli": { - "version": "56.1.16", - "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-56.1.16.tgz", - "integrity": "sha512-VBQn0mqAwc67b9Cn0RVXyeodghomAx5xGRhA/bXaQzuxDjMQk0zIOb6pXMZX7yiIwJW66UZt/zQiJNSv6aWJYw==", + "version": "56.1.18", + "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-56.1.18.tgz", + "integrity": "sha512-ACzbK2mLPevgjdJ7EeDyjPem+WU9oDcCLD2Ajwrl6dVvN9xP5wchGrwRQvVx55TU3bdTCEXpiHC2AGRXfXVc6g==", "license": "MIT", "dependencies": { "@expo/code-signing-certificates": "^0.0.6", - "@expo/config": "~56.0.9", - "@expo/config-plugins": "~56.0.9", + "@expo/config": "~56.0.11", + "@expo/config-plugins": "~56.0.11", "@expo/devcert": "^1.2.1", - "@expo/env": "~2.3.0", - "@expo/image-utils": "^0.10.1", - "@expo/inline-modules": "^0.0.12", + "@expo/env": "~2.3.1", + "@expo/image-utils": "^0.10.2", + "@expo/inline-modules": "^0.0.13", "@expo/json-file": "^10.2.0", - "@expo/log-box": "^56.0.13", + "@expo/log-box": "^56.0.14", "@expo/metro": "~56.0.0", - "@expo/metro-config": "~56.0.14", + "@expo/metro-config": "~56.0.16", "@expo/metro-file-map": "^56.0.3", "@expo/osascript": "^2.6.0", "@expo/package-manager": "^1.12.1", "@expo/plist": "^0.7.0", - "@expo/prebuild-config": "^56.0.16", - "@expo/require-utils": "^56.1.3", - "@expo/router-server": "^56.0.14", - "@expo/schema-utils": "^56.0.0", + "@expo/prebuild-config": "^56.0.18", + "@expo/require-utils": "^56.1.4", + "@expo/router-server": "^56.0.15", + "@expo/schema-utils": "^56.0.2", "@expo/spawn-async": "^1.8.0", "@expo/ws-tunnel": "^2.0.0", "@expo/xcpretty": "^4.4.4", "@react-native/dev-middleware": "0.85.3", "accepts": "^1.3.8", + "agent-cli-detector": "^0.1.2", "arg": "^5.0.2", "bplist-creator": "0.1.0", "bplist-parser": "^0.3.1", @@ -4196,7 +4281,7 @@ "compression": "^1.7.4", "connect": "^3.7.0", "debug": "^4.3.4", - "dnssd-advertise": "^1.1.4", + "dnssd-advertise": "^1.1.6", "expo-server": "^56.0.5", "fetch-nodeshim": "^0.4.10", "getenv": "^2.0.0", @@ -4240,18 +4325,18 @@ } }, "node_modules/expo/node_modules/@expo/cli/node_modules/@expo/router-server": { - "version": "56.0.14", - "resolved": "https://registry.npmjs.org/@expo/router-server/-/router-server-56.0.14.tgz", - "integrity": "sha512-2UCTtZfcq1ZPgp3wk8/+sq9DvFI9UxrPr1jcEKMAF2DGAJLosnpc8GWNNg2hkjt6SHUOdFHIPxujWPYyho2y3A==", + "version": "56.0.15", + "resolved": "https://registry.npmjs.org/@expo/router-server/-/router-server-56.0.15.tgz", + "integrity": "sha512-eXTwUEKR6MPeoJVwyGOX5eIvUUKCGL0mItTXBMTb2TIr9M6IH7ORVo8yHB70RVSLVXo8AuwsCtDfKFKZ3rUZ5w==", "license": "MIT", "dependencies": { "debug": "^4.3.4" }, "peerDependencies": { - "@expo/metro-runtime": "^56.0.15", + "@expo/metro-runtime": "^56.0.16", "expo": "*", - "expo-constants": "^56.0.18", - "expo-font": "^56.0.6", + "expo-constants": "^56.0.19", + "expo-font": "^56.0.7", "expo-router": "*", "expo-server": "^56.0.5", "react": "*", @@ -4273,45 +4358,6 @@ } } }, - "node_modules/expo/node_modules/@expo/metro-config": { - "version": "56.0.14", - "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-56.0.14.tgz", - "integrity": "sha512-O3CIHruaTJhswPAf/nf3i8QQ3f2jl+mEwSea1eb3khuplabdy/wTQz+JvHN8VGUFyg7JKwUGU1QfO6T3JiSQqA==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.20.0", - "@babel/core": "^7.20.0", - "@babel/generator": "^7.20.5", - "@expo/config": "~56.0.9", - "@expo/env": "~2.3.0", - "@expo/json-file": "~10.2.0", - "@expo/metro": "~56.0.0", - "@expo/require-utils": "^56.1.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.25.0", - "chalk": "^4.1.0", - "debug": "^4.3.2", - "getenv": "^2.0.0", - "glob": "^13.0.0", - "hermes-parser": "^0.33.3", - "jsc-safe-url": "^0.2.4", - "lightningcss": "^1.30.1", - "picomatch": "^4.0.4", - "postcss": "^8.5.14", - "resolve-from": "^5.0.0" - }, - "peerDependencies": { - "expo": "*" - }, - "peerDependenciesMeta": { - "expo": { - "optional": true - } - } - }, "node_modules/expo/node_modules/@expo/ws-tunnel": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@expo/ws-tunnel/-/ws-tunnel-2.0.0.tgz", @@ -4349,46 +4395,6 @@ "node": ">=8" } }, - "node_modules/expo/node_modules/expo-asset": { - "version": "56.0.17", - "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-56.0.17.tgz", - "integrity": "sha512-GFN5j+8SPkyv0nfsiFHewmdB/D0tL237TsBE/gSfFOFy/J3a52py7IulcSqkA3sQE/u/UlD5BmvP5ssS4//nUg==", - "license": "MIT", - "dependencies": { - "@expo/image-utils": "^0.10.1", - "expo-constants": "~56.0.18" - }, - "peerDependencies": { - "expo": "*", - "react": "*", - "react-native": "*" - } - }, - "node_modules/expo/node_modules/expo-keep-awake": { - "version": "56.0.3", - "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-56.0.3.tgz", - "integrity": "sha512-CLMJXtEiMKknD3Rpm8CRwE6ZJUzu2yCEmRk1sgfHAJ1zIbuEWY3dpPDubtsnuzWm+2k6Sru+yaFbYsvPWmTiBA==", - "license": "MIT", - "peerDependencies": { - "expo": "*", - "react": "*" - } - }, - "node_modules/expo/node_modules/hermes-estree": { - "version": "0.33.3", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.33.3.tgz", - "integrity": "sha512-6kzYZHCk8Fy1Uc+t3HGYyJn3OL4aeqKLTyina4UFtWl8I0kSL7OmKThaiX+Uh2f8nGw3mo4Ifxg0M5Zk3/Oeqg==", - "license": "MIT" - }, - "node_modules/expo/node_modules/hermes-parser": { - "version": "0.33.3", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.33.3.tgz", - "integrity": "sha512-Yg3HgaG4CqgyowtYjX/FsnPAuZdHOqSMtnbpylbptsQ9nwwSKsy6uRWcGO5RK0EqiX12q8HvDWKgeAVajRO5DA==", - "license": "MIT", - "dependencies": { - "hermes-estree": "0.33.3" - } - }, "node_modules/expo/node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -4420,9 +4426,9 @@ } }, "node_modules/expo/node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", "license": "MIT", "engines": { "node": ">=12" @@ -4436,6 +4442,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", "license": "MIT", + "peer": true, "engines": { "node": ">=10.0.0" }, @@ -5096,6 +5103,7 @@ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", "license": "MIT", + "peer": true, "bin": { "jiti": "bin/jiti.js" } @@ -5107,9 +5115,9 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", - "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz", + "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==", "funding": [ { "type": "github", @@ -5598,7 +5606,6 @@ "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", "license": "MIT", - "peer": true, "bin": { "lz-string": "bin/bin.js" } @@ -6488,6 +6495,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.12", "picocolors": "^1.1.1", @@ -6752,6 +6760,7 @@ "resolved": "https://registry.npmjs.org/react/-/react-19.2.3.tgz", "integrity": "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -6771,6 +6780,7 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.3.tgz", "integrity": "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==", "license": "MIT", + "peer": true, "dependencies": { "scheduler": "^0.27.0" }, @@ -6807,6 +6817,7 @@ "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.85.3.tgz", "integrity": "sha512-HN/fGC+3nZVcDNcw7gfbM/DuqZAvI9Mz+/SxuhODaua4JY0BPzhfTzWXRyTR4mRgMHmShTPpH2PYMTxvZrsdZA==", "license": "MIT", + "peer": true, "dependencies": { "@react-native/assets-registry": "0.85.3", "@react-native/codegen": "0.85.3", @@ -7178,6 +7189,7 @@ "resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-4.3.1.tgz", "integrity": "sha512-KhGsS0YkCA+gusgyzlf9hnqzVPIR398KTpqXyqq/+yYJJPAvyEEPKcxlB0xtOOXSMrR2A9uRKVARVQhZwrOh+Q==", "license": "MIT", + "peer": true, "dependencies": { "react-native-is-edge-to-edge": "^1.3.1", "semver": "^7.7.3" @@ -7193,6 +7205,7 @@ "resolved": "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-5.7.0.tgz", "integrity": "sha512-/9/MtQz8ODphjsLdZ+GZAIcC/RtoqW9EeShf7Uvnfgm/pzYrJ75y3PV/J1wuAV1T5Dye5ygq4EAW20RoBq0ABQ==", "license": "MIT", + "peer": true, "peerDependencies": { "react": "*", "react-native": "*" @@ -7217,6 +7230,7 @@ "resolved": "https://registry.npmjs.org/react-native-web/-/react-native-web-0.21.2.tgz", "integrity": "sha512-SO2t9/17zM4iEnFvlu2DA9jqNbzNhoUP+AItkoCOyFmDMOhUnBBznBDCYN92fGdfAkfQlWzPoez6+zLxFNsZEg==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.18.6", "@react-native/normalize-colors": "^0.74.1", @@ -7249,6 +7263,7 @@ "resolved": "https://registry.npmjs.org/react-native-worklets/-/react-native-worklets-0.8.3.tgz", "integrity": "sha512-oCBJROyLU7yG/1R8s0INMflygTH71bx+5XcYkH0CM938TlhSoVbiunE1WVW5FZa51vwYqfLie/IXMX2s1Kh3eg==", "license": "MIT", + "peer": true, "dependencies": { "@babel/plugin-transform-arrow-functions": "^7.27.1", "@babel/plugin-transform-class-properties": "^7.27.1", @@ -7283,6 +7298,7 @@ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -7772,6 +7788,18 @@ "plist": "^3.0.5" } }, + "node_modules/simple-plist/node_modules/bplist-parser": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.1.tgz", + "integrity": "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==", + "license": "MIT", + "dependencies": { + "big-integer": "1.6.x" + }, + "engines": { + "node": ">= 5.10.0" + } + }, "node_modules/simple-swizzle": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.4.tgz", @@ -8016,6 +8044,7 @@ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.19.tgz", "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==", "license": "MIT", + "peer": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -8153,6 +8182,7 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -8226,6 +8256,7 @@ "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", "devOptional": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" diff --git a/package.json b/package.json index 1ec01d2..8d943d6 100644 --- a/package.json +++ b/package.json @@ -6,14 +6,14 @@ "@expo/metro-runtime": "~56.0.15", "@expo/vector-icons": "^15.1.1", "babel-preset-expo": "~56.0.0", - "expo": "~56.0.12", - "expo-constants": "~56.0.18", + "expo": "~56.0.14", + "expo-constants": "~56.0.20", "expo-document-picker": "~56.0.4", "expo-file-system": "~56.0.8", "expo-font": "~56.0.7", - "expo-linking": "~56.0.14", - "expo-notifications": "~56.0.18", - "expo-router": "~56.2.11", + "expo-linking": "~56.0.15", + "expo-notifications": "~56.0.19", + "expo-router": "~56.2.13", "expo-secure-store": "~56.0.4", "expo-splash-screen": "~56.0.10", "expo-status-bar": "~56.0.4", diff --git a/types/codex.ts b/types/codex.ts index cc3b4d8..86a3c40 100644 --- a/types/codex.ts +++ b/types/codex.ts @@ -3,21 +3,55 @@ export interface CodexAuth { accountId?: string; } -export interface UsageWindow { - used_percent: number; - reset_at: number; - limit_window_seconds: number; +export interface CodexUsageWindow { + usedPercent: number; + resetsAt: number; + windowMinutes: number; + windowSeconds: number; } -export interface CodexUsageResponse { - plan_type: string; - rate_limit: { - primary_window: UsageWindow; - secondary_window: UsageWindow; - }; - credits: { - has_credits: boolean; - unlimited: boolean; - balance: number; - }; +export interface CodexCreditsSummary { + hasCredits: boolean; + unlimited: boolean; + balance: number; +} + +export interface CodexResetCredit { + index: number; + status?: string; + grantedAt?: string | null; + grantedAtLocal?: string | null; + expiresAt?: string | null; + expiresAtLocal?: string | null; + timeUntilExpiry?: string | null; +} + +export interface CodexResetCoupons { + source: "live_api" | "local_state_fallback" | "unavailable"; + sourceDescription: string; + availableCount?: number | null; + totalEarnedCount?: number | null; + credits?: CodexResetCredit[]; + nextExpiringCredit?: CodexResetCredit | null; + dismissedAtLocal?: string | null; + latestPossibleExpiryLocal?: string | null; + latestPossibleExpiryNote?: string | null; + fallbackReason?: string; + error?: string; +} + +export interface CodexDesktopSnapshot { + sessionFile?: string; + threadId?: string | null; + snapshotTimestamp?: string | null; + limitId?: string | null; + planType?: string | null; + rateLimitReachedType?: string | null; + primary: CodexUsageWindow | null; + secondary: CodexUsageWindow | null; +} + +export interface CodexUsageResponse extends CodexDesktopSnapshot { + credits: CodexCreditsSummary; + resetCoupons?: CodexResetCoupons | null; }