{ "name": "offgrid-mobile", "version": "0.0.119", "private": true, "scripts": { "android": "react-native run-android --mode=debug --appId ai.offgridmobile.dev", "ios": "react-native run-ios", "ios:device": "./scripts/ios-device.sh", "lint": "eslint . && npm run lint:android && npm run lint:ios", "lint:android": "cd android && ./gradlew :app:lintDebug", "lint:ios": "if command -v swiftlint >/dev/null; then swiftlint lint --quiet; else echo 'SwiftLint not installed, skipping iOS lint'; fi", "prepare": "husky && (cd pro && git config core.hooksPath .githooks 2>/dev/null || true)", "sonar": "./scripts/run-sonar.sh", "start": "react-native start", "test": "jest --coverage --forceExit --detectOpenHandles && npm run test:android && npm run test:ios", "test:e2e:ios-sync-adapter": "node --test scripts/physical-sync/__tests__/iosKnowledgeSyncDeviceAdapter.test.mjs", "sync:ios-adapter": "node --experimental-strip-types --no-warnings scripts/physical-sync/iosKnowledgeSyncAdapter.mjs", "test:android": "cd android && ./gradlew :app:testDebugUnitTest", "test:ios": "bash scripts/test-ios.sh", "postinstall": "patch-package", "depcruise": "depcruise src --config .dependency-cruiser.js", "knip": "knip", "e2e:wda": "node scripts/ios/launch-wda.mjs", "e2e:device": "node --test __tests__/device/*.e2e.mjs", "e2e:coverage": "node scripts/e2e/collect-coverage.mjs", "e2e:build:ios": "E2E_COVERAGE=1 npx react-native run-ios --device", "e2e:build:android": "E2E_COVERAGE=1 npx react-native run-android --mode=debug --appId ai.offgridmobile.dev", "test:device-parser": "node --test scripts/android/__tests__/adbClient.test.mjs scripts/e2e/__tests__/deviceJourney.test.mjs", "e2e:mesh": "node --test __tests__/device/meshPairing.e2e.mjs", "e2e:image-sync": "node scripts/e2e/generated-image-sync.mjs", "e2e:thinking-sync": "node scripts/e2e/attended-thinking-sync.mjs", "e2e:journeys": "node scripts/e2e/run-journeys.mjs", "e2e:engine-smoke": "node scripts/e2e/engine-smoke-journey.mjs", "e2e:mic-permission": "node scripts/e2e/mic-permission-journey.mjs", "e2e:download-a11y": "node scripts/e2e/download-a11y-journey.mjs", "e2e:branch-fixes": "node scripts/e2e/branch-fixes-journey.mjs", "e2e:crash-smoke": "node scripts/e2e/crash-smoke-journey.mjs" }, "dependencies": { "@dr.pogodin/react-native-fs": "^2.38.1", "@kesha-antonov/react-native-background-downloader": "^4.5.6", "@modelcontextprotocol/sdk": "^1.29.0", "@offgrid/models": "file:../shared/packages/models", "@offgrid/rag": "file:../shared/packages/rag", "@offgrid/speech": "file:../shared/packages/speech", "@offgrid/sync": "file:../shared/packages/sync", "@offgrid/ui": "file:../shared/packages/ui", "@op-engineering/op-sqlite": "^15.2.5", "@react-native-async-storage/async-storage": "^2.2.0", "@react-native-community/slider": "^5.1.2", "@react-native-documents/picker": "^12.0.1", "@react-native-documents/viewer": "^3.0.1", "@react-native-voice/voice": "^3.2.4", "@react-navigation/bottom-tabs": "^7.10.1", "@react-navigation/native": "^7.1.28", "@react-navigation/native-stack": "^7.11.0", "@ronradtke/react-native-markdown-display": "^8.1.0", "@testing-library/react-native": "^13.3.3", "@types/react-native-vector-icons": "^6.4.18", "buffer": "^6.0.3", "js-sha256": "^0.11.0", "js-sha512": "^0.9.0", "llama.rn": "0.13.0-rc.7", "node-html-parser": "^7.1.0", "patch-package": "^8.0.1", "posthog-react-native": "^4.81.10", "react": "19.2.0", "react-compiler-runtime": "^1.0.0", "react-native": "0.83.1", "react-native-audio-api": "^0.11.7", "react-native-calendar-events": "^2.2.0", "react-native-device-info": "^15.0.1", "react-native-edge-to-edge": "^1.8.1", "react-native-executorch": "^0.9.3", "react-native-executorch-bare-resource-fetcher": "^0.9.1", "react-native-gesture-handler": "^2.30.0", "react-native-get-random-values": "^1.11.0", "react-native-haptic-feedback": "^2.3.3", "react-native-image-picker": "^8.2.1", "react-native-inappbrowser-reborn": "^3.7.1", "react-native-keyboard-controller": "^1.21.12", "react-native-keychain": "^10.0.0", "react-native-qrcode-svg": "^6.3.21", "react-native-reanimated": "~4.3.4", "react-native-safe-area-context": "^5.6.2", "react-native-screens": "^4.20.0", "react-native-svg": "^15.15.3", "react-native-tcp-socket": "^6.4.1", "react-native-url-polyfill": "^3.0.0", "react-native-vector-icons": "^10.3.0", "react-native-video": "^6.19.3", "react-native-video-player": "0.16.3", "react-native-vision-camera": "^4.7.3", "react-native-worklets": "^0.8.3", "react-native-zeroconf": "^0.14.0", "react-native-zip-archive": "7.1.0", "text-encoding-polyfill": "^0.6.7", "tweetnacl": "^1.0.3", "tweetnacl-util": "^0.15.1", "whisper.rn": "^0.5.5", "zustand": "^5.0.10" }, "devDependencies": { "@babel/core": "^7.25.2", "@babel/preset-env": "^7.25.3", "@babel/runtime": "^7.25.0", "@jest/globals": "^30.4.1", "@react-native-community/cli": "20.0.0", "@react-native-community/cli-platform-android": "20.0.0", "@react-native-community/cli-platform-ios": "20.0.0", "@react-native/babel-preset": "0.83.1", "@react-native/eslint-config": "0.83.1", "@react-native/metro-config": "0.83.1", "@react-native/typescript-config": "0.83.1", "@types/jest": "^29.5.13", "@types/node": "^25.3.5", "@types/react": "^19.2.0", "@types/react-test-renderer": "^19.1.0", "babel-plugin-istanbul": "^8.0.0", "babel-plugin-react-compiler": "^1.0.0", "dependency-cruiser": "^18.0.0", "eslint": "^8.19.0", "eslint-plugin-react-compiler": "^19.1.0-rc.2", "eslint-plugin-sonarjs": "^1.0.4", "husky": "^9.1.7", "jest": "^29.6.3", "knip": "^6.25.0", "memfs": "^4.64.0", "prettier": "2.8.8", "react-test-renderer": "19.2.0", "semver": "^6.3.1", "sonar-scanner": "^3.1.0", "typescript": "^5.8.3", "yaml": "2.9.1" }, "lint-staged": { "*.{ts,tsx,js,jsx}": "eslint --max-warnings=999" }, "engines": { "node": ">=20" }, "op-sqlite": { "fts5": true }, "overrides": { "react": "19.2.0", "linkify-it": "^5.0.2", "@expo/plist": { "xmldom": "npm:@xmldom/xmldom@0.8.15" } } }