sootsim 0.1.293 → 0.1.294

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.
Files changed (165) hide show
  1. package/detox/expectations.ts +4 -3
  2. package/detox/index.ts +2 -4
  3. package/dist-cli/bin.js +7 -5
  4. package/dist-cli/chunks/{agent-YWI2NWL7.js → agent-GDFF6G7N.js} +4 -2
  5. package/dist-cli/chunks/{agent-wrapper-IYJ7UZOA.js → agent-wrapper-ZUKQUOD2.js} +4 -2
  6. package/dist-cli/chunks/{app-fonts-FQFUC4LR.js → app-fonts-IMYBO6AQ.js} +4 -2
  7. package/dist-cli/chunks/{assert-XUCELWAC.js → assert-GXOGZUKO.js} +4 -2
  8. package/dist-cli/chunks/{auth-4DQTV3OW.js → auth-P7FAKLHQ.js} +4 -2
  9. package/dist-cli/chunks/beta-RXT5RU3A.js +4 -0
  10. package/dist-cli/chunks/{camera-RYOHBVZA.js → camera-RNVAC4IO.js} +4 -2
  11. package/dist-cli/chunks/{chunk-2XYCSFGN.js → chunk-24BJFJFB.js} +26 -24
  12. package/dist-cli/chunks/{chunk-WVMYRKSS.js → chunk-2M7OZ6Y4.js} +4 -2
  13. package/dist-cli/chunks/chunk-37ZXWXM3.js +4 -0
  14. package/dist-cli/chunks/{chunk-UOHGYYSO.js → chunk-3F2GAJ4Z.js} +3 -1
  15. package/dist-cli/chunks/{chunk-KC5SCOGS.js → chunk-4Z4URZOG.js} +4 -2
  16. package/dist-cli/chunks/{chunk-LOQLZFRK.js → chunk-5S3GPTX7.js} +4 -2
  17. package/dist-cli/chunks/chunk-6YN3IAWJ.js +4 -0
  18. package/dist-cli/chunks/{chunk-YRFWATLA.js → chunk-7HVMAGDK.js} +4 -2
  19. package/dist-cli/chunks/{chunk-4B4VFT73.js → chunk-7Q77LTPT.js} +7 -5
  20. package/dist-cli/chunks/{chunk-RKXHQ2Q3.js → chunk-AFLGWOX3.js} +18 -16
  21. package/dist-cli/chunks/{chunk-LA5DIO33.js → chunk-AMKQUZA2.js} +3 -1
  22. package/dist-cli/chunks/{chunk-TJS5IMOH.js → chunk-AO65WEF7.js} +3 -1
  23. package/dist-cli/chunks/{chunk-BQT5YDTV.js → chunk-BBVBMGTT.js} +5 -3
  24. package/dist-cli/chunks/{chunk-WPPMUUML.js → chunk-BXO2PTNM.js} +4 -2
  25. package/dist-cli/chunks/{chunk-2VKTOZQ5.js → chunk-CTMPC5DN.js} +4 -2
  26. package/dist-cli/chunks/{chunk-RV67J726.js → chunk-D2R7PDN5.js} +3 -1
  27. package/dist-cli/chunks/{chunk-RMLJXP7T.js → chunk-DI55E6CS.js} +4 -2
  28. package/dist-cli/chunks/chunk-DUHBRW7J.js +4 -0
  29. package/dist-cli/chunks/chunk-EXTV6NWM.js +74 -0
  30. package/dist-cli/chunks/{chunk-6IFJLHDA.js → chunk-FNCSUHUR.js} +3 -1
  31. package/dist-cli/chunks/{chunk-DE4ZA3NL.js → chunk-FSRRJGYC.js} +4 -2
  32. package/dist-cli/chunks/{chunk-UPKYK52K.js → chunk-I233T2T4.js} +4 -2
  33. package/dist-cli/chunks/{chunk-E5WYXRGV.js → chunk-ISJ4ACWL.js} +28 -26
  34. package/dist-cli/chunks/{chunk-AFRXWKTA.js → chunk-JFWEDISV.js} +3 -1
  35. package/dist-cli/chunks/chunk-JGGXQHXH.js +10 -0
  36. package/dist-cli/chunks/chunk-JUOQ4ZPA.js +7 -0
  37. package/dist-cli/chunks/{chunk-2M57EAWS.js → chunk-K53YCAQM.js} +3 -1
  38. package/dist-cli/chunks/{chunk-7B6RGFTM.js → chunk-KWIURH7N.js} +4 -2
  39. package/dist-cli/chunks/{chunk-VO74GDXL.js → chunk-N4MT5KEB.js} +5 -3
  40. package/dist-cli/chunks/{chunk-VZ44FQDG.js → chunk-O6I5ZGMY.js} +3 -1
  41. package/dist-cli/chunks/chunk-OKSGM6IG.js +4 -0
  42. package/dist-cli/chunks/chunk-OYYQQBKP.js +3 -0
  43. package/dist-cli/chunks/{chunk-NCCMRFXU.js → chunk-PSOUSJSZ.js} +3 -1
  44. package/dist-cli/chunks/{chunk-J6P2UPXH.js → chunk-PZTKQG6H.js} +4 -2
  45. package/dist-cli/chunks/{chunk-B7TX4WFB.js → chunk-RWUNC66S.js} +4 -2
  46. package/dist-cli/chunks/{chunk-547W23BB.js → chunk-SLMUW2WU.js} +4 -2
  47. package/dist-cli/chunks/{chunk-WI36YJ23.js → chunk-SPQKJDIK.js} +3 -1
  48. package/dist-cli/chunks/{chunk-PCAPHXN3.js → chunk-V2MYTL4C.js} +4 -2
  49. package/dist-cli/chunks/{chunk-JOPKZVOW.js → chunk-VVVORIQI.js} +3 -1
  50. package/dist-cli/chunks/chunk-VXGCZUX4.js +5 -0
  51. package/dist-cli/chunks/chunk-W44PDEQH.js +4 -0
  52. package/dist-cli/chunks/{chunk-WOWLO4LL.js → chunk-WQL3BLFD.js} +3 -1
  53. package/dist-cli/chunks/{chunk-U3564F2Y.js → chunk-WYRLRNIP.js} +4 -2
  54. package/dist-cli/chunks/{chunk-WP3TFHFL.js → chunk-XYFP466E.js} +4 -2
  55. package/dist-cli/chunks/chunk-ZFMJFX27.js +4 -0
  56. package/dist-cli/chunks/{chunk-67CIS55C.js → chunk-ZUX5PIGI.js} +3 -1
  57. package/dist-cli/chunks/{cleanup-BLFDJSFS.js → cleanup-74SKOD2P.js} +4 -2
  58. package/dist-cli/chunks/cli-version-2JGMYL4O.js +4 -0
  59. package/dist-cli/chunks/{compat-Q3WCSTB7.js → compat-ME6HXEEU.js} +5 -3
  60. package/dist-cli/chunks/{config-NHNMRRNB.js → config-PM67EWT3.js} +4 -2
  61. package/dist-cli/chunks/control-HV7GZXAH.js +4 -0
  62. package/dist-cli/chunks/daemon-LKRHF5OK.js +4 -0
  63. package/dist-cli/chunks/{debug-PGRMZFXA.js → debug-XUGWZLIW.js} +5 -3
  64. package/dist-cli/chunks/{desktop-NVTQ37LH.js → desktop-IO5HPX5Z.js} +5 -3
  65. package/dist-cli/chunks/{detox-W3JDXS76.js → detox-E42OEJJZ.js} +4 -2
  66. package/dist-cli/chunks/{device-KQYN3EVK.js → device-XA67L2EB.js} +4 -2
  67. package/dist-cli/chunks/{diagnose-CPUKSGNO.js → diagnose-36FD6ECF.js} +4 -2
  68. package/dist-cli/chunks/disk-cleanup-DDCFGFWK.js +4 -0
  69. package/dist-cli/chunks/drivers-C2SH3DWS.js +4 -0
  70. package/dist-cli/chunks/{film-VZGAZ2YY.js → film-XARTGFIZ.js} +11 -24
  71. package/dist-cli/chunks/flow-E64G5LF3.js +4 -0
  72. package/dist-cli/chunks/help-4ZSRG4F4.js +4 -0
  73. package/dist-cli/chunks/{hidden-runtime-alias-KWHABCNZ.js → hidden-runtime-alias-T4ZALBE2.js} +4 -2
  74. package/dist-cli/chunks/{home-paths-O4CGYVHF.js → home-paths-5L7N2FLS.js} +4 -2
  75. package/dist-cli/chunks/inspect-U2SV25ER.js +4 -0
  76. package/dist-cli/chunks/install-desktop-LTGVT7ID.js +4 -0
  77. package/dist-cli/chunks/{login-KPN4Z26Q.js → login-GF6WVVER.js} +6 -4
  78. package/dist-cli/chunks/logout-6F6UKUNI.js +4 -0
  79. package/dist-cli/chunks/{maestro-PYA4AHTS.js → maestro-FMPKHEMX.js} +13 -11
  80. package/dist-cli/chunks/{maestro-generate-KCMYWPWL.js → maestro-generate-QGPGNXI6.js} +5 -3
  81. package/dist-cli/chunks/{mode-AEB7G2SJ.js → mode-JSNMAHDZ.js} +4 -2
  82. package/dist-cli/chunks/optional-demo-registry-K4VERLJV.js +4 -0
  83. package/dist-cli/chunks/{perf-YLXGZI3E.js → perf-PO7ARUTG.js} +4 -2
  84. package/dist-cli/chunks/{permissions-7VMVZOUV.js → permissions-XI2QUAEZ.js} +4 -2
  85. package/dist-cli/chunks/{record-AVQO45PE.js → record-4CJCJAFD.js} +5 -3
  86. package/dist-cli/chunks/runtime-SN2RWDES.js +4 -0
  87. package/dist-cli/chunks/{screenshot-command-LACQLA4N.js → screenshot-command-NDVULWMZ.js} +5 -3
  88. package/dist-cli/chunks/{screenshots-capture-PROOBSGB.js → screenshots-capture-Q7UTXF3V.js} +4 -2
  89. package/dist-cli/chunks/{serve-FJN2FRGW.js → serve-UEUIBHCK.js} +4 -2
  90. package/dist-cli/chunks/{setup-IVV4NRYQ.js → setup-ZEEWYK4B.js} +5 -3
  91. package/dist-cli/chunks/{skills-WYR3PJOH.js → skills-NFG6VAO5.js} +4 -2
  92. package/dist-cli/chunks/{storage-GM7K4MGM.js → storage-POWCOUCQ.js} +4 -2
  93. package/dist-cli/chunks/store-BJK7V7FL.js +4 -0
  94. package/dist-cli/chunks/telemetry-EJP5EW7K.js +4 -0
  95. package/dist-cli/chunks/{timeline-R5UL3N4T.js → timeline-MNHZCVAL.js} +4 -2
  96. package/dist-cli/chunks/{upgrade-RWHSFZRX.js → upgrade-X57SIG7L.js} +4 -2
  97. package/dist-cli/chunks/upload-JABM3ITZ.js +4 -0
  98. package/dist-cli/chunks/{version-7K6TVQOW.js → version-V4IKIDX7.js} +4 -2
  99. package/dist-cli/chunks/web-F5CLF34I.js +4 -0
  100. package/dist-cli/chunks/{what-happened-K24TSJZX.js → what-happened-H74HHGRK.js} +4 -2
  101. package/dist-lib/agent-daemon-client.cjs +1 -1
  102. package/dist-lib/agent-events.cjs +1 -1
  103. package/dist-lib/agent-identity.cjs +3 -3
  104. package/dist-lib/agent-sessions.cjs +1 -1
  105. package/dist-lib/attached-projects.cjs +1 -1
  106. package/dist-lib/auth/shared-session.cjs +1 -1
  107. package/dist-lib/backend-origin.cjs +1 -1
  108. package/dist-lib/beta.cjs +1 -1
  109. package/dist-lib/beta.mjs +1 -1
  110. package/dist-lib/bridge-constants.cjs +1 -1
  111. package/dist-lib/cli-constants.cjs +1 -1
  112. package/dist-lib/config.cjs +1 -1
  113. package/dist-lib/detox/index.cjs +5 -4
  114. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  115. package/dist-lib/home-paths.cjs +1 -1
  116. package/dist-lib/host/bridge-host.cjs +3 -3
  117. package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
  118. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  119. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  120. package/dist-lib/host/websocket-proxy.cjs +1 -1
  121. package/dist-lib/index.cjs +1 -1
  122. package/dist-lib/jump-to-source-babel.cjs +1 -1
  123. package/dist-lib/menu.cjs +45 -4
  124. package/dist-lib/menu.mjs +42 -4
  125. package/dist-lib/metro.cjs +1 -1
  126. package/dist-lib/profiles.cjs +1 -1
  127. package/dist-lib/render-mode.cjs +1 -1
  128. package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
  129. package/dist-lib/sdk.cjs +5 -2
  130. package/dist-lib/sdk.mjs +4 -2
  131. package/dist-lib/skills.cjs +325 -182
  132. package/dist-lib/vite.cjs +1 -1
  133. package/package.json +6 -1
  134. package/scripts/postinstall.cjs +11 -2
  135. package/src/agent-identity.ts +2 -2
  136. package/src/menu.ts +53 -4
  137. package/src/vite-plugin.ts +102 -2
  138. package/dist-cli/chunks/beta-CFDAW6UN.js +0 -2
  139. package/dist-cli/chunks/chunk-3UX6AY2B.js +0 -2
  140. package/dist-cli/chunks/chunk-6VVLDYPV.js +0 -8
  141. package/dist-cli/chunks/chunk-7H34H74K.js +0 -72
  142. package/dist-cli/chunks/chunk-7H5G4HUK.js +0 -2
  143. package/dist-cli/chunks/chunk-ACSTEPSD.js +0 -2
  144. package/dist-cli/chunks/chunk-HKMWUN7F.js +0 -2
  145. package/dist-cli/chunks/chunk-K5JEUI5G.js +0 -5
  146. package/dist-cli/chunks/chunk-MOU2WLO4.js +0 -2
  147. package/dist-cli/chunks/chunk-QXDXUDJD.js +0 -1
  148. package/dist-cli/chunks/chunk-USJTVC7T.js +0 -2
  149. package/dist-cli/chunks/chunk-YNG4C3ZS.js +0 -2
  150. package/dist-cli/chunks/cli-version-TQHZOK4L.js +0 -2
  151. package/dist-cli/chunks/control-I7YBDRJT.js +0 -2
  152. package/dist-cli/chunks/daemon-4R3SZLZY.js +0 -2
  153. package/dist-cli/chunks/disk-cleanup-2COWZWBC.js +0 -2
  154. package/dist-cli/chunks/drivers-RRZM6E72.js +0 -2
  155. package/dist-cli/chunks/flow-VH6DFDQ4.js +0 -2
  156. package/dist-cli/chunks/help-3HQ2RINO.js +0 -2
  157. package/dist-cli/chunks/inspect-PKMJGXDH.js +0 -2
  158. package/dist-cli/chunks/install-desktop-K5TP3ZHJ.js +0 -2
  159. package/dist-cli/chunks/logout-E3UCJAMC.js +0 -2
  160. package/dist-cli/chunks/optional-demo-registry-AIWOBAAA.js +0 -2
  161. package/dist-cli/chunks/runtime-HOGETVVD.js +0 -2
  162. package/dist-cli/chunks/store-YLVHPKG7.js +0 -2
  163. package/dist-cli/chunks/telemetry-MQKB6PFX.js +0 -2
  164. package/dist-cli/chunks/upload-RBH4XGJ2.js +0 -2
  165. package/dist-cli/chunks/web-46ZPQCAL.js +0 -2
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.293 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.294 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -474,10 +474,10 @@ var init_registry = __esm({
474
474
  },
475
475
  {
476
476
  range: ">=4.0.0",
477
- coverage: 0.95,
478
- note: "core animations, gestures, scroll, layout transitions, keyboard, sensors, and reduced motion",
479
- working: "useSharedValue, useAnimatedStyle/Props/Reaction, useDerivedValue, useAnimatedScrollHandler, useScrollViewOffset, useFrameCallback, useAnimatedRef, useAnimatedKeyboard, useAnimatedSensor, useReducedMotion, entering/exiting/layout transitions, withTiming/Spring/Decay/Delay/Sequence/Repeat/Clamp, interpolate, interpolateColor, runOnJS/UI, measure, scrollTo, Easing, createAnimatedComponent, Animated.View/Text/Image/ScrollView/FlatList",
480
- missing: "Reanimated 4 native CSS keyframes/transitions, getViewProp, and direct setViewStyle remain incomplete"
477
+ coverage: 0.96,
478
+ note: "core animations, gestures, scroll, layout transitions, keyboard, sensors, reduced motion, and native view property reads",
479
+ working: "useSharedValue, useAnimatedStyle/Props/Reaction, useDerivedValue, useAnimatedScrollHandler, useScrollViewOffset, useFrameCallback, useAnimatedRef, useAnimatedKeyboard, useAnimatedSensor, useReducedMotion, entering/exiting/layout transitions, withTiming/Spring/Decay/Delay/Sequence/Repeat/Clamp, interpolate, interpolateColor, runOnJS/UI, measure, scrollTo, getViewProp (layout, opacity, zIndex, backgroundColor, boxShadow), Easing, createAnimatedComponent, Animated.View/Text/Image/ScrollView/FlatList",
480
+ missing: "Reanimated 4 native CSS keyframes/transitions and direct setViewStyle remain incomplete"
481
481
  }
482
482
  ]
483
483
  },
@@ -491,7 +491,7 @@ var init_registry = __esm({
491
491
  coverage: 0.9,
492
492
  note: "tap, pan, pinch, rotation, fling, long press, race, manual, simultaneous",
493
493
  working: "GestureDetector, Gesture.Tap/Pan/Pinch/Rotation/Fling/LongPress/Manual/Race/Simultaneous/Exclusive/Hover, simultaneousWithExternalGesture/requireExternalGestureToFail/blocksExternalGesture, ScrollView/FlatList, Switch/RefreshControl, Pressable/Text, Touchables, BaseButton/RawButton/RectButton/BorderlessButton/PureNativeButton, Swipeable, ReanimatedSwipeable, GestureHandlerRootView, createNativeWrapper, gestureHandlerRootHOC, PointerType/MouseButton/HoverEffect exports, velocity tracking, activeOffsets, multi-tap",
494
- missing: "DrawerLayout (passthrough noop), NativeViewGestureHandler still lacks native-scroll coupling and handlerTag semantics, ForceTouch semantics are placeholder-only"
494
+ missing: "DrawerLayout is a passthrough noop; ForceTouch semantics are placeholder-only"
495
495
  }
496
496
  ]
497
497
  },
@@ -505,13 +505,14 @@ var init_registry = __esm({
505
505
  coverage: 0.9,
506
506
  note: "screen container, stack, header config, search bar, navigation props",
507
507
  working: "Screen, ScreenContainer, ScreenStack, enableFreeze/freezeEnabled with delayed React freeze, Android modal/pageSheet push fallback, Android statusBarHidden/statusBarStyle/navigationBarHidden traits, push/pop slide, zoom/fade/fade_from_bottom transitions, edge swipe-back, parallax behind-screen, large title collapse, header (back button, inline/large title, custom left/center/right/search bar subviews, native header bar buttons/menus/badges, crossfade), formSheet custom initial detents/corner radius/grabber/undimmed range and stacked sheets, useHeaderHeight, useTransitionProgress, FullWindowOverlay, SearchBar, Tabs.Host/Screen, lifecycle callbacks (onAppear/onDisappear/onWillAppear/onWillDisappear), onDismissed",
508
- missing: "statusBarColor/navigationBarColor/navigationBarTranslucent ignored, replaceAnimation differentiation, interactive drag between formSheet detents, integrated search bar placements"
508
+ missing: "replaceAnimation differentiation, interactive drag between formSheet detents, integrated search bar placements"
509
509
  }
510
510
  ]
511
511
  },
512
512
  "react-native-safe-area-context": {
513
513
  category: "Essentials",
514
514
  stubType: "native",
515
+ proofCoverage: 0.7,
515
516
  versions: [
516
517
  {
517
518
  range: ">=4.0.0",
@@ -530,8 +531,8 @@ var init_registry = __esm({
530
531
  range: ">=13.0.0",
531
532
  coverage: 0.85,
532
533
  note: "full CanvasKit rendering for shapes/text/XML; SVG filter elements skipped",
533
- working: "Svg, Path, Circle, Rect, Line, Ellipse, Polygon, Polyline, G, Text, TSpan, Defs, ClipPath, LinearGradient, RadialGradient, Stop, Mask, Symbol, Use, Pattern, ForeignObject, Image, Marker, SvgXml, SvgUri, SvgFromXml, SvgCss, transforms, fill/stroke/opacity/dasharray, currentColor, viewBox scaling",
534
- missing: "SVG filter primitives (Filter, FeBlend, FeColorMatrix, FeGaussianBlur, FeComposite, etc) \u2014 all fe* skipped; ClipPath/Mask/Use/Pattern/Symbol/Image listed as skipped in engine"
534
+ working: "Svg, Path, Circle, Rect, Line, Ellipse, Polygon, Polyline, G, Text, TSpan, Defs, LinearGradient, RadialGradient, Stop, SvgXml, SvgUri, SvgFromXml, SvgCss, transforms, fill/stroke/opacity/dasharray, currentColor, viewBox scaling",
535
+ missing: "SVG filter primitives (Filter, FeBlend, FeColorMatrix, FeGaussianBlur, FeComposite, etc) are skipped; ClipPath, Mask, Use, Pattern, Symbol, Marker, ForeignObject, TextPath, and Image are also skipped by the renderer"
535
536
  }
536
537
  ]
537
538
  },
@@ -549,13 +550,14 @@ var init_registry = __esm({
549
550
  "react-native-webview": {
550
551
  category: "Essentials",
551
552
  stubType: "native",
553
+ proofCoverage: 0.3,
552
554
  versions: [
553
555
  {
554
556
  range: ">=11.0.0",
555
- coverage: 0.35,
556
- note: "DOM iframe path only; sootsim canvas path is a native-view bridge placeholder",
557
- working: "source.uri/source.html, injectedJavaScriptBeforeContentLoaded, injectedJavaScript, ReactNativeWebView.postMessage bridge, onMessage, onLoad/Start/End, onNavigationStateChange, onError, ref.goBack/goForward/reload/stopLoading/injectJavaScript/postMessage, renderLoading, renderError, javaScriptEnabled sandbox in DOM/web contexts",
558
- missing: "actual web content rendering inside the canvas worker, onShouldStartLoadWithRequest, allowsBackForwardNavigationGestures, userAgent, dataDetectorTypes, cacheEnabled, incognito, scalesPageToFit, canGoBack/Forward in iframe-mode (always false), originWhitelist enforcement"
557
+ coverage: 0.5,
558
+ note: "native-seam only: the published package runs unchanged and routes RNCWebView through the tenant-to-shell hosted iframe surface. the iframe keeps loading while parked behind a canvas placeholder and becomes interactive when promoted live.",
559
+ working: "source.uri/source.html, HTML and cooperating-page injectedJavaScriptBeforeContentLoaded/injectedJavaScript, strict ReactNativeWebView.postMessage bridge envelope, onMessage synthetic event with navigation fields, onLoad/Start/End, onNavigationStateChange, ref.reload/stopLoading/injectJavaScript/postMessage, renderLoading, javaScriptEnabled sandbox, layout, inherited clipping and visibility, parked/live presentation",
560
+ missing: "iframe pixels in canvas screenshots, script injection and ReactNativeWebView bootstrap for arbitrary cross-origin pages, cross-origin ref.goBack/goForward and truthful canGoBack/canGoForward values, failed HTTP/refused navigation callbacks (onError/onHttpError and renderError), onShouldStartLoadWithRequest, allowsBackForwardNavigationGestures, userAgent, dataDetectorTypes, cacheEnabled, incognito, scalesPageToFit, originWhitelist enforcement"
559
561
  }
560
562
  ]
561
563
  },
@@ -564,24 +566,46 @@ var init_registry = __esm({
564
566
  stubType: "native",
565
567
  versions: [
566
568
  {
567
- range: ">=55.0.0",
569
+ range: ">=55.0.0 <56.0.0",
570
+ coverage: 0.3,
571
+ note: "native-seam only: the published Expo wrapper resolves ExpoDomWebViewModule to the shared hosted webview implementation.",
572
+ working: "DomWebView/WebView exports, source.uri rendering, onMessage, ref.injectJavaScript and ref.scrollTo for pages that cooperate with the shell message bridge, layout and parked/live presentation",
573
+ missing: "reload and injectedJavaScriptObject, Expo modules bridge, arbitrary cross-origin script injection and scrolling, exact native scroll physics and native-only media/keyboard props, iframe pixels in canvas screenshots"
574
+ },
575
+ {
576
+ range: ">=56.0.0 <58.0.0",
568
577
  coverage: 0.35,
569
- note: "thin re-export of react-native-webview \u2014 Expo DOM is conceptually the same surface (WebView component + postMessage/injectJavaScript) and so inherits its compat: real iframe-backed DOM rendering with the message bridge, navigation callbacks, and ref imperative API. Same caveats as react-native-webview (canvas-worker placeholder for the native-view path, no onShouldStartLoadWithRequest).",
570
- working: "DomWebView/WebView exports, source.uri/source.html, ReactNativeWebView.postMessage bridge, onMessage, onLoad/Start/End, onNavigationStateChange, onError, ref.goBack/goForward/reload/stopLoading/injectJavaScript/postMessage, renderLoading/renderError, javaScriptEnabled in DOM contexts",
571
- missing: "native DOM component registry beyond what react-native-webview already provides, exact scrollTo semantics, native-view canvas rendering, onShouldStartLoadWithRequest, allowsBackForwardNavigationGestures, originWhitelist enforcement"
578
+ note: "native-seam only: the published Expo wrapper resolves ExpoDomWebViewModule to the shared hosted webview implementation.",
579
+ working: "DomWebView/WebView exports, source.uri rendering, onMessage data/url/title, ref.reload/injectJavaScript/scrollTo, and reload-on-update behavior for injectedJavaScriptObject/injectedJavaScript on pages that cooperate with the shell message bridge, layout and parked/live presentation",
580
+ missing: "document-start timing for injectedJavaScriptObject on URI pages, Expo modules bridge, arbitrary cross-origin script injection and scrolling, exact native scroll physics and native-only media/keyboard props, iframe pixels in canvas screenshots"
572
581
  }
573
582
  ]
574
583
  },
575
584
  "@shopify/flash-list": {
576
585
  category: "Lists & Sheets",
586
+ // v2.0.0 dropped every native view: the published tarball has no ios/,
587
+ // android/, podspec, or codegenConfig, and its JS calls no native seam.
588
+ // v1 (through 2.0.0-rc.12) shipped the AutoLayoutView + CellContainer
589
+ // Swift/Kotlin views. `native` keeps the v1 range honest on the compat
590
+ // page; shipsNativeCode is false because a new install resolves to v2 and
591
+ // brings no native code into the app. neither major is stubbed — the real
592
+ // package runs from the bundle.
577
593
  stubType: "native",
594
+ shipsNativeCode: false,
578
595
  versions: [
579
596
  {
580
- range: ">=1.0.0",
581
- coverage: 0.8,
582
- note: "FlashList and MasonryFlashList rendered as engine FlatList \u2014 core rendering works",
583
- working: "FlashList (renders as FlatList with full props passthrough), MasonryFlashList (alias to same), ref forwarding",
584
- missing: "native recycling/virtualization engine, estimatedItemSize perf tuning, overrideItemLayout, drawDistance, horizontal masonry layout, onBlankArea callback"
597
+ range: ">=1.0.0 <2.0.0",
598
+ coverage: 0.7,
599
+ note: "real upstream v1 JS (recyclerlistview-backed) runs from the bundle; its two native views resolve as plain engine views, so recycling still works but native layout correction does not",
600
+ working: "FlashList, MasonryFlashList, ref methods, recyclerlistview virtualization and cell recycling (all pure JS), CellContainer renders as a view",
601
+ missing: "the AutoLayoutView native pass \u2014 post-layout gap correction between recycled cells and the onBlankArea callback it feeds; overrideItemLayout precision on iOS-specific paths"
602
+ },
603
+ {
604
+ range: ">=2.0.0",
605
+ coverage: 0.95,
606
+ note: "real upstream package \u2014 v2 is pure JS with no native views, so nothing is intercepted and the full recycling engine runs on the engine ScrollView",
607
+ working: "the entire published API runs unmodified: FlashList with its real recycling/virtualization engine, AnimatedFlashList, FlashListRef imperative methods, masonry prop, useLayoutState, useRecyclingState, useMappingHelper, useFlashListContext, LayoutCommitObserver, viewability/ViewToken, the benchmark helpers",
608
+ missing: "nothing package-level \u2014 remaining gaps are engine ScrollView fidelity, not flash-list"
585
609
  }
586
610
  ]
587
611
  },
@@ -607,7 +631,7 @@ var init_registry = __esm({
607
631
  coverage: 0.88,
608
632
  note: "native bindings stubbed (KeyboardControllerNative, KeyboardEvents, FocusedInputEvents, WindowDimensionsEvents, KeyboardControllerView + sibling native views); upstream pure-JS components, hooks, animated module, and KeyboardAvoidingView resolve from node_modules unchanged",
609
633
  working: "every upstream JS export \u2014 KeyboardProvider, KeyboardAvoidingView, KeyboardStickyView, KeyboardAwareScrollView, KeyboardToolbar, KeyboardGestureArea, useReanimatedKeyboardAnimation, useKeyboardAnimation, useKeyboardHandler, useGenericKeyboardHandler, useKeyboardController, useKeyboardState, useKeyboardContext, useReanimatedFocusedInput, useFocusedInputHandler, useResizeMode, useWindowDimensions, KeyboardEvents, FocusedInputEvents, WindowDimensionsEvents resize events, KeyboardController (dismiss/setFocusTo/isVisible/state/preload/setInputMode/setDefaultMode), KeyboardControllerView, OverKeyboardView, KeyboardBackgroundView, KeyboardExtender, ClippingScrollView, KeyboardToolbarGroupView, AndroidSoftInputModes \u2014 all run upstream code through reanimated worklets",
610
- missing: "per-frame keyboard progress events (smooth `onMove` requires SAB-backed shared values driven from the shell-side keyboard animation; deferred \u2014 see plans/real-worklets.md)"
634
+ missing: "preload is a noop; KeyboardGestureArea, OverKeyboardView, KeyboardBackgroundView, and KeyboardExtender are passthrough views without their native platform effects"
611
635
  }
612
636
  ]
613
637
  },
@@ -643,8 +667,8 @@ var init_registry = __esm({
643
667
  {
644
668
  range: ">=0.1.0",
645
669
  coverage: 0.85,
646
- note: "TabBarView renders floating tab bar with badge/label/sfSymbol",
647
- working: "TabBarView, items/selectedIndex/onItemPressed, badge, labeled, sfSymbol via FloatingTabBar, hapticFeedbackEnabled accepted",
670
+ note: "renders the platform bottom tab bar with badge/label/sfSymbol",
671
+ working: "TabBarView, items/selectedIndex/onItemPressed, badge, labeled, sfSymbol, hapticFeedbackEnabled accepted; the default bar follows the device platform (iOS 26 floating liquid-glass pill, android material bottom navigation)",
648
672
  missing: "TabView (navigationState/renderScene pattern), SceneMap, useBottomTabBarHeight, sidebarAdaptable, minimizeBehavior, tabBarActiveTintColor/InactiveTintColor, getIcon/getLazy/getRole/getHidden/getFreezeOnBlur getters"
649
673
  }
650
674
  ]
@@ -665,13 +689,14 @@ var init_registry = __esm({
665
689
  "expo-constants": {
666
690
  category: "Expo SDK",
667
691
  stubType: "native",
692
+ proofCoverage: 1,
668
693
  versions: [
669
694
  {
670
695
  range: ">=14.0.0",
671
696
  coverage: 0.95,
672
697
  note: "package-local wrapper registers only ExponentConstants; upstream expo-constants JS computes the public Constants object unchanged.",
673
- working: "ExponentConstants native module constants, expoConfig/manifest from embedded app config, executionEnvironment, appOwnership, sessionId, isDevice, platform.ios metadata, statusBarHeight, deviceYearClass, getWebViewUserAgentAsync, AppOwnership, ExecutionEnvironment, UserInterfaceIdiom",
674
- missing: "real binary-derived embedded app config, Expo Updates manifest2, expoGoConfig/easConfig, physical-device status bar and system font enumeration"
698
+ working: "ExponentConstants native module constants matching the bare iOS dictionary: sessionId, executionEnvironment, appOwnership, debugMode, deviceName, isHeadless, statusBarHeight, systemFonts, platform.ios.buildNumber, expoConfig/manifest from the resolved app config, getWebViewUserAgentAsync, and the AppOwnership / ExecutionEnvironment / UserInterfaceIdiom enums from upstream JS",
699
+ missing: "real binary-derived embedded app config, Expo Updates manifest2, expoGoConfig/easConfig, physical-device status bar and system font enumeration. the Expo Go fields deviceYearClass, expoVersion, expoRuntimeVersion, experienceUrl, isDevice, linkingUri and the deprecated platform.ios model/platform/systemVersion/userInterfaceIdiom are intentionally absent, matching a bare iOS app where the native constants dictionary never publishes them; read device metadata from expo-device instead"
675
700
  }
676
701
  ]
677
702
  },
@@ -794,6 +819,7 @@ var init_registry = __esm({
794
819
  "expo-secure-store": {
795
820
  category: "Auth & Payments",
796
821
  stubType: "native",
822
+ proofCoverage: 1,
797
823
  versions: [
798
824
  {
799
825
  range: ">=12.0.0",
@@ -820,6 +846,7 @@ var init_registry = __esm({
820
846
  "expo-network": {
821
847
  category: "Device & Platform",
822
848
  stubType: "native",
849
+ proofCoverage: 1,
823
850
  versions: [
824
851
  {
825
852
  range: ">=50.0.0",
@@ -945,19 +972,21 @@ var init_registry = __esm({
945
972
  "expo-application": {
946
973
  category: "Expo SDK",
947
974
  stubType: "native",
975
+ proofCoverage: 1,
948
976
  versions: [
949
977
  {
950
978
  range: ">=5.0.0",
951
979
  coverage: 0.95,
952
- note: "upstream expo-application JS runs unchanged; package-local wrapper only registers the ExpoApplication native module.",
980
+ note: "upstream expo-application JS runs unchanged; package-local wrapper only registers the ExpoApplication native module, whose identity constants follow the live Expo config.",
953
981
  working: "upstream constants and platform availability checks, applicationName, applicationId, nativeApplicationVersion, nativeBuildVersion, getIosIdForVendorAsync (localStorage-backed), getIosApplicationReleaseTypeAsync SIMULATOR, ApplicationReleaseType enum, getInstallationTimeAsync, getIosPushNotificationServiceEnvironmentAsync",
954
- missing: "real native bundle metadata, Android id/install referrer on non-Android platforms, push entitlement inspection"
982
+ missing: "bare/frozen apps without resolved Expo config use simulator metadata; Android id/install referrer on non-Android platforms; push entitlement inspection"
955
983
  }
956
984
  ]
957
985
  },
958
986
  "expo-battery": {
959
987
  category: "Expo SDK",
960
988
  stubType: "native",
989
+ proofCoverage: 0.9,
961
990
  versions: [
962
991
  {
963
992
  range: ">=9.0.0",
@@ -971,6 +1000,7 @@ var init_registry = __esm({
971
1000
  "expo-brightness": {
972
1001
  category: "Device & Platform",
973
1002
  stubType: "native",
1003
+ proofCoverage: 0.9,
974
1004
  versions: [
975
1005
  {
976
1006
  range: ">=14.0.0",
@@ -984,6 +1014,7 @@ var init_registry = __esm({
984
1014
  "expo-cellular": {
985
1015
  category: "Device & Platform",
986
1016
  stubType: "native",
1017
+ proofCoverage: 0.6,
987
1018
  versions: [
988
1019
  {
989
1020
  range: ">=7.0.0",
@@ -997,6 +1028,7 @@ var init_registry = __esm({
997
1028
  "expo-screen-capture": {
998
1029
  category: "Device & Platform",
999
1030
  stubType: "native",
1031
+ proofCoverage: 0.8,
1000
1032
  versions: [
1001
1033
  {
1002
1034
  range: ">=8.0.0",
@@ -1010,6 +1042,7 @@ var init_registry = __esm({
1010
1042
  "expo-speech": {
1011
1043
  category: "Media",
1012
1044
  stubType: "native",
1045
+ proofCoverage: 0.25,
1013
1046
  versions: [
1014
1047
  {
1015
1048
  range: ">=13.0.0",
@@ -1203,7 +1236,13 @@ var init_registry = __esm({
1203
1236
  },
1204
1237
  "posthog-react-native": {
1205
1238
  category: "Analytics",
1239
+ // the package itself is pure JS (no ios/, android/, podspec, or native
1240
+ // seam) and would run from the bundle. it is deliberately intercepted
1241
+ // anyway under the analytics rule in docs/compat-scoring.md: SDK APIs stay
1242
+ // load-safe noops and the simulator sends no telemetry. do not "restore
1243
+ // the real package" here — suppressing delivery is the point.
1206
1244
  stubType: "native",
1245
+ shipsNativeCode: false,
1207
1246
  versions: [
1208
1247
  {
1209
1248
  range: ">=2.0.0",
@@ -1220,7 +1259,7 @@ var init_registry = __esm({
1220
1259
  versions: [
1221
1260
  {
1222
1261
  range: ">=4.0.0",
1223
- coverage: 1,
1262
+ coverage: 0.95,
1224
1263
  note: "real package JS (index.ts hide/isVisible + the pure-JS useHideAnimation hook) runs unmodified from the bundle against the RNBootSplash native seam. the app's configured logo + background (+ logoWidth, dark variant) from the bootsplash config plugin are parsed and painted on the canvas boot splash. RNBootSplash is manual-hide (no content-appeared auto-hide); hide(fade) drives it: cross-dissolve over a fixed 250ms when fade is set, snap otherwise (mirrors ios/RNBootSplash.mm). isVisible() reflects real splash state; getConstants() returns { darkModeEnabled } exactly as the iOS constantsToExport (logoSizeRatio/navigationBarHeight/statusBarHeight are android-only, defaulted in the hook).",
1225
1264
  working: "configured logo + background + logoWidth + dark variant painted on boot, hide(fade) (real canvas fade/snap), isVisible() (true while splash visible), getConstants() (darkModeEnabled), useHideAnimation hook (logo/brand layout from manifest, runs from bundle)",
1226
1265
  missing: "the optional brand/darkBrand image (a secondary bottom-anchored logo) is not painted \u2014 only the primary logo + background"
@@ -1273,8 +1312,8 @@ var init_registry = __esm({
1273
1312
  {
1274
1313
  range: ">=10.0.0",
1275
1314
  coverage: 1,
1276
- note: "comprehensive iPhone 16 Pro mock \u2014 all ~70 getters covered with hardcoded realistic values",
1277
- working: "all sync and async getters: uniqueId, model, brand, systemName/Version, bundleId, buildNumber, version, deviceName, deviceType, manufacturer, carrier, totalMemory, diskCapacity, freeDiskStorage, fontScale, isEmulator, isTablet, hasNotch, hasDynamicIsland, isLandscape, brightness, getBatteryLevel and ~60 more"
1315
+ note: "comprehensive live-device mock \u2014 hardware fields follow the active device spec and app identity fields follow the live Expo config",
1316
+ working: "all sync and async getters: uniqueId, model, brand, systemName/Version, live bundleId/buildNumber/version/appName, deviceName, deviceType, manufacturer, carrier, totalMemory, diskCapacity, freeDiskStorage, fontScale, isEmulator, isTablet, hasNotch, hasDynamicIsland, isLandscape, brightness, getBatteryLevel and ~60 more"
1278
1317
  }
1279
1318
  ]
1280
1319
  },
@@ -1323,10 +1362,10 @@ var init_registry = __esm({
1323
1362
  versions: [
1324
1363
  {
1325
1364
  range: ">=1.2.0",
1326
- coverage: 0.75,
1327
- note: "native review module surface with App Store review URL construction and deterministic in-app fallback behavior",
1328
- working: "default Rate class, AndroidMarket constants, filterOptions, rate callback, App Store review URL opening via browser window when available, direct Android market URL helper",
1329
- missing: "real SKStoreReviewController / Google Play in-app review dialogs and Linking.canOpenURL platform policy checks"
1365
+ coverage: 0.85,
1366
+ note: "native-seam only \u2014 the upstream Rate class, option defaults/filtering, platform selection, AndroidMarket constants, and Linking fallbacks run from the bundle. the RNRate iOS module opens the requested App Store review URL through the browser handoff when preferInApp is false; because StoreKit review UI is suppressed in the simulator, preferInApp follows the native post-delay fallback exactly, either opening the store and reporting true or reporting false when openAppStoreIfInAppFails is disabled.",
1367
+ working: "default Rate class, AndroidMarket constants, filterOptions, rate callback, exact itms-apps review URL construction, direct App Store browser handoff, preferInApp delay and openAppStoreIfInAppFails success/failure behavior, Android/fallback URL helpers from upstream JS",
1368
+ missing: "no visible SKStoreReviewController or Google Play in-app review dialog; App Store URLs are handed to the browser/host rather than UIApplication"
1330
1369
  }
1331
1370
  ]
1332
1371
  },
@@ -1395,6 +1434,19 @@ var init_registry = __esm({
1395
1434
  }
1396
1435
  ]
1397
1436
  },
1437
+ "react-native-sound-player": {
1438
+ category: "Media",
1439
+ stubType: "native",
1440
+ versions: [
1441
+ {
1442
+ range: ">=0.14.5 <1.0.0",
1443
+ coverage: 0.85,
1444
+ note: "native-seam only \u2014 the published 0.14.5 wrapper runs unchanged against an HTMLAudioElement-backed RNSoundPlayer module with its upstream NativeEventEmitter contract",
1445
+ working: "playUrl/loadUrl and resolved playAsset/loadAsset URLs, load/play/pause/resume/stop/seek, volume clamping, finite and infinite loop bookkeeping, delayed play, getInfo currentTime/duration, FinishedLoading/URL/File, FinishedPlaying, and OnSetupError events",
1446
+ missing: "iOS main-bundle and Documents resource-name lookup for playSoundFile, AVAudioSession speaker/mix routing, background playback, and exact native codec support"
1447
+ }
1448
+ ]
1449
+ },
1398
1450
  "react-native-sensors": {
1399
1451
  category: "Device & Platform",
1400
1452
  stubType: "native",
@@ -1778,10 +1830,10 @@ var init_registry = __esm({
1778
1830
  versions: [
1779
1831
  {
1780
1832
  range: ">=10.0.0",
1781
- coverage: 0.75,
1782
- note: "real MapLibre tiles via the host native seam (map-host.ts). the package JS runs from the bundle; RNMBX* host components + the RNMBXModule native module are seam-provided. keyless: Mapbox vector styles fall back to OpenFreeMap, while official Mapbox satellite styles use Esri World Imagery.",
1783
- working: "MapView (real vector tiles, keyless satellite imagery, mercator/globe projection, pinch-zoom + pan), Camera (centerCoordinate/zoomLevel/bounds/pitch/heading via the stop prop \u2192 camera/fit), ShapeSource (geojson), LineLayer/CircleLayer/FillLayer/SymbolLayer/HeatmapLayer/FillExtrusionLayer/BackgroundLayer (reactStyle \u2192 GL paint/layout), PointAnnotation/MarkerView (host pin), setAccessToken/setWellKnownTileServer (no-op, keyless)",
1784
- missing: "custom PointAnnotation/MarkerView child views (need host\u2192tenant coordinate projection), imperative queries (queryRenderedFeaturesAtPoint/getZoom/getCenter/takeSnap), standalone RasterSource/VectorSource/ImageSource components, terrain/sky/atmosphere, real onCameraChanged/onMapIdle payloads"
1833
+ coverage: 0.82,
1834
+ note: "real MapLibre tiles via the host native seam (map-host.ts). the package JS runs from the bundle; RNMBX* host components and every enforcing TurboModule imported by the native entrypoint are seam-provided. MapView ref reads and takeSnap consume the same host camera feedback and compositor pixels as the rendered map. keyless: Mapbox vector styles fall back to OpenFreeMap, while official Mapbox satellite styles use Esri World Imagery.",
1835
+ working: "MapView (upstream native wrapper, real vector tiles, keyless satellite imagery, mercator/globe projection, pinch-zoom + pan, onCameraChanged/onMapIdle and legacy region payloads), Camera (centerCoordinate/zoomLevel/bounds/pitch/heading via the stop prop \u2192 camera/fit), MapView ref getCenter/getZoom/getPointInView/getCoordinateFromView/getVisibleBounds/takeSnap/clearData, ShapeSource (geojson), LineLayer/CircleLayer/FillLayer/SymbolLayer/HeatmapLayer/FillExtrusionLayer/BackgroundLayer (reactStyle \u2192 GL paint/layout), PointAnnotation/MarkerView (host pin), setAccessToken/setWellKnownTileServer (no-op, keyless)",
1836
+ missing: "custom PointAnnotation/MarkerView child views, queryRenderedFeaturesAtPoint/queryRenderedFeaturesInRect/querySourceFeatures, feature-state/source-visibility/terrain queries, projection reads with bearing/pitch, standalone RasterSource/VectorSource/ImageSource components, terrain/sky/atmosphere, map/style/render lifecycle callbacks, location/user-location, offline/tile-store/viewport/shape-animator APIs, snapshotManager; MapView.takeSnap crops the visible screen rectangle (so an overlapping sibling can be included) and writeToDisk returns a browser blob URI rather than file://"
1785
1837
  }
1786
1838
  ]
1787
1839
  },
@@ -1882,10 +1934,10 @@ var init_registry = __esm({
1882
1934
  versions: [
1883
1935
  {
1884
1936
  range: ">=1.0.0",
1885
- coverage: 0.82,
1886
- note: "native-seam over a real host-thread maplibre-gl driver (render-worker/map-host.ts), NOT an OSM iframe. the package JS (MapView/Marker/Callout/AnimatedRegion/createFabricMap) runs unchanged; only the RNMapsMapView/RNMapsMarker host components + the RNMapsAirModule TurboModule are ours. maplibre renders keyless OpenFreeMap vector tiles at device scale on the host and ships each frame to the shell painter via the live-frame channel. Markers render as real maplibre circle layers. Pinch (focal-point zoom) + pan are forwarded from the tenant responder. The imperative ref API now works: getCamera/getMapBoundaries/getPointForCoordinate/getCoordinateForPoint answer from web-mercator math over the seam's tracked camera; animateCamera/animateToRegion/setCamera/fitToCoordinates/fitToElements route through codegenNativeCommands \u2192 __dispatchCommandImpl \u2192 the maplibre easeTo/jumpTo/fitBounds host commands. getCamera reflects the LAST COMMANDED camera (programmatic drive), not gesture-driven changes \u2014 there's no onRegionChange feedback channel yet.",
1887
- working: "MapView with real maplibre vector-tile rendering at device scale, initialRegion/region/camera honored, Marker (real map pins via maplibre circle layers, pinColor), pinch+pan gestures with focal-point zoom, getCamera/getMapBoundaries (web-mercator unproject of the view corners), getPointForCoordinate/getCoordinateForPoint (projection round-trip), getMarkersFrames, animateCamera/animateToRegion/setCamera (easeTo/jumpTo), fitToCoordinates/fitToElements/fitToSuppliedMarkers (fitBounds), onMapReady, MapView ref API, Callout/CalloutSubview/AnimatedRegion/MAP_TYPES/PROVIDER_GOOGLE/DEFAULT/enableLatestRenderer exports",
1888
- missing: "onRegionChange/onRegionChangeComplete (no feedback channel from the host map back to the tenant, so getCamera is stale after a user gesture), custom Marker child views (coordinate-only pins today), shape overlays (Polyline/Polygon/Circle/Overlay/Heatmap/Geojson/UrlTile/WMSTile/LocalTile render null \u2014 the GL style reconcile path exists in map-host but react-native-maps does not emit it yet, only @rnmapbox/maps does), takeSnapshot (map pixels render host-side \u2014 needs a snapshot round-trip), getAddressFromCoordinates (no reverse geocoder), showsUserLocation tracking, gesture-based onPress/onLongPress"
1937
+ coverage: 0.9,
1938
+ note: "native-seam over a real host-thread maplibre-gl driver (render-worker/map-host.ts), NOT an OSM iframe. the package JS (MapView/Marker/Callout/AnimatedRegion/createFabricMap) runs unchanged; only the RNMapsMapView/RNMapsMarker host components + the RNMapsAirModule TurboModule are ours. maplibre renders keyless OpenFreeMap vector tiles at device scale on the host and ships each frame to the shell painter via the live-frame channel. Childless Markers render as real maplibre circle layers; custom Marker child views render in the tenant overlay and reproject from host camera feedback. Pinch (focal-point zoom) + pan are forwarded from the tenant responder, and maplibre camera changes return through the host\u2192tenant channel for region callbacks and current imperative reads. The imperative ref API works: getCamera/getMapBoundaries/getPointForCoordinate/getCoordinateForPoint answer from web-mercator math over the seam's tracked camera; animateCamera/animateToRegion/setCamera/fitToCoordinates/fitToElements route through codegenNativeCommands \u2192 __dispatchCommandImpl \u2192 the maplibre easeTo/jumpTo/fitBounds host commands. takeSnapshot captures and encodes the visible map viewport through the compositor pixel owner, including png/jpg, quality, base64/blob-uri results, and requested output dimensions.",
1939
+ working: "MapView with real maplibre vector-tile rendering at device scale, initialRegion/region/camera honored, Marker (real map pins via maplibre circle layers, pinColor; custom child views with anchor positioning and pan reprojection), pinch+pan gestures with focal-point zoom, onRegionChangeStart/onRegionChange/onRegionChangeComplete with region + isGesture, getCamera/getMapBoundaries (web-mercator unproject of the view corners), getPointForCoordinate/getCoordinateForPoint (projection round-trip), getMarkersFrames, animateCamera/animateToRegion/setCamera (easeTo/jumpTo), fitToCoordinates/fitToElements/fitToSuppliedMarkers (fitBounds), takeSnapshot of the visible viewport (real compositor pixels, png/jpg + quality, file/base64 result, requested output scaling), onMapReady, MapView ref API, Callout/CalloutSubview/AnimatedRegion/MAP_TYPES/PROVIDER_GOOGLE/DEFAULT/enableLatestRenderer exports",
1940
+ missing: "custom Marker child projection does not yet account for bearing/pitch, shape overlays (Polyline/Polygon/Circle/Overlay/Heatmap/Geojson/UrlTile/WMSTile/LocalTile render null \u2014 the GL style reconcile path exists in map-host but react-native-maps does not emit it yet, only @rnmapbox/maps does), takeSnapshot region override and isolated native-subtree capture (the visible screen rectangle can include an overlapping sibling; file result is a browser blob URI rather than file://), getAddressFromCoordinates (no reverse geocoder), showsUserLocation tracking, gesture-based onPress/onLongPress"
1889
1941
  }
1890
1942
  ]
1891
1943
  },
@@ -1943,6 +1995,7 @@ var init_registry = __esm({
1943
1995
  "expo-screen-orientation": {
1944
1996
  category: "Expo SDK",
1945
1997
  stubType: "native",
1998
+ proofCoverage: 0.8,
1946
1999
  versions: [
1947
2000
  {
1948
2001
  range: ">=7.0.0",
@@ -1956,6 +2009,7 @@ var init_registry = __esm({
1956
2009
  "expo-sensors": {
1957
2010
  category: "Expo SDK",
1958
2011
  stubType: "native",
2012
+ proofCoverage: 0.8,
1959
2013
  versions: [
1960
2014
  {
1961
2015
  range: ">=13.0.0",
@@ -1969,13 +2023,14 @@ var init_registry = __esm({
1969
2023
  "expo-sharing": {
1970
2024
  category: "Expo SDK",
1971
2025
  stubType: "native",
2026
+ proofCoverage: 0,
1972
2027
  versions: [
1973
2028
  {
1974
2029
  range: ">=12.0.0",
1975
- coverage: 0.95,
1976
- note: "upstream expo-sharing JS runs unchanged; package-local wrapper only registers the ExpoSharing native module.",
1977
- working: "isAvailableAsync (real browser check), shareAsync calls navigator.share({url,title}) when available and safely noops otherwise, getSharedPayloads/getResolvedSharedPayloadsAsync return empty incoming-share state, clearSharedPayloads",
1978
- missing: "native share sheet UI, native file readability validation, incoming share extension app-group storage"
2030
+ coverage: 0.85,
2031
+ note: "upstream expo-sharing JS runs unchanged; package-local wrapper only registers the ExpoSharing native module. an empty incoming-share inbox is the state a browser preview should report, so the share-into surface scores as present.",
2032
+ working: "isAvailableAsync (real browser check), shareAsync calls navigator.share({url,title}) when available and safely noops otherwise, getSharedPayloads/getResolvedSharedPayloadsAsync/clearSharedPayloads report an empty incoming-share inbox",
2033
+ missing: "native share sheet UI, native file readability validation, incoming share extension app-group storage. the share-into functions also diverge on a misconfigured app: iOS throws FailedToResolveAppGroupIdException from all three when the app declares no ExpoShareIntoAppGroupId (expo-sharing/ios/SharingModule.swift:4-11) where sootsim returns the empty inbox, so an app that redboxes on device previews cleanly"
1979
2034
  }
1980
2035
  ]
1981
2036
  },
@@ -1994,6 +2049,7 @@ var init_registry = __esm({
1994
2049
  "expo-calendar": {
1995
2050
  category: "Expo SDK",
1996
2051
  stubType: "native",
2052
+ proofCoverage: 0.7,
1997
2053
  versions: [
1998
2054
  {
1999
2055
  range: ">=13.0.0",
@@ -2229,9 +2285,9 @@ var init_registry = __esm({
2229
2285
  {
2230
2286
  range: ">=2.0.0",
2231
2287
  coverage: 0.95,
2232
- note: "analytics SDK with full noop surface per the docs/compat-scoring.md rule \u2014 createClient returns stub; AnalyticsProvider/useAnalytics fully wired; delivery intentionally absent in browser preview.",
2233
- working: "createClient, AnalyticsProvider, useAnalytics hook, Plugin/DestinationPlugin base classes, EventType/PluginType/UpdateType enums, getAnonymousId stub, track/identify/screen/group/alias/flush accepted",
2234
- missing: "no event delivery \u2014 same constraint as every analytics SDK in browser preview"
2288
+ note: "real upstream package \u2014 not intercepted (its JS stub was dropped in 0a4ce9faf0 for omitting EventPlugin). the AnalyticsReactNative native module is absent and the SDK degrades without it, so createClient and track complete normally. UNLIKE the analytics SDKs sootsim does intercept, delivery is NOT suppressed here: a configured writeKey reaches the network from the preview.",
2289
+ working: "the whole published API runs unmodified: createClient, AnalyticsProvider, useAnalytics, Plugin/DestinationPlugin/EventPlugin base classes, EventType/PluginType/UpdateType enums, track/identify/screen/group/alias/flush, and the sovran store peer",
2290
+ missing: "the AnalyticsReactNative native module \u2014 device/app context fields it would supply fall back to defaults"
2235
2291
  }
2236
2292
  ]
2237
2293
  },
@@ -2316,6 +2372,7 @@ var init_registry = __esm({
2316
2372
  "expo-mail-composer": {
2317
2373
  category: "Device & Platform",
2318
2374
  stubType: "native",
2375
+ proofCoverage: 0.9,
2319
2376
  versions: [
2320
2377
  {
2321
2378
  range: ">=15.0.0",
@@ -2342,6 +2399,7 @@ var init_registry = __esm({
2342
2399
  "expo-print": {
2343
2400
  category: "Expo SDK",
2344
2401
  stubType: "native",
2402
+ proofCoverage: 0.4,
2345
2403
  versions: [
2346
2404
  {
2347
2405
  range: ">=14.0.0",
@@ -2355,6 +2413,7 @@ var init_registry = __esm({
2355
2413
  "expo-store-review": {
2356
2414
  category: "Expo SDK",
2357
2415
  stubType: "native",
2416
+ proofCoverage: 0.3,
2358
2417
  versions: [
2359
2418
  {
2360
2419
  range: ">=8.0.0",
@@ -2381,6 +2440,7 @@ var init_registry = __esm({
2381
2440
  "expo-tracking-transparency": {
2382
2441
  category: "Expo SDK",
2383
2442
  stubType: "native",
2443
+ proofCoverage: 0.6,
2384
2444
  versions: [
2385
2445
  {
2386
2446
  range: ">=3.0.0",
@@ -2420,6 +2480,7 @@ var init_registry = __esm({
2420
2480
  "expo-task-manager": {
2421
2481
  category: "Expo SDK",
2422
2482
  stubType: "native",
2483
+ proofCoverage: 1,
2423
2484
  versions: [
2424
2485
  {
2425
2486
  range: ">=11.0.0",
@@ -2880,9 +2941,36 @@ var init_registry = __esm({
2880
2941
  }
2881
2942
  ]
2882
2943
  },
2944
+ "expo-modules-jsi": {
2945
+ category: "Expo SDK",
2946
+ stubType: "build-only",
2947
+ versions: [
2948
+ {
2949
+ range: ">=57.0.4 <58.0.0",
2950
+ coverage: 1,
2951
+ note: "build-only \u2014 the published JavaScript entry exports null, and the npm package exists solely to autolink the native Swift/C++ ExpoModulesJSI framework used transitively by expo-modules-core; there is no runtime JavaScript API for SootSim to provide"
2952
+ }
2953
+ ]
2954
+ },
2955
+ "expo-age-range": {
2956
+ category: "Expo SDK",
2957
+ stubType: "native",
2958
+ versions: [
2959
+ {
2960
+ range: ">=57.0.3 <58.0.0",
2961
+ coverage: 0.7,
2962
+ note: "native-seam only \u2014 the published wrapper runs unchanged; ExpoAgeRange mirrors the documented unsupported-device fallback for the reference simulator",
2963
+ working: "all five published APIs; requestAgeRangeAsync returns { lowerBound: 18, upperBound: null, activeParentalControls: [] }; eligibility, regulatory-feature, and age-signal requests return null; significant-update acknowledgment resolves without UI",
2964
+ missing: "iOS Declared Age Range prompt and real user/region data, iOS 26.4 acknowledgment UI, Android Play Age Signals consent and metadata"
2965
+ }
2966
+ ]
2967
+ },
2883
2968
  "react-native-edge-to-edge": {
2884
2969
  category: "Device & Platform",
2885
- stubType: "build-only",
2970
+ // ships native android code and a real runtime JS surface (SystemBars
2971
+ // component + stack API) that sootsim implements — it was misfiled as
2972
+ // build-only, which the scoring layer now excludes entirely.
2973
+ stubType: "native",
2886
2974
  versions: [
2887
2975
  {
2888
2976
  range: ">=1.0.0",
@@ -2933,14 +3021,16 @@ var init_registry = __esm({
2933
3021
  },
2934
3022
  "@miblanchard/react-native-slider": {
2935
3023
  category: "UI Components",
2936
- stubType: "native",
3024
+ // pure JS — the published package imports only react and react-native
3025
+ // (Animated + PanResponder + View) and has no ios/, android/, podspec, or
3026
+ // native seam. not intercepted; the real package runs from the bundle.
3027
+ stubType: "works",
2937
3028
  versions: [
2938
3029
  {
2939
3030
  range: ">=2.0.0",
2940
- coverage: 0.8,
2941
- note: "alias to @react-native-community/slider stub via re-export",
2942
- working: "value, minimumValue, maximumValue, step, onValueChange, onSlidingStart, onSlidingComplete, disabled, minimumTrackTintColor",
2943
- missing: "thumbImage, minimumTrackImage, maximumTrackImage, StepMarker, renderStepNumber, visual track styling beyond accentColor"
3031
+ coverage: 1,
3032
+ note: "real upstream package runs unmodified on the engine View/Animated/PanResponder surface",
3033
+ working: "the whole published API: single and multi-thumb (array) value, onValueChange/onSlidingStart/onSlidingComplete with the upstream array payload, renderAboveThumbComponent, renderBelowThumbComponent, renderThumbComponent, renderMinimumTrackComponent, renderMaximumTrackComponent, renderTrackMarkComponent, trackMarks, thumbImage, vertical, startFromZero, trackClickable, animateTransitions with spring/timing animationConfig, thumbTouchSize, all style props"
2944
3034
  }
2945
3035
  ]
2946
3036
  },
@@ -2998,6 +3088,7 @@ var init_registry = __esm({
2998
3088
  "expo-intent-launcher": {
2999
3089
  category: "Expo SDK",
3000
3090
  stubType: "native",
3091
+ proofCoverage: 0.9,
3001
3092
  versions: [
3002
3093
  {
3003
3094
  range: ">=11.0.0",
@@ -3011,6 +3102,7 @@ var init_registry = __esm({
3011
3102
  "expo-sms": {
3012
3103
  category: "Expo SDK",
3013
3104
  stubType: "native",
3105
+ proofCoverage: 0.4,
3014
3106
  versions: [
3015
3107
  {
3016
3108
  range: ">=12.0.0",
@@ -3024,6 +3116,7 @@ var init_registry = __esm({
3024
3116
  "expo-video-thumbnails": {
3025
3117
  category: "Media",
3026
3118
  stubType: "native",
3119
+ proofCoverage: 0.9,
3027
3120
  versions: [
3028
3121
  {
3029
3122
  range: ">=8.0.0",
@@ -3111,9 +3204,23 @@ var init_registry = __esm({
3111
3204
  }
3112
3205
  ]
3113
3206
  },
3207
+ "@expo/app-integrity": {
3208
+ category: "Device & Platform",
3209
+ stubType: "native",
3210
+ versions: [
3211
+ {
3212
+ range: ">=57.0.1 <58.0.0",
3213
+ coverage: 0.7,
3214
+ note: "native-seam only \u2014 the published wrapper runs unchanged; the reference iOS simulator reports isSupported=false, and every App Attest call rejects with the upstream ERR_APP_INTEGRITY_FEATURE_UNSUPPORTED code and message",
3215
+ working: "all nine public exports: isSupported=false; generateKeyAsync, attestKeyAsync, and generateAssertionAsync reject with the real iOS-simulator unsupported error; Android-only methods take the upstream wrapper platform-error or false branches on iOS",
3216
+ missing: "real App Attest keys, attestations, and assertions; Android Play Integrity tokens and hardware-backed key attestation"
3217
+ }
3218
+ ]
3219
+ },
3114
3220
  "react-native-uitextview": {
3115
3221
  category: "UI Components",
3116
3222
  stubType: "native",
3223
+ proofCoverage: 0.6,
3117
3224
  versions: [
3118
3225
  {
3119
3226
  range: ">=1.0.0",
@@ -3474,6 +3581,7 @@ var init_registry = __esm({
3474
3581
  "react-native-drawer-layout": {
3475
3582
  category: "Navigation",
3476
3583
  stubType: "works",
3584
+ proofCoverage: 0.8,
3477
3585
  versions: [
3478
3586
  {
3479
3587
  range: ">=3.0.0",
@@ -3487,6 +3595,7 @@ var init_registry = __esm({
3487
3595
  "react-native-tab-view": {
3488
3596
  category: "Navigation",
3489
3597
  stubType: "works",
3598
+ proofCoverage: 0.8,
3490
3599
  versions: [
3491
3600
  {
3492
3601
  range: ">=3.0.0",
@@ -3499,14 +3608,17 @@ var init_registry = __esm({
3499
3608
  },
3500
3609
  "react-native-screen-transitions": {
3501
3610
  category: "Navigation",
3502
- stubType: "native",
3611
+ // pure JS over reanimated + gesture-handler + react-navigation; the
3612
+ // published package has no ios/, android/, podspec, or native seam. not
3613
+ // intercepted; the real package runs from the bundle.
3614
+ stubType: "works",
3503
3615
  versions: [
3504
3616
  {
3505
3617
  range: ">=1.0.0",
3506
- coverage: 0.6,
3507
- note: "SharedElement passthrough; transition animations not implemented",
3508
- working: "SharedElement (forwardRef passthrough), createSharedElementStackNavigator (returns navigator as-is), SharedElementTransition (renders null), useSharedElementTransition (returns static {progress:0, closing:0})",
3509
- missing: "createNativeStackNavigator (intentionally omitted to avoid duplicate nav context), actual shared element animation execution, progress tracking during navigation, element measurement/capture"
3618
+ coverage: 0.9,
3619
+ note: "real upstream package runs from the bundle over the reanimated, gesture-handler, screens, and safe-area-context seams sootsim already provides",
3620
+ working: "withScreenTransitions, createTransitionAwareComponent, createBoundaryComponent, Boundary, the transition-aware View/ScrollView/MaskedView, and the reanimated-driven transition specs",
3621
+ missing: "fidelity is bounded by the reanimated worklet and gesture-handler seams underneath it, not by anything package-level"
3510
3622
  }
3511
3623
  ]
3512
3624
  },
@@ -3634,6 +3746,7 @@ var init_registry = __esm({
3634
3746
  "expo-background-task": {
3635
3747
  category: "Expo SDK",
3636
3748
  stubType: "native",
3749
+ proofCoverage: 1,
3637
3750
  versions: [
3638
3751
  {
3639
3752
  range: ">=55.0.0",
@@ -3647,6 +3760,7 @@ var init_registry = __esm({
3647
3760
  "expo-background-fetch": {
3648
3761
  category: "Expo SDK",
3649
3762
  stubType: "native",
3763
+ proofCoverage: 1,
3650
3764
  versions: [
3651
3765
  {
3652
3766
  range: ">=13.0.0",
@@ -3838,7 +3952,11 @@ var init_registry = __esm({
3838
3952
  },
3839
3953
  "@welldone-software/why-did-you-render": {
3840
3954
  category: "Device & Platform",
3955
+ // pure JS (no native code), but deliberately intercepted: see the note
3956
+ // below. do not "restore the real package" — it patches React internals
3957
+ // and takes the bridged React down with it.
3841
3958
  stubType: "native",
3959
+ shipsNativeCode: false,
3842
3960
  versions: [
3843
3961
  {
3844
3962
  range: ">=8.0.0",
@@ -5071,7 +5189,7 @@ var init_registry = __esm({
5071
5189
  {
5072
5190
  range: ">=0.13.0",
5073
5191
  coverage: 1,
5074
- note: "TypeScript types only \u2014 no runtime API surface, importing it is a no-op at runtime"
5192
+ note: "build-only \u2014 the published 57.0.1 JavaScript entry build/Manifests.js contains only `export {}`; the package carries native manifest parser/types infrastructure and exposes no application runtime API"
5075
5193
  }
5076
5194
  ]
5077
5195
  },
@@ -5082,7 +5200,7 @@ var init_registry = __esm({
5082
5200
  {
5083
5201
  range: ">=0.13.0",
5084
5202
  coverage: 1,
5085
- note: "native-side helper used internally by expo-updates; JS entry exports null, no runtime API"
5203
+ note: "build-only \u2014 the published 57.0.1 JavaScript entry index.js contains only `module.exports = null`; the package is native-side JSON utility code used internally by Expo and exposes no application runtime API"
5086
5204
  }
5087
5205
  ]
5088
5206
  },
@@ -5093,18 +5211,20 @@ var init_registry = __esm({
5093
5211
  {
5094
5212
  range: ">=4.0.0",
5095
5213
  coverage: 1,
5096
- note: "native-side HTTP-header helper used internally by expo-updates; no JS API surface"
5214
+ note: "build-only \u2014 the published 57.0.0 tarball declares index.js as main but omits that file entirely; it contains Java and Objective-C structured-header parsers and no application runtime JavaScript API"
5097
5215
  }
5098
5216
  ]
5099
5217
  },
5100
5218
  "@bacons/apple-targets": {
5101
5219
  category: "Expo SDK",
5102
- stubType: "build-only",
5220
+ stubType: "native",
5103
5221
  versions: [
5104
5222
  {
5105
- range: ">=0.0.0",
5106
- coverage: 1,
5107
- note: "config plugin that wires extra Xcode targets at build time; no runtime JS API"
5223
+ range: ">=4.0.0 <6.0.0",
5224
+ coverage: 0.85,
5225
+ note: "native-seam only \u2014 the published ExtensionStorage wrapper runs unchanged against an app-group-keyed UserDefaults analogue; the package also keeps its Expo config-plugin and Apple-target generation paths at build time",
5226
+ working: "ExtensionStorage constructor, string/number/object/array set and get, remove, app-group suite isolation, reloadWidget, and reloadControls",
5227
+ missing: "persistence across simulator restarts, sharing with a real Apple extension process, and WidgetKit or Control Center timeline reloads"
5108
5228
  }
5109
5229
  ]
5110
5230
  },
@@ -5195,7 +5315,7 @@ var init_registry = __esm({
5195
5315
  {
5196
5316
  range: ">=2.0.0",
5197
5317
  coverage: 1,
5198
- note: "config plugin that wires Braze into expo prebuild; no runtime JS API"
5318
+ note: "build-only \u2014 the published 5.2.0 JavaScript entry build/withBraze.js is an Expo createRunOncePlugin that mutates Android and iOS projects during prebuild; it exposes no application runtime API"
5199
5319
  }
5200
5320
  ]
5201
5321
  },
@@ -5224,6 +5344,19 @@ var init_registry = __esm({
5224
5344
  }
5225
5345
  ]
5226
5346
  },
5347
+ "@posthog/react-native-plugin": {
5348
+ category: "Analytics",
5349
+ stubType: "native",
5350
+ versions: [
5351
+ {
5352
+ range: ">=2.0.1 <3.0.0",
5353
+ coverage: 0.95,
5354
+ note: "native-seam only \u2014 the published 2.0.1 and 2.3.1 JavaScript wrappers run unchanged against one PosthogReactNativePlugin seam; session-replay, native-error, and push bridges stay load-safe in their disabled state, and delivery is intentionally absent per the analytics/session-replay scoring rule",
5355
+ working: "2.0.1 named and default exports: setup/start/startSession/endSession/identify/startRecording/stopRecording/isEnabled=false; later 2.x exports reset, addExceptionStep, push-token register/unregister, setOptOut, capturePushNotificationOpened, and setPushIdentityProvider with NativeEventEmitter listener bookkeeping; the shared seam backs both surfaces",
5356
+ missing: "no session capture or replay upload, native exception capture, push subscription or notification-open delivery, or push-identity request events \u2014 intentionally absent for the development simulator"
5357
+ }
5358
+ ]
5359
+ },
5227
5360
  "posthog-react-native-session-replay": {
5228
5361
  category: "Analytics",
5229
5362
  stubType: "native",
@@ -5231,7 +5364,7 @@ var init_registry = __esm({
5231
5364
  {
5232
5365
  range: ">=1.0.0",
5233
5366
  coverage: 0.95,
5234
- note: "native-seam only: the real posthog-react-native-session-replay runs from the bundle (start/startSession/endSession/identify/startRecording/stopRecording/isEnabled + default export \u2014 all upstream JS). we stub only the PosthogReactNativeSessionReplay native module, mirroring lib/typescript index.d.ts exactly: recording actions resolve without capturing and isEnabled() reports false \u2014 the same clean state an app sees with replay unconfigured. per docs/compat-scoring.md session-replay rule, delivery is intentionally absent",
5367
+ note: "native-seam only: the real posthog-react-native-session-replay runs from the bundle (start/startSession/endSession/identify/startRecording/stopRecording/isEnabled + default export \u2014 all upstream JS). its published surface is fully covered by the shared PosthogReactNativeSessionReplay module, which also carries the renamed plugin superset: recording actions resolve without capturing and isEnabled() reports false \u2014 the same clean state an app sees with replay unconfigured. per docs/compat-scoring.md session-replay rule, delivery is intentionally absent",
5235
5368
  working: "full upstream JS surface (named exports + default module), start/startSession/endSession/identify/startRecording/stopRecording resolve, isEnabled resolves false",
5236
5369
  missing: "no session capture, no canvas recording, no replay upload \u2014 intentionally absent for the development simulator (no PostHog replay backend)"
5237
5370
  }
@@ -5257,8 +5390,7 @@ var init_registry = __esm({
5257
5390
  {
5258
5391
  range: ">=1.0.0",
5259
5392
  coverage: 1,
5260
- note: "load-safe noop \u2014 NewRelic.startAgent + record* methods + interaction tracking; nothing delivered",
5261
- missing: "no metrics, errors, or events transmitted; interaction IDs are placeholders"
5393
+ note: "load-safe noop \u2014 NewRelic.startAgent + record* methods + interaction tracking. no metrics, errors, or events are transmitted from the browser simulator and interaction ids are placeholders; delivery is intentionally absent, so an app behaves exactly as it would with a live agent."
5262
5394
  }
5263
5395
  ]
5264
5396
  },
@@ -5422,7 +5554,7 @@ var init_registry = __esm({
5422
5554
  versions: [
5423
5555
  {
5424
5556
  range: ">=4.0.0",
5425
- coverage: 1,
5557
+ coverage: 0.3,
5426
5558
  note: "load-safe noop \u2014 useShareIntent hook reports hasShareIntent=false consistently; ShareIntentProvider passthrough; getShareIntent resolves null. apps with conditional UI on incoming shares take their no-share branch",
5427
5559
  missing: "no iOS Share Extension / Android ACTION_SEND intent target \u2014 browsers cannot register a system share target. ShareIntentTypes constants exposed for type-checked imports"
5428
5560
  }
@@ -5642,8 +5774,7 @@ var init_registry = __esm({
5642
5774
  {
5643
5775
  range: ">=2.0.0",
5644
5776
  coverage: 1,
5645
- note: "load-safe noop \u2014 this is itself a polyfill package that monkey-patches global objects (Buffer, crypto, async-storage). on sootsim those globals are already wired by our compat layer so importing this is a no-op import; default export is an empty object",
5646
- missing: "nothing \u2014 its only job (install polyfills) is already done by our base compat layer. flagged as 0.5 because we don't exercise WalletConnect end-to-end yet"
5777
+ note: "load-safe noop \u2014 this is itself a polyfill package that monkey-patches global objects (Buffer, crypto, async-storage). on sootsim those globals are already wired by our compat layer so importing this is a no-op import; default export is an empty object. its only job is done, though WalletConnect itself is not exercised end to end here."
5647
5778
  }
5648
5779
  ]
5649
5780
  },
@@ -5729,7 +5860,7 @@ var init_registry = __esm({
5729
5860
  versions: [
5730
5861
  {
5731
5862
  range: ">=125.0.0",
5732
- coverage: 1,
5863
+ coverage: 0.7,
5733
5864
  note: "load-safe pass-through \u2014 RTCPeerConnection / RTCIceCandidate / RTCSessionDescription / MediaStream / MediaStreamTrack / mediaDevices forwarded from globalThis (browsers have these natively); registerGlobals is a noop; RTCView component renders null since we have no host-side video bridge yet",
5734
5865
  missing: "RTCView visual rendering needs a host bridge that paints a video element into the device frame (deferred). raw audio/video peer connections work via the browser globals"
5735
5866
  }
@@ -5878,7 +6009,7 @@ var init_registry = __esm({
5878
6009
  versions: [
5879
6010
  {
5880
6011
  range: ">=3.0.0",
5881
- coverage: 1,
6012
+ coverage: 0.25,
5882
6013
  note: 'isSupported=false (sootsim tenant runs in a worker without DOM); create/get reject with a clear "needs top-level DOM" error so apps with passkey-optional flows take their password fallback. PasskeyError class exposed',
5883
6014
  missing: "no WebAuthn \u2014 needs DOM access. host iframe could provide this; deferred until host bridge for credential management"
5884
6015
  }
@@ -5975,21 +6106,24 @@ var init_registry = __esm({
5975
6106
  versions: [
5976
6107
  {
5977
6108
  range: ">=11.0.0",
5978
- coverage: 1,
6109
+ coverage: 0.8,
5979
6110
  note: "load-safe noop \u2014 start/scan accept; connect rejects; getConnectedPeripherals returns []; full BleEventType / BleScanCallbackType / BleScanMode / BleAndroidPhyType / BleState enum surface",
5980
6111
  missing: "no Web Bluetooth bridging in this stub \u2014 apps that absolutely need BLE should branch on checkState=off"
5981
6112
  }
5982
6113
  ]
5983
6114
  },
5984
6115
  voltra: {
5985
- category: "Analytics",
5986
- stubType: "native",
6116
+ category: "Device & Platform",
6117
+ // "CLI for applying Voltra to native React Native projects" — a build-time
6118
+ // widget/Xcode-target tool (commander + cosmiconfig + @bacons/xcode), not a
6119
+ // runtime library, and nothing intercepts it. it was scored as a stubbed
6120
+ // analytics SDK, which it has never been.
6121
+ stubType: "build-only",
5987
6122
  versions: [
5988
6123
  {
5989
6124
  range: ">=0.0.1",
5990
- coverage: 0.95,
5991
- note: "load-safe noop \u2014 initialize accepted; getStatus reports uninitialized",
5992
- missing: "package surface stubbed loosely; no real analytics delivery"
6125
+ coverage: 1,
6126
+ note: "CLI only \u2014 mutates native project files at build time and is never imported by app code, so there is no runtime surface to support"
5993
6127
  }
5994
6128
  ]
5995
6129
  },
@@ -6036,8 +6170,7 @@ var init_registry = __esm({
6036
6170
  {
6037
6171
  range: ">=0.5.0",
6038
6172
  coverage: 1,
6039
- note: "load-safe pass-through \u2014 uses globalThis.AudioContext / OfflineAudioContext when present (Web Audio API). browsers have these natively",
6040
- missing: "no JSI fast-path; performance differs from native iOS/Android implementation but the API surface matches"
6173
+ note: "load-safe pass-through \u2014 uses globalThis.AudioContext / OfflineAudioContext when present (Web Audio API). browsers have these natively"
6041
6174
  }
6042
6175
  ]
6043
6176
  },
@@ -6155,9 +6288,9 @@ var init_registry = __esm({
6155
6288
  versions: [
6156
6289
  {
6157
6290
  range: ">=2.0.0",
6158
- coverage: 1,
6159
- note: 'load-safe stub \u2014 DocumentDirectoryPath / CachesDirectoryPath / TemporaryDirectoryPath / ExternalDirectoryPath / LibraryDirectoryPath / PicturesDirectoryPath / DownloadDirectoryPath / MainBundlePath constants exposed; readFile / writeFile / unlink / stat / mkdir / moveFile / copyFile reject with "use react-native-blob-util" suggestion',
6160
- missing: "no IDB-backed FS in this stub; consumers should migrate to react-native-blob-util which we score at 0.85"
6291
+ coverage: 0.95,
6292
+ note: "true alias for react-native-fs (0.95) \u2014 the maintained fork resolves to the same stub, so readFile / writeFile / appendFile / read / write / readDir / stat / exists / mkdir / unlink / copyFile / moveFile / hash / downloadFile / uploadFiles and every path constant run against the shared IndexedDB byte store that react-native-blob-util also writes to.",
6293
+ missing: "see react-native-fs \u2014 no Android background download manager; slight discount for fork-specific API drift we do not model separately"
6161
6294
  }
6162
6295
  ]
6163
6296
  },
@@ -6190,10 +6323,11 @@ var init_registry = __esm({
6190
6323
  stubType: "native",
6191
6324
  versions: [
6192
6325
  {
6193
- range: ">=0.4.0",
6194
- coverage: 1,
6195
- note: 'load-safe defaults \u2014 appVersion="0.0.0", buildVersion="1", bundleIdentifier="sootsim.app". consumers can override via env vars at build time',
6196
- missing: "no Info.plist / build.gradle reading"
6326
+ range: ">=0.3.6 <1.0.0",
6327
+ coverage: 0.9,
6328
+ note: "native-seam only \u2014 published package JS runs unchanged and reads RNVersionNumber appVersion/buildVersion/bundleIdentifier from the live Expo config",
6329
+ working: "default export with appVersion, platform-typed buildVersion, and bundleIdentifier; iOS and Android config fields; stable bare-app fallback",
6330
+ missing: "bare/frozen apps without resolved Expo config use simulator metadata rather than Info.plist or PackageInfo"
6197
6331
  }
6198
6332
  ]
6199
6333
  },
@@ -6275,7 +6409,7 @@ var init_registry = __esm({
6275
6409
  versions: [
6276
6410
  {
6277
6411
  range: ">=1.0.0",
6278
- coverage: 1,
6412
+ coverage: 0.6,
6279
6413
  note: "load-safe pass-through \u2014 forwards to globalThis.PaymentRequest where supported (browsers have W3C Payment Request API natively in some contexts)",
6280
6414
  missing: "no Apple Pay / Google Pay native fallback \u2014 apps fall back to PaymentRequest if available"
6281
6415
  }
@@ -6287,7 +6421,7 @@ var init_registry = __esm({
6287
6421
  versions: [
6288
6422
  {
6289
6423
  range: ">=6.0.0",
6290
- coverage: 1,
6424
+ coverage: 0.85,
6291
6425
  note: "partial \u2014 getItem / setItem / deleteItem / hasItem / getAllItems backed by the shared tenant key/value store with __soot_sensitive_ prefix; biometric helpers (hasEnrolledFingerprints / isSensorAvailable) report false",
6292
6426
  missing: "no real biometric gating; recommended swap: react-native-keychain (already 0.85 in our registry)"
6293
6427
  }
@@ -6395,7 +6529,7 @@ var init_registry = __esm({
6395
6529
  versions: [
6396
6530
  {
6397
6531
  range: ">=7.0.0",
6398
- coverage: 1,
6532
+ coverage: 0.8,
6399
6533
  note: "load-safe passthrough \u2014 Toast / Picker / Drawer / ActionSheet pass children through; the pure-JS half (Colors / Typography / Spacings tokens) is loaded directly from the consumer's bundle without going through this stub",
6400
6534
  missing: "native parts of ui-lib (Picker spinner, ActionSheet UI) are not delivered; UI looks plain"
6401
6535
  }
@@ -6507,7 +6641,7 @@ var init_registry = __esm({
6507
6641
  versions: [
6508
6642
  {
6509
6643
  range: ">=2.0.0",
6510
- coverage: 1,
6644
+ coverage: 0.5,
6511
6645
  note: "partial \u2014 getLanguage uses navigator.language; setLanguage / openSystemSettings noop",
6512
6646
  missing: "cannot set system language from browser"
6513
6647
  }
@@ -6531,7 +6665,7 @@ var init_registry = __esm({
6531
6665
  versions: [
6532
6666
  {
6533
6667
  range: ">=0.5.0",
6534
- coverage: 1,
6668
+ coverage: 0.9,
6535
6669
  note: "partial \u2014 Restart() calls location.reload() on web",
6536
6670
  missing: "app-state reset semantics differ from a real RN reload"
6537
6671
  }
@@ -6726,8 +6860,7 @@ var init_registry = __esm({
6726
6860
  {
6727
6861
  range: ">=1.0.0",
6728
6862
  coverage: 1,
6729
- note: "load-safe noop \u2014 expo plugin function returns empty config",
6730
- missing: "config plugin runs at build time; runtime is the iterable-react-native-sdk path"
6863
+ note: "load-safe noop \u2014 expo plugin function returns empty config"
6731
6864
  }
6732
6865
  ]
6733
6866
  },
@@ -6833,7 +6966,7 @@ var init_registry = __esm({
6833
6966
  versions: [
6834
6967
  {
6835
6968
  range: ">=1.5.0",
6836
- coverage: 1,
6969
+ coverage: 0.4,
6837
6970
  note: "load-safe passthrough \u2014 Spinner renders children; full Type enum exposed",
6838
6971
  missing: "no animation; recommended swap: pure-JS spinner like react-spinners"
6839
6972
  }
@@ -6844,10 +6977,11 @@ var init_registry = __esm({
6844
6977
  stubType: "native",
6845
6978
  versions: [
6846
6979
  {
6847
- range: ">=1.0.0",
6848
- coverage: 1,
6849
- note: 'load-safe defaults \u2014 appVersion="0.0.0", buildVersion="1", bundleIdentifier="sootsim.app"',
6850
- missing: "consumers should override via env vars at build time"
6980
+ range: ">=1.1.1 <2.0.0",
6981
+ coverage: 0.9,
6982
+ note: "native-seam only \u2014 published package JS runs unchanged and reads RNVersionInfo appVersion/buildVersion/bundleIdentifier from the live Expo config",
6983
+ working: "default export with appVersion, platform-typed buildVersion, and bundleIdentifier; iOS and Android config fields; stable bare-app fallback",
6984
+ missing: "bare/frozen apps without resolved Expo config use simulator metadata rather than Info.plist or PackageInfo"
6851
6985
  }
6852
6986
  ]
6853
6987
  },
@@ -6906,7 +7040,7 @@ var init_registry = __esm({
6906
7040
  versions: [
6907
7041
  {
6908
7042
  range: ">=2.0.0",
6909
- coverage: 1,
7043
+ coverage: 0.8,
6910
7044
  note: "load-safe class \u2014 setLanguage / getLanguage / getInterfaceLanguage / getAvailableLanguages backed by navigator.language",
6911
7045
  missing: "no Localizable.strings reading; consumers should use upstream Localizable strings via JSON imports"
6912
7046
  }
@@ -7257,7 +7391,7 @@ var init_registry = __esm({
7257
7391
  versions: [
7258
7392
  {
7259
7393
  range: ">=1.0.0",
7260
- coverage: 1,
7394
+ coverage: 0.8,
7261
7395
  note: "partial \u2014 uses window.prompt() when available so callbacks fire with the entered value",
7262
7396
  missing: "no Material AlertDialog on iOS; window.prompt is the closest browser equivalent"
7263
7397
  }
@@ -7536,7 +7670,7 @@ var init_registry = __esm({
7536
7670
  versions: [
7537
7671
  {
7538
7672
  range: ">=2.0.0",
7539
- coverage: 1,
7673
+ coverage: 0.85,
7540
7674
  note: "partial \u2014 set/get/remove backed by the shared tenant key/value store with __soot_secure_ prefix; ACCESSIBLE constants exposed",
7541
7675
  missing: "no real keychain encryption; recommended swap: react-native-keychain (already polyfilled)"
7542
7676
  }
@@ -7572,10 +7706,9 @@ var init_registry = __esm({
7572
7706
  versions: [
7573
7707
  {
7574
7708
  range: ">=1.0.0",
7575
- coverage: 0.85,
7709
+ coverage: 1,
7576
7710
  note: "native-seam: the two pure-JS constants (ScreenCornerRadius, IsScreenRounded) run from the real bundle; only the ScreenCornerRadius NativeModule is ours, and its `cornerRadius` constant returns the live simulated device's measured display corner radius from the same device spec the engine renders the chrome from. this is the package's entire purpose and SootSim answers it precisely. faithful complete contract, not a no-op.",
7577
- working: "NativeModules.ScreenCornerRadius.cornerRadius (real per-device radius, synchronous constant read at import like upstream); ScreenCornerRadius + IsScreenRounded constants computed by the real package JS off that value, so IsScreenRounded is correct per device",
7578
- missing: 'none functionally \u2014 returns the exact display corner radius of the simulated device; 0 only in the pre-boot window before the first device spec publishes, which the upstream `?? 0` already treats as "couldn\'t be detected"'
7711
+ working: "NativeModules.ScreenCornerRadius.cornerRadius (real per-device radius, synchronous constant read at import like upstream); ScreenCornerRadius + IsScreenRounded constants computed by the real package JS off that value, so IsScreenRounded is correct per device"
7579
7712
  }
7580
7713
  ]
7581
7714
  },
@@ -7694,8 +7827,7 @@ var init_registry = __esm({
7694
7827
  {
7695
7828
  range: ">=1.0.0",
7696
7829
  coverage: 1,
7697
- note: "load-safe partial \u2014 isWebPSupported=true (browsers support WebP); encodeWebP/decodeWebP reject",
7698
- missing: "WebP reading is via <img>/<canvas>; encoding via Canvas.toBlob"
7830
+ note: "load-safe partial \u2014 isWebPSupported=true (browsers support WebP); encodeWebP/decodeWebP reject"
7699
7831
  }
7700
7832
  ]
7701
7833
  },
@@ -7781,8 +7913,7 @@ var init_registry = __esm({
7781
7913
  {
7782
7914
  range: ">=1.0.0",
7783
7915
  coverage: 1,
7784
- note: "load-safe passthrough \u2014 children pass through (brownfield-mount of RN inside native host has no browser equivalent)",
7785
- missing: "sootsim is already a pure-JS host"
7916
+ note: "load-safe passthrough \u2014 children pass through (brownfield-mount of RN inside native host has no browser equivalent)"
7786
7917
  }
7787
7918
  ]
7788
7919
  },
@@ -7997,7 +8128,7 @@ var init_registry = __esm({
7997
8128
  versions: [
7998
8129
  {
7999
8130
  range: ">=2.0.0",
8000
- coverage: 1,
8131
+ coverage: 0.8,
8001
8132
  note: "load-safe partial \u2014 getCacheUri returns input url; cleanCache/cleanByUrl accepted; getCacheSize=0",
8002
8133
  missing: "no video proxy/cache; browsers cache via standard HTTP cache"
8003
8134
  }
@@ -8367,7 +8498,7 @@ var init_registry = __esm({
8367
8498
  versions: [
8368
8499
  {
8369
8500
  range: ">=0.5.0",
8370
- coverage: 1,
8501
+ coverage: 0.7,
8371
8502
  note: 'load-safe defaults \u2014 model/manufacturer/deviceId/bundleId/version/buildNumber/systemVersion/systemName all "sootsim"',
8372
8503
  missing: "consumers should use react-native-device-info (already polyfilled)"
8373
8504
  }
@@ -8452,7 +8583,7 @@ var init_registry = __esm({
8452
8583
  versions: [
8453
8584
  {
8454
8585
  range: ">=2.0.0",
8455
- coverage: 1,
8586
+ coverage: 0.25,
8456
8587
  note: "load-safe noop \u2014 LoaderKit renders null",
8457
8588
  missing: "no native loader animations; recommended swap: pure-JS spinner"
8458
8589
  }
@@ -8500,7 +8631,7 @@ var init_registry = __esm({
8500
8631
  versions: [
8501
8632
  {
8502
8633
  range: ">=0.10.0",
8503
- coverage: 1,
8634
+ coverage: 0.6,
8504
8635
  note: "load-safe pass-through \u2014 forwards to globalThis.PaymentRequest where supported",
8505
8636
  missing: "see @rnw-community/react-native-payments for the modern variant"
8506
8637
  }
@@ -8549,8 +8680,7 @@ var init_registry = __esm({
8549
8680
  {
8550
8681
  range: ">=0.0.1",
8551
8682
  coverage: 1,
8552
- note: "load-safe noop \u2014 Easing constants exposed; interpolate returns input",
8553
- missing: "pure-JS easings live in react-native-reanimated which we polyfill"
8683
+ note: "load-safe noop \u2014 Easing constants exposed; interpolate returns input"
8554
8684
  }
8555
8685
  ]
8556
8686
  },
@@ -8620,7 +8750,7 @@ var init_registry = __esm({
8620
8750
  versions: [
8621
8751
  {
8622
8752
  range: ">=3.0.0",
8623
- coverage: 1,
8753
+ coverage: 0.85,
8624
8754
  note: "partial \u2014 setItem/getItem/removeItem/exist/getAllKeys/multi* backed by the shared tenant key/value store with __soot_secure_ prefix; getSupportedBiometryType=null",
8625
8755
  missing: "no real keychain encryption; recommended swap: react-native-keychain (already 0.85)"
8626
8756
  }
@@ -8860,7 +8990,7 @@ var init_registry = __esm({
8860
8990
  {
8861
8991
  range: ">=0.4.0",
8862
8992
  coverage: 0.95,
8863
- note: "native-seam only - upstream analytics client, batching, AppState integration, and fetch delivery run from the bundle; RNAptabaseModule supplies the iOS appVersion/appBuildNumber constants the JS client reads",
8993
+ note: "native-seam only - upstream analytics client, batching, AppState integration, and fetch delivery run from the bundle; RNAptabaseModule supplies live Expo-config appVersion/appBuildNumber constants",
8864
8994
  working: "init, trackEvent, flush, AppState-based batching, fetch delivery, appVersion/appBuildNumber constants",
8865
8995
  missing: "no extra native delivery path beyond the upstream JS fetch client"
8866
8996
  }
@@ -9179,6 +9309,19 @@ var init_registry = __esm({
9179
9309
  }
9180
9310
  ]
9181
9311
  },
9312
+ "expo-widgets": {
9313
+ category: "Expo SDK",
9314
+ stubType: "native",
9315
+ versions: [
9316
+ {
9317
+ range: ">=57.0.10 <58.0.0",
9318
+ coverage: 0.7,
9319
+ note: "native-seam only \u2014 the published Widget, LiveActivity, and factory classes run from the bundle; widget timelines and live-activity instance lifecycles use deterministic in-memory state while unavailable host events and push tokens stay absent",
9320
+ working: "createWidget, Widget reload/updateTimeline/updateSnapshot/getTimeline, createLiveActivity, LiveActivityFactory start/getInstances, LiveActivity update/end/getPushToken, after dismissal policy, widgetsDirectory, reloadAllWidgets, and removable user-interaction/push-token subscriptions",
9321
+ missing: "no WidgetKit home-screen or Lock Screen rendering, Dynamic Island visuals, APNs push or push-to-start tokens, host widget interaction events, app-group files, or timeline persistence across simulator restarts"
9322
+ }
9323
+ ]
9324
+ },
9182
9325
  "@bittingz/expo-widgets": {
9183
9326
  category: "Device & Platform",
9184
9327
  stubType: "native",
@@ -9386,10 +9529,9 @@ var init_registry = __esm({
9386
9529
  versions: [
9387
9530
  {
9388
9531
  range: ">=1.0.0",
9389
- coverage: 0.75,
9390
- note: "native-seam only \u2014 upstream expo module wrapper runs from the bundle; ExpoScreenCornerRadius returns null, the same valid result upstream returns for unknown/unavailable model data",
9391
- working: "getCornerRadiusSync and getCornerRadius",
9392
- missing: "no real UIDevice model identifier lookup from the tenant worker yet"
9532
+ coverage: 1,
9533
+ note: "native-seam only \u2014 the upstream Expo module wrapper runs from the bundle; getCornerRadiusSync and getCornerRadius return the live simulated device's measured display corner radius from the same canonical surface metrics the engine uses to clip its screen. the value follows device switches and is zero for square-screen devices.",
9534
+ working: "getCornerRadiusSync and getCornerRadius with the real per-device radius in points"
9393
9535
  }
9394
9536
  ]
9395
9537
  },
@@ -9649,6 +9791,19 @@ var init_registry = __esm({
9649
9791
  }
9650
9792
  ]
9651
9793
  },
9794
+ "react-native-nitro-fetch": {
9795
+ category: "Networking",
9796
+ stubType: "native",
9797
+ versions: [
9798
+ {
9799
+ range: ">=1.5.4 <2.0.0",
9800
+ coverage: 0.7,
9801
+ note: "published-browser-entry: the package ships native NitroModules code, so SootSim classifies it as native while selecting its own index.web.js and internal .web.js siblings instead of the native transport. The upstream web implementation delegates the primary fetch API to the browser and keeps its public JavaScript helpers; native-only APIs expose the package's documented web warnings and unavailable values.",
9802
+ working: "fetch with browser RequestInfo/RequestInit, AbortSignal, headers, request bodies, redirects, credentials, and browser streaming; upstream Headers, Request, Response, generateCurl, NetworkInspector, nitroFetchOnWorklet JS-thread mapper, and token mapping utilities",
9803
+ missing: "Cronet/URLSession transport details, HTTP/3-specific behavior, native disk/prefetch cache, startup prefetch queue, synchronous off-thread worklet requests, cancellation by native request ID, and encrypted native token-refresh persistence"
9804
+ }
9805
+ ]
9806
+ },
9652
9807
  "react-native-fast-trie": {
9653
9808
  category: "Storage & Data",
9654
9809
  stubType: "native",
@@ -10296,41 +10451,49 @@ var init_registry = __esm({
10296
10451
  }
10297
10452
  });
10298
10453
 
10299
- // ../compat/src/scan.ts
10300
- function detectFramework(deps) {
10301
- if (deps["one"]) return "one";
10302
- if (deps["expo"]) return "expo";
10303
- if (deps["react-native"]) return "bare";
10304
- return "unknown";
10305
- }
10306
- function isRNEcosystemPackage(name) {
10307
- if (NON_RN_PACKAGES.has(name)) return false;
10308
- return name.startsWith("react-native") || name.startsWith("expo-") || name.startsWith("@react-native") || name.startsWith("@shopify/") || name.startsWith("@gorhom/") || name.startsWith("@callstack/") || POLYFILL_REGISTRY[name] !== void 0 || UNSUPPORTABLE.has(name);
10309
- }
10310
- function matchVersion(entry, version) {
10454
+ // ../compat/src/version-range.ts
10455
+ function matchCompatVersion(entry, version) {
10311
10456
  const clean = version.replace(/^[~^>=<\s]+/, "").split("-")[0];
10312
10457
  const [major] = clean.split(".").map(Number);
10313
- for (const v of entry.versions) {
10314
- const parts = v.range.split(" ");
10458
+ for (const candidate of entry.versions) {
10459
+ const parts = candidate.range.split(" ");
10315
10460
  let matches = true;
10316
10461
  for (const part of parts) {
10317
- const m = part.match(/^([><=]+)(\d+)/);
10318
- if (!m) continue;
10319
- const [, op, num] = m;
10320
- const rangeMajor = parseInt(num);
10462
+ const match = part.match(/^([><=]+)(\d+)/);
10463
+ if (!match) continue;
10464
+ const [, op, rawNum] = match;
10465
+ const rangeMajor = parseInt(rawNum);
10321
10466
  if (op === ">=" && major < rangeMajor) matches = false;
10322
10467
  if (op === "<" && major >= rangeMajor) matches = false;
10323
10468
  if (op === ">" && major <= rangeMajor) matches = false;
10324
10469
  if (op === "<=" && major > rangeMajor) matches = false;
10325
10470
  }
10326
- if (matches) return { coverage: v.coverage, note: v.note };
10471
+ if (matches) return { coverage: candidate.coverage, note: candidate.note };
10327
10472
  }
10328
- const last = entry.versions[entry.versions.length - 1];
10473
+ const last = entry.versions.at(-1);
10474
+ if (!last) return null;
10329
10475
  return {
10330
10476
  coverage: last.coverage * 0.5,
10331
10477
  note: `${last.note} (version not explicitly supported)`
10332
10478
  };
10333
10479
  }
10480
+ var init_version_range = __esm({
10481
+ "../compat/src/version-range.ts"() {
10482
+ "use strict";
10483
+ }
10484
+ });
10485
+
10486
+ // ../compat/src/scan.ts
10487
+ function detectFramework(deps) {
10488
+ if (deps["one"]) return "one";
10489
+ if (deps["expo"]) return "expo";
10490
+ if (deps["react-native"]) return "bare";
10491
+ return "unknown";
10492
+ }
10493
+ function isRNEcosystemPackage(name) {
10494
+ if (NON_RN_PACKAGES.has(name)) return false;
10495
+ return name.startsWith("react-native") || name.startsWith("expo-") || name.startsWith("@react-native") || name.startsWith("@shopify/") || name.startsWith("@gorhom/") || name.startsWith("@callstack/") || POLYFILL_REGISTRY[name] !== void 0 || UNSUPPORTABLE.has(name);
10496
+ }
10334
10497
  function scanDeps(pkg) {
10335
10498
  const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };
10336
10499
  const framework = detectFramework(allDeps);
@@ -10369,7 +10532,7 @@ function scanDeps(pkg) {
10369
10532
  });
10370
10533
  continue;
10371
10534
  }
10372
- const match = matchVersion(entry, version);
10535
+ const match = matchCompatVersion(entry, version);
10373
10536
  if (!match) {
10374
10537
  packages.push({
10375
10538
  name,
@@ -10404,6 +10567,7 @@ var init_scan = __esm({
10404
10567
  "../compat/src/scan.ts"() {
10405
10568
  "use strict";
10406
10569
  init_registry();
10570
+ init_version_range();
10407
10571
  NON_RN_PACKAGES = /* @__PURE__ */ new Set([
10408
10572
  "react",
10409
10573
  "react-dom",
@@ -12963,8 +13127,8 @@ var init_agent_sessions = __esm({
12963
13127
 
12964
13128
  // src/agent-identity.ts
12965
13129
  function teamMachineSessionIdFromCliIdentity(identity) {
12966
- if (!identity?.startsWith("AGENTBUS_SESSION:")) return null;
12967
- const sessionId = identity.slice("AGENTBUS_SESSION:".length).trim();
13130
+ if (!identity?.startsWith("TM_SESSION:")) return null;
13131
+ const sessionId = identity.slice("TM_SESSION:".length).trim();
12968
13132
  if (!TEAM_MACHINE_SESSION_RE.test(sessionId)) return null;
12969
13133
  return sessionId;
12970
13134
  }
@@ -16399,7 +16563,7 @@ var init_current_sim = __esm({
16399
16563
  IDENTITY_ENV_VARS = [
16400
16564
  "SOOTSIM_CLI_IDENTITY",
16401
16565
  // explicit override — fastest path, skips all pid lookups
16402
- "AGENTBUS_SESSION",
16566
+ "TM_SESSION",
16403
16567
  // Team Machine session id; routes prompt-bar followups back to this agent
16404
16568
  "CLAUDE_CODE_SESSION_ID",
16405
16569
  // claude code, if ever set
@@ -17520,7 +17684,7 @@ async function getShellState(bridge, readyTimeoutMs = 0) {
17520
17684
  }
17521
17685
  }
17522
17686
  }
17523
- var LAYOUT_GET_NATIVE_EVAL, WAIT_READY_PROBE, READY_CONTENT_NODE_FLOOR, READY_NODE_STABLE_MS;
17687
+ var LAYOUT_GET_NATIVE_EVAL, WAIT_READY_PROBE, READY_CONTENT_NODE_FLOOR, READY_NODE_STABLE_MS, READY_PROBE_POLL_MS;
17524
17688
  var init_core = __esm({
17525
17689
  "cli/commands/inspect/core.ts"() {
17526
17690
  "use strict";
@@ -17665,6 +17829,7 @@ var init_core = __esm({
17665
17829
  })()`;
17666
17830
  READY_CONTENT_NODE_FLOOR = 100;
17667
17831
  READY_NODE_STABLE_MS = 750;
17832
+ READY_PROBE_POLL_MS = 150;
17668
17833
  }
17669
17834
  });
17670
17835
 
@@ -18667,7 +18832,7 @@ var init_bridge_flow_runner = __esm({
18667
18832
  ` [flow] waiting for app to be ready\u2026 (${Math.round(elapsed / 1e3)}s)`
18668
18833
  );
18669
18834
  }
18670
- await sleep2(500);
18835
+ await sleep2(READY_PROBE_POLL_MS);
18671
18836
  }
18672
18837
  if (lastError?.message.startsWith("app failed to load:")) {
18673
18838
  throw lastError;
@@ -19706,18 +19871,10 @@ var init_bridge_flow_runner = __esm({
19706
19871
  if (!this.firstLaunchDone && !wantsClear) {
19707
19872
  this.firstLaunchDone = true;
19708
19873
  if (wantsResetRuntime) {
19709
- const startingShellState = await getShellState(this.bridge).catch(() => null);
19710
- const shouldReturnHome = startingShellState?.state === "home" && startingShellState.activeApp == null;
19874
+ const launched = await this.launchShellAppFromHomeIfNeeded(opts);
19875
+ if (launched) await this.waitForTree(12e4);
19711
19876
  await this.softReloadGuestApp(false);
19712
19877
  await this.waitForTree(12e4);
19713
- if (shouldReturnHome) {
19714
- await callShellCommandWhenReady(this.bridge, "goHome", 1e3);
19715
- await this.waitForShellHome(1e3);
19716
- }
19717
- await this.launchShellAppFromHomeIfNeeded(
19718
- opts,
19719
- shouldReturnHome ? { ...startingShellState ?? {}, state: "home", activeApp: null } : null
19720
- );
19721
19878
  } else {
19722
19879
  await this.launchShellAppFromHomeIfNeeded(opts);
19723
19880
  }
@@ -19790,26 +19947,12 @@ var init_bridge_flow_runner = __esm({
19790
19947
  await sleep2(16);
19791
19948
  }
19792
19949
  }
19793
- async waitForShellHome(timeoutMs) {
19794
- const deadline = Date.now() + timeoutMs;
19795
- while (Date.now() < deadline) {
19796
- const state = await getShellState(this.bridge).catch(() => null);
19797
- if (state?.state === "home" && state.activeApp == null && state.showSwitcher === false) {
19798
- return;
19799
- }
19800
- await sleep2(16);
19801
- }
19802
- }
19803
- async launchShellAppFromHomeIfNeeded(opts, knownHomeState) {
19950
+ async launchShellAppFromHomeIfNeeded(opts) {
19804
19951
  let state = null;
19805
- if (knownHomeState) {
19806
- state = knownHomeState;
19807
- } else {
19808
- try {
19809
- state = await getShellState(this.bridge);
19810
- } catch {
19811
- return false;
19812
- }
19952
+ try {
19953
+ state = await getShellState(this.bridge);
19954
+ } catch {
19955
+ return false;
19813
19956
  }
19814
19957
  if (state?.state !== "home" || state.activeApp != null) return false;
19815
19958
  const appId = this.resolveShellLaunchAppId(opts, state);