@ateam-ai-mobile/expo 0.1.19 → 0.1.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/aiLive/provider.d.mts +20 -0
- package/dist/aiLive/provider.d.ts +20 -0
- package/dist/aiLive/provider.js +400 -0
- package/dist/aiLive/provider.js.map +1 -0
- package/dist/aiLive/provider.mjs +15 -0
- package/dist/aiLive/provider.mjs.map +1 -0
- package/dist/bootstrap.js +350 -3
- package/dist/bootstrap.js.map +1 -1
- package/dist/bootstrap.mjs +17 -12
- package/dist/bootstrap.mjs.map +1 -1
- package/dist/capabilities/index.d.mts +40 -1
- package/dist/capabilities/index.d.ts +40 -1
- package/dist/capabilities/index.js +50 -14
- package/dist/capabilities/index.js.map +1 -1
- package/dist/capabilities/index.mjs +49 -32
- package/dist/capabilities/index.mjs.map +1 -1
- package/dist/{chunk-42FP5DTO.mjs → chunk-2ZQEQJQ6.mjs} +1 -1
- package/dist/chunk-2ZQEQJQ6.mjs.map +1 -0
- package/dist/chunk-AE55BKYV.mjs +24 -0
- package/dist/chunk-AE55BKYV.mjs.map +1 -0
- package/dist/chunk-BAZFMTCC.mjs +815 -0
- package/dist/chunk-BAZFMTCC.mjs.map +1 -0
- package/dist/{chunk-Z5AI2SXX.mjs → chunk-C62NQA4F.mjs} +203 -1004
- package/dist/chunk-C62NQA4F.mjs.map +1 -0
- package/dist/{chunk-DE6Y4VRI.mjs → chunk-GA7DS3PA.mjs} +1 -1
- package/dist/{chunk-DE6Y4VRI.mjs.map → chunk-GA7DS3PA.mjs.map} +1 -1
- package/dist/chunk-GW7YGXOW.mjs +47 -0
- package/dist/chunk-GW7YGXOW.mjs.map +1 -0
- package/dist/chunk-JUBLG3PN.mjs +351 -0
- package/dist/chunk-JUBLG3PN.mjs.map +1 -0
- package/dist/{chunk-Z3P7RUCC.mjs → chunk-OEX4OKYQ.mjs} +13 -13
- package/dist/{chunk-6JX222YX.mjs → chunk-WQK6PUBN.mjs} +9 -2
- package/dist/chunk-WQK6PUBN.mjs.map +1 -0
- package/dist/device/createDeviceProvider.js.map +1 -1
- package/dist/device/createDeviceProvider.mjs +7 -6
- package/dist/device-bridge/index.mjs +8 -6
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/push/index.d.mts +24 -0
- package/dist/push/index.d.ts +24 -0
- package/dist/push/index.js +224 -0
- package/dist/push/index.js.map +1 -0
- package/dist/push/index.mjs +174 -0
- package/dist/push/index.mjs.map +1 -0
- package/dist/push/silentSync.d.mts +8 -0
- package/dist/push/silentSync.d.ts +8 -0
- package/dist/push/silentSync.js +1075 -0
- package/dist/push/silentSync.js.map +1 -0
- package/dist/push/silentSync.mjs +67 -0
- package/dist/push/silentSync.mjs.map +1 -0
- package/dist/vision/index.d.mts +7 -1
- package/dist/vision/index.d.ts +7 -1
- package/dist/vision/index.js +8 -0
- package/dist/vision/index.js.map +1 -1
- package/dist/vision/index.mjs +3 -1
- package/ios/AdaVisionModule.swift +44 -1
- package/package.json +28 -6
- package/src/aiLive/provider.ts +242 -0
- package/src/aiLive/streamProtocol.ts +90 -0
- package/src/bootstrap.ts +7 -1
- package/src/capabilities/choices.ts +65 -0
- package/src/capabilities/config.ts +5 -4
- package/src/capabilities/index.ts +2 -0
- package/src/capabilities/picturesToAi.ts +40 -0
- package/src/capabilities/store.ts +38 -37
- package/src/index.ts +3 -0
- package/src/push/index.ts +18 -0
- package/src/push/messaging.ts +49 -0
- package/src/push/registration.ts +31 -0
- package/src/push/silentSync.ts +83 -0
- package/src/push/usePushNotifications.ts +224 -0
- package/src/vision/index.ts +14 -0
- package/dist/chunk-42FP5DTO.mjs.map +0 -1
- package/dist/chunk-6JX222YX.mjs.map +0 -1
- package/dist/chunk-Z5AI2SXX.mjs.map +0 -1
- /package/dist/{chunk-Z3P7RUCC.mjs.map → chunk-OEX4OKYQ.mjs.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/device-bridge/actions/messaging.ts","../src/device-bridge/actions/calendar-actions.ts","../src/device-bridge/actions/dnd.ts","../src/device-bridge/actions/navigation.ts","../src/device-bridge/actions/health-actions.ts","../src/device-bridge/actions/queue-poller.ts","../src/device-bridge/biometrics.ts","../src/device-bridge/sharing.ts","../src/device-bridge/scanner.ts","../src/device-bridge/index.ts"],"sourcesContent":["/**\n * Messaging Action Executor — sends SMS via expo-sms.\n * Executes 'messaging.send' actions from the action queue.\n */\n\nimport * as SMS from 'expo-sms';\nimport type { ActionResult } from '../types';\n\n/**\n * Check if SMS is available on this device.\n */\nexport async function isAvailable(): Promise<boolean> {\n return SMS.isAvailableAsync();\n}\n\n/**\n * Execute a messaging.send action.\n *\n * Params expected:\n * - contact_name: string (for display only)\n * - phone: string (phone number to send to)\n * - message: string (message text)\n */\nexport async function execute(\n actionId: string,\n params: Record<string, unknown>\n): Promise<ActionResult> {\n const phone = params.phone as string;\n const message = params.message as string;\n\n if (!phone || !message) {\n return {\n id: actionId,\n ok: false,\n error: 'Missing phone or message parameter',\n executed_at: new Date().toISOString(),\n };\n }\n\n try {\n const available = await SMS.isAvailableAsync();\n if (!available) {\n return {\n id: actionId,\n ok: false,\n error: 'SMS not available on this device',\n executed_at: new Date().toISOString(),\n };\n }\n\n // Opens the native SMS compose screen with pre-filled content\n const { result } = await SMS.sendSMSAsync([phone], message);\n\n return {\n id: actionId,\n ok: result === 'sent' || result === 'unknown', // 'unknown' on Android means it was sent\n result: {\n to: params.contact_name || phone,\n phone,\n message,\n status: result,\n sent_at: new Date().toISOString(),\n },\n executed_at: new Date().toISOString(),\n };\n } catch (error) {\n return {\n id: actionId,\n ok: false,\n error: `SMS send failed: ${error instanceof Error ? error.message : String(error)}`,\n executed_at: new Date().toISOString(),\n };\n }\n}\n","/**\n * Calendar Action Executor — creates/modifies events via expo-calendar.\n * Executes 'calendar.create', 'calendar.reschedule', 'calendar.cancel' actions.\n */\n\nimport * as ExpoCalendar from 'expo-calendar';\n// Type-only alias: the value namespace above cannot be used in type\n// position, so `ExpoCalendar.Calendar`-style annotations need this.\n// Derived rather than imported — see collectors/calendar.ts.\ntype Event = Awaited<ReturnType<typeof ExpoCalendar.getEventsAsync>>[number];\nimport type { ActionResult } from '../types';\n\n/**\n * Get the default calendar ID for creating events.\n */\nasync function getDefaultCalendarId(): Promise<string | null> {\n const calendars = await ExpoCalendar.getCalendarsAsync(ExpoCalendar.EntityTypes.EVENT);\n\n // Prefer the default calendar\n const defaultCal = calendars.find(c => c.isPrimary) || calendars[0];\n return defaultCal?.id || null;\n}\n\n/**\n * Execute a calendar.create action.\n *\n * Params expected:\n * - title: string\n * - date: string (YYYY-MM-DD)\n * - start_time: string (HH:MM)\n * - end_time?: string (HH:MM)\n * - location?: string\n * - attendees?: string[] (names — no email lookup here)\n * - notes?: string\n */\nexport async function executeCreate(\n actionId: string,\n params: Record<string, unknown>\n): Promise<ActionResult> {\n const title = params.title as string;\n const date = params.date as string;\n const startTime = params.start_time as string;\n const endTime = params.end_time as string | undefined;\n\n if (!title || !date || !startTime) {\n return {\n id: actionId,\n ok: false,\n error: 'Missing title, date, or start_time',\n executed_at: new Date().toISOString(),\n };\n }\n\n try {\n const calendarId = await getDefaultCalendarId();\n if (!calendarId) {\n return {\n id: actionId,\n ok: false,\n error: 'No calendar found on device',\n executed_at: new Date().toISOString(),\n };\n }\n\n const [year, month, day] = date.split('-').map(Number);\n const [startH, startM] = startTime.split(':').map(Number);\n\n const startDate = new Date(year, month - 1, day, startH, startM);\n let endDate: Date;\n\n if (endTime) {\n const [endH, endM] = endTime.split(':').map(Number);\n endDate = new Date(year, month - 1, day, endH, endM);\n } else {\n // Default 1 hour duration\n endDate = new Date(startDate.getTime() + 60 * 60 * 1000);\n }\n\n const eventId = await ExpoCalendar.createEventAsync(calendarId, {\n title,\n startDate,\n endDate,\n location: (params.location as string) || undefined,\n notes: (params.notes as string) || undefined,\n timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n });\n\n return {\n id: actionId,\n ok: true,\n result: {\n event_id: eventId,\n title,\n date,\n start: startTime,\n end: endTime || formatTime(endDate),\n message: `Event \"${title}\" created successfully`,\n },\n executed_at: new Date().toISOString(),\n };\n } catch (error) {\n return {\n id: actionId,\n ok: false,\n error: `Calendar create failed: ${error instanceof Error ? error.message : String(error)}`,\n executed_at: new Date().toISOString(),\n };\n }\n}\n\n/**\n * Execute a calendar.reschedule action.\n *\n * Params expected:\n * - event_id: string\n * - new_date?: string (YYYY-MM-DD)\n * - new_start_time?: string (HH:MM)\n * - new_end_time?: string (HH:MM)\n */\nexport async function executeReschedule(\n actionId: string,\n params: Record<string, unknown>\n): Promise<ActionResult> {\n const eventId = params.event_id as string;\n\n if (!eventId) {\n return {\n id: actionId,\n ok: false,\n error: 'Missing event_id',\n executed_at: new Date().toISOString(),\n };\n }\n\n try {\n const updates: Partial<Event> = {};\n\n if (params.new_date && params.new_start_time) {\n const [year, month, day] = (params.new_date as string).split('-').map(Number);\n const [h, m] = (params.new_start_time as string).split(':').map(Number);\n updates.startDate = new Date(year, month - 1, day, h, m);\n\n if (params.new_end_time) {\n const [eh, em] = (params.new_end_time as string).split(':').map(Number);\n updates.endDate = new Date(year, month - 1, day, eh, em);\n } else {\n updates.endDate = new Date(updates.startDate.getTime() + 60 * 60 * 1000);\n }\n }\n\n await ExpoCalendar.updateEventAsync(eventId, updates);\n\n return {\n id: actionId,\n ok: true,\n result: { event_id: eventId, message: 'Event rescheduled successfully' },\n executed_at: new Date().toISOString(),\n };\n } catch (error) {\n return {\n id: actionId,\n ok: false,\n error: `Calendar reschedule failed: ${error instanceof Error ? error.message : String(error)}`,\n executed_at: new Date().toISOString(),\n };\n }\n}\n\n/**\n * Execute a calendar.cancel action.\n *\n * Params expected:\n * - event_id: string\n */\nexport async function executeCancel(\n actionId: string,\n params: Record<string, unknown>\n): Promise<ActionResult> {\n const eventId = params.event_id as string;\n\n if (!eventId) {\n return {\n id: actionId,\n ok: false,\n error: 'Missing event_id',\n executed_at: new Date().toISOString(),\n };\n }\n\n try {\n await ExpoCalendar.deleteEventAsync(eventId);\n\n return {\n id: actionId,\n ok: true,\n result: { event_id: eventId, message: 'Event cancelled successfully' },\n executed_at: new Date().toISOString(),\n };\n } catch (error) {\n return {\n id: actionId,\n ok: false,\n error: `Calendar cancel failed: ${error instanceof Error ? error.message : String(error)}`,\n executed_at: new Date().toISOString(),\n };\n }\n}\n\n// ─── Helpers ───\n\nfunction formatTime(date: Date): string {\n return date.toLocaleTimeString('en-US', {\n hour: '2-digit',\n minute: '2-digit',\n hour12: false,\n });\n}\n","/**\n * DND Action Executor — manages Do Not Disturb via expo-notifications.\n * Executes 'dnd.set' actions from the action queue.\n *\n * Note: True system-level DND control requires platform-specific APIs:\n * - iOS: Focus modes (requires entitlements)\n * - Android: NotificationManager.setInterruptionFilter (requires DND access)\n *\n * For now, this manages DND state within the PA system:\n * - Stores DND state in relay for the connector to read\n * - Controls notification channel behavior in-app\n */\n\nimport type { ActionResult, DndState } from '../types';\n\n// In-memory DND state (synced to relay)\nlet currentDndState: DndState = {\n enabled: false,\n schedule: { start: '22:00', end: '07:00' },\n allowlist: [],\n};\n\n/**\n * Get current DND state.\n */\nexport function getState(): DndState {\n return { ...currentDndState };\n}\n\n/**\n * Execute a dnd.set action.\n *\n * Params expected:\n * - enabled?: boolean\n * - schedule_start?: string (HH:MM)\n * - schedule_end?: string (HH:MM)\n * - allowlist?: string[]\n */\nexport async function execute(\n actionId: string,\n params: Record<string, unknown>\n): Promise<ActionResult> {\n try {\n if (params.enabled !== undefined) {\n currentDndState.enabled = params.enabled as boolean;\n }\n if (params.schedule_start) {\n currentDndState.schedule.start = params.schedule_start as string;\n }\n if (params.schedule_end) {\n currentDndState.schedule.end = params.schedule_end as string;\n }\n if (params.allowlist) {\n currentDndState.allowlist = params.allowlist as string[];\n }\n\n return {\n id: actionId,\n ok: true,\n result: {\n message: `DND ${currentDndState.enabled ? 'enabled' : 'disabled'}`,\n dnd: currentDndState,\n },\n executed_at: new Date().toISOString(),\n };\n } catch (error) {\n return {\n id: actionId,\n ok: false,\n error: `DND set failed: ${error instanceof Error ? error.message : String(error)}`,\n executed_at: new Date().toISOString(),\n };\n }\n}\n","/**\n * Navigation Action Executor — opens maps app via expo-linking.\n * Executes 'navigation.start' actions from the action queue.\n */\n\nimport * as Linking from 'expo-linking';\nimport { Platform } from 'react-native';\nimport type { ActionResult } from '../types';\n\n/**\n * Execute a navigation.start action.\n * Opens the native maps app with turn-by-turn directions.\n *\n * Params expected:\n * - destination: string (address or place name)\n * - mode?: 'driving' | 'transit' | 'walking' (default: 'driving')\n */\nexport async function execute(\n actionId: string,\n params: Record<string, unknown>\n): Promise<ActionResult> {\n const destination = params.destination as string;\n const mode = (params.mode as string) || 'driving';\n\n if (!destination) {\n return {\n id: actionId,\n ok: false,\n error: 'Missing destination parameter',\n executed_at: new Date().toISOString(),\n };\n }\n\n try {\n const encodedDest = encodeURIComponent(destination);\n let url: string;\n\n if (Platform.OS === 'ios') {\n // Apple Maps with directions\n const modeMap: Record<string, string> = {\n driving: 'd',\n transit: 'r',\n walking: 'w',\n };\n url = `maps://maps.apple.com/?daddr=${encodedDest}&dirflg=${modeMap[mode] || 'd'}`;\n } else {\n // Google Maps on Android\n const modeMap: Record<string, string> = {\n driving: 'driving',\n transit: 'transit',\n walking: 'walking',\n };\n url = `google.navigation:q=${encodedDest}&mode=${modeMap[mode] || 'driving'}`;\n }\n\n const canOpen = await Linking.canOpenURL(url);\n if (!canOpen) {\n // Fallback to Google Maps web URL\n const webModeMap: Record<string, string> = {\n driving: 'driving',\n transit: 'transit',\n walking: 'walking',\n };\n url = `https://www.google.com/maps/dir/?api=1&destination=${encodedDest}&travelmode=${webModeMap[mode] || 'driving'}`;\n }\n\n await Linking.openURL(url);\n\n return {\n id: actionId,\n ok: true,\n result: {\n message: `Navigation started to ${destination} via ${mode}`,\n destination,\n mode,\n status: 'navigating',\n },\n executed_at: new Date().toISOString(),\n };\n } catch (error) {\n return {\n id: actionId,\n ok: false,\n error: `Navigation failed: ${error instanceof Error ? error.message : String(error)}`,\n executed_at: new Date().toISOString(),\n };\n }\n}\n","/**\n * Health Action Executor — on-demand reads from HealthKit.\n *\n * Two action types:\n * - 'health.today' → returns one HealthDayMetrics for today\n * - 'health.history' → returns last N days (1..30), newest-first\n *\n * Both are read-only; no params are required for `today`.\n * `history` accepts { days: number } (default 30).\n *\n * For periodic snapshots use the `health` capability instead — this\n * executor exists so a connector can pull fresher / longer-range data\n * without waiting for the next sync tick.\n */\nimport * as health from '../collectors/health';\nimport type { ActionResult } from '../types';\n\nexport async function executeToday(actionId: string): Promise<ActionResult> {\n try {\n const today = await health.collectToday();\n return {\n id: actionId,\n ok: true,\n result: { today },\n executed_at: new Date().toISOString(),\n };\n } catch (e: any) {\n return {\n id: actionId,\n ok: false,\n error: String(e?.message || e),\n executed_at: new Date().toISOString(),\n };\n }\n}\n\nexport async function executeHistory(\n actionId: string,\n params: Record<string, unknown>,\n): Promise<ActionResult> {\n try {\n const days = Number(params?.days) || 30;\n const list = await health.collectHistory(days);\n return {\n id: actionId,\n ok: true,\n result: { days: list },\n executed_at: new Date().toISOString(),\n };\n } catch (e: any) {\n return {\n id: actionId,\n ok: false,\n error: String(e?.message || e),\n executed_at: new Date().toISOString(),\n };\n }\n}\n","/**\n * Action Queue Poller — polls the relay for pending actions and executes them.\n * Routes each action to the appropriate executor based on action type.\n */\n\nimport type { RelayClient } from '../relay-client';\nimport type { PendingAction, ActionResult, ActionType } from '../types';\nimport * as messaging from './messaging';\nimport * as calendarActions from './calendar-actions';\nimport * as dnd from './dnd';\nimport * as navigation from './navigation';\nimport * as healthActions from './health-actions';\n\nexport interface QueuePollerConfig {\n /** Polling interval in ms (default: 5000) */\n pollInterval?: number;\n /** Relay client instance */\n relayClient: RelayClient;\n /** Callback when an action is executed */\n onActionExecuted?: (result: ActionResult) => void;\n /** Callback for errors */\n onError?: (error: Error) => void;\n}\n\nexport class QueuePoller {\n private relayClient: RelayClient;\n private pollInterval: number;\n private timer: ReturnType<typeof setInterval> | null = null;\n private running = false;\n private onActionExecuted?: (result: ActionResult) => void;\n private onError?: (error: Error) => void;\n\n constructor(config: QueuePollerConfig) {\n this.relayClient = config.relayClient;\n this.pollInterval = config.pollInterval ?? 5_000;\n this.onActionExecuted = config.onActionExecuted;\n this.onError = config.onError;\n }\n\n /**\n * Start polling for actions.\n */\n start(): void {\n if (this.running) return;\n this.running = true;\n\n // Poll immediately, then on interval\n this.poll();\n this.timer = setInterval(() => this.poll(), this.pollInterval);\n }\n\n /**\n * Stop polling.\n */\n stop(): void {\n this.running = false;\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n }\n\n /**\n * Check if poller is running.\n */\n isRunning(): boolean {\n return this.running;\n }\n\n /**\n * Execute a single poll cycle.\n */\n private async poll(): Promise<void> {\n if (!this.running) return;\n\n try {\n const response = await this.relayClient.pollActions();\n if (!response.ok || !response.data) return;\n\n for (const action of response.data) {\n // The relay only ever returns pending actions — it filters in the\n // query. A missing status therefore means \"the server didn't say\",\n // not \"already handled\", and treating it as the latter discarded\n // every queued action while every write tool still answered \"queued\".\n // Only an explicitly non-pending status is skipped.\n if (action.status && action.status !== 'pending') continue;\n\n const result = await this.executeAction(action);\n\n // Report result back to relay\n await this.relayClient.completeAction(result);\n\n this.onActionExecuted?.(result);\n }\n } catch (error) {\n this.onError?.(\n error instanceof Error ? error : new Error(String(error))\n );\n }\n }\n\n /**\n * Route an action to the appropriate executor.\n */\n private async executeAction(action: PendingAction): Promise<ActionResult> {\n const { id, type, params } = action;\n\n try {\n switch (type as ActionType) {\n case 'messaging.send':\n return await messaging.execute(id, params);\n\n case 'calendar.create':\n return await calendarActions.executeCreate(id, params);\n\n case 'calendar.reschedule':\n return await calendarActions.executeReschedule(id, params);\n\n case 'calendar.cancel':\n return await calendarActions.executeCancel(id, params);\n\n case 'dnd.set':\n return await dnd.execute(id, params);\n\n case 'navigation.start':\n return await navigation.execute(id, params);\n\n case 'health.today':\n return await healthActions.executeToday(id);\n\n case 'health.history':\n return await healthActions.executeHistory(id, params);\n\n default:\n return {\n id,\n ok: false,\n error: `Unknown action type: ${type}`,\n executed_at: new Date().toISOString(),\n };\n }\n } catch (error) {\n return {\n id,\n ok: false,\n error: `Action execution failed: ${error instanceof Error ? error.message : String(error)}`,\n executed_at: new Date().toISOString(),\n };\n }\n }\n}\n","/**\n * Device-bridge: Biometrics (Face ID / Touch ID / fingerprint)\n *\n * Used by solutions that need a biometric gate before sensitive actions\n * (e.g. \"unlock payment\", \"confirm financial transfer\", \"reveal stored\n * credentials\"). Also useful for protecting session cookies at rest.\n *\n * Wraps expo-local-authentication.\n */\n\nimport * as LocalAuthentication from 'expo-local-authentication';\n\nexport type BiometricType = 'fingerprint' | 'face' | 'iris' | 'none';\n\nexport interface BiometricCapabilities {\n hasHardware: boolean;\n isEnrolled: boolean;\n /**\n * Never contains 'none' — the mapper filters it out, since 'none' means\n * \"the OS reported an auth type we do not recognise\" and is not a\n * biometric a caller can offer. Typed as the guarantee the code makes.\n */\n supportedTypes: Exclude<BiometricType, 'none'>[];\n}\n\n/** What can the device do right now? */\nexport async function capabilities(): Promise<BiometricCapabilities> {\n const [hasHardware, isEnrolled, types] = await Promise.all([\n LocalAuthentication.hasHardwareAsync(),\n LocalAuthentication.isEnrolledAsync(),\n LocalAuthentication.supportedAuthenticationTypesAsync(),\n ]);\n const supportedTypes = types.map((t) => {\n if (t === LocalAuthentication.AuthenticationType.FINGERPRINT) return 'fingerprint';\n if (t === LocalAuthentication.AuthenticationType.FACIAL_RECOGNITION) return 'face';\n if (t === LocalAuthentication.AuthenticationType.IRIS) return 'iris';\n return 'none';\n }).filter((t) => t !== 'none') as Exclude<BiometricType, 'none'>[];\n return { hasHardware, isEnrolled, supportedTypes };\n}\n\nexport interface AuthenticateOptions {\n /** User-visible reason shown in the system dialog. */\n reason: string;\n /** Label on the \"cancel\" button (iOS only; Android has system default). */\n cancelLabel?: string;\n /** If biometrics aren't enrolled, fall back to device passcode. Default true. */\n fallbackToPasscode?: boolean;\n}\n\n/** Prompt the user for biometric auth. Resolves { success } or { success:false, error }. */\nexport async function authenticate(opts: AuthenticateOptions): Promise<{ success: boolean; error?: string }> {\n try {\n const res = await LocalAuthentication.authenticateAsync({\n promptMessage: opts.reason,\n cancelLabel: opts.cancelLabel,\n disableDeviceFallback: opts.fallbackToPasscode === false,\n });\n if (res.success) return { success: true };\n return { success: false, error: (res as any).error || 'unknown' };\n } catch (e: any) {\n return { success: false, error: String(e?.message || e) };\n }\n}\n","/**\n * Device-bridge: Sharing (native share sheet)\n *\n * Wraps expo-sharing. Lets solutions hand content off to the OS share sheet\n * — any installed app can receive it (Messages, WhatsApp, Mail, Files, etc.).\n *\n * Typical use: \"Share this article / calendar invite / photo with a contact.\"\n */\n\nimport * as Sharing from 'expo-sharing';\n\nexport interface ShareOptions {\n /** MIME type, e.g. 'application/pdf'. Optional. */\n mimeType?: string;\n /** iOS UTI, e.g. 'public.image'. Optional. */\n UTI?: string;\n /** Dialog title (Android only). */\n dialogTitle?: string;\n}\n\n/** Share a local file URI. */\nexport async function shareFile(fileUri: string, opts: ShareOptions = {}): Promise<{ ok: boolean; error?: string }> {\n try {\n const available = await Sharing.isAvailableAsync();\n if (!available) return { ok: false, error: 'sharing_unavailable' };\n await Sharing.shareAsync(fileUri, opts);\n return { ok: true };\n } catch (e: any) {\n return { ok: false, error: String(e?.message || e) };\n }\n}\n\nexport async function isAvailable(): Promise<boolean> {\n return Sharing.isAvailableAsync();\n}\n","/**\n * Device-bridge: Scanner (QR / barcode)\n *\n * Wraps expo-camera (which replaced the deprecated expo-barcode-scanner\n * in Expo SDK 50+). The CameraView component has built-in barcode scanning.\n *\n * Use cases:\n * - Wi-Fi QR handoff\n * - OAuth / pairing codes\n * - Payment QR codes\n * - Product lookup\n *\n * Plugins mount <CameraView onBarcodeScanned={...} /> directly. This module\n * exposes the permission helper + a result normalizer so plugins don't need\n * to import expo-camera directly.\n */\n\nimport { CameraView, useCameraPermissions, type BarcodeScanningResult } from 'expo-camera';\n\nexport interface ScanResult {\n type: string; // e.g. 'qr', 'ean13', 'code128'\n data: string; // decoded content\n}\n\n/** Request camera permission if not already granted. */\nexport async function requestPermissions(): Promise<{ granted: boolean; status: string }> {\n // useCameraPermissions is a hook; for the non-hook flow plugins should use\n // Camera.requestCameraPermissionsAsync. But it's easier to expose the hook\n // helper — plugins typically use the hook form inside their Component.\n // For service-style callers, fall back to the imperative API:\n const { Camera } = await import('expo-camera');\n const { status } = await Camera.requestCameraPermissionsAsync();\n return { granted: status === 'granted', status };\n}\n\n/** Normalize a CameraView barcode result to a stable shape. */\nexport function normalizeResult(r: BarcodeScanningResult): ScanResult {\n return { type: r.type, data: r.data };\n}\n\n/** Re-export the component + hook so plugins consume them via device-bridge. */\nexport { CameraView, useCameraPermissions };\n","/**\n * @mobile-pa/device-bridge\n *\n * Isolated device data sync module. Zero coupling to chat, voice, or UI.\n * Pluggable capability system — register built-in or custom capabilities.\n *\n * Usage (host app controls permission flow):\n *\n * import { DeviceBridge, capabilities } from '@mobile-pa/device-bridge';\n *\n * const bridge = new DeviceBridge({ relayUrl, deviceId, apiKey });\n *\n * // 1. Register capabilities\n * bridge.registerAll(capabilities.allBuiltIn());\n *\n * // 2. Permission flow — host app shows its own UI per capability\n * for (const cap of bridge.getPendingPermissions()) {\n * // → show explanation: cap.name, cap.description, cap.reason\n * // → user taps \"Allow\"\n * await bridge.requestPermission(cap.id);\n * }\n *\n * // 3. Start syncing (only syncs permitted capabilities)\n * await bridge.startSync();\n *\n * // 4. Add more capabilities later (even after sync started)\n * bridge.register(myCustomCapability);\n * await bridge.requestPermission(myCustomCapability.id);\n * // → auto-starts syncing if bridge is already running\n */\n\nimport { RelayClient } from './relay-client';\nimport { QueuePoller } from './actions/queue-poller';\nimport { registerBackgroundSync, unregisterBackgroundSync } from './background';\nimport type {\n DeviceBridgeConfig,\n BridgeStatus,\n CapabilityStatus,\n DomainSyncStatus,\n SyncState,\n Capability,\n PermissionState,\n ActionResult,\n} from './types';\n\n// Re-export types\nexport type {\n DeviceBridgeConfig,\n BridgeStatus,\n CapabilityStatus,\n DomainSyncStatus,\n BridgeError,\n ActionResult,\n Capability,\n PermissionState,\n} from './types';\n\n// Re-export capability factories\nexport * as capabilities from './capabilities';\n\nexport class DeviceBridge {\n private config: DeviceBridgeConfig;\n private relay: RelayClient;\n private queuePoller: QueuePoller;\n\n // Capability registry\n private caps: Map<string, Capability> = new Map();\n private syncTimers: Map<string, ReturnType<typeof setInterval>> = new Map();\n private subscriptions: Map<string, () => void> = new Map();\n private domainStatus: Map<string, DomainSyncStatus> = new Map();\n private running = false;\n\n constructor(config: DeviceBridgeConfig) {\n this.config = config;\n\n this.relay = new RelayClient({\n relayUrl: config.relayUrl,\n deviceId: config.deviceId,\n tenant: config.tenant,\n actorId: config.actorId,\n apiKey: config.apiKey,\n });\n\n this.queuePoller = new QueuePoller({\n relayClient: this.relay,\n pollInterval: 5_000,\n onActionExecuted: () => this.notifyStatusChange(),\n onError: (error) => this.config.onError?.({\n domain: 'actions',\n message: error.message,\n code: 'ACTION_ERROR',\n timestamp: new Date().toISOString(),\n }),\n });\n }\n\n // ─── Capability Registration ───\n\n /**\n * Register a capability. Does NOT request permission — just makes it known.\n * Can be called before or after startSync().\n */\n register(cap: Capability): void {\n this.caps.set(cap.id, cap);\n this.domainStatus.set(cap.id, {\n domain: cap.id,\n lastSync: null,\n state: 'idle',\n });\n }\n\n /**\n * Register multiple capabilities at once.\n */\n registerAll(caps: Capability[]): void {\n for (const cap of caps) {\n this.register(cap);\n }\n }\n\n /**\n * Get a registered capability by ID.\n * Use this to read name/description/reason for your permission UI.\n */\n getCapability(id: string): Capability | undefined {\n return this.caps.get(id);\n }\n\n /**\n * Get all registered capabilities with their current status.\n */\n listCapabilities(): CapabilityStatus[] {\n return Array.from(this.caps.values()).map(cap => ({\n id: cap.id,\n name: cap.name,\n permission: cap.permissionState,\n sync: this.domainStatus.get(cap.id) || {\n domain: cap.id,\n lastSync: null,\n state: 'idle' as SyncState,\n },\n }));\n }\n\n // ─── Permissions (host app controls the flow) ───\n\n /**\n * Request permission for ONE capability.\n * Call after showing your own explanation screen.\n * If bridge is already running and granted, syncing starts automatically.\n */\n async requestPermission(capId: string): Promise<boolean> {\n const cap = this.caps.get(capId);\n if (!cap) throw new Error(`Capability \"${capId}\" not registered`);\n\n if (!cap.requiresPermission) {\n cap.permissionState = 'not_needed';\n return true;\n }\n\n const granted = await cap.requestPermission();\n cap.permissionState = granted ? 'granted' : 'denied';\n\n // Auto-start syncing if bridge is already running\n if (granted && this.running) {\n this.startCapabilitySync(cap);\n }\n\n this.notifyStatusChange();\n return granted;\n }\n\n /**\n * Check permission WITHOUT prompting.\n */\n async checkPermission(capId: string): Promise<PermissionState> {\n const cap = this.caps.get(capId);\n if (!cap) throw new Error(`Capability \"${capId}\" not registered`);\n if (!cap.requiresPermission) return 'not_needed';\n\n const granted = await cap.checkPermission();\n cap.permissionState = granted ? 'granted' : cap.permissionState;\n return cap.permissionState;\n }\n\n /**\n * Request ALL permissions sequentially (one at a time, not bombarded).\n */\n async requestAllPermissions(): Promise<Map<string, boolean>> {\n const results = new Map<string, boolean>();\n\n for (const [id, cap] of this.caps) {\n if (!cap.requiresPermission) {\n cap.permissionState = 'not_needed';\n results.set(id, true);\n continue;\n }\n const granted = await cap.requestPermission();\n cap.permissionState = granted ? 'granted' : 'denied';\n results.set(id, granted);\n }\n\n this.notifyStatusChange();\n return results;\n }\n\n /**\n * Get capabilities that still need permission.\n * Use this to drive a \"next permission\" onboarding flow.\n */\n getPendingPermissions(): Capability[] {\n return Array.from(this.caps.values()).filter(\n cap => cap.requiresPermission && cap.permissionState === 'not_requested'\n );\n }\n\n // ─── Sync Control ───\n\n /**\n * Start syncing all permitted capabilities + action queue poller.\n */\n async startSync(): Promise<void> {\n if (this.running) return;\n this.running = true;\n\n for (const [, cap] of this.caps) {\n const permitted =\n !cap.requiresPermission ||\n cap.permissionState === 'granted' ||\n cap.permissionState === 'not_needed';\n\n if (permitted) {\n this.startCapabilitySync(cap);\n } else {\n this.updateDomainStatus(cap.id, 'error', 'Permission not granted');\n }\n }\n\n this.queuePoller.start();\n\n // R7: the bridge OWNS its background-fetch lifecycle. Registering the OS task\n // here (from this bridge's own config) — instead of the host doing it\n // separately — is what lets stopSync() reliably UNREGISTER it: before R7 the\n // host registered it but stopBridge never unregistered, so the OS task kept\n // firing with the PREVIOUS user's config across logout/tenant-switch.\n // Best-effort: a host without expo-background-fetch just skips it. Needs a\n // tenant + apiKey (both optional on DeviceBridgeConfig) to hit the relay —\n // without them the background task has no identity to sync as, so skip it.\n if (this.config.tenant && this.config.apiKey) {\n registerBackgroundSync({\n relayUrl: this.config.relayUrl,\n deviceId: this.config.deviceId,\n tenant: this.config.tenant,\n actorId: this.config.actorId,\n apiKey: this.config.apiKey,\n }).catch((e: any) => console.warn('[adas/bridge] registerBackgroundSync failed:', e?.message || e));\n }\n\n this.notifyStatusChange();\n }\n\n /**\n * Stop all syncing.\n */\n stopSync(): void {\n this.running = false;\n\n for (const [id, timer] of this.syncTimers) {\n clearInterval(timer);\n this.updateDomainStatus(id, 'stopped');\n }\n this.syncTimers.clear();\n for (const unsub of this.subscriptions.values()) {\n try { unsub(); } catch { /* swallow — best effort cleanup */ }\n }\n this.subscriptions.clear();\n this.queuePoller.stop();\n // R7: unregister the OS background-fetch task so it can't keep firing with\n // this (now stale) user's config after logout/tenant-switch.\n unregisterBackgroundSync().catch((e: any) => console.warn('[adas/bridge] unregisterBackgroundSync failed:', e?.message || e));\n this.notifyStatusChange();\n }\n\n /**\n * Force immediate sync of all permitted capabilities.\n */\n async syncNow(): Promise<void> {\n const promises = Array.from(this.caps.values())\n .filter(c => c.permissionState === 'granted' || c.permissionState === 'not_needed')\n .map(c => this.syncCapability(c));\n await Promise.allSettled(promises);\n }\n\n /**\n * Force immediate sync of a single capability by id. Used by the host to\n * refresh fast-moving sources (battery) on app-foreground so the relay\n * gets a fresh reading the moment the user opens the app.\n */\n async syncCapabilityNow(capId: string): Promise<void> {\n const cap = this.caps.get(capId);\n if (!cap) return;\n const permitted =\n !cap.requiresPermission ||\n cap.permissionState === 'granted' ||\n cap.permissionState === 'not_needed';\n if (!permitted) return;\n await this.syncCapability(cap);\n }\n\n /**\n * Get current bridge status.\n */\n getStatus(): BridgeStatus {\n return {\n running: this.running,\n capabilities: this.listCapabilities(),\n lastFullSync: this.getLastFullSync(),\n pendingActions: this.relay.getOfflineQueueSize(),\n };\n }\n\n /**\n * Check if the relay is reachable.\n */\n async checkConnectivity(): Promise<boolean> {\n return this.relay.ping();\n }\n\n // ─── Internal ───\n\n private startCapabilitySync(cap: Capability): void {\n if (this.syncTimers.has(cap.id)) return;\n\n const interval = this.config.syncIntervals?.[cap.id] ?? cap.defaultInterval;\n this.syncCapability(cap);\n const timer = setInterval(() => this.syncCapability(cap), interval);\n this.syncTimers.set(cap.id, timer);\n\n // Wire any OS-event subscription (e.g. battery level/state) so we push\n // on real change rather than just on the polling cadence. iOS suspends\n // JS timers in the background, which is exactly when these events still\n // fire from native.\n if (cap.subscribe && !this.subscriptions.has(cap.id)) {\n try {\n const unsub = cap.subscribe(() => {\n if (this.running) this.syncCapability(cap);\n });\n this.subscriptions.set(cap.id, unsub);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n this.config.onError?.({\n domain: cap.id,\n message: `subscribe failed: ${message}`,\n code: 'SUBSCRIBE_ERROR',\n timestamp: new Date().toISOString(),\n });\n }\n }\n }\n\n private async syncCapability(cap: Capability): Promise<void> {\n if (!this.running) return;\n this.updateDomainStatus(cap.id, 'syncing');\n\n try {\n const data = await cap.collect();\n // Collectors that did the work and concluded \"nothing to push\" return\n // null (e.g. contacts hashing detects no changes since last cycle —\n // saves a 1MB+ payload for 6000 contacts). Stay 'idle', don't hit the\n // network, but don't treat it as an error either.\n if (data === null) {\n this.updateDomainStatus(cap.id, 'idle');\n return;\n }\n const result = await this.relay.pushDomain(cap.id, data);\n\n if (result.ok) {\n this.updateDomainStatus(cap.id, 'idle');\n } else {\n this.updateDomainStatus(cap.id, 'error', result.error);\n this.config.onError?.({\n domain: cap.id,\n message: result.error || 'Push failed',\n code: 'RELAY_ERROR',\n timestamp: new Date().toISOString(),\n });\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.updateDomainStatus(cap.id, 'error', message);\n this.config.onError?.({\n domain: cap.id,\n message,\n code: 'COLLECTOR_ERROR',\n timestamp: new Date().toISOString(),\n });\n }\n }\n\n private updateDomainStatus(id: string, state: SyncState, error?: string): void {\n const current = this.domainStatus.get(id);\n this.domainStatus.set(id, {\n domain: id,\n lastSync: state === 'idle' ? new Date().toISOString() : (current?.lastSync ?? null),\n state,\n error,\n itemCount: current?.itemCount,\n });\n }\n\n private getLastFullSync(): string | null {\n const syncs = Array.from(this.domainStatus.values())\n .map(d => d.lastSync)\n .filter((s): s is string => s !== null);\n if (syncs.length === 0) return null;\n return syncs.sort()[0];\n }\n\n private notifyStatusChange(): void {\n this.config.onStatusChange?.(this.getStatus());\n }\n}\n\n// ─── Background Sync Support ───\nexport {\n registerBackgroundSync,\n unregisterBackgroundSync,\n syncDomains,\n BACKGROUND_TASK_NAME,\n} from './background';\nexport type { BackgroundSyncConfig } from './background';\n\n// ─── Re-exports for advanced usage ───\nexport { RelayClient } from './relay-client';\nexport { QueuePoller } from './actions/queue-poller';\n\n// ─────────────────────────────────────────────────────────────────────\n// PLATFORM NATIVE CAPABILITIES\n// device-bridge owns every native dependency. plugin-sdk delegates to\n// these namespaces so RN plugins never import native modules directly.\n// Adding a new native capability = one file here + one plugin-sdk\n// delegation + one rebuild — THEN every future solution consumes it\n// as plain JS, no rebuild required.\n// ─────────────────────────────────────────────────────────────────────\n\n// Biometrics — Face ID / Touch ID / fingerprint (expo-local-authentication)\nexport * as biometrics from './biometrics';\nexport type { BiometricType, BiometricCapabilities, AuthenticateOptions } from './biometrics';\n\n// Sharing — native share sheet (expo-sharing)\nexport * as sharing from './sharing';\nexport type { ShareOptions } from './sharing';\n\n// Scanner — QR / barcode camera (expo-camera)\nexport * as scanner from './scanner';\nexport type { ScanResult } from './scanner';\n\n// Location — GPS fixes for plugin tools (expo-location, safe in Expo Go)\nexport * as location from './collectors/location';\nexport type { Position } from './collectors/location';\n\n// NOTE: cookies (@react-native-cookies/cookies) and nfc (react-native-nfc-manager)\n// require native modules NOT included in Expo Go. They are imported lazily\n// via require() in useNativeCapabilities.ts. Do NOT add eager exports here\n// or the app will crash in Expo Go.\n// To use: require('../../packages/device-bridge/src/cookies')\n// To use: require('../../packages/device-bridge/src/nfc')\n"],"mappings":"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","names":["execute","execute","execute"]}
|