diff --git a/README.md b/README.md index a74e0b0..2c699e2 100644 --- a/README.md +++ b/README.md @@ -107,22 +107,22 @@ instance without a lookup table. ```mermaid sequenceDiagram - participant A as Sender device - participant IA as UserInbox sender - participant C as Chat chatId - participant N as Neon - participant IB as UserInbox recipient - participant B as Recipient device - - A->>IA: send · MLS ciphertext (msgpack) - IA->>C: RPC forward - Note over C: buffer ~100ms
assign monotonic serverSerial - C->>N: batch INSERT over HTTP - C-->>IA: ack (serverSerial) - IA-->>A: ack - C->>IB: msg (ciphertext) - IB-->>B: WS deliver → MLS decrypt → SQLite - Note over C,B: recipient offline →
SNS ChatDelivered → SQS → chat-push → APNs/FCM +participant A as Sender device +participant IA as UserInbox sender +participant C as Chat chatId +participant N as Neon +participant IB as UserInbox recipient +participant B as Recipient device + +A->>IA: send · MLS ciphertext (msgpack) +IA->>C: RPC forward +Note over C: buffer ~100ms
assign monotonic serverSerial +C->>N: batch INSERT over HTTP +C-->>IA: ack (serverSerial) +IA-->>A: ack +C->>IB: msg (ciphertext) +IB-->>B: WS deliver → MLS decrypt → SQLite +Note over C,B: recipient offline →
SNS ChatDelivered → SQS → chat-push → APNs/FCM ``` ### Trust boundary diff --git a/apps/mobile/app/_layout.tsx b/apps/mobile/app/_layout.tsx index 8a816ef..4b16002 100644 --- a/apps/mobile/app/_layout.tsx +++ b/apps/mobile/app/_layout.tsx @@ -66,9 +66,12 @@ getOrCreateChatIdentity() console.error("[chat-mvp/M3] chat-identity init failed", err); }); +// chat-db is per-account (chat-.sqlite) and opens only once the auth +// store pushes a signed-in user — this boot probe resolves after the first +// sign-in rather than at launch, and stays pending on a signed-out cold boot. getChatDb() .then((handle) => { - console.log("[chat-mvp/M2] chat-db ready", { + console.log("[chat-mvp/M2] chat-db ready (post-auth)", { schemaVersion: handle.version, keySource: handle.keySource, }); diff --git a/apps/mobile/app/settings/blocks.tsx b/apps/mobile/app/settings/blocks.tsx index cedc1ec..07aa404 100644 --- a/apps/mobile/app/settings/blocks.tsx +++ b/apps/mobile/app/settings/blocks.tsx @@ -104,7 +104,7 @@ export default function BlocksScreen() { data={rows} keyExtractor={(r) => r.accountId} renderItem={({ item }) => ( - onUnblock(item)} @@ -117,7 +117,7 @@ export default function BlocksScreen() { ); } -function BlockedRow({ +function BlockedRowItem({ row, isPending, onUnblock, diff --git a/apps/mobile/eslint.config.mjs b/apps/mobile/eslint.config.mjs index 3b8032a..97d8154 100644 --- a/apps/mobile/eslint.config.mjs +++ b/apps/mobile/eslint.config.mjs @@ -5,6 +5,6 @@ export default [ ...expo, eslintConfigPrettier, { - ignores: ["dist/**", "android/**", "ios/**", ".expo/**"], + ignores: ["dist/**", "android/**", "ios/**", ".expo/**", "sst-env.d.ts"], }, ]; diff --git a/apps/mobile/lib/chat/create-chat.ts b/apps/mobile/lib/chat/create-chat.ts index c7a0447..700d35c 100644 --- a/apps/mobile/lib/chat/create-chat.ts +++ b/apps/mobile/lib/chat/create-chat.ts @@ -6,10 +6,20 @@ // step fails (e.g. peer has 0 KeyPackages right now), the chat row + member // rows still exist on the server. UI surfaces the failure; user can retry. +import { useChatStore } from "@repo/chat"; import { getChatDb, mls as mlsStore } from "@repo/chat-db"; import { trpc } from "@/lib/trpc/client"; import { getMlsClient } from "@/lib/chat/mls-auto-publish"; import { clearChatGroupCache } from "./group-resolver"; +import { createTrpcChatApi } from "./store-provider"; + +// The chat screen renders from the zustand store, and nothing refreshes the +// store after a create — the WS `open` refresh fired long before this chat +// existed. Without this pull the freshly-created chat has no store record and +// /chat/[chatId] shows an indefinite spinner. refresh() merges + never throws. +async function syncChatStore(): Promise { + await useChatStore.getState().refresh(createTrpcChatApi()); +} // GroupId (Uint8Array) → base64 for the linkMlsGroup wire. Mirrors the encoder // in publish.ts (Hermes provides global btoa); avoids a Buffer polyfill dep. @@ -58,6 +68,7 @@ export async function createNewChat( if (created.existing) { const chat = await trpc.chat.get.query({ chatId: created.chatId }); if (chat.mlsGroupIdB64) { + await syncChatStore(); return { chatId: created.chatId, existing: true, @@ -115,6 +126,8 @@ export async function createNewChat( } } + await syncChatStore(); + return { chatId: created.chatId, existing: created.existing, diff --git a/apps/mobile/lib/chat/mls-auto-publish.ts b/apps/mobile/lib/chat/mls-auto-publish.ts index 587df1d..4eceb94 100644 --- a/apps/mobile/lib/chat/mls-auto-publish.ts +++ b/apps/mobile/lib/chat/mls-auto-publish.ts @@ -12,6 +12,7 @@ import { trpc } from "@/lib/trpc/client"; import { loadSessionToken } from "@/lib/auth/session"; import { useAuthStore } from "@/store/auth"; import { getOrCreateChatIdentity } from "./identity"; +import { kickChatBackfill } from "./store-provider"; import { publishMyChatDevice } from "./publish"; import { getCurrentChatTransport } from "./transport"; import { clearChatGroupCache } from "./group-resolver"; @@ -196,6 +197,10 @@ async function tick(reason: string): Promise { hexStr += (gid[i] ?? 0).toString(16).padStart(2, "0"); clearChatGroupCache(`mls-${hexStr}`); } + // Newly-joined groups may have backfill rows sitting behind a capped + // cursor (dropped recoverably before the join) — re-request them now + // that the engine holds the group. + kickChatBackfill(); } // Poll commits for every locally-known group. At Phase 1 scale the @@ -267,6 +272,12 @@ async function onAuthChange(reason: string): Promise { await tick(reason); startTimer(); + + // Engine is initialised for this account only from here on. Any backfill + // page that arrived earlier (WS open races bootstrap, esp. on account + // switch) dropped its rows with "engine not initialised" and capped the + // cursor — re-request those rows now that decrypt can succeed. + kickChatBackfill(); } // Foreground transitions trigger an immediate catch-up tick. Saves the user diff --git a/apps/mobile/lib/chat/store-provider.tsx b/apps/mobile/lib/chat/store-provider.tsx index e999aae..799feda 100644 --- a/apps/mobile/lib/chat/store-provider.tsx +++ b/apps/mobile/lib/chat/store-provider.tsx @@ -9,6 +9,7 @@ import { AppState } from "react-native"; import { ChatStoreProvider, createOutboxWorker, + useChatBackfill, useChatStore, type BackfillCursorApi, type BoundOutboxApi, @@ -66,7 +67,9 @@ async function mirrorChatsToLocalDb( } } -function createTrpcChatApi(): ChatApi { +// Exported for non-React callers that need a one-off store refresh with the +// same list→local-mirror semantics the provider uses (e.g. create-chat). +export function createTrpcChatApi(): ChatApi { return { chatList: async (input) => { const res = await trpc.chat.list.query(input); @@ -87,6 +90,30 @@ function createTrpcChatApi(): ChatApi { }; } +// Module-level bridge so non-React code (the MLS auto-publish loop) can kick +// a backfill pass. The decisive consumer: a backfill page that raced +// initEngine(accountId) drops its rows recoverably and caps the cursor — the +// engine-ready kick is what re-requests those rows once decrypt can succeed. +// Mirrors the getCurrentChatTransport() singleton pattern (transport.tsx). +let backfillKicker: (() => void) | null = null; + +export function kickChatBackfill(): void { + backfillKicker?.(); +} + +// Rendered inside ChatStoreProvider so useChatBackfill is in scope; registers +// the provider's runner into the module-level bridge above. +function BackfillKickBridge() { + const kick = useChatBackfill(); + useEffect(() => { + backfillKicker = kick; + return () => { + if (backfillKicker === kick) backfillKicker = null; + }; + }, [kick]); + return null; +} + // Curry chat-db's backfill_cursors helpers onto a handle → the injected // BackfillCursorApi the store provider drives (docs/message-backfill.md). function bindBackfillCursors(handle: ChatDbHandle): BackfillCursorApi { @@ -113,6 +140,9 @@ function bindOutbox(handle: ChatDbHandle): BoundOutboxApi { export function MobileChatStoreProvider({ children }: { children: ReactNode }) { const authenticated = useAuthStore((s) => !!s.session); + // chat-db is per-account (chat-.sqlite) — bindings must be rebuilt + // when the signed-in user changes, not once per mount. + const userId = useAuthStore((s) => s.session?.user.id ?? null); const transport = useChatTransport(); const api = useMemo(createTrpcChatApi, []); @@ -143,6 +173,14 @@ export function MobileChatStoreProvider({ children }: { children: ReactNode }) { ); useEffect(() => { + if (!userId) { + // Signed out (or not yet in) — detach the previous account's bindings + // so nothing keeps writing through a closed/foreign handle. + setPersistApi(undefined); + setBackfillApi(undefined); + setOutboxBindings(undefined); + return; + } let active = true; (async () => { try { @@ -175,7 +213,7 @@ export function MobileChatStoreProvider({ children }: { children: ReactNode }) { return () => { active = false; }; - }, [confirmOptimisticMessage, failOptimisticMessage, transport]); + }, [userId, confirmOptimisticMessage, failOptimisticMessage, transport]); // AppState foreground kick. The chat-store provider already wires // worker.kick on transport.onState("open"), and the worker runs a 30s @@ -200,6 +238,7 @@ export function MobileChatStoreProvider({ children }: { children: ReactNode }) { backfillCursors={backfillApi} authenticated={authenticated} > + {children} ); diff --git a/apps/mobile/lib/chat/transport.tsx b/apps/mobile/lib/chat/transport.tsx index 4d04290..2c77e5c 100644 --- a/apps/mobile/lib/chat/transport.tsx +++ b/apps/mobile/lib/chat/transport.tsx @@ -88,11 +88,13 @@ export function ChatTransportProvider({ children }: { children: ReactNode }) { } satisfies MlsApi, onDecryptFailure: (msg, reason) => { console.warn( - "[chat/transport] decrypt failed", + "[DEBUG-bkfl] decrypt failed", { chatId: msg.chatId, serverMsgId: msg.serverMsgId, senderId: msg.senderId, + // version byte: 2 = MLS (v=2), anything else = v=1 libsodium. + v: msg.ciphertext.length > 0 ? msg.ciphertext[0] : -1, }, reason, ); diff --git a/apps/mobile/package.json b/apps/mobile/package.json index 8468b6d..0e3475e 100644 --- a/apps/mobile/package.json +++ b/apps/mobile/package.json @@ -83,6 +83,7 @@ "@types/react": "~19.1.10", "eslint": "^9.39.1", "eslint-config-expo": "^10.0.0", - "typescript": "5.9.2" + "typescript": "5.9.2", + "@react-native-community/cli": "latest" } } diff --git a/apps/mobile/store/auth.ts b/apps/mobile/store/auth.ts index 0277585..382b836 100644 --- a/apps/mobile/store/auth.ts +++ b/apps/mobile/store/auth.ts @@ -1,4 +1,8 @@ import { create } from "zustand"; +import { setActiveChatDbUser } from "@repo/chat-db"; + +import { clearChatGroupCache } from "@/lib/chat/group-resolver"; +import { forgetMyAccount } from "@/lib/account/me"; type User = { id: string; @@ -25,12 +29,33 @@ type AuthState = { setActiveProfile: (profileId: string) => void; }; +// Per-account local state pivots on the signed-in Better Auth user id: the +// chat DB file (chat-.sqlite), the chatId→groupId resolver cache and +// the account.me singleton all belong to exactly one account. Token refreshes +// for the SAME user must not churn any of them — only an actual user change. +function onUserChange(prev: Session | null, next: Session | null): void { + const prevUser = prev?.user.id ?? null; + const nextUser = next?.user.id ?? null; + if (prevUser === nextUser) return; + setActiveChatDbUser(nextUser); + clearChatGroupCache(); + forgetMyAccount(); +} + export const useAuthStore = create((set) => ({ session: null, - setSession: (session) => set({ session }), + setSession: (session) => + set((state) => { + onUserChange(state.session, session); + return { session }; + }), - clearSession: () => set({ session: null }), + clearSession: () => + set((state) => { + onUserChange(state.session, null); + return { session: null }; + }), setActiveProfile: (profileId) => set((state) => diff --git a/packages/chat-db/src/client.ts b/packages/chat-db/src/client.ts index 444b9f5..3b334e2 100644 --- a/packages/chat-db/src/client.ts +++ b/packages/chat-db/src/client.ts @@ -1,8 +1,20 @@ import { open, type DB } from "@op-engineering/op-sqlite"; + import { getOrCreatePassphrase, type PassphraseSource } from "./key"; import { runMigrations, LATEST_VERSION } from "./migrations"; +import { importLegacyChatDb } from "./legacy-import"; -const DB_NAME = "chat.sqlite"; +// One DB file PER SIGNED-IN ACCOUNT, keyed by the Better Auth user id. The +// shared-file era ("chat.sqlite") leaked state across accounts on the same +// install: backfill cursors poisoned each other (account B inherited account +// A's high-water mark and permanently skipped messages), the plaintext cache +// crossed account boundaries, and the outbox could dispatch one account's +// queued sends under another's session. The SQLCipher passphrase stays +// install-wide (device-at-rest threat model doesn't change per account). +// +// The active account is pushed in by the auth store via setActiveChatDbUser(); +// getChatDb() callers all run post-auth, so a call that arrives before the +// first sign-in simply waits for it. export interface ChatDbHandle { db: DB; @@ -10,25 +22,111 @@ export interface ChatDbHandle { keySource: PassphraseSource; } -let cached: ChatDbHandle | null = null; +function dbNameForUser(userId: string): string { + // Auth user ids are url-safe today; sanitise anyway — a file name must + // never depend on that staying true. + return `chat-${userId.replace(/[^A-Za-z0-9_-]/g, "_")}.sqlite`; +} + +let activeUserId: string | null = null; +let cached: { userId: string; handle: ChatDbHandle } | null = null; +let opening: { userId: string; promise: Promise } | null = null; +let gate: Array<() => void> = []; -export async function getChatDb(): Promise { - if (cached) return cached; +function closeQuietly(handle: ChatDbHandle): void { + void Promise.resolve() + .then(() => handle.db.close()) + .catch((err: unknown) => { + console.warn("[chat-db] close failed", err); + }); +} + +/** Auth-store hook point. Call with the Better Auth user id on sign-in and + * null on sign-out. Switching users closes the previous handle; consumers + * re-resolve via getChatDb() and land on the new account's file. */ +export function setActiveChatDbUser(userId: string | null): void { + if (userId === activeUserId) return; + activeUserId = userId; + opening = null; + if (cached) { + const stale = cached; + cached = null; + closeQuietly(stale.handle); + } + if (userId) { + const waiters = gate; + gate = []; + for (const release of waiters) release(); + } +} +function waitForActiveUser(): Promise { + return new Promise((resolve) => gate.push(resolve)); +} + +async function openForUser(userId: string): Promise { const { passphrase, source } = await getOrCreatePassphrase(); - const db = open({ name: DB_NAME, encryptionKey: passphrase }); + const db = open({ name: dbNameForUser(userId), encryptionKey: passphrase }); await db.execute("PRAGMA foreign_keys = ON"); await db.execute("PRAGMA journal_mode = WAL"); await runMigrations(db); - cached = { db, version: LATEST_VERSION, keySource: source }; - return cached; + // One-time import from the shared-file era. The marker lives outside the + // import transaction; a crash in between only re-runs the idempotent copy + // (INSERT OR IGNORE). An import failure throws — better a loud open failure + // than silently abandoning the account's MLS engine snapshot. + await db.execute( + "CREATE TABLE IF NOT EXISTS legacy_import (done INTEGER PRIMARY KEY NOT NULL)", + ); + const marker = await db.execute("SELECT done FROM legacy_import LIMIT 1"); + if ((marker.rows ?? []).length === 0) { + const { imported, rows } = await importLegacyChatDb(db, passphrase); + await db.execute("INSERT OR IGNORE INTO legacy_import (done) VALUES (1)"); + if (imported) { + console.log("[chat-db] imported legacy shared DB", { userId, rows }); + } + } + + return { db, version: LATEST_VERSION, keySource: source }; +} + +export async function getChatDb(): Promise { + for (;;) { + if (!activeUserId) { + await waitForActiveUser(); + continue; + } + const userId = activeUserId; + if (cached?.userId === userId) return cached.handle; + + if (!opening || opening.userId !== userId) { + opening = { userId, promise: openForUser(userId) }; + } + const current = opening; + let handle: ChatDbHandle; + try { + handle = await current.promise; + } catch (err) { + if (opening === current) opening = null; + throw err; + } + if (opening === current) opening = null; + + // Account switched while the open was in flight — discard and retry. + if (activeUserId !== userId) { + if (cached?.handle !== handle) closeQuietly(handle); + continue; + } + cached = { userId, handle }; + return handle; + } } export async function closeChatDb(): Promise { if (!cached) return; - await cached.db.close(); + const stale = cached; cached = null; + await stale.handle.db.close(); } diff --git a/packages/chat-db/src/index.ts b/packages/chat-db/src/index.ts index 455dd8f..623fc3d 100644 --- a/packages/chat-db/src/index.ts +++ b/packages/chat-db/src/index.ts @@ -1,4 +1,9 @@ -export { getChatDb, closeChatDb, type ChatDbHandle } from "./client"; +export { + getChatDb, + closeChatDb, + setActiveChatDbUser, + type ChatDbHandle, +} from "./client"; export { LATEST_VERSION as SCHEMA_VERSION } from "./migrations"; export * as outbox from "./outbox"; export * as peerKeys from "./peer-keys"; diff --git a/packages/chat-db/src/legacy-import.ts b/packages/chat-db/src/legacy-import.ts new file mode 100644 index 0000000..c0339c4 --- /dev/null +++ b/packages/chat-db/src/legacy-import.ts @@ -0,0 +1,131 @@ +import { open, type DB } from "@op-engineering/op-sqlite"; + +import { runMigrations } from "./migrations"; + +// One-time import of the shared-file era database ("chat.sqlite") into a fresh +// per-account file. Before the per-account split every signed-in user on an +// install shared one DB, so the legacy file holds the union of their data — +// crucially each account's mls_engine_state snapshot, which is unrecoverable +// if dropped (MLS group state can't be re-derived; there is no re-Welcome +// mechanism yet), and the plaintext message cache (forward secrecy means old +// v=2 ciphertexts can never be re-decrypted). + +export const LEGACY_DB_NAME = "chat.sqlite"; + +// Tables copied verbatim. Cursor + queue tables are deliberately absent: +// - backfill_cursors / sync_cursor start at zero for the account — the +// shared-file cursors are exactly the cross-account poisoning this split +// fixes (account B inheriting account A's high-water mark skips messages +// B has never seen). +// - pending_outbox rows aren't account-attributable; a queued send must +// never dispatch under a different signed-in user. +const COPY_TABLES: ReadonlyArray<{ table: string; cols: string[] }> = [ + { + table: "chats", + cols: [ + "id", + "kind", + "title", + "created_at", + "updated_at", + "last_message_id", + "mls_group_id", + ], + }, + { + table: "messages", + cols: [ + "id", + "chat_id", + "sender_id", + "ciphertext", + "nonce", + "sent_at", + "received_at", + "status", + "plaintext", + "client_msg_id", + ], + }, + { + table: "members", + cols: ["chat_id", "account_id", "role", "joined_at", "identity_pubkey"], + }, + { + table: "key_material", + cols: ["account_id", "identity_pub", "identity_priv", "created_at"], + }, + { + table: "peer_keys", + cols: [ + "account_id", + "device_id", + "ed25519_pub", + "x25519_pub", + "refreshed_at", + "server_updated_at", + ], + }, + { + table: "mls_engine_state", + cols: ["account_id", "snapshot", "updated_at"], + }, + { + table: "mls_group", + cols: ["group_id", "chat_id", "last_applied_epoch", "joined_at"], + }, +]; + +export interface LegacyImportResult { + imported: boolean; + rows: number; +} + +// Copy the legacy DB's rows into `fresh`. INSERT OR IGNORE keeps this +// idempotent — a crash between the copy and the caller's marker write only +// causes a harmless re-run. Opening the legacy name creates an empty file +// when none exists; user_version 0 identifies that case (no schema ever ran) +// and we skip without copying. +export async function importLegacyChatDb( + fresh: DB, + passphrase: string, +): Promise { + const legacy = open({ name: LEGACY_DB_NAME, encryptionKey: passphrase }); + try { + const vres = await legacy.execute("PRAGMA user_version"); + const version = (vres.rows?.[0]?.user_version as number) ?? 0; + if (version === 0) return { imported: false, rows: 0 }; + + // Bring the legacy file up to the current schema so the column lists + // below are valid — same forward-only runner the shared-file era used. + await runMigrations(legacy); + + let copied = 0; + await fresh.execute("BEGIN IMMEDIATE"); + try { + for (const { table, cols } of COPY_TABLES) { + const res = await legacy.execute( + `SELECT ${cols.join(", ")} FROM ${table}`, + ); + const rows = (res.rows ?? []) as Array>; + if (rows.length === 0) continue; + const sql = `INSERT OR IGNORE INTO ${table} (${cols.join(", ")}) + VALUES (${cols.map(() => "?").join(", ")})`; + for (const row of rows) { + await fresh.execute( + sql, + cols.map((c) => row[c]) as Parameters[1], + ); + copied++; + } + } + await fresh.execute("COMMIT"); + } catch (err) { + await fresh.execute("ROLLBACK"); + throw err; + } + return { imported: true, rows: copied }; + } finally { + await legacy.close(); + } +} diff --git a/packages/chat-db/src/migrations.ts b/packages/chat-db/src/migrations.ts index a0ccceb..630a638 100644 --- a/packages/chat-db/src/migrations.ts +++ b/packages/chat-db/src/migrations.ts @@ -156,6 +156,17 @@ const MIGRATIONS: Migration[] = [ ) WITHOUT ROWID`, ], }, + { + version: 6, + up: [ + // Data repair, not schema: cursors written before 2026-07-16 could + // advance past rows dropped with "engine not initialised" (a backfill + // page racing initEngine on account switch) — those serials were + // skipped forever. Wiping cursors is always safe: the next backfill + // force-refetches from 0 and the store dedupes by serverMsgId. + `DELETE FROM backfill_cursors`, + ], + }, ]; const LAST = MIGRATIONS[MIGRATIONS.length - 1]; diff --git a/packages/chat/src/backfill-decrypt.test.ts b/packages/chat/src/backfill-decrypt.test.ts index 7549960..dc1fd31 100644 --- a/packages/chat/src/backfill-decrypt.test.ts +++ b/packages/chat/src/backfill-decrypt.test.ts @@ -134,3 +134,124 @@ describe("decryptBackfill — undecryptable rows advance the cursor (ADR-0020 § expect(onDecryptFailure).toHaveBeenCalledTimes(1); }); }); + +// An engine that holds no state for the group — throws the same shape the +// native ChatMlsCore surfaces when the device never processed a Welcome — +// but only for a sentinel ciphertext, so a page can mix healthy + blocked rows. +const GNF_SENTINEL = 0x99; +const gnfMls: MlsApi = { + encryptApp: (_g, plaintext) => plaintext, + processMessage: (_g, bytes) => { + if (bytes.length <= 2 && bytes[bytes.length - 1] === GNF_SENTINEL) { + throw new Error('ChatMlsError.Internal("group not found")'); + } + return { kind: "application", plaintext: bytes }; + }, +}; + +function gnfRowCiphertext(): Uint8Array { + return new Uint8Array([FRAME_VERSION_V2, GNF_SENTINEL]); +} + +describe("decryptBackfill — recoverable failures pin the cursor", () => { + it("caps upTo below a 'group not found' row and stops paging", async () => { + const { push, page } = harness({ + mls: gnfMls, + resolveChatGroupId: async () => GID, + }); + + const good = encryptOutboundMls({ + body: { text: "hello" }, + groupId: GID, + mls: gnfMls, + }); + + push({ + t: "bfd", + chatId: "chat-1", + messages: [ + bfdRow("8", good.ciphertext), // decrypts + bfdRow("9", gnfRowCiphertext()), // group not found → recoverable + bfdRow("10", good.ciphertext), // still delivered (dedupe on refetch) + ], + upTo: "10", + more: true, + }); + + const result = await page; + expect(result.messages.map((m) => m.serverMsgId)).toEqual(["8", "10"]); + // Cursor pinned just below the blocked serial → 9 is refetched after the + // Welcome lands, instead of being skipped forever. + expect(result.upTo).toBe("8"); + // Same-session paging stops — otherwise the next page re-serves 9+ in a loop. + expect(result.more).toBe(false); + }); + + it("caps at serial-1 even for the first row of history", async () => { + const { push, page } = harness({ + mls: gnfMls, + resolveChatGroupId: async () => GID, + }); + + push({ + t: "bfd", + chatId: "chat-1", + messages: [bfdRow("1", gnfRowCiphertext())], + upTo: "1", + more: false, + }); + + const result = await page; + expect(result.upTo).toBe("0"); + expect(result.more).toBe(false); + }); + + it("treats a not-yet-initialised engine as recoverable (init race on account switch)", async () => { + // Exact shape the native module surfaces when a backfill page races + // initEngine(accountId) — the 2026-07-16 alice regression. + const bootingMls: MlsApi = { + encryptApp: (_g, plaintext) => plaintext, + processMessage: () => { + throw new Error( + "UnexpectedException: ChatMlsCore: engine not initialised — call initEngine(accountId) first", + ); + }, + }; + const { push, page } = harness({ + mls: bootingMls, + resolveChatGroupId: async () => GID, + }); + + push({ + t: "bfd", + chatId: "chat-1", + messages: [bfdRow("3", gnfRowCiphertext())], + upTo: "3", + more: false, + }); + + const result = await page; + expect(result.upTo).toBe("2"); + expect(result.more).toBe(false); + }); + + it("treats a missing local chat↔group link as recoverable too", async () => { + // chat.list mirror hasn't landed yet → resolveChatGroupId yields null. + const { push, page, onDecryptFailure } = harness({ + mls: gnfMls, + resolveChatGroupId: async () => null, + }); + + push({ + t: "bfd", + chatId: "chat-1", + messages: [bfdRow("5", gnfRowCiphertext())], + upTo: "5", + more: false, + }); + + const result = await page; + expect(result.upTo).toBe("4"); + expect(onDecryptFailure).toHaveBeenCalledTimes(1); + }); +}); diff --git a/packages/chat/src/encrypted-transport.ts b/packages/chat/src/encrypted-transport.ts index c5a749b..8b82daf 100644 --- a/packages/chat/src/encrypted-transport.ts +++ b/packages/chat/src/encrypted-transport.ts @@ -31,6 +31,26 @@ export interface ReactionInput { op: "add" | "del"; } +// Outcome of a single-row decrypt. Failures carry the reason so the backfill +// path can distinguish recoverable ones (cursor must not advance) from +// expected-permanent ones (cursor advances, per ADR-0020 §5). +type DecryptOutcome = + | { ok: true; frame: ChatFrame; frameVersion: 1 | 2 } + | { ok: false; reason: string }; + +// Decrypt failures a later state change can cure: the engine gaining the +// group from a pending Welcome ("group not found"), the chat.list mirror +// landing the local chat↔group link ("no mls_group_id locally"), or the +// native engine still booting ("engine not initialised" — a backfill page +// that races initEngine(accountId), seen on account switch). If the backfill +// cursor advances past such a row it is never refetched — the message is +// lost even after the state heals. +export function isRecoverableDecryptReason(reason: string): boolean { + return /group not found|no mls_group_id locally|engine not initialised/i.test( + reason, + ); +} + // Discriminated on payload: exactly one of `text` (a message) or `reaction` // (a reaction that rides the same encrypted frame — Option A). Both share the // routing fields below. @@ -184,42 +204,37 @@ export function createEncryptedTransport( } // Decrypt a single inbound row (live `msg` or a backfilled `bfd` row — both - // carry the same fields). Returns the decrypted frame + version, or null on - // any failure (empty/unknown/undecryptable), having already reported it via - // onDecryptFailure. Shared by the live path and backfill so both stay in - // lock-step on v=1/v=2 handling. - async function decryptOne( - msg: IncomingMessage, - ): Promise<{ frame: ChatFrame; frameVersion: 1 | 2 } | null> { + // carry the same fields). Failures are reported via onDecryptFailure AND + // surfaced in the outcome so decryptBackfill can classify them (recoverable + // failures must not advance the cursor). Shared by the live path and + // backfill so both stay in lock-step on v=1/v=2 handling. + async function decryptOne(msg: IncomingMessage): Promise { + const fail = (reason: string): DecryptOutcome => { + opts.onDecryptFailure?.(msg, reason); + return { ok: false, reason }; + }; + // Peek the version byte before doing any lookups — v=2 skips the v=1 // peer-pub directory hit entirely. if (msg.ciphertext.length === 0) { - opts.onDecryptFailure?.(msg, "empty ciphertext"); - return null; + return fail("empty ciphertext"); } const version = msg.ciphertext[0]; if (version === FRAME_VERSION_V2) { if (!opts.mls || !opts.resolveChatGroupId) { - opts.onDecryptFailure?.( - msg, - "v=2 frame received but no MLS engine configured", - ); - return null; + return fail("v=2 frame received but no MLS engine configured"); } let groupId: Uint8Array | null; try { groupId = await opts.resolveChatGroupId(msg.chatId); } catch (err) { - opts.onDecryptFailure?.(msg, `groupId lookup failed: ${String(err)}`); - return null; + return fail(`groupId lookup failed: ${String(err)}`); } if (!groupId) { - opts.onDecryptFailure?.( - msg, + return fail( `v=2 frame for chat ${msg.chatId} but no mls_group_id locally`, ); - return null; } try { const result = decryptInbound({ @@ -236,10 +251,9 @@ export function createEncryptedTransport( if (result.frameVersion !== 2) { throw new Error("expected v=2 result for v=2 ciphertext"); } - return { frame: result.frame, frameVersion: 2 }; + return { ok: true, frame: result.frame, frameVersion: 2 }; } catch (err) { - opts.onDecryptFailure?.(msg, String(err)); - return null; + return fail(String(err)); } } @@ -250,8 +264,7 @@ export function createEncryptedTransport( seed = await opts.getMySeed(); candidates = await opts.resolveSenderX25519Pubs(msg.senderId); } catch (err) { - opts.onDecryptFailure?.(msg, `pre-decrypt lookup failed: ${String(err)}`); - return null; + return fail(`pre-decrypt lookup failed: ${String(err)}`); } try { const result = decryptInbound({ @@ -264,27 +277,31 @@ export function createEncryptedTransport( if (result.frameVersion !== 1) { throw new Error("expected v=1 result for v=1 ciphertext"); } - return { frame: result.frame, frameVersion: 1 }; + return { ok: true, frame: result.frame, frameVersion: 1 }; } catch (err) { - opts.onDecryptFailure?.(msg, String(err)); - return null; + return fail(String(err)); } } async function handleInbound(msg: IncomingMessage) { const res = await decryptOne(msg); - if (res) dispatch(msg, res.frame, res.frameVersion); + if (res.ok) dispatch(msg, res.frame, res.frameVersion); } // Decrypt one `bfd` page: map each row through decryptOne (dropping the ones // that fail), split messages from reactions. Ordering is preserved from the - // server's ascending-serial page. `upTo`/`more` pass through untouched so the - // caller advances its cursor even past undecryptable rows. + // server's ascending-serial page. `upTo`/`more` pass through for + // expected-permanent drops (cursor advances, no refetch loop), but a + // RECOVERABLE drop (see isRecoverableDecryptReason) caps `upTo` below the + // failing serial + forces more:false so the row is refetched after heal. async function decryptBackfill( bfd: IncomingBackfill, ): Promise { const messages: BackfilledMessage[] = []; const reactions: BackfilledReaction[] = []; + let dropped = 0; + // serverMsgId of the first recoverably-undecryptable row, if any. + let blockedAt: string | null = null; for (const row of bfd.messages) { const asMsg: IncomingMessage = { t: "msg", @@ -296,7 +313,17 @@ export function createEncryptedTransport( ts: row.ts, }; const res = await decryptOne(asMsg); - if (!res) continue; + if (!res.ok) { + dropped++; + // First RECOVERABLE failure pins the cursor: the row will decrypt + // once the pending Welcome / chat-link lands, but only if we refetch + // it. Later rows still process — the store dedupes the overlap by + // serverMsgId on the post-heal refetch. + if (blockedAt === null && isRecoverableDecryptReason(res.reason)) { + blockedAt = row.serverMsgId; + } + continue; + } const base = { chatId: bfd.chatId, serverMsgId: row.serverMsgId, @@ -310,12 +337,41 @@ export function createEncryptedTransport( messages.push({ ...base, frame: res.frame }); } } + + // Non-recoverable drops (own v=2 sends, v=1 sealed to other devices) + // advance the cursor as before (ADR-0020 §5 — no refetch loop). A + // recoverable drop caps upTo just below the failing serial so the next + // backfill re-requests it, and stops same-session paging (more:false) — + // otherwise the follow-up page would re-serve the same rows in a loop. + let upTo = bfd.upTo; + let more = bfd.more; + if (blockedAt !== null) { + const capped = (BigInt(blockedAt) - 1n).toString(); + if (BigInt(capped) < BigInt(bfd.upTo)) upTo = capped; + more = false; + } + + // [DEBUG-bkfl] The decisive probe: fetched>0 & dropped==fetched → wholesale + // decrypt-drop; fetched==0 → fetch/identity/cursor gap upstream. + console.log( + "[DEBUG-bkfl] page", + JSON.stringify({ + chatId: bfd.chatId, + fetched: bfd.messages.length, + decryptedMsgs: messages.length, + decryptedRx: reactions.length, + dropped, + blockedAt, + upTo, + more, + }), + ); return { chatId: bfd.chatId, messages, reactions, - upTo: bfd.upTo, - more: bfd.more, + upTo, + more, }; } diff --git a/packages/chat/src/outbox-worker.test.ts b/packages/chat/src/outbox-worker.test.ts new file mode 100644 index 0000000..4222d66 --- /dev/null +++ b/packages/chat/src/outbox-worker.test.ts @@ -0,0 +1,105 @@ +import { describe, expect, it, vi } from "vitest"; +import { encode } from "@msgpack/msgpack"; +import type { PendingOutboxRow } from "@repo/chat-db"; + +import { + createOutboxWorker, + isTerminalSendReason, + type BoundOutboxApi, + type OutboxWorkerStoreApi, +} from "./outbox-worker"; +import type { EncryptedChatTransport } from "./encrypted-transport"; + +function row(overrides: Partial = {}): PendingOutboxRow { + return { + id: "client-msg-1", + chat_id: "chat-1", + payload: encode({ text: "hi" }), + idempotency_key: "client-msg-1", + attempts: 0, + next_attempt_at: 0, + created_at: 0, + last_error: null, + ...overrides, + } as PendingOutboxRow; +} + +// One-shot outbox: due() hands out the row exactly once, then records which +// terminal/transient transition the worker chose. +function harness(sendError: Error) { + let handed = false; + const calls = { + markFailed: vi.fn(async () => {}), + markPermanentlyFailed: vi.fn(async () => {}), + markSent: vi.fn(async () => {}), + }; + const outbox: BoundOutboxApi = { + enqueue: async () => {}, + due: async () => { + if (handed) return []; + handed = true; + return [row()]; + }, + markSent: calls.markSent, + markFailed: calls.markFailed, + markPermanentlyFailed: calls.markPermanentlyFailed, + requeue: async () => {}, + }; + const store: OutboxWorkerStoreApi = { + confirmOptimisticMessage: vi.fn(), + failOptimisticMessage: vi.fn(), + }; + const transport = { + send: vi.fn(async () => { + throw sendError; + }), + } as unknown as EncryptedChatTransport; + + let resolveSettled!: (v: { kind: "terminal" | "transient" }) => void; + const settled = new Promise<{ kind: "terminal" | "transient" }>((resolve) => { + resolveSettled = resolve; + }); + const worker = createOutboxWorker({ + outbox, + transport, + store, + onTerminalFailure: () => resolveSettled({ kind: "terminal" }), + onTransientFailure: () => resolveSettled({ kind: "transient" }), + }); + worker.start(); + return { settled, calls, store, worker }; +} + +describe("outbox-worker — 'group not found' is terminal, not transient", () => { + it("marks the row permanently failed on the FIRST attempt", async () => { + const { settled, calls, store, worker } = harness( + new Error('ChatMlsError.Internal("group not found")'), + ); + const outcome = await settled; + worker.stop(); + expect(outcome.kind).toBe("terminal"); + expect(calls.markPermanentlyFailed).toHaveBeenCalledTimes(1); + expect(calls.markFailed).not.toHaveBeenCalled(); + expect(store.failOptimisticMessage).toHaveBeenCalledWith({ + chatId: "chat-1", + clientMsgId: "client-msg-1", + }); + }); + + it("still retries genuinely transient failures with backoff", async () => { + const { settled, calls, worker } = harness( + new Error("network request failed"), + ); + const outcome = await settled; + worker.stop(); + expect(outcome.kind).toBe("transient"); + expect(calls.markFailed).toHaveBeenCalledTimes(1); + expect(calls.markPermanentlyFailed).not.toHaveBeenCalled(); + }); + + it("classifier matches the engine error shape case-insensitively", () => { + expect(isTerminalSendReason('Internal("group not found")')).toBe(true); + expect(isTerminalSendReason("Group Not Found")).toBe(true); + expect(isTerminalSendReason("timeout waiting for ack")).toBe(false); + }); +}); diff --git a/packages/chat/src/outbox-worker.ts b/packages/chat/src/outbox-worker.ts index 7242a50..95919b1 100644 --- a/packages/chat/src/outbox-worker.ts +++ b/packages/chat/src/outbox-worker.ts @@ -87,6 +87,17 @@ const BACKOFFS_MS = [5_000, 30_000, 120_000, 600_000]; const TICK_LIMIT = 20; const PERIODIC_TICK_MS = 30_000; +// "group not found" = the MLS engine holds no state for this chat's group +// (crypto-membership gap — the device never processed a Welcome). No retry +// can fix it: the ratchet the ciphertext needs doesn't exist on this device. +// Retrying used to leave the bubble at "sending" (opacity < 1) forever; +// terminal-failing flips it to "failed" so the user sees the truth. +const TERMINAL_REASONS = /group not found/i; + +export function isTerminalSendReason(reason: string): boolean { + return TERMINAL_REASONS.test(reason); +} + function backoffFor(attemptsAfter: number): number { const idx = Math.max(0, Math.min(attemptsAfter - 1, BACKOFFS_MS.length - 1)); return BACKOFFS_MS[idx]!; @@ -157,7 +168,7 @@ export function createOutboxWorker(deps: OutboxWorkerDeps): OutboxWorker { } catch (err) { const reason = err instanceof Error ? err.message : String(err); const attemptsAfter = row.attempts + 1; - if (attemptsAfter >= MAX_ATTEMPTS) { + if (attemptsAfter >= MAX_ATTEMPTS || isTerminalSendReason(reason)) { await deps.outbox.markPermanentlyFailed(row.id, reason); deps.store.failReaction?.({ chatId: row.chat_id, @@ -216,7 +227,7 @@ export function createOutboxWorker(deps: OutboxWorkerDeps): OutboxWorker { } catch (err) { const reason = err instanceof Error ? err.message : String(err); const attemptsAfter = row.attempts + 1; - if (attemptsAfter >= MAX_ATTEMPTS) { + if (attemptsAfter >= MAX_ATTEMPTS || isTerminalSendReason(reason)) { await deps.outbox.markPermanentlyFailed(row.id, reason); deps.store.failOptimisticMessage({ chatId: row.chat_id, diff --git a/packages/chat/src/provider.tsx b/packages/chat/src/provider.tsx index 97d39b1..a0b9d22 100644 --- a/packages/chat/src/provider.tsx +++ b/packages/chat/src/provider.tsx @@ -122,9 +122,15 @@ export function ChatStoreProvider({ // Build + fire one batched `bf` covering every known chat's cursor. No-op // without a cursor store or before chats have loaded. const runBackfill = useCallback(() => { - if (!backfillCursors) return; + if (!backfillCursors) { + console.log("[DEBUG-bkfl] runBackfill skipped — no backfillCursors"); + return; + } const chatIds = Array.from(useChatStore.getState().chats.keys()); - if (chatIds.length === 0) return; + if (chatIds.length === 0) { + console.log("[DEBUG-bkfl] runBackfill skipped — 0 chats in store"); + return; + } void (async () => { let cursors: Record = {}; try { @@ -138,6 +144,16 @@ export function ChatStoreProvider({ backfilledThisLaunch.current.add(chatId); return forced ? { chatId, after, force: true } : { chatId, after }; }); + console.log( + "[DEBUG-bkfl] sendBackfill", + JSON.stringify( + batch.map((b) => ({ + chatId: b.chatId, + after: b.after, + force: "force" in b ? !!b.force : false, + })), + ), + ); transport.sendBackfill(batch); })(); }, [backfillCursors, transport]); @@ -257,7 +273,10 @@ export function ChatStoreProvider({ // decrypted + split by the transport. Merge messages via the store's // serial-sorted ingest, fold reactions onto their targets (serial-ascending // order guarantees a target lands before its reaction), advance the cursor to - // `upTo` (even past undecryptable rows → no refetch loop), and page while more. + // `upTo`, and page while more. The transport advances `upTo` past + // expected-permanent drops (no refetch loop) but caps it below a RECOVERABLE + // drop (e.g. "group not found" before the Welcome lands) so that row is + // refetched — never silently lost — once the group state heals. useEffect(() => { if (!authenticated) return; return transport.onBackfill((page) => { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a9c67d1..749fade 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,13 +10,13 @@ importers: dependencies: expo: specifier: ~54.0.34 - version: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) + version: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) react: specifier: 19.1.0 version: 19.1.0 react-native: specifier: 0.81.5 - version: 0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) + version: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) devDependencies: '@repo/eslint-config': specifier: workspace:* @@ -93,7 +93,7 @@ importers: version: 0.4.2 '@op-engineering/op-sqlite': specifier: ^14.1.0 - version: 14.1.4(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + version: 14.1.4(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) '@repo/api-server': specifier: workspace:* version: link:../../services/api @@ -120,16 +120,16 @@ importers: version: link:../../packages/ui '@shopify/flash-list': specifier: ^2.3.1 - version: 2.3.1(@babel/runtime@7.29.2)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + version: 2.3.1(@babel/runtime@7.29.2)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) '@tamagui/animations-react-native': specifier: ^2.0.0-rc.41 version: 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@tamagui/config': specifier: ^2.0.0-rc.41 - version: 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native-reanimated@4.1.7(react-native-worklets@0.8.3(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react@19.1.0) + version: 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native-reanimated@4.1.7(react-native-worklets@0.8.3(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react@19.1.0) '@tamagui/metro-plugin': specifier: 2.0.0-rc.41 - version: 2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) + version: 2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) '@tamagui/native': specifier: ^2.0.0-rc.41 version: 2.0.0-rc.42(react@19.1.0) @@ -147,19 +147,19 @@ importers: version: 1.6.9(@cloudflare/workers-types@4.20260509.1)(@prisma/client@6.19.3(prisma@6.19.3(typescript@5.9.2))(typescript@5.9.2))(next@16.1.0(@babel/core@7.29.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(prisma@6.19.3(typescript@5.9.2))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(vitest@2.1.9(@types/node@22.19.18)(lightningcss@1.32.0)(terser@5.47.1)) expo: specifier: ~54.0.0 - version: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) + version: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) expo-blur: specifier: ~15.0.8 - version: 15.0.8(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + version: 15.0.8(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) expo-build-properties: specifier: ~0.14.0 version: 0.14.8(expo@54.0.34) expo-clipboard: specifier: ~8.0.8 - version: 8.0.8(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + version: 8.0.8(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) expo-constants: specifier: ~18.0.0 - version: 18.0.13(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0)) + version: 18.0.13(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0)) expo-crypto: specifier: ~15.0.0 version: 15.0.9(expo@54.0.34) @@ -171,25 +171,25 @@ importers: version: 8.0.10(expo@54.0.34) expo-file-system: specifier: ~19.0.18 - version: 19.0.22(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0)) + version: 19.0.22(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0)) expo-font: specifier: ~14.0.0 - version: 14.0.11(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + version: 14.0.11(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) expo-haptics: specifier: ~15.0.8 version: 15.0.8(expo@54.0.34) expo-linear-gradient: specifier: ~15.0.8 - version: 15.0.8(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + version: 15.0.8(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) expo-linking: specifier: ~8.0.0 - version: 8.0.12(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + version: 8.0.12(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) expo-notifications: specifier: ~0.32.12 - version: 0.32.17(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) + version: 0.32.17(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) expo-router: specifier: ~6.0.0 - version: 6.0.23(d270f903a381d04171c7e3105bcc3cd4) + version: 6.0.23(04d3d8526ab825d13bb1e48e5046dce1) expo-secure-store: specifier: ~15.0.0 version: 15.0.8(expo@54.0.34) @@ -198,10 +198,10 @@ importers: version: 31.0.13(expo@54.0.34)(typescript@5.9.2) expo-status-bar: specifier: ~3.0.0 - version: 3.0.9(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + version: 3.0.9(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) expo-system-ui: specifier: ~6.0.9 - version: 6.0.9(expo@54.0.34)(react-native-web@0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0)) + version: 6.0.9(expo@54.0.34)(react-native-web@0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0)) react: specifier: 19.1.0 version: 19.1.0 @@ -210,25 +210,25 @@ importers: version: 19.1.0(react@19.1.0) react-native: specifier: 0.81.5 - version: 0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) + version: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) react-native-gesture-handler: specifier: ~2.28.0 - version: 2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + version: 2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) react-native-get-random-values: specifier: ~1.11.0 - version: 1.11.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0)) + version: 1.11.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0)) react-native-reanimated: specifier: ~4.1.1 - version: 4.1.7(react-native-worklets@0.8.3(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + version: 4.1.7(react-native-worklets@0.8.3(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) react-native-safe-area-context: specifier: ~5.6.0 - version: 5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + version: 5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) react-native-screens: specifier: ~4.16.0 - version: 4.16.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + version: 4.16.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) tamagui: specifier: ^2.0.0-rc.41 - version: 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + version: 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) zustand: specifier: ^5.0.3 version: 5.0.13(@types/react@19.1.17)(react@19.1.0)(use-sync-external-store@1.6.0(react@19.1.0)) @@ -236,6 +236,9 @@ importers: '@babel/core': specifier: ^7.25.2 version: 7.29.0 + '@react-native-community/cli': + specifier: latest + version: 20.2.0(typescript@5.9.2) '@repo/eslint-config': specifier: workspace:* version: link:../../packages/eslint-config @@ -277,7 +280,7 @@ importers: version: 19.1.0 react-native: specifier: '*' - version: 0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) + version: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) zustand: specifier: ^5.0.3 version: 5.0.13(@types/react@19.1.17)(react@19.1.0)(use-sync-external-store@1.6.0(react@19.1.0)) @@ -305,13 +308,13 @@ importers: dependencies: expo: specifier: '*' - version: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) + version: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) react: specifier: '*' version: 19.1.0 react-native: specifier: '*' - version: 0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) + version: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) devDependencies: '@repo/eslint-config': specifier: workspace:* @@ -333,13 +336,13 @@ importers: dependencies: expo: specifier: '*' - version: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) + version: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) react: specifier: '*' version: 19.1.0 react-native: specifier: '*' - version: 0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) + version: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) devDependencies: '@repo/eslint-config': specifier: workspace:* @@ -361,10 +364,10 @@ importers: dependencies: '@op-engineering/op-sqlite': specifier: ^14.1.0 - version: 14.1.4(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + version: 14.1.4(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) expo: specifier: '*' - version: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) + version: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) expo-crypto: specifier: ~15.0.0 version: 15.0.9(expo@54.0.34) @@ -376,7 +379,7 @@ importers: version: 19.1.0 react-native: specifier: '*' - version: 0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) + version: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) devDependencies: '@repo/eslint-config': specifier: workspace:* @@ -404,13 +407,13 @@ importers: version: link:../chat-db expo: specifier: '*' - version: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) + version: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) react: specifier: '*' version: 19.1.0 react-native: specifier: '*' - version: 0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) + version: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) zod: specifier: ^3.24.1 version: 3.25.76 @@ -598,7 +601,7 @@ importers: version: 19.1.0 tamagui: specifier: 2.0.0-rc.42 - version: 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + version: 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) devDependencies: '@repo/eslint-config': specifier: workspace:* @@ -748,6 +751,34 @@ importers: specifier: ^4.90.0 version: 4.90.0(@cloudflare/workers-types@4.20260509.1) + services/demo-bot: + dependencies: + '@noble/ed25519': + specifier: ^2.3.0 + version: 2.3.0 + '@repo/chat-mls-core': + specifier: workspace:* + version: link:../../packages/chat-mls-core + '@repo/chat-mls-core-node': + specifier: file:../../packages/chat-mls-core/node + version: file:packages/chat-mls-core/node + '@trpc/client': + specifier: ^11.17.0 + version: 11.17.0(@trpc/server@11.17.0(typescript@5.9.2))(typescript@5.9.2) + devDependencies: + '@repo/api-server': + specifier: workspace:* + version: link:../api + '@types/node': + specifier: ^22.10.0 + version: 22.19.18 + tsx: + specifier: ^4.21.0 + version: 4.21.0 + typescript: + specifier: 5.9.2 + version: 5.9.2 + services/upload: dependencies: '@aws-sdk/client-s3': @@ -2413,6 +2444,12 @@ packages: '@floating-ui/utils@0.2.11': resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==} + '@hapi/hoek@9.3.0': + resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} + + '@hapi/topo@5.1.0': + resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} + '@humanfs/core@0.19.2': resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} engines: {node: '>=18.18.0'} @@ -3098,6 +3135,44 @@ packages: '@types/react': optional: true + '@react-native-community/cli-clean@20.2.0': + resolution: {integrity: sha512-krqbhFiwHN8l5wZ2XTcrNq9N+DqDWHxW8RK0bIcrK0O+fMvjYi9e/1Pnx2W0CTotOVcZpHzUbgZ4TQVF231Skw==} + + '@react-native-community/cli-config-android@20.2.0': + resolution: {integrity: sha512-lASofUNBVK0Pq3VEJ1JrCfAW94Rnk38DikauycRcoHl0hWjHIN3XhsN20dEq+CaIJoq37aCg5NSSSpmkET+ShA==} + + '@react-native-community/cli-config-apple@20.2.0': + resolution: {integrity: sha512-oohr6BV2riWJ5PYjayi1u52bG3H95MwKPkJCZo9pnOlYTjifZQVkMxZ8VTuk392efh0bijVTYfxH8iJPi97SIQ==} + + '@react-native-community/cli-config@20.2.0': + resolution: {integrity: sha512-GF5FxgDfOSLPi/bSiE/xvOGELwzV2GLQnDED+7ArbPi01W1Vu+hD/m+J+bwX34Pocpo767eXAVxc2h9WFUTUfQ==} + + '@react-native-community/cli-doctor@20.2.0': + resolution: {integrity: sha512-eZjlwmjPoBXgyD6nV5oDDocL1VH5UW4LxZcMAqyN3rQw5vq3CeJikFpNedKTtSl3P6JizIkInyIHpfrW+9qfJA==} + + '@react-native-community/cli-platform-android@20.2.0': + resolution: {integrity: sha512-fRglzcf/Yq5lnIkqdA8uf1GvlG18x3Dm48Yvo+l7KiWgh/SVtfVhfvalrtX5rmx+KeJkDA534bGoPvi5+ruWjw==} + + '@react-native-community/cli-platform-apple@20.2.0': + resolution: {integrity: sha512-jkEPLAd8C/ZRu39a3nhxwSXe0iisUiJC808GExnrnTcViLtg3sad2ciQ/HjjvbdsPCS9sT+Jr7xh3MzBsPojsQ==} + + '@react-native-community/cli-platform-ios@20.2.0': + resolution: {integrity: sha512-bCKlBt2HoD7WTl/HX60+4HFhR1lKY64Y9MPWu7yWQwOCEqYRMi6MkRxLimiONj9M2/lNf0z9BPHDzdDe5HM2ag==} + + '@react-native-community/cli-server-api@20.2.0': + resolution: {integrity: sha512-AI1fsl+6LNuOoDcdWsnF3s9ozqminGCUlbFcrgdZIJWyOuFBeQclNydI22VO3vWaO4dHQkfVa3Zo10AncWQvwA==} + + '@react-native-community/cli-tools@20.2.0': + resolution: {integrity: sha512-A5W2nqlTidPzGyXzS57jvHsMpQd8iOGSjePj4H318uMbhIdeIHQ5e59fNbdHahS62ISs+2p9s78sVHMbGVa1bg==} + + '@react-native-community/cli-types@20.2.0': + resolution: {integrity: sha512-K60zY/ly8G9rGJQzZ+bFRyLEckAUzyF8Fu9a2Kw6JipCrOl7SiVRBVqjvOr/XnCRKuOpH8i9y7RVg07wkSGRBQ==} + + '@react-native-community/cli@20.2.0': + resolution: {integrity: sha512-5RZKkBeUFC4hhrzySzxWmRJwXBTc2PE3L6QUgvnJk3QDxNYMY7aGuI8Gr9eZRS1DbiY10IPWqpJfqSIplzVG6A==} + engines: {node: '>=20.19.4'} + hasBin: true + '@react-native/assets-registry@0.81.5': resolution: {integrity: sha512-705B6x/5Kxm1RKRvSv0ADYWm5JOnoiQ1ufW7h8uu2E6G9Of/eE6hP/Ivw3U5jI16ERqZxiKQwk34VJbB0niX9w==} engines: {node: '>= 20.19.4'} @@ -3240,6 +3315,9 @@ packages: '@react-navigation/routers@7.5.5': resolution: {integrity: sha512-9/hhMte12Kgu+pMnLfA4EWJ0OQmIEAMVMX06FPH2yGkEQSQ3JhhCN/GkcRikzQhtEi97VYYQA15umptBUShcOQ==} + '@repo/chat-mls-core-node@file:packages/chat-mls-core/node': + resolution: {directory: packages/chat-mls-core/node, type: directory} + '@rollup/rollup-android-arm-eabi@4.60.4': resolution: {integrity: sha512-F5QXMSiFebS9hKZj02XhWLLnRpJ3B3AROP0tWbFBSj+6kCbg5m9j5JoHKd4mmSVy5mS/IMQloYgYxCuJC0fxEQ==} cpu: [arm] @@ -3388,6 +3466,15 @@ packages: react: '*' react-native: '*' + '@sideway/address@4.1.5': + resolution: {integrity: sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==} + + '@sideway/formula@3.0.1': + resolution: {integrity: sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==} + + '@sideway/pinpoint@2.0.0': + resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} + '@sinclair/typebox@0.27.10': resolution: {integrity: sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==} @@ -4724,6 +4811,9 @@ packages: '@vitest/utils@2.1.9': resolution: {integrity: sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==} + '@vscode/sudo-prompt@9.3.2': + resolution: {integrity: sha512-gcXoCN00METUNFeQOFJ+C9xUI0DKB+0EGMVg7wbVYRHBw2Eq3fKisDZOkRdOz3kqXRKOENMfShPOmypw1/8nOw==} + '@xmldom/xmldom@0.8.13': resolution: {integrity: sha512-KRYzxepc14G/CEpEGc3Yn+JKaAeT63smlDr+vjB8jRfgTBBI9wRj/nkQEO+ucV8p8I9bfKLWp37uHgFrbntPvw==} engines: {node: '>=10.0.0'} @@ -4775,6 +4865,9 @@ packages: resolution: {integrity: sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==} engines: {node: '>=18'} + ansi-fragments@0.2.1: + resolution: {integrity: sha512-DykbNHxuXQwUDRv5ibc2b0x7uw7wmwOGLBUd5RmaQ5z8Lhx19vwvKV+FAsM5rEA6dEcHxX+/Ad5s9eF2k2bB+w==} + ansi-regex@4.1.1: resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} engines: {node: '>=6'} @@ -4810,6 +4903,9 @@ packages: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} + appdirsjs@1.2.7: + resolution: {integrity: sha512-Quji6+8kLBC3NnBeo14nPDq0+2jUs5s3/xEye+udFHumHhRk4M7aAMXp/PBJqkKYGuuyR9M/6Dq7d2AViiGmhw==} + arg@5.0.2: resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} @@ -4865,6 +4961,10 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} + astral-regex@1.0.0: + resolution: {integrity: sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==} + engines: {node: '>=4'} + astral-regex@2.0.0: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} engines: {node: '>=8'} @@ -5062,6 +5162,9 @@ packages: bignumber.js@9.3.1: resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==} + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + blake3-wasm@2.1.5: resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==} @@ -5225,6 +5328,10 @@ packages: resolution: {integrity: sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==} engines: {node: '>=4'} + cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + cli-cursor@5.0.0: resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} engines: {node: '>=18'} @@ -5240,6 +5347,9 @@ packages: client-only@0.0.1: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + cliui@6.0.0: + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} @@ -5278,9 +5388,15 @@ packages: resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} engines: {node: '>=12.5.0'} + colorette@1.4.0: + resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} + colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + command-exists@1.2.9: + resolution: {integrity: sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==} + commander@11.1.0: resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} engines: {node: '>=16'} @@ -5304,6 +5420,10 @@ packages: resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} engines: {node: '>= 10'} + commander@9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} + commondir@1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} @@ -5359,6 +5479,15 @@ packages: resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} engines: {node: '>= 0.10'} + cosmiconfig@9.0.2: + resolution: {integrity: sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + create-jest@29.7.0: resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -5389,6 +5518,9 @@ packages: resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} engines: {node: '>= 0.4'} + dayjs@1.11.21: + resolution: {integrity: sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==} + debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: @@ -5414,6 +5546,10 @@ packages: supports-color: optional: true + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + decode-uri-component@0.2.2: resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} engines: {node: '>=0.10'} @@ -5554,6 +5690,15 @@ packages: resolution: {integrity: sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA==} engines: {node: '>=8'} + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + envinfo@7.21.0: + resolution: {integrity: sha512-Lw7I8Zp5YKHFCXL7+Dz95g4CcbMEpgvqZNNq3AmlT5XAV6CgAAk6gyAMqn2zjw08K9BHfcNuKrMiCPLByGafow==} + engines: {node: '>=4'} + hasBin: true + environment@1.1.0: resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} engines: {node: '>=18'} @@ -5567,6 +5712,10 @@ packages: error-stack-parser@2.1.4: resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} + errorhandler@1.5.2: + resolution: {integrity: sha512-kNAL7hESndBCrWwS72QyV3IVOTrVmj9D062FV5BQswNL5zEdeRmz/WJFyh6Aj/plvvSOrzddkxW57HgkZcR9Fw==} + engines: {node: '>= 0.8'} + es-abstract@1.24.2: resolution: {integrity: sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==} engines: {node: '>= 0.4'} @@ -6201,6 +6350,10 @@ packages: resolution: {integrity: sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg==} engines: {node: '>=14.14'} + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -6544,6 +6697,10 @@ packages: resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} engines: {node: '>= 0.4'} + is-fullwidth-code-point@2.0.0: + resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} + engines: {node: '>=4'} + is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} @@ -6564,6 +6721,10 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} + is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + is-map@2.0.3: resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} @@ -6623,6 +6784,10 @@ packages: resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + is-weakmap@2.0.2: resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} engines: {node: '>= 0.4'} @@ -6635,6 +6800,10 @@ packages: resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} engines: {node: '>= 0.4'} + is-wsl@1.1.0: + resolution: {integrity: sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==} + engines: {node: '>=4'} + is-wsl@2.2.0: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} @@ -6831,6 +7000,9 @@ packages: resolution: {integrity: sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==} engines: {node: '>= 0.6.0'} + joi@17.13.4: + resolution: {integrity: sha512-1RuuER6kmt8K8I3nIWvPZKi5RQCb568ZPyY4Pwjlua+yo+63ZTmIwxLZH0heBmiKN4uxjvCiarDrjaeH84xicQ==} + jose@4.15.9: resolution: {integrity: sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==} @@ -6889,6 +7061,9 @@ packages: engines: {node: '>=6'} hasBin: true + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + jsonfile@6.2.1: resolution: {integrity: sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==} @@ -6921,6 +7096,9 @@ packages: resolution: {integrity: sha512-ONPnazC96VKDntab9j9JKwIWhZ4ZUceB4A9Epu4Ssg0hYFmtHZSeQ+n15nIwTFmcBUKtExOer8WTJ4GF9MO64A==} hasBin: true + launch-editor@2.14.1: + resolution: {integrity: sha512-QWBrQsMpH7gPr965dsKD/3cKWiNoTjpATQf++Xq63N6sKRGMwlVXz41O1IZTMfZQgBctD/K5Zt06+/I6pP6+HA==} + leven@3.1.0: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} @@ -7042,10 +7220,18 @@ packages: resolution: {integrity: sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==} engines: {node: '>=4'} + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + log-update@6.1.0: resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} engines: {node: '>=18'} + logkitty@0.7.1: + resolution: {integrity: sha512-/3ER20CTTbahrCrpYfPn7Xavv9diBROZpoXGVZDWMw4b/X4uuUwAC0ki85tgsdMRONURyIJbcOvS94QsUBYPbQ==} + hasBin: true + loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -7308,6 +7494,11 @@ packages: engines: {node: '>=4'} hasBin: true + mime@2.6.0: + resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} + engines: {node: '>=4.0.0'} + hasBin: true + mimic-fn@1.2.0: resolution: {integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==} engines: {node: '>=4'} @@ -7443,6 +7634,10 @@ packages: sass: optional: true + nocache@3.0.4: + resolution: {integrity: sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw==} + engines: {node: '>=12.0.0'} + node-exports-info@1.6.0: resolution: {integrity: sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==} engines: {node: '>= 0.4'} @@ -7469,6 +7664,10 @@ packages: node-releases@2.0.38: resolution: {integrity: sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==} + node-stream-zip@1.15.0: + resolution: {integrity: sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==} + engines: {node: '>=0.12.0'} + normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -7578,6 +7777,10 @@ packages: resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} engines: {node: '>=18'} + open@6.4.0: + resolution: {integrity: sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==} + engines: {node: '>=8'} + open@7.4.2: resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==} engines: {node: '>=8'} @@ -7601,6 +7804,10 @@ packages: 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'} + own-keys@1.0.1: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} @@ -8010,6 +8217,10 @@ packages: resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==} engines: {node: '>=0.10.0'} + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + readdirp@4.1.2: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} @@ -8055,6 +8266,9 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} + require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + requireg@0.2.2: resolution: {integrity: sha512-nYzyjnFcPNGR3lx9lwPPPnuQxv6JWEZd2Ci0u9opN7N5zUEPIhY/GbL3vMGOr2UXwEg9WwSyV9X9Y/kLFgPsOg==} engines: {node: '>= 4.0.0'} @@ -8107,6 +8321,10 @@ packages: resolution: {integrity: sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==} engines: {node: '>=4'} + restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + restore-cursor@5.1.0: resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} engines: {node: '>=18'} @@ -8206,6 +8424,9 @@ packages: server-only@0.0.1: resolution: {integrity: sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==} + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + set-cookie-parser@3.1.0: resolution: {integrity: sha512-kjnC1DXBHcxaOaOXBHBeRtltsDG2nUiUni+jP92M9gYdW12rsmx92UsfpH7o5tDRs7I1ZZPSQJQGv3UaRfCiuw==} @@ -8254,6 +8475,10 @@ packages: resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} engines: {node: '>= 0.4'} + shell-quote@1.9.0: + resolution: {integrity: sha512-Iov+JwFv/2HcTpcwNMKd8+IWNb8tboQJNQTkAY/LLVK7gGH9jy+LGkVqPxfekHl+yMmiqXszdGWXgkfml7hjqA==} + engines: {node: '>= 0.4'} + side-channel-list@1.0.1: resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} engines: {node: '>= 0.4'} @@ -8297,6 +8522,10 @@ packages: resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} engines: {node: '>=12'} + slice-ansi@2.1.0: + resolution: {integrity: sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==} + engines: {node: '>=6'} + slice-ansi@4.0.0: resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} engines: {node: '>=10'} @@ -8464,6 +8693,9 @@ packages: resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} engines: {node: '>= 0.4'} + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + strip-ansi@5.2.0: resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} engines: {node: '>=6'} @@ -8749,6 +8981,10 @@ packages: resolution: {integrity: sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==} engines: {node: '>=4'} + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + universalify@2.0.1: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} @@ -8802,6 +9038,9 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + util@0.12.5: resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} @@ -8949,6 +9188,9 @@ packages: resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} engines: {node: '>= 0.4'} + which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + which-typed-array@1.1.20: resolution: {integrity: sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==} engines: {node: '>= 0.4'} @@ -8985,6 +9227,10 @@ packages: '@cloudflare/workers-types': optional: true + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -9071,6 +9317,9 @@ packages: resolution: {integrity: sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==} engines: {node: '>=8.0'} + y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -9090,10 +9339,18 @@ packages: engines: {node: '>= 14.6'} hasBin: true + yargs-parser@18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} + yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} + yargs@15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} + yargs@17.7.2: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} @@ -10683,7 +10940,7 @@ snapshots: '@expo-google-fonts/sora@0.4.2': {} - '@expo/cli@54.0.24(expo-router@6.0.23)(expo@54.0.34)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(typescript@5.9.2)': + '@expo/cli@54.0.24(expo-router@6.0.23)(expo@54.0.34)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(typescript@5.9.2)': dependencies: '@0no-co/graphql.web': 1.2.0(graphql@16.14.0) '@expo/code-signing-certificates': 0.0.6 @@ -10717,7 +10974,7 @@ snapshots: connect: 3.7.0 debug: 4.4.3 env-editor: 0.4.2 - expo: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) + expo: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) expo-server: 1.0.6 freeport-async: 2.0.0 getenv: 2.0.0 @@ -10750,8 +11007,8 @@ snapshots: wrap-ansi: 7.0.0 ws: 8.20.0 optionalDependencies: - expo-router: 6.0.23(d270f903a381d04171c7e3105bcc3cd4) - react-native: 0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) + expo-router: 6.0.23(04d3d8526ab825d13bb1e48e5046dce1) + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) transitivePeerDependencies: - bufferutil - graphql @@ -10809,18 +11066,18 @@ snapshots: transitivePeerDependencies: - supports-color - '@expo/devtools@0.1.8(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': + '@expo/devtools@0.1.8(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': dependencies: chalk: 4.1.2 optionalDependencies: react: 19.1.0 - react-native: 0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) - '@expo/dom-webview@55.0.6(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': + '@expo/dom-webview@55.0.6(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': dependencies: - expo: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) + expo: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) react: 19.1.0 - react-native: 0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) optional: true '@expo/env@2.0.11': @@ -10891,19 +11148,19 @@ snapshots: postcss: 8.4.49 resolve-from: 5.0.0 optionalDependencies: - expo: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) + expo: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - '@expo/metro-runtime@6.1.2(expo@54.0.34)(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': + '@expo/metro-runtime@6.1.2(expo@54.0.34)(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': dependencies: anser: 1.4.10 - expo: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) + expo: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) pretty-format: 29.7.0 react: 19.1.0 - react-native: 0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) stacktrace-parser: 0.1.11 whatwg-fetch: 3.6.20 optionalDependencies: @@ -10958,7 +11215,7 @@ snapshots: '@expo/json-file': 10.0.14 '@react-native/normalize-colors': 0.81.5 debug: 4.4.3 - expo: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) + expo: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) resolve-from: 5.0.0 semver: 7.8.0 xml2js: 0.6.0 @@ -10986,11 +11243,11 @@ snapshots: '@expo/sudo-prompt@9.3.2': {} - '@expo/vector-icons@15.1.1(expo-font@14.0.11(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': + '@expo/vector-icons@15.1.1(expo-font@14.0.11(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': dependencies: - expo-font: 14.0.11(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + expo-font: 14.0.11(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) react: 19.1.0 - react-native: 0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) '@expo/ws-tunnel@1.0.6': {} @@ -11017,14 +11274,20 @@ snapshots: react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - '@floating-ui/react-native@0.10.9(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': + '@floating-ui/react-native@0.10.9(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': dependencies: '@floating-ui/core': 1.7.5 react: 19.1.0 - react-native: 0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) '@floating-ui/utils@0.2.11': {} + '@hapi/hoek@9.3.0': {} + + '@hapi/topo@5.1.0': + dependencies: + '@hapi/hoek': 9.3.0 + '@humanfs/core@0.19.2': dependencies: '@humanfs/types': 0.15.0 @@ -11449,10 +11712,10 @@ snapshots: '@nolyfill/is-core-module@1.0.39': {} - '@op-engineering/op-sqlite@14.1.4(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': + '@op-engineering/op-sqlite@14.1.4(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': dependencies: react: 19.1.0 - react-native: 0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) '@opentelemetry/semantic-conventions@1.40.0': {} @@ -11716,6 +11979,135 @@ snapshots: optionalDependencies: '@types/react': 19.1.17 + '@react-native-community/cli-clean@20.2.0': + dependencies: + '@react-native-community/cli-tools': 20.2.0 + execa: 5.1.1 + fast-glob: 3.3.3 + picocolors: 1.1.1 + + '@react-native-community/cli-config-android@20.2.0': + dependencies: + '@react-native-community/cli-tools': 20.2.0 + fast-glob: 3.3.3 + fast-xml-parser: 5.7.2 + picocolors: 1.1.1 + + '@react-native-community/cli-config-apple@20.2.0': + dependencies: + '@react-native-community/cli-tools': 20.2.0 + execa: 5.1.1 + fast-glob: 3.3.3 + picocolors: 1.1.1 + + '@react-native-community/cli-config@20.2.0(typescript@5.9.2)': + dependencies: + '@react-native-community/cli-tools': 20.2.0 + cosmiconfig: 9.0.2(typescript@5.9.2) + deepmerge: 4.3.1 + fast-glob: 3.3.3 + joi: 17.13.4 + picocolors: 1.1.1 + transitivePeerDependencies: + - typescript + + '@react-native-community/cli-doctor@20.2.0(typescript@5.9.2)': + dependencies: + '@react-native-community/cli-config': 20.2.0(typescript@5.9.2) + '@react-native-community/cli-platform-android': 20.2.0 + '@react-native-community/cli-platform-apple': 20.2.0 + '@react-native-community/cli-platform-ios': 20.2.0 + '@react-native-community/cli-tools': 20.2.0 + command-exists: 1.2.9 + deepmerge: 4.3.1 + envinfo: 7.21.0 + execa: 5.1.1 + node-stream-zip: 1.15.0 + ora: 5.4.1 + picocolors: 1.1.1 + semver: 7.8.0 + wcwidth: 1.0.1 + yaml: 2.8.4 + transitivePeerDependencies: + - typescript + + '@react-native-community/cli-platform-android@20.2.0': + dependencies: + '@react-native-community/cli-config-android': 20.2.0 + '@react-native-community/cli-tools': 20.2.0 + execa: 5.1.1 + logkitty: 0.7.1 + picocolors: 1.1.1 + + '@react-native-community/cli-platform-apple@20.2.0': + dependencies: + '@react-native-community/cli-config-apple': 20.2.0 + '@react-native-community/cli-tools': 20.2.0 + execa: 5.1.1 + fast-xml-parser: 5.7.2 + picocolors: 1.1.1 + + '@react-native-community/cli-platform-ios@20.2.0': + dependencies: + '@react-native-community/cli-platform-apple': 20.2.0 + + '@react-native-community/cli-server-api@20.2.0': + dependencies: + '@react-native-community/cli-tools': 20.2.0 + body-parser: 2.2.2 + compression: 1.8.1 + connect: 3.7.0 + errorhandler: 1.5.2 + nocache: 3.0.4 + open: 6.4.0 + pretty-format: 29.7.0 + serve-static: 1.16.3 + ws: 6.2.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@react-native-community/cli-tools@20.2.0': + dependencies: + '@vscode/sudo-prompt': 9.3.2 + appdirsjs: 1.2.7 + execa: 5.1.1 + find-up: 5.0.0 + launch-editor: 2.14.1 + mime: 2.6.0 + ora: 5.4.1 + picocolors: 1.1.1 + prompts: 2.4.2 + semver: 7.8.0 + + '@react-native-community/cli-types@20.2.0': + dependencies: + joi: 17.13.4 + + '@react-native-community/cli@20.2.0(typescript@5.9.2)': + dependencies: + '@react-native-community/cli-clean': 20.2.0 + '@react-native-community/cli-config': 20.2.0(typescript@5.9.2) + '@react-native-community/cli-doctor': 20.2.0(typescript@5.9.2) + '@react-native-community/cli-server-api': 20.2.0 + '@react-native-community/cli-tools': 20.2.0 + '@react-native-community/cli-types': 20.2.0 + commander: 9.5.0 + deepmerge: 4.3.1 + execa: 5.1.1 + find-up: 5.0.0 + fs-extra: 8.1.0 + graceful-fs: 4.2.11 + picocolors: 1.1.1 + prompts: 2.4.2 + semver: 7.8.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - typescript + - utf-8-validate + '@react-native/assets-registry@0.81.5': {} '@react-native/babel-plugin-codegen@0.81.5(@babel/core@7.29.0)': @@ -11842,7 +12234,7 @@ snapshots: tinyglobby: 0.2.16 yargs: 17.7.2 - '@react-native/community-cli-plugin@0.81.5(@react-native/metro-config@0.85.3(@babel/core@7.29.0))': + '@react-native/community-cli-plugin@0.81.5(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))': dependencies: '@react-native/dev-middleware': 0.81.5 debug: 4.4.3 @@ -11852,6 +12244,7 @@ snapshots: metro-core: 0.83.7 semver: 7.8.0 optionalDependencies: + '@react-native-community/cli': 20.2.0(typescript@5.9.2) '@react-native/metro-config': 0.85.3(@babel/core@7.29.0) transitivePeerDependencies: - bufferutil @@ -11911,24 +12304,24 @@ snapshots: '@react-native/normalize-colors@0.81.5': {} - '@react-native/virtualized-lists@0.81.5(@types/react@19.1.17)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': + '@react-native/virtualized-lists@0.81.5(@types/react@19.1.17)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': dependencies: invariant: 2.2.4 nullthrows: 1.1.1 react: 19.1.0 - react-native: 0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) optionalDependencies: '@types/react': 19.1.17 - '@react-navigation/bottom-tabs@7.15.13(@react-navigation/native@7.2.4(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-screens@4.16.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': + '@react-navigation/bottom-tabs@7.15.13(@react-navigation/native@7.2.4(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-screens@4.16.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': dependencies: - '@react-navigation/elements': 2.9.17(@react-navigation/native@7.2.4(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) - '@react-navigation/native': 7.2.4(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@react-navigation/elements': 2.9.17(@react-navigation/native@7.2.4(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@react-navigation/native': 7.2.4(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) color: 4.2.3 react: 19.1.0 - react-native: 0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) - react-native-safe-area-context: 5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) - react-native-screens: 4.16.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) + react-native-safe-area-context: 5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + react-native-screens: 4.16.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) sf-symbols-typescript: 2.2.0 transitivePeerDependencies: - '@react-native-masked-view/masked-view' @@ -11945,44 +12338,46 @@ snapshots: use-latest-callback: 0.2.6(react@19.1.0) use-sync-external-store: 1.6.0(react@19.1.0) - '@react-navigation/elements@2.9.17(@react-navigation/native@7.2.4(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': + '@react-navigation/elements@2.9.17(@react-navigation/native@7.2.4(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': dependencies: - '@react-navigation/native': 7.2.4(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@react-navigation/native': 7.2.4(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) color: 4.2.3 react: 19.1.0 - react-native: 0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) - react-native-safe-area-context: 5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) + react-native-safe-area-context: 5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) use-latest-callback: 0.2.6(react@19.1.0) use-sync-external-store: 1.6.0(react@19.1.0) - '@react-navigation/native-stack@7.14.14(@react-navigation/native@7.2.4(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-screens@4.16.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': + '@react-navigation/native-stack@7.14.14(@react-navigation/native@7.2.4(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-screens@4.16.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': dependencies: - '@react-navigation/elements': 2.9.17(@react-navigation/native@7.2.4(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) - '@react-navigation/native': 7.2.4(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@react-navigation/elements': 2.9.17(@react-navigation/native@7.2.4(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@react-navigation/native': 7.2.4(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) color: 4.2.3 react: 19.1.0 - react-native: 0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) - react-native-safe-area-context: 5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) - react-native-screens: 4.16.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) + react-native-safe-area-context: 5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + react-native-screens: 4.16.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) sf-symbols-typescript: 2.2.0 warn-once: 0.1.1 transitivePeerDependencies: - '@react-native-masked-view/masked-view' - '@react-navigation/native@7.2.4(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': + '@react-navigation/native@7.2.4(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': dependencies: '@react-navigation/core': 7.17.4(react@19.1.0) escape-string-regexp: 4.0.0 fast-deep-equal: 3.1.3 nanoid: 3.3.12 react: 19.1.0 - react-native: 0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) use-latest-callback: 0.2.6(react@19.1.0) '@react-navigation/routers@7.5.5': dependencies: nanoid: 3.3.12 + '@repo/chat-mls-core-node@file:packages/chat-mls-core/node': {} + '@rollup/rollup-android-arm-eabi@4.60.4': optional: true @@ -12060,11 +12455,19 @@ snapshots: '@rtsao/scc@1.1.0': {} - '@shopify/flash-list@2.3.1(@babel/runtime@7.29.2)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': + '@shopify/flash-list@2.3.1(@babel/runtime@7.29.2)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': dependencies: '@babel/runtime': 7.29.2 react: 19.1.0 - react-native: 0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) + + '@sideway/address@4.1.5': + dependencies: + '@hapi/hoek': 9.3.0 + + '@sideway/formula@3.0.1': {} + + '@sideway/pinpoint@2.0.0': {} '@sinclair/typebox@0.27.10': {} @@ -12497,13 +12900,13 @@ snapshots: '@tamagui/animation-helpers@2.0.0-rc.42': {} - '@tamagui/animations-css@2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0)': + '@tamagui/animations-css@2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0)': dependencies: '@tamagui/animation-helpers': 2.0.0-rc.41 - '@tamagui/constants': 2.0.0-rc.41(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@tamagui/constants': 2.0.0-rc.41(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) '@tamagui/cubic-bezier-animator': 2.0.0-rc.41 - '@tamagui/use-presence': 2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) - '@tamagui/web': 2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) + '@tamagui/use-presence': 2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) + '@tamagui/web': 2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) transitivePeerDependencies: @@ -12541,14 +12944,14 @@ snapshots: - '@emotion/is-prop-valid' - react-dom - '@tamagui/animations-react-native@2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0)': + '@tamagui/animations-react-native@2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0)': dependencies: '@tamagui/animation-helpers': 2.0.0-rc.41 - '@tamagui/constants': 2.0.0-rc.41(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) - '@tamagui/use-presence': 2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) - '@tamagui/web': 2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) + '@tamagui/constants': 2.0.0-rc.41(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@tamagui/use-presence': 2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) + '@tamagui/web': 2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) react: 19.1.0 - react-native: 0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) transitivePeerDependencies: - '@react-native-menu/menu' - burnt @@ -12573,13 +12976,13 @@ snapshots: transitivePeerDependencies: - react-dom - '@tamagui/animations-reanimated@2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native-reanimated@4.1.7(react-native-worklets@0.8.3(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react@19.1.0)': + '@tamagui/animations-reanimated@2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native-reanimated@4.1.7(react-native-worklets@0.8.3(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react@19.1.0)': dependencies: '@tamagui/animation-helpers': 2.0.0-rc.42 '@tamagui/core': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@tamagui/use-presence': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react: 19.1.0 - react-native-reanimated: 4.1.7(react-native-worklets@0.8.3(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + react-native-reanimated: 4.1.7(react-native-worklets@0.8.3(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) transitivePeerDependencies: - react-dom @@ -12713,13 +13116,13 @@ snapshots: dependencies: react: 19.1.0 - '@tamagui/config-default@2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0)': + '@tamagui/config-default@2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0)': dependencies: - '@tamagui/animations-css': 2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) - '@tamagui/animations-react-native': 2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) - '@tamagui/core': 2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) - '@tamagui/shorthands': 2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) - '@tamagui/web': 2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) + '@tamagui/animations-css': 2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) + '@tamagui/animations-react-native': 2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) + '@tamagui/core': 2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) + '@tamagui/shorthands': 2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) + '@tamagui/web': 2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) transitivePeerDependencies: - '@react-native-menu/menu' - burnt @@ -12747,12 +13150,12 @@ snapshots: - react - react-dom - '@tamagui/config@2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native-reanimated@4.1.7(react-native-worklets@0.8.3(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react@19.1.0)': + '@tamagui/config@2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native-reanimated@4.1.7(react-native-worklets@0.8.3(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react@19.1.0)': dependencies: '@tamagui/animations-css': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@tamagui/animations-motion': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@tamagui/animations-react-native': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@tamagui/animations-reanimated': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native-reanimated@4.1.7(react-native-worklets@0.8.3(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react@19.1.0) + '@tamagui/animations-reanimated': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native-reanimated@4.1.7(react-native-worklets@0.8.3(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react@19.1.0) '@tamagui/colors': 2.0.0-rc.42 '@tamagui/core': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@tamagui/font-inter': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -12768,19 +13171,19 @@ snapshots: - react-dom - react-native-reanimated - '@tamagui/constants@2.0.0-rc.41(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': + '@tamagui/constants@2.0.0-rc.41(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': dependencies: react: 19.1.0 - react-native: 0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) '@tamagui/constants@2.0.0-rc.42(react@19.1.0)': dependencies: react: 19.1.0 - '@tamagui/context-menu@2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': + '@tamagui/context-menu@2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': dependencies: - '@tamagui/create-menu': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) - '@tamagui/popover': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@tamagui/create-menu': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@tamagui/popover': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) '@tamagui/use-callback-ref': 2.0.0-rc.42(react@19.1.0) '@tamagui/use-controllable-state': 2.0.0-rc.42(react@19.1.0) '@tamagui/web': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -12789,16 +13192,16 @@ snapshots: - react-dom - react-native - '@tamagui/core@2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0)': + '@tamagui/core@2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0)': dependencies: - '@tamagui/helpers': 2.0.0-rc.41(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) - '@tamagui/react-native-media-driver': 2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) + '@tamagui/helpers': 2.0.0-rc.41(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@tamagui/react-native-media-driver': 2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) '@tamagui/react-native-use-pressable': 2.0.0-rc.41(react@19.1.0) - '@tamagui/use-element-layout': 2.0.0-rc.41(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@tamagui/use-element-layout': 2.0.0-rc.41(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) '@tamagui/use-event': 2.0.0-rc.41(react@19.1.0) - '@tamagui/web': 2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) + '@tamagui/web': 2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) react: 19.1.0 - react-native: 0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) transitivePeerDependencies: - '@react-native-menu/menu' - burnt @@ -12829,7 +13232,7 @@ snapshots: dependencies: react: 19.1.0 - '@tamagui/create-menu@2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': + '@tamagui/create-menu@2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': dependencies: '@tamagui/animate': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@tamagui/animate-presence': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -12841,8 +13244,8 @@ snapshots: '@tamagui/get-token': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@tamagui/image': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@tamagui/native': 2.0.0-rc.42(react@19.1.0) - '@tamagui/popover': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) - '@tamagui/popper': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@tamagui/popover': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@tamagui/popper': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) '@tamagui/portal': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@tamagui/remove-scroll': 2.0.0-rc.42(react@19.1.0) '@tamagui/roving-focus': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -12855,9 +13258,9 @@ snapshots: - react-dom - react-native - '@tamagui/create-theme@2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0)': + '@tamagui/create-theme@2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0)': dependencies: - '@tamagui/web': 2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) + '@tamagui/web': 2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) transitivePeerDependencies: - '@react-native-menu/menu' - burnt @@ -12935,10 +13338,10 @@ snapshots: '@tamagui/fake-react-native@2.0.0-rc.42': {} - '@tamagui/floating@2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': + '@tamagui/floating@2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': dependencies: '@floating-ui/react-dom': 2.1.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@floating-ui/react-native': 0.10.9(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@floating-ui/react-native': 0.10.9(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) '@tamagui/use-event': 2.0.0-rc.42(react@19.1.0) react: 19.1.0 transitivePeerDependencies: @@ -12998,10 +13401,10 @@ snapshots: transitivePeerDependencies: - react-dom - '@tamagui/generate-themes@2.0.0-rc.41(esbuild@0.27.7)(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0)': + '@tamagui/generate-themes@2.0.0-rc.41(esbuild@0.27.7)(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0)': dependencies: - '@tamagui/create-theme': 2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) - '@tamagui/theme-builder': 2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) + '@tamagui/create-theme': 2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) + '@tamagui/theme-builder': 2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) '@tamagui/types': 2.0.0-rc.41 esbuild-register: 3.6.0(esbuild@0.27.7) fs-extra: 11.3.5 @@ -13087,9 +13490,9 @@ snapshots: transitivePeerDependencies: - react-dom - '@tamagui/helpers@2.0.0-rc.41(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': + '@tamagui/helpers@2.0.0-rc.41(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': dependencies: - '@tamagui/constants': 2.0.0-rc.41(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@tamagui/constants': 2.0.0-rc.41(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) '@tamagui/simple-hash': 2.0.0-rc.41 react: 19.1.0 transitivePeerDependencies: @@ -13173,13 +13576,13 @@ snapshots: transitivePeerDependencies: - react-dom - '@tamagui/menu@2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': + '@tamagui/menu@2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': dependencies: '@tamagui/core': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@tamagui/create-menu': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@tamagui/create-menu': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) '@tamagui/helpers': 2.0.0-rc.42(react@19.1.0) - '@tamagui/popover': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) - '@tamagui/popper': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@tamagui/popover': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@tamagui/popper': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) '@tamagui/use-controllable-state': 2.0.0-rc.42(react@19.1.0) '@tamagui/web': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react: 19.1.0 @@ -13187,9 +13590,9 @@ snapshots: - react-dom - react-native - '@tamagui/metro-plugin@2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0)': + '@tamagui/metro-plugin@2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0)': dependencies: - '@tamagui/static': 2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) + '@tamagui/static': 2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) transitivePeerDependencies: - '@react-native-menu/menu' - burnt @@ -13208,13 +13611,13 @@ snapshots: - supports-color - zeego - '@tamagui/native@2.0.0-rc.41(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0)': + '@tamagui/native@2.0.0-rc.41(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0)': dependencies: react: 19.1.0 - react-native: 0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) optionalDependencies: - react-native-gesture-handler: 2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) - react-native-safe-area-context: 5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + react-native-gesture-handler: 2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + react-native-safe-area-context: 5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) sf-symbols-typescript: 2.2.0 '@tamagui/native@2.0.0-rc.42(react@19.1.0)': @@ -13231,7 +13634,7 @@ snapshots: '@tamagui/polyfill-dev@2.0.0-rc.42': {} - '@tamagui/popover@2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': + '@tamagui/popover@2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': dependencies: '@tamagui/adapt': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@tamagui/animate': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -13240,11 +13643,11 @@ snapshots: '@tamagui/constants': 2.0.0-rc.42(react@19.1.0) '@tamagui/core': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@tamagui/dismissable': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@tamagui/floating': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@tamagui/floating': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) '@tamagui/focus-scope': 2.0.0-rc.42(react@19.1.0) '@tamagui/helpers': 2.0.0-rc.42(react@19.1.0) '@tamagui/polyfill-dev': 2.0.0-rc.42 - '@tamagui/popper': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@tamagui/popper': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) '@tamagui/portal': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@tamagui/remove-scroll': 2.0.0-rc.42(react@19.1.0) '@tamagui/scroll-view': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -13258,12 +13661,12 @@ snapshots: - react-dom - react-native - '@tamagui/popper@2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': + '@tamagui/popper@2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': dependencies: '@tamagui/compose-refs': 2.0.0-rc.42(react@19.1.0) '@tamagui/constants': 2.0.0-rc.42(react@19.1.0) '@tamagui/core': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@tamagui/floating': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@tamagui/floating': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) '@tamagui/get-token': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@tamagui/stacks': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@tamagui/start-transition': 2.0.0-rc.42(react@19.1.0) @@ -13335,10 +13738,10 @@ snapshots: transitivePeerDependencies: - react-dom - '@tamagui/react-native-media-driver@2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0)': + '@tamagui/react-native-media-driver@2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0)': dependencies: - '@tamagui/web': 2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) - react-native: 0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) + '@tamagui/web': 2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) transitivePeerDependencies: - '@react-native-menu/menu' - burnt @@ -13377,14 +13780,14 @@ snapshots: dependencies: react: 19.1.0 - '@tamagui/react-native-web-internals@2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0)': + '@tamagui/react-native-web-internals@2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0)': dependencies: '@tamagui/normalize-css-color': 2.0.0-rc.41 '@tamagui/react-native-use-pressable': 2.0.0-rc.41(react@19.1.0) '@tamagui/react-native-use-responder-events': 2.0.0-rc.41(react@19.1.0) '@tamagui/simple-hash': 2.0.0-rc.41 - '@tamagui/use-element-layout': 2.0.0-rc.41(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) - '@tamagui/web': 2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) + '@tamagui/use-element-layout': 2.0.0-rc.41(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@tamagui/web': 2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) transitivePeerDependencies: @@ -13412,13 +13815,13 @@ snapshots: react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - '@tamagui/react-native-web-lite@2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0)': + '@tamagui/react-native-web-lite@2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0)': dependencies: '@tamagui/normalize-css-color': 2.0.0-rc.41 '@tamagui/react-native-use-pressable': 2.0.0-rc.41(react@19.1.0) '@tamagui/react-native-use-responder-events': 2.0.0-rc.41(react@19.1.0) - '@tamagui/react-native-web-internals': 2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) - '@tamagui/web': 2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) + '@tamagui/react-native-web-internals': 2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) + '@tamagui/web': 2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) invariant: 2.2.4 memoize-one: 6.0.0 react: 19.1.0 @@ -13476,7 +13879,7 @@ snapshots: transitivePeerDependencies: - react-dom - '@tamagui/select@2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': + '@tamagui/select@2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': dependencies: '@tamagui/adapt': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@tamagui/animate-presence': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -13485,7 +13888,7 @@ snapshots: '@tamagui/core': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@tamagui/create-context': 2.0.0-rc.42(react@19.1.0) '@tamagui/dismissable': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@tamagui/floating': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@tamagui/floating': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) '@tamagui/focus-scope': 2.0.0-rc.42(react@19.1.0) '@tamagui/focusable': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@tamagui/get-token': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -13548,9 +13951,9 @@ snapshots: transitivePeerDependencies: - react-dom - '@tamagui/shorthands@2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0)': + '@tamagui/shorthands@2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0)': dependencies: - '@tamagui/web': 2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) + '@tamagui/web': 2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) transitivePeerDependencies: - '@react-native-menu/menu' - burnt @@ -13641,7 +14044,7 @@ snapshots: - react-dom - supports-color - '@tamagui/static@2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0)': + '@tamagui/static@2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0)': dependencies: '@babel/core': 7.29.0 '@babel/generator': 7.29.1 @@ -13653,18 +14056,18 @@ snapshots: '@babel/traverse': 7.29.0 '@babel/types': 7.29.0 '@tamagui/cli-color': 2.0.0-rc.41 - '@tamagui/config-default': 2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) - '@tamagui/core': 2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) + '@tamagui/config-default': 2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) + '@tamagui/core': 2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) '@tamagui/fake-react-native': 2.0.0-rc.41 - '@tamagui/generate-themes': 2.0.0-rc.41(esbuild@0.27.7)(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) - '@tamagui/helpers': 2.0.0-rc.41(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@tamagui/generate-themes': 2.0.0-rc.41(esbuild@0.27.7)(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) + '@tamagui/helpers': 2.0.0-rc.41(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) '@tamagui/helpers-node': 2.0.0-rc.41 '@tamagui/proxy-worm': 2.0.0-rc.41 - '@tamagui/react-native-web-internals': 2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) - '@tamagui/react-native-web-lite': 2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) - '@tamagui/shorthands': 2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) + '@tamagui/react-native-web-internals': 2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) + '@tamagui/react-native-web-lite': 2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) + '@tamagui/shorthands': 2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) '@tamagui/types': 2.0.0-rc.41 - '@tamagui/web': 2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) + '@tamagui/web': 2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) babel-literal-to-ast: 2.1.0(@babel/core@7.29.0) browserslist: 4.28.2 check-dependency-version-consistency: 4.1.1 @@ -13678,7 +14081,7 @@ snapshots: invariant: 2.2.4 js-yaml: 4.1.1 react: 19.1.0 - react-native: 0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) react-native-web: 0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) transitivePeerDependencies: - '@react-native-menu/menu' @@ -13796,10 +14199,10 @@ snapshots: transitivePeerDependencies: - react-dom - '@tamagui/theme-builder@2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0)': + '@tamagui/theme-builder@2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0)': dependencies: - '@tamagui/create-theme': 2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) - '@tamagui/web': 2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) + '@tamagui/create-theme': 2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) + '@tamagui/web': 2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) color2k: 2.0.3 transitivePeerDependencies: - '@react-native-menu/menu' @@ -13891,17 +14294,17 @@ snapshots: transitivePeerDependencies: - react-dom - '@tamagui/tooltip@2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': + '@tamagui/tooltip@2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': dependencies: '@tamagui/compose-refs': 2.0.0-rc.42(react@19.1.0) '@tamagui/core': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@tamagui/create-context': 2.0.0-rc.42(react@19.1.0) - '@tamagui/floating': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@tamagui/floating': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) '@tamagui/get-token': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@tamagui/helpers': 2.0.0-rc.42(react@19.1.0) '@tamagui/polyfill-dev': 2.0.0-rc.42 - '@tamagui/popover': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) - '@tamagui/popper': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@tamagui/popover': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@tamagui/popper': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) '@tamagui/stacks': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@tamagui/text': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@tamagui/use-controllable-state': 2.0.0-rc.42(react@19.1.0) @@ -13948,9 +14351,9 @@ snapshots: dependencies: react: 19.1.0 - '@tamagui/use-element-layout@2.0.0-rc.41(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': + '@tamagui/use-element-layout@2.0.0-rc.41(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': dependencies: - '@tamagui/constants': 2.0.0-rc.41(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@tamagui/constants': 2.0.0-rc.41(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) '@tamagui/is-equal-shallow': 2.0.0-rc.41(react@19.1.0) react: 19.1.0 transitivePeerDependencies: @@ -13987,9 +14390,9 @@ snapshots: dependencies: react: 19.1.0 - '@tamagui/use-presence@2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0)': + '@tamagui/use-presence@2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0)': dependencies: - '@tamagui/web': 2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) + '@tamagui/web': 2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) react: 19.1.0 transitivePeerDependencies: - '@react-native-menu/menu' @@ -14029,13 +14432,13 @@ snapshots: transitivePeerDependencies: - react-dom - '@tamagui/web@2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0)': + '@tamagui/web@2.0.0-rc.41(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0)': dependencies: '@tamagui/compose-refs': 2.0.0-rc.41(react@19.1.0) - '@tamagui/constants': 2.0.0-rc.41(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) - '@tamagui/helpers': 2.0.0-rc.41(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@tamagui/constants': 2.0.0-rc.41(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@tamagui/helpers': 2.0.0-rc.41(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) '@tamagui/is-equal-shallow': 2.0.0-rc.41(react@19.1.0) - '@tamagui/native': 2.0.0-rc.41(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) + '@tamagui/native': 2.0.0-rc.41(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(sf-symbols-typescript@2.2.0) '@tamagui/normalize-css-color': 2.0.0-rc.41 '@tamagui/timer': 2.0.0-rc.41 '@tamagui/types': 2.0.0-rc.41 @@ -14044,7 +14447,7 @@ snapshots: '@tamagui/use-force-update': 2.0.0-rc.41(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - react-native: 0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) transitivePeerDependencies: - '@react-native-menu/menu' - burnt @@ -14085,13 +14488,13 @@ snapshots: '@tanstack/query-core': 5.100.9 react: 19.1.0 - '@testing-library/react-native@13.3.3(jest@29.7.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react-test-renderer@19.2.0(react@19.1.0))(react@19.1.0)': + '@testing-library/react-native@13.3.3(jest@29.7.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react-test-renderer@19.2.0(react@19.1.0))(react@19.1.0)': dependencies: jest-matcher-utils: 30.4.1 picocolors: 1.1.1 pretty-format: 30.4.1 react: 19.1.0 - react-native: 0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) react-test-renderer: 19.2.0(react@19.1.0) redent: 3.0.0 optionalDependencies: @@ -14411,6 +14814,8 @@ snapshots: loupe: 3.2.1 tinyrainbow: 1.2.0 + '@vscode/sudo-prompt@9.3.2': {} + '@xmldom/xmldom@0.8.13': {} '@xmldom/xmldom@0.9.10': {} @@ -14461,6 +14866,12 @@ snapshots: dependencies: environment: 1.1.0 + ansi-fragments@0.2.1: + dependencies: + colorette: 1.4.0 + slice-ansi: 2.1.0 + strip-ansi: 5.2.0 + ansi-regex@4.1.1: {} ansi-regex@5.0.1: {} @@ -14486,6 +14897,8 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.2 + appdirsjs@1.2.7: {} + arg@5.0.2: {} argparse@1.0.10: @@ -14577,6 +14990,8 @@ snapshots: assertion-error@2.0.1: {} + astral-regex@1.0.0: {} + astral-regex@2.0.0: {} async-function@1.0.0: {} @@ -14733,7 +15148,7 @@ snapshots: resolve-from: 5.0.0 optionalDependencies: '@babel/runtime': 7.29.2 - expo: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) + expo: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) transitivePeerDependencies: - '@babel/core' - supports-color @@ -14801,6 +15216,12 @@ snapshots: bignumber.js@9.3.1: {} + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + blake3-wasm@2.1.5: {} body-parser@2.2.2: @@ -15000,6 +15421,10 @@ snapshots: dependencies: restore-cursor: 2.0.0 + cli-cursor@3.1.0: + dependencies: + restore-cursor: 3.1.0 + cli-cursor@5.0.0: dependencies: restore-cursor: 5.1.0 @@ -15013,6 +15438,12 @@ snapshots: client-only@0.0.1: {} + cliui@6.0.0: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + cliui@8.0.1: dependencies: string-width: 4.2.3 @@ -15051,8 +15482,12 @@ snapshots: color-convert: 2.0.1 color-string: 1.9.1 + colorette@1.4.0: {} + colorette@2.0.20: {} + command-exists@1.2.9: {} + commander@11.1.0: {} commander@12.1.0: {} @@ -15065,6 +15500,8 @@ snapshots: commander@7.2.0: {} + commander@9.5.0: {} + commondir@1.0.1: {} compressible@2.0.18: @@ -15119,6 +15556,15 @@ snapshots: object-assign: 4.1.1 vary: 1.1.2 + cosmiconfig@9.0.2(typescript@5.9.2): + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.1 + js-yaml: 4.1.1 + parse-json: 5.2.0 + optionalDependencies: + typescript: 5.9.2 + create-jest@29.7.0(@types/node@22.19.18): dependencies: '@jest/types': 29.6.3 @@ -15171,6 +15617,8 @@ snapshots: es-errors: 1.3.0 is-data-view: 1.0.2 + dayjs@1.11.21: {} + debug@2.6.9: dependencies: ms: 2.0.0 @@ -15183,6 +15631,8 @@ snapshots: dependencies: ms: 2.1.3 + decamelize@1.2.0: {} + decode-uri-component@0.2.2: {} dedent@1.7.2: @@ -15292,12 +15742,15 @@ snapshots: env-editor@0.4.2: {} + env-paths@2.2.1: {} + + envinfo@7.21.0: {} + environment@1.1.0: {} error-ex@1.3.4: dependencies: is-arrayish: 0.2.1 - optional: true error-stack-parser-es@1.0.5: {} @@ -15305,6 +15758,11 @@ snapshots: dependencies: stackframe: 1.3.4 + errorhandler@1.5.2: + dependencies: + accepts: 1.3.8 + escape-html: 1.0.3 + es-abstract@1.24.2: dependencies: array-buffer-byte-length: 1.0.2 @@ -15759,7 +16217,6 @@ snapshots: onetime: 5.1.2 signal-exit: 3.0.7 strip-final-newline: 2.0.0 - optional: true exit@0.1.2: optional: true @@ -15777,54 +16234,54 @@ snapshots: expo-application@7.0.8(expo@54.0.34): dependencies: - expo: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) + expo: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) - expo-asset@12.0.13(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2): + expo-asset@12.0.13(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2): dependencies: '@expo/image-utils': 0.8.14(typescript@5.9.2) - expo: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) - expo-constants: 18.0.13(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0)) + expo: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) + expo-constants: 18.0.13(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0)) react: 19.1.0 - react-native: 0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) transitivePeerDependencies: - supports-color - typescript - expo-blur@15.0.8(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): + expo-blur@15.0.8(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): dependencies: - expo: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) + expo: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) react: 19.1.0 - react-native: 0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) expo-build-properties@0.14.8(expo@54.0.34): dependencies: ajv: 8.20.0 - expo: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) + expo: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) semver: 7.8.0 - expo-clipboard@8.0.8(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): + expo-clipboard@8.0.8(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): dependencies: - expo: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) + expo: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) react: 19.1.0 - react-native: 0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) - expo-constants@18.0.13(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0)): + expo-constants@18.0.13(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0)): dependencies: '@expo/config': 12.0.13 '@expo/env': 2.0.11 - expo: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) - react-native: 0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) + expo: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) transitivePeerDependencies: - supports-color expo-crypto@15.0.9(expo@54.0.34): dependencies: base64-js: 1.5.1 - expo: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) + expo: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) expo-dev-client@6.0.21(expo@54.0.34): dependencies: - expo: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) + expo: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) expo-dev-launcher: 6.0.21(expo@54.0.34) expo-dev-menu: 7.0.19(expo@54.0.34) expo-dev-menu-interface: 2.0.0(expo@54.0.34) @@ -15836,7 +16293,7 @@ snapshots: expo-dev-launcher@6.0.21(expo@54.0.34): dependencies: ajv: 8.20.0 - expo: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) + expo: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) expo-dev-menu: 7.0.19(expo@54.0.34) expo-manifests: 1.0.11(expo@54.0.34) transitivePeerDependencies: @@ -15844,53 +16301,53 @@ snapshots: expo-dev-menu-interface@2.0.0(expo@54.0.34): dependencies: - expo: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) + expo: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) expo-dev-menu@7.0.19(expo@54.0.34): dependencies: - expo: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) + expo: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) expo-dev-menu-interface: 2.0.0(expo@54.0.34) expo-device@8.0.10(expo@54.0.34): dependencies: - expo: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) + expo: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) ua-parser-js: 0.7.41 - expo-file-system@19.0.22(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0)): + expo-file-system@19.0.22(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0)): dependencies: - expo: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) - react-native: 0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) + expo: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) - expo-font@14.0.11(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): + expo-font@14.0.11(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): dependencies: - expo: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) + expo: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) fontfaceobserver: 2.3.0 react: 19.1.0 - react-native: 0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) expo-haptics@15.0.8(expo@54.0.34): dependencies: - expo: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) + expo: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) expo-json-utils@0.15.0: {} expo-keep-awake@15.0.8(expo@54.0.34)(react@19.1.0): dependencies: - expo: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) + expo: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) react: 19.1.0 - expo-linear-gradient@15.0.8(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): + expo-linear-gradient@15.0.8(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): dependencies: - expo: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) + expo: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) react: 19.1.0 - react-native: 0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) - expo-linking@8.0.12(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): + expo-linking@8.0.12(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): dependencies: - expo-constants: 18.0.13(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0)) + expo-constants: 18.0.13(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0)) invariant: 2.2.4 react: 19.1.0 - react-native: 0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) transitivePeerDependencies: - expo - supports-color @@ -15898,7 +16355,7 @@ snapshots: expo-manifests@1.0.11(expo@54.0.34): dependencies: '@expo/config': 12.0.13 - expo: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) + expo: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) expo-json-utils: 0.15.0 transitivePeerDependencies: - supports-color @@ -15911,43 +16368,43 @@ snapshots: require-from-string: 2.0.2 resolve-from: 5.0.0 - expo-modules-core@3.0.30(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): + expo-modules-core@3.0.30(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): dependencies: invariant: 2.2.4 react: 19.1.0 - react-native: 0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) - expo-notifications@0.32.17(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2): + expo-notifications@0.32.17(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2): dependencies: '@expo/image-utils': 0.8.14(typescript@5.9.2) '@ide/backoff': 1.0.0 abort-controller: 3.0.0 assert: 2.1.0 badgin: 1.2.3 - expo: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) + expo: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) expo-application: 7.0.8(expo@54.0.34) - expo-constants: 18.0.13(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0)) + expo-constants: 18.0.13(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0)) react: 19.1.0 - react-native: 0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) transitivePeerDependencies: - supports-color - typescript - expo-router@6.0.23(d270f903a381d04171c7e3105bcc3cd4): + expo-router@6.0.23(04d3d8526ab825d13bb1e48e5046dce1): dependencies: - '@expo/metro-runtime': 6.1.2(expo@54.0.34)(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@expo/metro-runtime': 6.1.2(expo@54.0.34)(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) '@expo/schema-utils': 0.1.8 '@radix-ui/react-slot': 1.2.0(@types/react@19.1.17)(react@19.1.0) '@radix-ui/react-tabs': 1.1.13(@types/react-dom@19.1.11(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@react-navigation/bottom-tabs': 7.15.13(@react-navigation/native@7.2.4(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-screens@4.16.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) - '@react-navigation/native': 7.2.4(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) - '@react-navigation/native-stack': 7.14.14(@react-navigation/native@7.2.4(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-screens@4.16.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@react-navigation/bottom-tabs': 7.15.13(@react-navigation/native@7.2.4(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-screens@4.16.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@react-navigation/native': 7.2.4(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@react-navigation/native-stack': 7.14.14(@react-navigation/native@7.2.4(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-screens@4.16.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) client-only: 0.0.1 debug: 4.4.3 escape-string-regexp: 4.0.0 - expo: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) - expo-constants: 18.0.13(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0)) - expo-linking: 8.0.12(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + expo: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) + expo-constants: 18.0.13(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0)) + expo-linking: 8.0.12(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) expo-server: 1.0.6 fast-deep-equal: 3.1.3 invariant: 2.2.4 @@ -15955,10 +16412,10 @@ snapshots: query-string: 7.1.3 react: 19.1.0 react-fast-compare: 3.2.2 - react-native: 0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) - react-native-is-edge-to-edge: 1.3.1(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) - react-native-safe-area-context: 5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) - react-native-screens: 4.16.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) + react-native-is-edge-to-edge: 1.3.1(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + react-native-safe-area-context: 5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + react-native-screens: 4.16.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) semver: 7.6.3 server-only: 0.0.1 sf-symbols-typescript: 2.2.0 @@ -15966,10 +16423,10 @@ snapshots: use-latest-callback: 0.2.6(react@19.1.0) vaul: 1.1.2(@types/react-dom@19.1.11(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) optionalDependencies: - '@testing-library/react-native': 13.3.3(jest@29.7.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react-test-renderer@19.2.0(react@19.1.0))(react@19.1.0) + '@testing-library/react-native': 13.3.3(jest@29.7.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react-test-renderer@19.2.0(react@19.1.0))(react@19.1.0) react-dom: 19.1.0(react@19.1.0) - react-native-gesture-handler: 2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) - react-native-reanimated: 4.1.7(react-native-worklets@0.8.3(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + react-native-gesture-handler: 2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + react-native-reanimated: 4.1.7(react-native-worklets@0.8.3(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) react-native-web: 0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) transitivePeerDependencies: - '@react-native-masked-view/masked-view' @@ -15979,30 +16436,30 @@ snapshots: expo-secure-store@15.0.8(expo@54.0.34): dependencies: - expo: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) + expo: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) expo-server@1.0.6: {} expo-splash-screen@31.0.13(expo@54.0.34)(typescript@5.9.2): dependencies: '@expo/prebuild-config': 54.0.8(expo@54.0.34)(typescript@5.9.2) - expo: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) + expo: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) transitivePeerDependencies: - supports-color - typescript - expo-status-bar@3.0.9(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): + expo-status-bar@3.0.9(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): dependencies: react: 19.1.0 - react-native: 0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) - react-native-is-edge-to-edge: 1.3.1(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) + react-native-is-edge-to-edge: 1.3.1(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) - expo-system-ui@6.0.9(expo@54.0.34)(react-native-web@0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0)): + expo-system-ui@6.0.9(expo@54.0.34)(react-native-web@0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0)): dependencies: '@react-native/normalize-colors': 0.81.5 debug: 4.4.3 - expo: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) - react-native: 0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) + expo: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) optionalDependencies: react-native-web: 0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) transitivePeerDependencies: @@ -16010,36 +16467,36 @@ snapshots: expo-updates-interface@2.0.0(expo@54.0.34): dependencies: - expo: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) + expo: 54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) - expo@54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2): + expo@54.0.34(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2): dependencies: '@babel/runtime': 7.29.2 - '@expo/cli': 54.0.24(expo-router@6.0.23)(expo@54.0.34)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(typescript@5.9.2) + '@expo/cli': 54.0.24(expo-router@6.0.23)(expo@54.0.34)(graphql@16.14.0)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(typescript@5.9.2) '@expo/config': 12.0.13 '@expo/config-plugins': 54.0.4 - '@expo/devtools': 0.1.8(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@expo/devtools': 0.1.8(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) '@expo/fingerprint': 0.15.5 '@expo/metro': 54.2.0 '@expo/metro-config': 54.0.15(expo@54.0.34) - '@expo/vector-icons': 15.1.1(expo-font@14.0.11(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@expo/vector-icons': 15.1.1(expo-font@14.0.11(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) '@ungap/structured-clone': 1.3.1 babel-preset-expo: 54.0.10(@babel/core@7.29.0)(@babel/runtime@7.29.2)(expo@54.0.34)(react-refresh@0.14.2) - expo-asset: 12.0.13(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) - expo-constants: 18.0.13(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0)) - expo-file-system: 19.0.22(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0)) - expo-font: 14.0.11(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + expo-asset: 12.0.13(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(typescript@5.9.2) + expo-constants: 18.0.13(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0)) + expo-file-system: 19.0.22(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0)) + expo-font: 14.0.11(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) expo-keep-awake: 15.0.8(expo@54.0.34)(react@19.1.0) expo-modules-autolinking: 3.0.25 - expo-modules-core: 3.0.30(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + expo-modules-core: 3.0.30(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) pretty-format: 29.7.0 react: 19.1.0 - react-native: 0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) react-refresh: 0.14.2 whatwg-url-without-unicode: 8.0.0-3 optionalDependencies: - '@expo/dom-webview': 55.0.6(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) - '@expo/metro-runtime': 6.1.2(expo@54.0.34)(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@expo/dom-webview': 55.0.6(expo@54.0.34)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@expo/metro-runtime': 6.1.2(expo@54.0.34)(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) transitivePeerDependencies: - '@babel/core' - bufferutil @@ -16253,6 +16710,12 @@ snapshots: jsonfile: 6.2.1 universalify: 2.0.1 + fs-extra@8.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + fs.realpath@1.0.0: {} fsevents@2.3.3: @@ -16321,8 +16784,7 @@ snapshots: dunder-proto: 1.0.1 es-object-atoms: 1.1.1 - get-stream@6.0.1: - optional: true + get-stream@6.0.1: {} get-symbol-description@1.1.0: dependencies: @@ -16490,8 +16952,7 @@ snapshots: transitivePeerDependencies: - supports-color - human-signals@2.1.0: - optional: true + human-signals@2.1.0: {} husky@9.1.7: {} @@ -16565,8 +17026,7 @@ snapshots: call-bound: 1.0.4 get-intrinsic: 1.3.0 - is-arrayish@0.2.1: - optional: true + is-arrayish@0.2.1: {} is-arrayish@0.3.4: {} @@ -16616,6 +17076,8 @@ snapshots: dependencies: call-bound: 1.0.4 + is-fullwidth-code-point@2.0.0: {} + is-fullwidth-code-point@3.0.0: {} is-fullwidth-code-point@5.1.0: @@ -16637,6 +17099,8 @@ snapshots: dependencies: is-extglob: 2.1.1 + is-interactive@1.0.0: {} + is-map@2.0.3: {} is-nan@1.3.2: @@ -16691,6 +17155,8 @@ snapshots: dependencies: which-typed-array: 1.1.20 + is-unicode-supported@0.1.0: {} + is-weakmap@2.0.2: {} is-weakref@1.1.1: @@ -16702,6 +17168,8 @@ snapshots: call-bound: 1.0.4 get-intrinsic: 1.3.0 + is-wsl@1.1.0: {} + is-wsl@2.2.0: dependencies: is-docker: 2.2.1 @@ -17117,6 +17585,14 @@ snapshots: jmespath@0.16.0: {} + joi@17.13.4: + dependencies: + '@hapi/hoek': 9.3.0 + '@hapi/topo': 5.1.0 + '@sideway/address': 4.1.5 + '@sideway/formula': 3.0.1 + '@sideway/pinpoint': 2.0.0 + jose@4.15.9: {} jose@5.10.0: {} @@ -17146,8 +17622,7 @@ snapshots: json-buffer@3.0.1: {} - json-parse-even-better-errors@2.3.1: - optional: true + json-parse-even-better-errors@2.3.1: {} json-schema-traverse@0.4.1: {} @@ -17161,6 +17636,10 @@ snapshots: json5@2.2.3: {} + jsonfile@4.0.0: + optionalDependencies: + graceful-fs: 4.2.11 + jsonfile@6.2.1: dependencies: universalify: 2.0.1 @@ -17197,6 +17676,11 @@ snapshots: lan-network@0.2.1: {} + launch-editor@2.14.1: + dependencies: + picocolors: 1.1.1 + shell-quote: 1.9.0 + leven@3.1.0: {} levn@0.4.1: @@ -17300,6 +17784,11 @@ snapshots: dependencies: chalk: 2.4.2 + log-symbols@4.1.0: + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + log-update@6.1.0: dependencies: ansi-escapes: 7.3.0 @@ -17308,6 +17797,12 @@ snapshots: strip-ansi: 7.2.0 wrap-ansi: 9.0.2 + logkitty@0.7.1: + dependencies: + ansi-fragments: 0.2.1 + dayjs: 1.11.21 + yargs: 15.4.1 + loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 @@ -17901,10 +18396,11 @@ snapshots: mime@1.6.0: {} + mime@2.6.0: {} + mimic-fn@1.2.0: {} - mimic-fn@2.1.0: - optional: true + mimic-fn@2.1.0: {} mimic-function@5.0.1: {} @@ -18012,6 +18508,8 @@ snapshots: - '@babel/core' - babel-plugin-macros + nocache@3.0.4: {} + node-exports-info@1.6.0: dependencies: array.prototype.flatmap: 1.3.3 @@ -18031,6 +18529,8 @@ snapshots: node-releases@2.0.38: {} + node-stream-zip@1.15.0: {} + normalize-path@3.0.0: {} npm-package-arg@11.0.3: @@ -18043,7 +18543,6 @@ snapshots: npm-run-path@4.0.1: dependencies: path-key: 3.1.1 - optional: true nullthrows@1.1.1: {} @@ -18141,12 +18640,15 @@ snapshots: onetime@5.1.2: dependencies: mimic-fn: 2.1.0 - optional: true onetime@7.0.0: dependencies: mimic-function: 5.0.1 + open@6.4.0: + dependencies: + is-wsl: 1.1.0 + open@7.4.2: dependencies: is-docker: 2.2.1 @@ -18193,6 +18695,18 @@ snapshots: strip-ansi: 5.2.0 wcwidth: 1.0.1 + ora@5.4.1: + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.2 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + own-keys@1.0.1: dependencies: get-intrinsic: 1.3.0 @@ -18227,7 +18741,6 @@ snapshots: error-ex: 1.3.4 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - optional: true parse-png@2.1.0: dependencies: @@ -18472,43 +18985,43 @@ snapshots: react-is@19.2.6: {} - react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): + react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): dependencies: '@egjs/hammerjs': 2.0.17 hoist-non-react-statics: 3.3.2 invariant: 2.2.4 react: 19.1.0 - react-native: 0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) - react-native-get-random-values@1.11.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0)): + react-native-get-random-values@1.11.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0)): dependencies: fast-base64-decode: 1.0.0 - react-native: 0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) - react-native-is-edge-to-edge@1.3.1(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): + react-native-is-edge-to-edge@1.3.1(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): dependencies: react: 19.1.0 - react-native: 0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) - react-native-reanimated@4.1.7(react-native-worklets@0.8.3(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): + react-native-reanimated@4.1.7(react-native-worklets@0.8.3(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): dependencies: react: 19.1.0 - react-native: 0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) - react-native-is-edge-to-edge: 1.3.1(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) - react-native-worklets: 0.8.3(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) + react-native-is-edge-to-edge: 1.3.1(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + react-native-worklets: 0.8.3(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) semver: 7.8.0 - react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): + react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): dependencies: react: 19.1.0 - react-native: 0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) - react-native-screens@4.16.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): + react-native-screens@4.16.0(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): dependencies: react: 19.1.0 react-freeze: 1.0.4(react@19.1.0) - react-native: 0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) - react-native-is-edge-to-edge: 1.3.1(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) + react-native-is-edge-to-edge: 1.3.1(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) warn-once: 0.1.1 react-native-web@0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0): @@ -18526,7 +19039,7 @@ snapshots: transitivePeerDependencies: - encoding - react-native-worklets@0.8.3(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): + react-native-worklets@0.8.3(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): dependencies: '@babel/core': 7.29.0 '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.29.0) @@ -18541,21 +19054,21 @@ snapshots: '@react-native/metro-config': 0.85.3(@babel/core@7.29.0) convert-source-map: 2.0.0 react: 19.1.0 - react-native: 0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0) semver: 7.8.0 transitivePeerDependencies: - supports-color - react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0): + react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0): dependencies: '@jest/create-cache-key-function': 29.7.0 '@react-native/assets-registry': 0.81.5 '@react-native/codegen': 0.81.5(@babel/core@7.29.0) - '@react-native/community-cli-plugin': 0.81.5(@react-native/metro-config@0.85.3(@babel/core@7.29.0)) + '@react-native/community-cli-plugin': 0.81.5(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0)) '@react-native/gradle-plugin': 0.81.5 '@react-native/js-polyfills': 0.81.5 '@react-native/normalize-colors': 0.81.5 - '@react-native/virtualized-lists': 0.81.5(@types/react@19.1.17)(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@react-native/virtualized-lists': 0.81.5(@types/react@19.1.17)(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) abort-controller: 3.0.0 anser: 1.4.10 ansi-regex: 5.0.1 @@ -18631,6 +19144,12 @@ snapshots: react@19.1.0: {} + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + readdirp@4.1.2: {} redent@3.0.0: @@ -18686,6 +19205,8 @@ snapshots: require-from-string@2.0.2: {} + require-main-filename@2.0.0: {} + requireg@0.2.2: dependencies: nested-error-stacks: 2.0.1 @@ -18737,6 +19258,11 @@ snapshots: onetime: 2.0.1 signal-exit: 3.0.7 + restore-cursor@3.1.0: + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + restore-cursor@5.1.0: dependencies: onetime: 7.0.0 @@ -18891,6 +19417,8 @@ snapshots: server-only@0.0.1: {} + set-blocking@2.0.0: {} + set-cookie-parser@3.1.0: {} set-function-length@1.2.2: @@ -18967,6 +19495,8 @@ snapshots: shell-quote@1.8.3: {} + shell-quote@1.9.0: {} + side-channel-list@1.0.1: dependencies: es-errors: 1.3.0 @@ -19017,6 +19547,12 @@ snapshots: slash@4.0.0: {} + slice-ansi@2.1.0: + dependencies: + ansi-styles: 3.2.1 + astral-regex: 1.0.0 + is-fullwidth-code-point: 2.0.0 + slice-ansi@4.0.0: dependencies: ansi-styles: 4.3.0 @@ -19202,6 +19738,10 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.1.1 + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + strip-ansi@5.2.0: dependencies: ansi-regex: 4.1.1 @@ -19219,8 +19759,7 @@ snapshots: strip-bom@4.0.0: optional: true - strip-final-newline@2.0.0: - optional: true + strip-final-newline@2.0.0: {} strip-indent@3.0.0: dependencies: @@ -19288,7 +19827,7 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 - tamagui@2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): + tamagui@2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): dependencies: '@tamagui/accordion': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@tamagui/adapt': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -19302,10 +19841,10 @@ snapshots: '@tamagui/collapsible': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@tamagui/compose-refs': 2.0.0-rc.42(react@19.1.0) '@tamagui/constants': 2.0.0-rc.42(react@19.1.0) - '@tamagui/context-menu': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@tamagui/context-menu': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) '@tamagui/core': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@tamagui/create-context': 2.0.0-rc.42(react@19.1.0) - '@tamagui/create-menu': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@tamagui/create-menu': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) '@tamagui/dialog': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@tamagui/element': 2.0.0-rc.42(react@19.1.0) '@tamagui/elements': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -19323,16 +19862,16 @@ snapshots: '@tamagui/label': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@tamagui/linear-gradient': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@tamagui/list-item': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@tamagui/menu': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@tamagui/menu': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) '@tamagui/polyfill-dev': 2.0.0-rc.42 - '@tamagui/popover': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) - '@tamagui/popper': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@tamagui/popover': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@tamagui/popper': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) '@tamagui/portal': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@tamagui/progress': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@tamagui/radio-group': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@tamagui/react-native-media-driver': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@tamagui/scroll-view': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@tamagui/select': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@tamagui/select': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) '@tamagui/separator': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@tamagui/shapes': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@tamagui/sheet': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -19346,7 +19885,7 @@ snapshots: '@tamagui/theme': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@tamagui/toast': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@tamagui/toggle-group': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@tamagui/tooltip': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@tamagui/tooltip': 2.0.0-rc.42(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@react-native-community/cli@20.2.0(typescript@5.9.2))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) '@tamagui/use-controllable-state': 2.0.0-rc.42(react@19.1.0) '@tamagui/use-debounce': 2.0.0-rc.42(react@19.1.0) '@tamagui/use-force-update': 2.0.0-rc.42(react@19.1.0) @@ -19548,6 +20087,8 @@ snapshots: unicode-property-aliases-ecmascript@2.2.0: {} + universalify@0.1.2: {} + universalify@2.0.1: {} unpipe@1.0.0: {} @@ -19614,6 +20155,8 @@ snapshots: dependencies: react: 19.1.0 + util-deprecate@1.0.2: {} + util@0.12.5: dependencies: inherits: 2.0.4 @@ -19778,6 +20321,8 @@ snapshots: is-weakmap: 2.0.2 is-weakset: 2.0.4 + which-module@2.0.1: {} + which-typed-array@1.1.20: dependencies: available-typed-arrays: 1.0.7 @@ -19826,6 +20371,12 @@ snapshots: - bufferutil - utf-8-validate + wrap-ansi@6.2.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -19876,6 +20427,8 @@ snapshots: xmlbuilder@15.1.1: {} + y18n@4.0.3: {} + y18n@5.0.8: {} yallist@3.1.1: {} @@ -19886,8 +20439,27 @@ snapshots: yaml@2.8.4: {} + yargs-parser@18.1.3: + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + yargs-parser@21.1.1: {} + yargs@15.4.1: + dependencies: + cliui: 6.0.0 + decamelize: 1.2.0 + find-up: 4.1.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 4.2.3 + which-module: 2.0.1 + y18n: 4.0.3 + yargs-parser: 18.1.3 + yargs@17.7.2: dependencies: cliui: 8.0.1 diff --git a/services/api/src/lib/chat-ws-push.ts b/services/api/src/lib/chat-ws-push.ts index ecf923b..2fb7f7a 100644 --- a/services/api/src/lib/chat-ws-push.ts +++ b/services/api/src/lib/chat-ws-push.ts @@ -30,7 +30,16 @@ const SECRET_HEADER = "x-chat-ws-secret"; // Until that's done the secret resolves to an empty string and push becomes // a no-op — the 30s client poll remains the correctness fallback. function chatWsUrl(): string | null { - const v = Resource.ChatWsInternalUrl.value; + // Resolves to "" when the secret is declared-but-unset (push no-op), and + // THROWS when SST links aren't active at all (a bare `pnpm api` outside the + // sst dev multiplexer). Both must degrade to a no-op — push is best-effort and + // must never crash the request/process (the 30s client poll is the fallback). + let v: string; + try { + v = Resource.ChatWsInternalUrl.value; + } catch { + return null; + } if (!v) return null; return v.replace(/\/$/, ""); } diff --git a/services/demo-bot/.env.example b/services/demo-bot/.env.example new file mode 100644 index 0000000..f799cdc --- /dev/null +++ b/services/demo-bot/.env.example @@ -0,0 +1,13 @@ +# Concierge bot credentials — the account the demo bot signs in as (or signs up +# on first run). Use a dedicated address, not a real user. +DEMO_BOT_EMAIL=concierge@mortstack.demo +DEMO_BOT_PASSWORD=change-me-min-8-chars +DEMO_BOT_NAME=Mortstack Concierge + +# Backend endpoints (defaults target the local stack: API :3001, chat-ws :8787). +# MORTSTACK_API_URL=http://localhost:3001 +# MORTSTACK_WS_URL=ws://localhost:8787 + +# Where the bot persists its MLS state (engine snapshot + group registry + +# identity). Defaults to services/demo-bot/.demo-bot-state. +# DEMO_BOT_STATE_DIR=.demo-bot-state diff --git a/services/demo-bot/.gitignore b/services/demo-bot/.gitignore new file mode 100644 index 0000000..dbcb36d --- /dev/null +++ b/services/demo-bot/.gitignore @@ -0,0 +1,2 @@ +.env +.demo-bot-state/ diff --git a/services/demo-bot/package.json b/services/demo-bot/package.json new file mode 100644 index 0000000..90d4261 --- /dev/null +++ b/services/demo-bot/package.json @@ -0,0 +1,23 @@ +{ + "name": "@repo/demo-bot", + "version": "0.0.0", + "private": true, + "type": "module", + "description": "Headless MLS 'concierge' bot — founds demo groups and adds new signups (real Add+Welcome) so a fresh user has a working two-way E2EE chat. Tracer-bullet (local Node); productionises to an SST Lambda later.", + "scripts": { + "bot": "tsx src/index.ts", + "check-types": "tsc --noEmit" + }, + "dependencies": { + "@noble/ed25519": "^2.3.0", + "@repo/chat-mls-core": "workspace:*", + "@repo/chat-mls-core-node": "file:../../packages/chat-mls-core/node", + "@trpc/client": "^11.17.0" + }, + "devDependencies": { + "@repo/api-server": "workspace:*", + "@types/node": "^22.10.0", + "tsx": "^4.21.0", + "typescript": "5.9.2" + } +} diff --git a/services/demo-bot/src/auth.ts b/services/demo-bot/src/auth.ts new file mode 100644 index 0000000..d5d4b16 --- /dev/null +++ b/services/demo-bot/src/auth.ts @@ -0,0 +1,58 @@ +export interface AuthOpts { + apiUrl: string; + email: string; + password: string; + name: string; +} + +// Obtain a Better Auth bearer for an account. Mirrors the mobile auth client +// (apps/mobile/lib/auth/client.ts): the token rides back in the `set-auth-token` +// response header (bearer plugin), and Origin must be set so Better Auth's CSRF +// origin-check passes for a non-browser client. +// +// First run signs up (requireEmailVerification is false server-side, so the +// account is immediately usable); subsequent runs sign in. Idempotent from the +// caller's view — always returns a usable token or throws. +export async function authenticate(opts: AuthOpts): Promise { + const signIn = await postAuth(opts, "/auth/sign-in/email", { + email: opts.email, + password: opts.password, + }); + if (signIn.token) return signIn.token; + + // Sign-in failed (most likely account doesn't exist yet) → sign up. + const signUp = await postAuth(opts, "/auth/sign-up/email", { + email: opts.email, + password: opts.password, + name: opts.name, + }); + if (signUp.token) return signUp.token; + + throw new Error( + `[demo-bot/auth] could not obtain a session for ${opts.email}. ` + + `sign-in: ${signIn.status} ${signIn.body} | sign-up: ${signUp.status} ${signUp.body}`, + ); +} + +async function postAuth( + opts: AuthOpts, + path: string, + body: Record, +): Promise<{ token: string | null; status: number; body: string }> { + const res = await fetch(`${opts.apiUrl}${path}`, { + method: "POST", + headers: { + "content-type": "application/json", + // RN doesn't send Origin either; set it so the CSRF origin-check passes. + origin: opts.apiUrl, + }, + body: JSON.stringify(body), + }); + const token = res.headers.get("set-auth-token"); + const text = await res.text().catch(() => ""); + return { + token: res.ok ? token : null, + status: res.status, + body: text.slice(0, 200), + }; +} diff --git a/services/demo-bot/src/bot.ts b/services/demo-bot/src/bot.ts new file mode 100644 index 0000000..10e3e0f --- /dev/null +++ b/services/demo-bot/src/bot.ts @@ -0,0 +1,249 @@ +import { createRequire } from "node:module"; +import { tmpdir } from "node:os"; +import { join } from "node:path"; + +// @repo/chat-mls-core ships raw .ts (no "type":"module"), so tsx loads it as +// CommonJS at runtime while tsc sees the ESM source — a mismatch no single +// import form satisfies (default import runs but won't typecheck; namespace +// typechecks but hides the class under .default at runtime). Resolve it the +// canonical way: require() the value (tsx transpiles the .ts on demand) and +// take the class *type* from a type-only import (erased, so no runtime effect). +import type { MlsClient as MlsClientCtor } from "@repo/chat-mls-core/client"; + +const { MlsClient } = createRequire(import.meta.url)( + "@repo/chat-mls-core/client", +) as { + MlsClient: typeof MlsClientCtor; +}; +type MlsClient = MlsClientCtor; + +import type { BotConfig } from "./config.js"; +import { authenticate } from "./auth.js"; +import { createTrpc, makeMlsRpc, type TrpcClient } from "./rpc.js"; +import { createFileStore, type BotStore } from "./store.js"; +import { createNodeMlsEngineModule } from "./engine.js"; +import { nodeMlsCrypto, ed25519PubFromSeed } from "./crypto.js"; + +function b64(bytes: Uint8Array): string { + return Buffer.from(bytes).toString("base64"); +} + +// Canonical device-bundle bytes the server re-verifies. Byte-for-byte identical +// to apps/mobile/lib/chat/publish.ts + services/api/src/routers/user.ts: +// 0x01 ‖ deviceId-utf8 ‖ ed25519Pub ‖ x25519Pub +const BUNDLE_VERSION = 0x01; +function canonicalBundleBytes( + deviceId: string, + ed25519Pub: Uint8Array, + x25519Pub: Uint8Array, +): Uint8Array { + const deviceIdBytes = new TextEncoder().encode(deviceId); + const out = new Uint8Array( + 1 + deviceIdBytes.length + ed25519Pub.length + x25519Pub.length, + ); + out[0] = BUNDLE_VERSION; + out.set(deviceIdBytes, 1); + out.set(ed25519Pub, 1 + deviceIdBytes.length); + out.set(x25519Pub, 1 + deviceIdBytes.length + ed25519Pub.length); + return out; +} + +// Register the bot's device server-side (user.keys.publish). The mls.keys.* +// routes gate on a registered device, so this must run before bootstrap's +// orphan-KP cleanup and any add. Idempotent — server upserts on (account, device). +async function registerDevice( + trpc: TrpcClient, + id: { deviceId: string; seed: Uint8Array; x25519Pub: Uint8Array }, +): Promise { + const ed25519Pub = ed25519PubFromSeed(id.seed); + const bundle = canonicalBundleBytes(id.deviceId, ed25519Pub, id.x25519Pub); + const sig = nodeMlsCrypto.signEd25519Detached(bundle, id.seed); + await trpc.user.keys.publish.mutate({ + deviceId: id.deviceId, + ed25519PubB64: b64(ed25519Pub), + x25519PubB64: b64(id.x25519Pub), + bundleSigB64: b64(sig), + }); +} + +export interface Bot { + cfg: BotConfig; + trpc: TrpcClient; + store: BotStore; + client: MlsClient; + accountId: string; + deviceId: string; +} + +interface BuildClientOpts { + apiUrl: string; + email: string; + password: string; + name: string; + stateDir: string; +} + +type Client = Omit & { source: "fresh" | "snapshot" }; + +// Authenticate → resolve domain accountId → construct an MlsClient with the Node +// engine + file store + real RPC → register device → bootstrap. This is the +// mobile bootstrap (mls-auto-publish.ts) minus the RN-specific poll loop, and is +// shared by both the concierge (createBot) and the verify harness's synthetic user. +async function buildClient(opts: BuildClientOpts): Promise { + const token = await authenticate(opts); + const trpc = createTrpc(opts.apiUrl, token); + + // Domain Account.id ≠ Better Auth user id — the engine + snapshot key off it. + const me = await trpc.account.me.query(); + const accountId = me.accountId; + + const store = createFileStore(opts.stateDir); + const { seed, deviceId, x25519Pub } = store.getOrCreateIdentity(); + + // Register the device before any mls.keys.* call (bootstrap's fresh path + // clears orphan KPs; add fetches peer KPs) — both gate on a registered device. + await registerDevice(trpc, { deviceId, seed, x25519Pub }); + + const client = new MlsClient({ + accountId, + deviceId, + identitySeed: seed, + rpc: makeMlsRpc(trpc), + engine: createNodeMlsEngineModule(), + crypto: nodeMlsCrypto, + mlsStore: store, + }); + + const { source } = await client.bootstrap(); + return { trpc, store, client, accountId, deviceId, source }; +} + +// Boot the concierge from config. +export async function createBot(cfg: BotConfig): Promise { + const { source, ...rest } = await buildClient({ + apiUrl: cfg.apiUrl, + email: cfg.email, + password: cfg.password, + name: cfg.name, + stateDir: cfg.stateDir, + }); + console.log( + `[demo-bot] engine ready (source=${source}, account=${rest.accountId}, device=${rest.deviceId})`, + ); + return { cfg, ...rest }; +} + +// End-to-end proof of slice 1 against the REAL server, no sim required: stand up +// a throwaway KeyPackage-publishing "user", have the bot add it to a lobby, and +// assert the user joins from the bot's Welcome. A join means the user is now +// cryptographically in the group — the exact thing "group not found" denied. +export async function verifySlice1(cfg: BotConfig): Promise { + const bot = await createBot(cfg); + + const email = `verify-user-${Date.now()}@mortstack.demo`; + const user = await buildClient({ + apiUrl: cfg.apiUrl, + email, + password: "verify-user-pw-123", + name: "Verify User", + stateDir: join(tmpdir(), `demo-bot-verify-${Date.now()}`), + }); + console.log(`[verify] synthetic user ready — account=${user.accountId}`); + + // The user must publish KeyPackages before the bot can add it (the KP-timing + // dependency the real signup flow also has). + const top = await user.client.topUpKeyPackagesIfBelow(10, 8); + console.log(`[verify] user published ${top.published} KeyPackage(s)`); + + await addUserToDemo(bot, user.accountId, "Verify Lobby"); + + const joined = await user.client.pollPendingWelcomes(); + const ok = joined.joinedGroupIds.length >= 1; + console.log( + ok + ? `[verify] ✅ SLICE 1 PASS — user joined ${joined.joinedGroupIds.length} group(s) from the bot's Welcome. The "group not found" root is fixed off-device.` + : `[verify] ❌ SLICE 1 FAIL — user received no Welcome (joinedGroupIds=0). Inspect publishWelcomes / fetchPendingWelcomes.`, + ); + return ok; +} + +// Ensure a signed-up user is a full member of a demo lobby — the whole point of +// the bot. `chat.create` requires ≥1 non-caller member, so a lobby can't exist +// before its first user; this founds one WITH the first user, and adds later +// users to the existing lobby. Either way it does the two-fact membership +// correctly: (1) the server ChatMember row (so the user's chat.list surfaces the +// lobby) and (2) the real MLS Add — fetch the user's KeyPackage → engine.addMembers +// → publish Commit + Welcome — so the user's device can actually join and decrypt. +// This is the fix for the "group not found" root: no DB membership without a Welcome. +export async function addUserToDemo( + bot: Bot, + userAccountId: string, + lobbyName: string, +): Promise { + if (userAccountId === bot.accountId) { + throw new Error("[demo-bot] can't add the bot to its own lobby"); + } + + // Reuse the first lobby the bot already founded (tracer keeps one); else found. + const existing = bot.store.listChats().find((c) => c.mlsGroupIdB64); + + let chatId: string; + let groupId: Uint8Array; + + if (existing) { + chatId = existing.id; + groupId = bot.store.getChatGroupId(chatId)!; + // Server membership for a NEW member of an existing lobby. Note: addMembers' + // input is `accountIds` (chat.create's is `memberAccountIds` — asymmetric). + await bot.trpc.chat.addMembers.mutate({ + chatId, + accountIds: [userAccountId], + }); + } else { + // Found the lobby WITH this user as the initial member (server rows for + // bot+user), then have the bot mint + link the MLS group. Mirrors the + // founder half of apps/mobile/lib/chat/create-chat.ts. + const created = await bot.trpc.chat.create.mutate({ + kind: "group", + name: lobbyName, + memberAccountIds: [userAccountId], + }); + chatId = created.chatId; + await bot.store.upsertChat({ id: chatId, kind: "group", name: lobbyName }); + const g = await bot.client.createGroup({ chatId }); + groupId = g.groupId; + await bot.trpc.chat.linkMlsGroup.mutate({ + chatId, + mlsGroupIdB64: b64(groupId), + }); + console.log(`[demo-bot] founded lobby "${lobbyName}" chatId=${chatId}`); + } + + // The real MLS Add + Welcome — same call for both paths. Fails when the user + // has no published KeyPackage (they've never opened the app) — surface that as + // actionable guidance rather than a stack trace; the server rows already exist, + // so a retry after they sign in completes the join. + let res: { devicesAdded: unknown[]; epoch: number }; + try { + res = await bot.client.addMembersByAccounts({ + groupId, + accountIds: [userAccountId], + }); + } catch (err) { + console.warn( + `[demo-bot] ⚠ MLS add failed for ${userAccountId} — most likely no published KeyPackage yet. ` + + `Have them sign into the app once (it publishes KPs on bootstrap), then re-run 'bot add ${userAccountId}'. ` + + `Lobby ${chatId} + server membership already exist, so the retry only does the MLS Welcome.\n cause: ${String(err)}`, + ); + return; + } + console.log( + `[demo-bot] added ${userAccountId} → lobby ${chatId}: devices=${res.devicesAdded.length} epoch=${res.epoch}`, + ); + if (res.devicesAdded.length === 0) { + console.warn( + "[demo-bot] ⚠ 0 devices added — the user has no published KeyPackage yet. " + + "Have them open the app (sign in) once so it publishes KPs, then retry.", + ); + } +} diff --git a/services/demo-bot/src/config.ts b/services/demo-bot/src/config.ts new file mode 100644 index 0000000..56f4b51 --- /dev/null +++ b/services/demo-bot/src/config.ts @@ -0,0 +1,36 @@ +import { resolve } from "node:path"; + +// Runtime config for the demo bot. Everything overridable by env so the same +// binary runs against a local stack (defaults) or a deployed stage. The +// concierge credentials MUST be provided — the bot signs in (or signs up on +// first run) to obtain a Better Auth bearer, exactly like a device does. +export interface BotConfig { + apiUrl: string; + wsUrl: string; + email: string; + password: string; + name: string; + stateDir: string; +} + +export function loadConfig(): BotConfig { + const email = process.env.DEMO_BOT_EMAIL; + const password = process.env.DEMO_BOT_PASSWORD; + if (!email || !password) { + throw new Error( + "DEMO_BOT_EMAIL and DEMO_BOT_PASSWORD must be set (add them to services/demo-bot/.env or export them). See .env.example.", + ); + } + return { + apiUrl: process.env.MORTSTACK_API_URL ?? "http://localhost:3001", + wsUrl: process.env.MORTSTACK_WS_URL ?? "ws://localhost:8787", + email, + password, + name: process.env.DEMO_BOT_NAME ?? "Mortstack Concierge", + // Bot MLS state (engine snapshot + group/chat registry + identity seed) + // lives here for the tracer. Productionises to a Neon table for Lambda. + stateDir: process.env.DEMO_BOT_STATE_DIR + ? resolve(process.env.DEMO_BOT_STATE_DIR) + : resolve(process.cwd(), ".demo-bot-state"), + }; +} diff --git a/services/demo-bot/src/crypto.ts b/services/demo-bot/src/crypto.ts new file mode 100644 index 0000000..e71eb68 --- /dev/null +++ b/services/demo-bot/src/crypto.ts @@ -0,0 +1,53 @@ +// Node MlsCryptoApi adapter — the three primitives MlsClient needs out of band +// of the MLS engine. Mirrors packages/chat-mls-core/test/lib/node-crypto.ts, +// but installs the ed25519 sha512 sync provider via node:crypto so this file +// carries no @noble/hashes dependency. + +import { createHash, generateKeyPairSync, webcrypto } from "node:crypto"; +import * as ed25519 from "@noble/ed25519"; + +// @noble/ed25519 v2 doesn't bundle sha512 — provide a sync implementation so +// `sign()` works without going async. node:crypto's sha512 is exact-parity +// with the @noble/hashes provider the test harness uses. +ed25519.etc.sha512Sync = (...messages: Uint8Array[]) => + new Uint8Array( + createHash("sha512") + .update(Buffer.from(ed25519.etc.concatBytes(...messages))) + .digest(), + ); + +export const nodeMlsCrypto = { + digestSha256: async (bytes: Uint8Array): Promise => { + // A Uint8Array is a valid BufferSource (ArrayBufferView); digest hashes + // exactly the view's range, so no manual slice is needed. + const buf = await webcrypto.subtle.digest("SHA-256", bytes); + return new Uint8Array(buf); + }, + getRandomBytes: (n: number): Uint8Array => { + const out = new Uint8Array(n); + webcrypto.getRandomValues(out); + return out; + }, + signEd25519Detached: (message: Uint8Array, seed: Uint8Array): Uint8Array => + // @noble/ed25519 sign takes the 32-byte seed (private key) — matches the + // M3 identity_seed semantics used by chat-crypto on device. + ed25519.sign(message, seed), +}; + +// The Ed25519 public half of the identity seed — the device bundle's signing +// key. Sync because crypto.ts installs the sha512Sync provider above. +export function ed25519PubFromSeed(seed: Uint8Array): Uint8Array { + return ed25519.getPublicKey(seed); +} + +// A fresh raw (32-byte) X25519 public key. The device bundle format carries an +// x25519 pub for the v=1 pairwise path; the bot only ever speaks v=2 (MLS), so +// the private half is discarded — this key exists solely to satisfy the bundle +// shape the server stores. Generated once and persisted so re-registration is +// idempotent on the same key. +export function newX25519PubRaw(): Uint8Array { + const { publicKey } = generateKeyPairSync("x25519"); + // SPKI DER for X25519 is a fixed 44-byte structure ending in the 32-byte key. + const der = publicKey.export({ type: "spki", format: "der" }); + return new Uint8Array(der.subarray(der.length - 32)); +} diff --git a/services/demo-bot/src/engine.ts b/services/demo-bot/src/engine.ts new file mode 100644 index 0000000..9f619f0 --- /dev/null +++ b/services/demo-bot/src/engine.ts @@ -0,0 +1,114 @@ +// Per-instance MlsEngineModule for the bot, wrapping the napi MlsEngine. +// Mirrors packages/chat-mls-core/node/module.ts (the acceptance-harness wrapper) +// but is self-contained so the bot depends only on the published napi package +// (@repo/chat-mls-core-node), not on the harness's internal relative imports. +// +// The napi surface speaks Buffer; MlsClient's engine surface speaks Uint8Array. +// This wrapper is the sole Buffer↔Uint8Array boundary. + +// The napi package is a CommonJS native addon (module.exports = require(.node)), +// so ESM can't statically see its named exports — import the default and pull +// the class off it. +import ChatMlsCoreNode from "@repo/chat-mls-core-node"; + +const NapiMlsEngine = ChatMlsCoreNode.MlsEngine; +type NapiMlsEngine = InstanceType; + +function toBuffer(b: Uint8Array): Buffer { + return Buffer.from(b.buffer, b.byteOffset, b.byteLength); +} + +function fromBuffer(b: Buffer): Uint8Array { + return new Uint8Array(b.buffer, b.byteOffset, b.byteLength); +} + +// Structural shape MlsClient consumes (ProcessedKind carries Uint8Array, not +// the napi Buffer). Discriminated union so it's assignable to chat-mls-core's +// MlsEngineModule.processMessage return; duck-typed at the construction site, +// same as the harness wrapper. +type ProcessedKind = + | { kind: "application"; plaintext: Uint8Array } + | { kind: "commitApplied" } + | { kind: "proposalQueued" }; + +export function createNodeMlsEngineModule() { + let engine: NapiMlsEngine | null = null; + + const require_ = (): NapiMlsEngine => { + if (!engine) throw new Error("[demo-bot/engine] engine not initialised"); + return engine; + }; + + return { + initEngine(accountId: string, identitySeed: Uint8Array): void { + if (engine) { + if (engine.accountId() !== accountId) { + throw new Error( + `[demo-bot/engine] engine already bound to ${engine.accountId()} — resetEngine() before switching to ${accountId}`, + ); + } + return; + } + engine = new NapiMlsEngine(accountId, toBuffer(identitySeed)); + }, + engineAccountId(): string { + return require_().accountId(); + }, + resetEngine(): void { + engine = null; + }, + dumpState(): Uint8Array { + return fromBuffer(require_().dumpState()); + }, + loadState(snapshot: Uint8Array): void { + require_().loadState(toBuffer(snapshot)); + }, + createKeyPackage(): Uint8Array { + return fromBuffer(require_().createKeyPackage()); + }, + createGroup(groupId: Uint8Array): void { + require_().createGroup(toBuffer(groupId)); + }, + addMembers(groupId: Uint8Array, keyPackages: Uint8Array[]) { + const r = require_().addMembers( + toBuffer(groupId), + keyPackages.map(toBuffer), + ); + return { commit: fromBuffer(r.commit), welcome: fromBuffer(r.welcome) }; + }, + removeMembersByAccounts( + groupId: Uint8Array, + accountIds: string[], + ): Uint8Array { + return fromBuffer( + require_().removeMembersByAccounts(toBuffer(groupId), accountIds), + ); + }, + joinFromWelcome(welcomeBytes: Uint8Array): Uint8Array { + return fromBuffer(require_().joinFromWelcome(toBuffer(welcomeBytes))); + }, + encryptApp(groupId: Uint8Array, plaintext: Uint8Array): Uint8Array { + return fromBuffer( + require_().encryptApp(toBuffer(groupId), toBuffer(plaintext)), + ); + }, + processMessage(groupId: Uint8Array, msgBytes: Uint8Array): ProcessedKind { + const r = require_().processMessage( + toBuffer(groupId), + toBuffer(msgBytes), + ); + if (r.kind === "application" && r.plaintext) { + return { kind: "application", plaintext: fromBuffer(r.plaintext) }; + } + if (r.kind === "commitApplied") return { kind: "commitApplied" }; + if (r.kind === "proposalQueued") return { kind: "proposalQueued" }; + throw new Error(`[demo-bot/engine] unknown ProcessedKind: ${r.kind}`); + }, + currentEpoch(groupId: Uint8Array): number { + return require_().currentEpoch(toBuffer(groupId)); + }, + memberCount(groupId: Uint8Array): number { + return require_().memberCount(toBuffer(groupId)); + }, + }; +} diff --git a/services/demo-bot/src/index.ts b/services/demo-bot/src/index.ts new file mode 100644 index 0000000..0fc9957 --- /dev/null +++ b/services/demo-bot/src/index.ts @@ -0,0 +1,62 @@ +import { loadConfig } from "./config.js"; +import { createBot, addUserToDemo, verifySlice1 } from "./bot.js"; + +const USAGE = `demo-bot — headless MLS concierge (tracer) + + pnpm --filter @repo/demo-bot bot whoami + Authenticate, print the bot's domain accountId + deviceId. + + pnpm --filter @repo/demo-bot bot add [lobbyName] + Ensure the user is in a demo lobby (founding one with them if none exists) + via a real MLS Add + Welcome. Default lobby name "Welcome Lobby". + + pnpm --filter @repo/demo-bot bot lobbies + List the lobbies this bot has founded (from local state). + + pnpm --filter @repo/demo-bot bot verify + Sim-free end-to-end proof: spin up a throwaway KP-publishing user, add it, + assert it joins from the bot's Welcome. Exits non-zero on failure. + +Env: DEMO_BOT_EMAIL, DEMO_BOT_PASSWORD required (see .env.example).`; + +async function main(): Promise { + const [cmd, ...args] = process.argv.slice(2); + const cfg = loadConfig(); + + switch (cmd) { + case "whoami": { + const bot = await createBot(cfg); + console.log(`accountId=${bot.accountId} deviceId=${bot.deviceId}`); + break; + } + case "add": { + const [userAccountId, lobbyName] = args; + if (!userAccountId) + throw new Error("usage: bot add [lobbyName]"); + const bot = await createBot(cfg); + await addUserToDemo(bot, userAccountId, lobbyName ?? "Welcome Lobby"); + break; + } + case "lobbies": { + const bot = await createBot(cfg); + for (const c of bot.store.listChats()) { + console.log( + `${c.id} ${c.name ?? "(no name)"} ${c.mlsGroupIdB64 ? "linked" : "unlinked"}`, + ); + } + break; + } + case "verify": { + const ok = await verifySlice1(cfg); + if (!ok) process.exitCode = 1; + break; + } + default: + console.log(USAGE); + } +} + +main().catch((err) => { + console.error(err); + process.exit(1); +}); diff --git a/services/demo-bot/src/rpc.ts b/services/demo-bot/src/rpc.ts new file mode 100644 index 0000000..4a75f66 --- /dev/null +++ b/services/demo-bot/src/rpc.ts @@ -0,0 +1,40 @@ +import { createTRPCClient, httpBatchLink } from "@trpc/client"; +import type { AppRouter } from "@repo/api-server"; +import type { MlsRpc } from "@repo/chat-mls-core/client"; + +export type TrpcClient = ReturnType; + +// Typed tRPC client against the API's /trpc endpoint with the concierge bearer. +// Same shape as apps/mobile/lib/trpc/client.ts; token is captured for the run +// (the bot authenticates once at startup). +export function createTrpc(apiUrl: string, token: string) { + return createTRPCClient({ + links: [ + httpBatchLink({ + url: `${apiUrl}/trpc`, + headers: () => ({ authorization: `Bearer ${token}` }), + }), + ], + }); +} + +// The MlsRpc adapter MlsClient injects — the exact 8-method surface mobile's +// makeRpc() binds (apps/mobile/lib/chat/mls-auto-publish.ts), pointed at the +// Node tRPC client instead of the RN one. +export function makeMlsRpc(trpc: TrpcClient): MlsRpc { + return { + keysCount: (input) => trpc.mls.keys.count.query(input), + keysDeleteAllForDevice: (input) => + trpc.mls.keys.deleteAllForDevice.mutate(input), + keysPublish: (input) => trpc.mls.keys.publish.mutate(input), + keysFetchForAccounts: (input) => + trpc.mls.keys.fetchForAccounts.query(input), + groupsPublishCommit: (input) => trpc.mls.groups.publishCommit.mutate(input), + groupsFetchPendingCommits: (input) => + trpc.mls.groups.fetchPendingCommits.query(input), + groupsPublishWelcomes: (input) => + trpc.mls.groups.publishWelcomes.mutate(input), + groupsFetchPendingWelcomes: () => + trpc.mls.groups.fetchPendingWelcomes.query(), + }; +} diff --git a/services/demo-bot/src/store.ts b/services/demo-bot/src/store.ts new file mode 100644 index 0000000..c6c8846 --- /dev/null +++ b/services/demo-bot/src/store.ts @@ -0,0 +1,212 @@ +import { randomUUID, webcrypto } from "node:crypto"; +import { mkdirSync, readFileSync, writeFileSync, existsSync } from "node:fs"; +import { join } from "node:path"; + +import type { MlsStoreApi } from "@repo/chat-mls-core/client"; + +import { newX25519PubRaw } from "./crypto.js"; + +// File-backed persistence for the tracer bot. One JSON file holds the whole +// bot state: engine snapshots (per account), the local MLS group registry, the +// chat mirror, and the bot's stable identity (seed + deviceId). Bytes are +// base64. Single-writer by construction (one CLI invocation at a time) — the +// Lambda version swaps this for a Neon table + a per-account advisory lock. +// +// Implements MlsStoreApi (what MlsClient injects) plus a few bot-only helpers +// (identity, chatId→groupId forward lookup) the orchestration needs. + +interface GroupRec { + groupIdB64: string; + chat_id: string | null; + last_applied_epoch: number; + joined_at: number; +} +interface ChatRec { + id: string; + kind: "direct" | "group"; + name: string | null; + mlsGroupIdB64: string | null; +} +interface Persisted { + identity?: { seedB64: string; deviceId: string; x25519PubB64: string }; + snapshots: Record; + groups: Record; // keyed by groupId hex + chats: Record; // keyed by chatId +} + +function b64(bytes: Uint8Array): string { + return Buffer.from(bytes).toString("base64"); +} +function unb64(s: string): Uint8Array { + return new Uint8Array(Buffer.from(s, "base64")); +} +function hex(bytes: Uint8Array): string { + return Buffer.from(bytes).toString("hex"); +} + +export interface BotStore extends MlsStoreApi { + getOrCreateIdentity(): { + seed: Uint8Array; + deviceId: string; + x25519Pub: Uint8Array; + }; + /** Forward lookup the MlsStoreApi doesn't expose: chatId → GroupId bytes. */ + getChatGroupId(chatId: string): Uint8Array | null; + listChats(): ChatRec[]; +} + +export function createFileStore(stateDir: string): BotStore { + const file = join(stateDir, "state.json"); + + function load(): Persisted { + if (!existsSync(file)) { + return { snapshots: {}, groups: {}, chats: {} }; + } + return JSON.parse(readFileSync(file, "utf8")) as Persisted; + } + function save(state: Persisted): void { + mkdirSync(stateDir, { recursive: true }); + writeFileSync(file, JSON.stringify(state, null, 2), "utf8"); + } + + return { + getOrCreateIdentity() { + const state = load(); + if (state.identity) { + return { + seed: unb64(state.identity.seedB64), + deviceId: state.identity.deviceId, + x25519Pub: unb64(state.identity.x25519PubB64), + }; + } + const seed = new Uint8Array(32); + webcrypto.getRandomValues(seed); + const deviceId = randomUUID(); + const x25519Pub = newX25519PubRaw(); + state.identity = { + seedB64: b64(seed), + deviceId, + x25519PubB64: b64(x25519Pub), + }; + save(state); + return { seed, deviceId, x25519Pub }; + }, + + getChatGroupId(chatId) { + const rec = load().chats[chatId]; + return rec?.mlsGroupIdB64 ? unb64(rec.mlsGroupIdB64) : null; + }, + + listChats() { + return Object.values(load().chats); + }, + + // ── MlsStoreApi ────────────────────────────────────────────────────────── + async loadEngineSnapshot(accountId) { + const row = load().snapshots[accountId]; + return row + ? { snapshot: unb64(row.snapshotB64), updated_at: row.updated_at } + : null; + }, + async saveEngineSnapshot(accountId, snapshot) { + const state = load(); + state.snapshots[accountId] = { + snapshotB64: b64(snapshot), + updated_at: Date.now(), + }; + save(state); + }, + async clearEngineSnapshot(accountId) { + const state = load(); + delete state.snapshots[accountId]; + save(state); + }, + + async upsertGroup(input) { + const state = load(); + const key = hex(input.groupId); + const existing = state.groups[key]; + // Mirror mls-store.ts ON CONFLICT: keep last_applied_epoch, COALESCE chat_id. + state.groups[key] = { + groupIdB64: b64(input.groupId), + chat_id: input.chatId ?? existing?.chat_id ?? null, + last_applied_epoch: + existing?.last_applied_epoch ?? input.initialEpoch ?? 0, + joined_at: existing?.joined_at ?? Date.now(), + }; + save(state); + }, + async setLastAppliedEpoch(groupId, epoch) { + const state = load(); + const rec = state.groups[hex(groupId)]; + if (rec) { + rec.last_applied_epoch = epoch; + save(state); + } + }, + async getGroup(groupId) { + const rec = load().groups[hex(groupId)]; + if (!rec) return null; + return { + group_id: unb64(rec.groupIdB64), + chat_id: rec.chat_id, + last_applied_epoch: rec.last_applied_epoch, + joined_at: rec.joined_at, + }; + }, + async listGroups() { + return Object.values(load().groups).map((r) => ({ + groupId: unb64(r.groupIdB64), + chatId: r.chat_id, + lastAppliedEpoch: r.last_applied_epoch, + })); + }, + async clearAllGroups() { + const state = load(); + state.groups = {}; + save(state); + }, + + async setChatMlsGroupId(chatId, groupId) { + const state = load(); + const rec = state.chats[chatId]; + if (!rec) return { updates: 0 }; + rec.mlsGroupIdB64 = b64(groupId); + save(state); + return { updates: 1 }; + }, + async ensureChatForDebug(chatId, kind = "group") { + const state = load(); + if (state.chats[chatId]) return { created: false }; + state.chats[chatId] = { + id: chatId, + kind, + name: null, + mlsGroupIdB64: null, + }; + save(state); + return { created: true }; + }, + async upsertChat(input) { + const state = load(); + const existing = state.chats[input.id]; + state.chats[input.id] = { + id: input.id, + kind: input.kind, + name: input.name ?? existing?.name ?? null, + // COALESCE: don't drop an existing link if this upsert omits it. + mlsGroupIdB64: input.mlsGroupId + ? b64(input.mlsGroupId) + : (existing?.mlsGroupIdB64 ?? null), + }; + save(state); + }, + async chatIdByGroupId(groupId) { + const target = b64(groupId); + const hit = Object.values(load().chats).find( + (c) => c.mlsGroupIdB64 === target, + ); + return hit?.id ?? null; + }, + }; +} diff --git a/services/demo-bot/tsconfig.json b/services/demo-bot/tsconfig.json new file mode 100644 index 0000000..332fb48 --- /dev/null +++ b/services/demo-bot/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "ESNext", + "moduleResolution": "Bundler", + "lib": ["ES2022"], + "types": ["node"], + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "resolveJsonModule": true, + "noEmit": true + }, + "include": ["src"] +}