sootsim 0.1.238 → 0.1.240

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 (144) hide show
  1. package/dist-cli/bin.js +4 -4
  2. package/dist-cli/chunks/{agent-VQVLJBBZ.js → agent-YS355M7O.js} +2 -2
  3. package/dist-cli/chunks/{agent-wrapper-ABFE7KJQ.js → agent-wrapper-DJJH2DE5.js} +2 -2
  4. package/dist-cli/chunks/{app-fonts-ODI2DJ7C.js → app-fonts-2KURCNO7.js} +2 -2
  5. package/dist-cli/chunks/{assert-ZXNN3U2C.js → assert-Y7SV6LAY.js} +2 -2
  6. package/dist-cli/chunks/{auth-LMHWH6T3.js → auth-5VMBSD6F.js} +2 -2
  7. package/dist-cli/chunks/beta-KMI4GCCN.js +2 -0
  8. package/dist-cli/chunks/{camera-VWTIE3VW.js → camera-WCQNMZRH.js} +2 -2
  9. package/dist-cli/chunks/{chunk-EGRRMDLA.js → chunk-2QILUPQJ.js} +1 -1
  10. package/dist-cli/chunks/{chunk-D5LYVGSE.js → chunk-2ZEVD46I.js} +3 -3
  11. package/dist-cli/chunks/{chunk-XUOCSWW4.js → chunk-3RYTIG4Y.js} +1 -1
  12. package/dist-cli/chunks/{chunk-XWGGIFDB.js → chunk-3ULI43M6.js} +16 -8
  13. package/dist-cli/chunks/{chunk-CDAMSEOW.js → chunk-4F63QBYN.js} +3 -3
  14. package/dist-cli/chunks/{chunk-6UMCNLKY.js → chunk-4FUKKXDQ.js} +2 -2
  15. package/dist-cli/chunks/{chunk-SCLKEUCN.js → chunk-5LCZXDDX.js} +1 -1
  16. package/dist-cli/chunks/{chunk-2PFG3UHP.js → chunk-6XHVSTMH.js} +2 -2
  17. package/dist-cli/chunks/{chunk-MT2HMCDI.js → chunk-7ZTOWAQF.js} +2 -2
  18. package/dist-cli/chunks/{chunk-6PYVHZVH.js → chunk-AX56F2Z5.js} +1 -1
  19. package/dist-cli/chunks/{chunk-IHEPAACR.js → chunk-BWR3AJZ3.js} +1 -1
  20. package/dist-cli/chunks/{chunk-2FFZXFDY.js → chunk-C4MSUAGM.js} +1 -1
  21. package/dist-cli/chunks/{chunk-LYSW5PTM.js → chunk-DEO54ZY3.js} +2 -2
  22. package/dist-cli/chunks/{chunk-HTTHCQQS.js → chunk-DQEI7LOC.js} +3 -3
  23. package/dist-cli/chunks/{chunk-HC6JXVIP.js → chunk-EJ6ULQFO.js} +2 -2
  24. package/dist-cli/chunks/{chunk-MD5GBDM4.js → chunk-GI36DI2I.js} +1 -1
  25. package/dist-cli/chunks/{chunk-6KMMJDSE.js → chunk-GW7REFUB.js} +1 -1
  26. package/dist-cli/chunks/{chunk-XOKMWX3P.js → chunk-GYWIGJB7.js} +2 -2
  27. package/dist-cli/chunks/{chunk-CXV3CSSF.js → chunk-H6GS5C4F.js} +2 -2
  28. package/dist-cli/chunks/{chunk-UYFE2VRP.js → chunk-HIFBYPJK.js} +2 -2
  29. package/dist-cli/chunks/{chunk-CU7M5IBW.js → chunk-ILU6JNUJ.js} +1 -1
  30. package/dist-cli/chunks/{chunk-5MQZW32V.js → chunk-JDRG4T3G.js} +2 -2
  31. package/dist-cli/chunks/{chunk-ECCUSCHO.js → chunk-KENWUOKC.js} +2 -2
  32. package/dist-cli/chunks/{chunk-7OQU5M3J.js → chunk-KY2HHVDG.js} +2 -2
  33. package/dist-cli/chunks/{chunk-OHLPCYOM.js → chunk-LBOSTYWQ.js} +1 -1
  34. package/dist-cli/chunks/{chunk-4DN5YMPS.js → chunk-M2MJXMTO.js} +1 -1
  35. package/dist-cli/chunks/{chunk-QGCNRLCM.js → chunk-M2OTE66X.js} +2 -2
  36. package/dist-cli/chunks/{chunk-5MFTB3S4.js → chunk-M3VY5LEN.js} +1 -1
  37. package/dist-cli/chunks/{chunk-NCJGR7VZ.js → chunk-NJYDI627.js} +1 -1
  38. package/dist-cli/chunks/{chunk-YK4NG4BL.js → chunk-OBQJXFV3.js} +1 -1
  39. package/dist-cli/chunks/{chunk-GI4YPHU6.js → chunk-OKHNWLZ7.js} +2 -2
  40. package/dist-cli/chunks/{chunk-CGQTOBHQ.js → chunk-OUW757HM.js} +128 -87
  41. package/dist-cli/chunks/chunk-R54EGANH.js +1 -0
  42. package/dist-cli/chunks/{chunk-54XALXOI.js → chunk-SFNTUDIP.js} +2 -2
  43. package/dist-cli/chunks/{chunk-KGAN3JXK.js → chunk-SW5HPJC7.js} +2 -2
  44. package/dist-cli/chunks/{chunk-YNSDDYLM.js → chunk-T7BLBFPG.js} +2 -2
  45. package/dist-cli/chunks/{chunk-3KVQ35TN.js → chunk-TFXCEOCW.js} +1 -1
  46. package/dist-cli/chunks/chunk-U3VMQUN6.js +1 -0
  47. package/dist-cli/chunks/{chunk-RTMLR7KA.js → chunk-VU5WTUZJ.js} +2 -2
  48. package/dist-cli/chunks/{chunk-DMSG7ESJ.js → chunk-WYT6JDAV.js} +1 -1
  49. package/dist-cli/chunks/{chunk-A46S76WN.js → chunk-XSSTKHK7.js} +2 -2
  50. package/dist-cli/chunks/{chunk-4DPHH2DS.js → chunk-XV4VXQDA.js} +2 -2
  51. package/dist-cli/chunks/{chunk-VTY35NKD.js → chunk-XVE2O2IR.js} +2 -2
  52. package/dist-cli/chunks/{chunk-QGFPGXNJ.js → chunk-ZYMOUSJC.js} +1 -1
  53. package/dist-cli/chunks/cli-version-2BXTYTLJ.js +2 -0
  54. package/dist-cli/chunks/{compat-JZPFXICF.js → compat-LUERFKMW.js} +3 -3
  55. package/dist-cli/chunks/{config-UL7HLQDC.js → config-U4Z6TYT6.js} +2 -2
  56. package/dist-cli/chunks/{control-QKU5C5S2.js → control-I5YB63IZ.js} +2 -2
  57. package/dist-cli/chunks/daemon-VTG3XKWA.js +2 -0
  58. package/dist-cli/chunks/{debug-H5DH3AQF.js → debug-HXECWDLV.js} +3 -3
  59. package/dist-cli/chunks/{desktop-6KNJHXC3.js → desktop-NZJLDJIO.js} +3 -3
  60. package/dist-cli/chunks/{detox-GGHGQ4ZT.js → detox-LUOT4TIA.js} +2 -2
  61. package/dist-cli/chunks/{device-BRDNCJVC.js → device-7TZ7BD36.js} +2 -2
  62. package/dist-cli/chunks/{diagnose-YYUH2HKW.js → diagnose-DW2ANEGF.js} +2 -2
  63. package/dist-cli/chunks/drivers-RDXY5SDO.js +2 -0
  64. package/dist-cli/chunks/{film-ZCOJKWH3.js → film-6MYMKZ3N.js} +3 -3
  65. package/dist-cli/chunks/flow-KS77CBEA.js +2 -0
  66. package/dist-cli/chunks/help-H3ZD3LVG.js +2 -0
  67. package/dist-cli/chunks/{hidden-runtime-alias-FKPQZHNW.js → hidden-runtime-alias-FUDVEMFB.js} +2 -2
  68. package/dist-cli/chunks/{home-paths-XVONOHWM.js → home-paths-KU4MY22X.js} +2 -2
  69. package/dist-cli/chunks/inspect-ACDDO276.js +2 -0
  70. package/dist-cli/chunks/install-desktop-UQVXJAXS.js +2 -0
  71. package/dist-cli/chunks/{login-4DXNKRVF.js → login-EVS4SZQN.js} +4 -4
  72. package/dist-cli/chunks/{logout-ARENLQQ5.js → logout-K5MLSAWM.js} +2 -2
  73. package/dist-cli/chunks/{maestro-G7VNKI32.js → maestro-OEDT2T7V.js} +3 -3
  74. package/dist-cli/chunks/{maestro-generate-U3YRKKPN.js → maestro-generate-T4RZSVSM.js} +3 -3
  75. package/dist-cli/chunks/{mode-FNLKDZKM.js → mode-TZU7JML2.js} +2 -2
  76. package/dist-cli/chunks/optional-demo-registry-NIJ3MA5N.js +2 -0
  77. package/dist-cli/chunks/{perf-C3O4QGRB.js → perf-YNBU57WH.js} +2 -2
  78. package/dist-cli/chunks/{record-YEOZEOTK.js → record-V6T2INPF.js} +3 -3
  79. package/dist-cli/chunks/runtime-7XBSKGNO.js +2 -0
  80. package/dist-cli/chunks/{screenshot-command-CCVMBNZ7.js → screenshot-command-CZZ6IXSD.js} +3 -3
  81. package/dist-cli/chunks/{screenshots-capture-GIVPWSQG.js → screenshots-capture-WVR5FCHX.js} +2 -2
  82. package/dist-cli/chunks/serve-6I35UUFI.js +41 -0
  83. package/dist-cli/chunks/{setup-OQ7EMGIY.js → setup-O7GD6GME.js} +3 -3
  84. package/dist-cli/chunks/{skills-Z25AHTRM.js → skills-GBTBS2OK.js} +2 -2
  85. package/dist-cli/chunks/{storage-EDYGSOMU.js → storage-FI2YOPQE.js} +2 -2
  86. package/dist-cli/chunks/store-FU7T5NPV.js +2 -0
  87. package/dist-cli/chunks/telemetry-REPVX6LA.js +2 -0
  88. package/dist-cli/chunks/{timeline-FTAZATIZ.js → timeline-E5DVVATK.js} +2 -2
  89. package/dist-cli/chunks/{upgrade-JBRL4AHX.js → upgrade-QKOI3Q4U.js} +2 -2
  90. package/dist-cli/chunks/upload-IFQM3FG4.js +2 -0
  91. package/dist-cli/chunks/{version-H6PRWWUE.js → version-UANAPNZM.js} +2 -2
  92. package/dist-cli/chunks/web-4LZ7DUUS.js +2 -0
  93. package/dist-cli/chunks/{what-happened-A7IDSBXP.js → what-happened-JOLNICMX.js} +2 -2
  94. package/dist-lib/agent-daemon-client.cjs +1 -1
  95. package/dist-lib/agent-events.cjs +1 -1
  96. package/dist-lib/agent-identity.cjs +1 -1
  97. package/dist-lib/agent-sessions.cjs +1 -1
  98. package/dist-lib/attached-projects.cjs +1 -1
  99. package/dist-lib/auth/shared-session.cjs +1 -1
  100. package/dist-lib/backend-origin.cjs +1 -1
  101. package/dist-lib/beta.cjs +1 -1
  102. package/dist-lib/beta.mjs +1 -1
  103. package/dist-lib/bridge-constants.cjs +1 -1
  104. package/dist-lib/cli-constants.cjs +1 -1
  105. package/dist-lib/config.cjs +1 -1
  106. package/dist-lib/detox/index.cjs +1 -1
  107. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  108. package/dist-lib/home-paths.cjs +1 -1
  109. package/dist-lib/host/bridge-host.cjs +77 -33
  110. package/dist-lib/host/fetch-proxy-handler.cjs +77 -33
  111. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  112. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  113. package/dist-lib/host/websocket-proxy.cjs +1 -1
  114. package/dist-lib/index.cjs +1 -1
  115. package/dist-lib/jump-to-source-babel.cjs +1 -1
  116. package/dist-lib/menu.cjs +1 -1
  117. package/dist-lib/menu.mjs +1 -1
  118. package/dist-lib/metro.cjs +1 -1
  119. package/dist-lib/profiles.cjs +1 -1
  120. package/dist-lib/render-mode.cjs +1 -1
  121. package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
  122. package/dist-lib/sdk.cjs +91 -4
  123. package/dist-lib/sdk.mjs +91 -4
  124. package/dist-lib/skills.cjs +105 -40
  125. package/dist-lib/vite.cjs +1 -1
  126. package/package.json +1 -1
  127. package/src/host/fetch-proxy-handler.ts +104 -52
  128. package/dist-cli/chunks/beta-TN34R6YC.js +0 -2
  129. package/dist-cli/chunks/chunk-QAKSIRZO.js +0 -1
  130. package/dist-cli/chunks/chunk-UV4NF53M.js +0 -1
  131. package/dist-cli/chunks/cli-version-JMIF5EGD.js +0 -2
  132. package/dist-cli/chunks/daemon-IREYS2N7.js +0 -2
  133. package/dist-cli/chunks/drivers-IHDBZZUB.js +0 -2
  134. package/dist-cli/chunks/flow-TXWXTHAY.js +0 -2
  135. package/dist-cli/chunks/help-TAORLP73.js +0 -2
  136. package/dist-cli/chunks/inspect-ALJUDST3.js +0 -2
  137. package/dist-cli/chunks/install-desktop-W5JGGPCV.js +0 -2
  138. package/dist-cli/chunks/optional-demo-registry-Y5KQWQ6V.js +0 -2
  139. package/dist-cli/chunks/runtime-VCWHZCYU.js +0 -2
  140. package/dist-cli/chunks/serve-KYU7THWX.js +0 -41
  141. package/dist-cli/chunks/store-BP3EICTQ.js +0 -2
  142. package/dist-cli/chunks/telemetry-K2S6RLSW.js +0 -2
  143. package/dist-cli/chunks/upload-JVFQZS5Z.js +0 -2
  144. package/dist-cli/chunks/web-D45A6FKK.js +0 -2
package/dist-lib/sdk.mjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.238 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.240 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // cli/commands/inspect/core.ts
4
4
  function resolveMaxMsFlag(args, fallbackMs) {
@@ -250,6 +250,14 @@ function layoutGetNativeEval(opts = {}) {
250
250
  const abs = n.absolute || n.absolutePosition || { x: layout.x, y: layout.y }
251
251
  const text = typeof n.text === 'string' && n.text.trim() ? n.text.trim() : undefined
252
252
  const base = {
253
+ ...(typeof n.nodeId === 'number'
254
+ ? {
255
+ nodeId: n.nodeId,
256
+ ancestorIds: Array.isArray(n.ancestors)
257
+ ? n.ancestors.map((ancestor) => ancestor && ancestor.nodeId).filter((id) => typeof id === 'number')
258
+ : [],
259
+ }
260
+ : {}),
253
261
  testID: n.testID || n.testId || undefined,
254
262
  role: n.accessibilityRole || n.role || undefined,
255
263
  type: typeof n.type === 'string' ? n.type : 'node',
@@ -959,7 +967,13 @@ async function inspectScrollStateAt(bridge, x, y) {
959
967
  path: "__sootsimTest.getScrollStateAt",
960
968
  args: [x, y]
961
969
  });
962
- return result && typeof result === "object" ? result : null;
970
+ if (!result || typeof result !== "object") return null;
971
+ const state = result;
972
+ return {
973
+ ...state,
974
+ scrollOffsetX: typeof state.scrollOffsetX === "number" ? state.scrollOffsetX : state.offsetX,
975
+ scrollOffsetY: typeof state.scrollOffsetY === "number" ? state.scrollOffsetY : state.offsetY
976
+ };
963
977
  }
964
978
  async function inspectLogs(bridge) {
965
979
  const res = await bridge.send({
@@ -1469,6 +1483,7 @@ function tapTiming(agent, opts = {}) {
1469
1483
  }
1470
1484
  function isTapSuccess(result) {
1471
1485
  if (!result || result.hit === false || result.ok === false) return false;
1486
+ if (result.requestedTargetMatched === false) return false;
1472
1487
  if (result.pointerTapHandled === false && !result.keyboardOpened && !result.isTextInput) {
1473
1488
  return false;
1474
1489
  }
@@ -1476,6 +1491,7 @@ function isTapSuccess(result) {
1476
1491
  }
1477
1492
  function tapTargetFromPayload(payload, textFallback) {
1478
1493
  return {
1494
+ nodeId: payload.target?.nodeId ?? payload.match?.nodeId ?? payload.node?.nodeId ?? null,
1479
1495
  id: payload.target?.id ?? payload.match?.id ?? payload.node?.id ?? null,
1480
1496
  testID: payload.target?.testID ?? payload.match?.testID ?? payload.node?.testID ?? null,
1481
1497
  text: payload.target?.text ?? payload.target?.accessibilityLabel ?? payload.match?.text ?? payload.match?.accessibilityLabel ?? payload.node?.text ?? textFallback ?? null,
@@ -1521,12 +1537,83 @@ async function tapResolvedTarget(bridge, args) {
1521
1537
  lastOffscreenAt = at;
1522
1538
  } else {
1523
1539
  lastOffscreenAt = null;
1524
- const result = await bridge.send({
1540
+ const requestedTarget = tapTargetFromPayload(payload, args.textFallback);
1541
+ const verification = await bridge.send({
1542
+ type: "evaluate",
1543
+ code: `(async () => {
1544
+ const t = window.__sootsimTest
1545
+ if (
1546
+ !t ||
1547
+ typeof t.inspectAt !== 'function' ||
1548
+ typeof t.resolveTapTarget !== 'function'
1549
+ ) {
1550
+ return { error: 'tap-target-inspection-unavailable' }
1551
+ }
1552
+ const requestedTarget = ${JSON.stringify(requestedTarget)}
1553
+ const inspected = await t.inspectAt(${payload.cx}, ${payload.cy})
1554
+ const resolved =
1555
+ inspected && typeof inspected.nodeId === 'number'
1556
+ ? await t.resolveTapTarget(inspected.nodeId)
1557
+ : null
1558
+ const node = (resolved && resolved.target) || inspected
1559
+ const coordinateTarget = node
1560
+ ? {
1561
+ nodeId: node.nodeId ?? null,
1562
+ id: node.id ?? null,
1563
+ testID: node.testID ?? null,
1564
+ text: node.text ?? node.accessibilityLabel ?? null,
1565
+ type: node.type ?? null,
1566
+ }
1567
+ : null
1568
+ const requestedTargetMatched =
1569
+ coordinateTarget === null
1570
+ ? false
1571
+ : typeof requestedTarget.nodeId === 'number' &&
1572
+ typeof coordinateTarget.nodeId === 'number'
1573
+ ? requestedTarget.nodeId === coordinateTarget.nodeId
1574
+ : requestedTarget.testID && coordinateTarget.testID
1575
+ ? requestedTarget.testID === coordinateTarget.testID
1576
+ : requestedTarget.id && coordinateTarget.id
1577
+ ? requestedTarget.id === coordinateTarget.id
1578
+ : false
1579
+ return {
1580
+ requestedTargetMatched,
1581
+ requestedTarget,
1582
+ coordinateTarget,
1583
+ }
1584
+ })()`
1585
+ });
1586
+ if (verification?.error) {
1587
+ return {
1588
+ payload,
1589
+ result: {
1590
+ hit: false,
1591
+ reason: verification.error,
1592
+ requestedTarget
1593
+ },
1594
+ attempts,
1595
+ failure: "special"
1596
+ };
1597
+ }
1598
+ if (verification?.requestedTargetMatched === false) {
1599
+ return {
1600
+ payload,
1601
+ result: {
1602
+ hit: false,
1603
+ reason: "target-covered",
1604
+ ...verification
1605
+ },
1606
+ attempts,
1607
+ failure: "missed"
1608
+ };
1609
+ }
1610
+ const dispatched = await bridge.send({
1525
1611
  type: "tap",
1526
1612
  x: payload.cx,
1527
1613
  y: payload.cy,
1528
- target: tapTargetFromPayload(payload, args.textFallback)
1614
+ target: requestedTarget
1529
1615
  });
1616
+ const result = dispatched && typeof dispatched === "object" ? { ...dispatched, ...verification } : { hit: !!dispatched, ...verification };
1530
1617
  lastResult = result;
1531
1618
  if (isTapSuccess(result)) return { payload, result, attempts };
1532
1619
  }
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.238 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.240 | (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;
@@ -498,10 +498,10 @@ var init_registry = __esm({
498
498
  { range: ">=3.0.0 <4.0.0", coverage: 0.6, note: "basic screen container" },
499
499
  {
500
500
  range: ">=4.0.0",
501
- coverage: 0.87,
501
+ coverage: 0.9,
502
502
  note: "screen container, stack, header config, search bar, navigation props",
503
- 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, crossfade), useHeaderHeight, useTransitionProgress, FullWindowOverlay, SearchBar, Tabs.Host/Screen, lifecycle callbacks (onAppear/onDisappear/onWillAppear/onWillDisappear), onDismissed",
504
- missing: "statusBarColor/navigationBarColor/navigationBarTranslucent ignored, replaceAnimation differentiation, formSheet detent fidelity, integrated search bar placements"
503
+ 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",
504
+ missing: "statusBarColor/navigationBarColor/navigationBarTranslucent ignored, replaceAnimation differentiation, interactive drag between formSheet detents, integrated search bar placements"
505
505
  }
506
506
  ]
507
507
  },
@@ -3844,6 +3844,19 @@ var init_registry = __esm({
3844
3844
  ]
3845
3845
  },
3846
3846
  // --- react-navigation: pure JS, runs as-is on top of stubbed screens/gesture-handler/safe-area ---
3847
+ "@vxrn/native": {
3848
+ category: "Navigation",
3849
+ stubType: "native",
3850
+ versions: [
3851
+ {
3852
+ range: ">=1.21.0",
3853
+ coverage: 0.72,
3854
+ note: "native-seam only for toolbar/menu host views. the real @vxrn/native StackToolbar and MenuAction React code runs from the bundle and converts its public composition API into native host props and native-stack header items.",
3855
+ working: "StackToolbar header and bottom placements, Button, Label, Icon with SF Symbols/image sources, Badge, fixed/fluid Spacer, View children, nested Menu/MenuAction trees, disabled/selected/destructive actions, visible action callbacks, and native-stack header bar item integration",
3856
+ missing: "Color and zoom-transition native hosts, SplitView gamma host, bottom SearchBarSlot integration with a configured native search controller, exact UIKit shared-background grouping"
3857
+ }
3858
+ ]
3859
+ },
3847
3860
  "@react-navigation/native": {
3848
3861
  category: "Navigation",
3849
3862
  stubType: "works",
@@ -3862,10 +3875,10 @@ var init_registry = __esm({
3862
3875
  versions: [
3863
3876
  {
3864
3877
  range: ">=6.0.0",
3865
- coverage: 0.9,
3878
+ coverage: 0.93,
3866
3879
  note: "pure JS wrapper around react-native-screens (stubbed); push/pop, header, modals, large titles all flow through screens stub",
3867
- working: "createNativeStackNavigator, Screen, Group, Navigator, header config (title, back button, large title, search bar, custom left/right), Android modal/pageSheet push fallback, modal/formSheet/pageSheet presentation, push/pop animations, gesture-driven back, freezeOnBlur via react-native-screens, useHeaderHeight",
3868
- missing: "fidelity bound by react-native-screens stub \u2014 formSheet detent fidelity, search bar placements"
3880
+ working: "createNativeStackNavigator, Screen, Group, Navigator, header config (title, back button, large title, search bar, custom left/right, unstable native header button/menu items), Android modal/pageSheet push fallback, modal/formSheet/pageSheet presentation, formSheet initial custom detents/corner radius/grabber/undimmed range and stacked sheets, push/pop animations, gesture-driven back, freezeOnBlur via react-native-screens, useHeaderHeight",
3881
+ missing: "fidelity bound by react-native-screens stub \u2014 interactive drag between formSheet detents and integrated search bar placements"
3869
3882
  }
3870
3883
  ]
3871
3884
  },
@@ -12881,12 +12894,6 @@ function formatFetchProxyError(targetUrl, err) {
12881
12894
  }
12882
12895
  return message;
12883
12896
  }
12884
- function isTextProxyContentType(contentType) {
12885
- const value = Array.isArray(contentType) ? contentType[0] : contentType;
12886
- const normalized = value?.split(";", 1)[0]?.trim().toLowerCase();
12887
- if (!normalized) return false;
12888
- return normalized.startsWith("text/") || normalized === "application/json" || normalized.endsWith("+json") || normalized === "application/x-www-form-urlencoded" || normalized === "application/xml" || normalized.endsWith("+xml") || normalized === "application/javascript" || normalized === "application/graphql";
12889
- }
12890
12897
  function buildFetchProxyHeaders(reqHeaders, targetUrl) {
12891
12898
  const headers = {};
12892
12899
  for (const [key, value] of Object.entries(reqHeaders)) {
@@ -12945,7 +12952,6 @@ async function handleFetchProxyRequest(req, res) {
12945
12952
  res.end("invalid url param");
12946
12953
  return;
12947
12954
  }
12948
- const headers = buildFetchProxyHeaders(req.headers, upstreamUrl);
12949
12955
  let body;
12950
12956
  if (req.method !== "GET" && req.method !== "HEAD") {
12951
12957
  const chunks = [];
@@ -12953,39 +12959,89 @@ async function handleFetchProxyRequest(req, res) {
12953
12959
  chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
12954
12960
  }
12955
12961
  if (chunks.length > 0) {
12956
- const bytes = Buffer.concat(chunks);
12957
- body = isTextProxyContentType(req.headers["content-type"]) ? bytes.toString("utf8") : bytes;
12962
+ body = Buffer.concat(chunks);
12958
12963
  }
12959
12964
  }
12960
- let upstream;
12961
- try {
12962
- upstream = await fetch(upstreamUrl.href, {
12963
- method: req.method,
12964
- headers,
12965
- body,
12966
- redirect: "follow"
12965
+ const originalMethod = req.method || "GET";
12966
+ const proxy = async (targetUrl2, method, nextBody, redirects) => {
12967
+ const transport = targetUrl2.protocol === "https:" ? import_https.default : import_http2.default;
12968
+ const targetHeaders = buildFetchProxyHeaders(req.headers, targetUrl2);
12969
+ if (targetUrl2.origin !== upstreamUrl.origin) {
12970
+ delete targetHeaders.authorization;
12971
+ delete targetHeaders["proxy-authorization"];
12972
+ }
12973
+ if (method === "GET" || method === "HEAD") {
12974
+ delete targetHeaders["content-length"];
12975
+ delete targetHeaders["content-type"];
12976
+ } else if (nextBody) {
12977
+ targetHeaders["content-length"] = String(nextBody.byteLength);
12978
+ }
12979
+ const proxyRes = await new Promise((resolve5, reject) => {
12980
+ const proxyReq = transport.request(
12981
+ {
12982
+ hostname: targetUrl2.hostname,
12983
+ port: targetUrl2.port || (targetUrl2.protocol === "https:" ? 443 : 80),
12984
+ path: targetUrl2.pathname + targetUrl2.search,
12985
+ method,
12986
+ headers: targetHeaders
12987
+ },
12988
+ resolve5
12989
+ );
12990
+ const abort = () => proxyReq.destroy(new Error("fetch proxy client disconnected"));
12991
+ req.once("aborted", abort);
12992
+ proxyReq.once("close", () => req.off("aborted", abort));
12993
+ proxyReq.once("error", reject);
12994
+ if (nextBody === void 0) proxyReq.end();
12995
+ else proxyReq.end(nextBody);
12967
12996
  });
12997
+ const status = proxyRes.statusCode ?? 502;
12998
+ const location = proxyRes.headers.location;
12999
+ if (location && (status === 301 || status === 302 || status === 303 || status === 307 || status === 308)) {
13000
+ if (redirects >= 10) {
13001
+ proxyRes.destroy();
13002
+ throw new Error("too many redirects");
13003
+ }
13004
+ const switchToGet = (status === 301 || status === 302) && method === "POST" || status === 303 && method !== "GET" && method !== "HEAD";
13005
+ const redirectUrl = new URL(location, targetUrl2);
13006
+ proxyRes.resume();
13007
+ await (0, import_promises2.finished)(proxyRes);
13008
+ await proxy(
13009
+ redirectUrl,
13010
+ switchToGet ? "GET" : method,
13011
+ switchToGet ? void 0 : nextBody,
13012
+ redirects + 1
13013
+ );
13014
+ return;
13015
+ }
13016
+ for (const [key, value] of Object.entries(proxyRes.headers)) {
13017
+ const lowerKey = key.toLowerCase();
13018
+ if (value === void 0 || lowerKey === "set-cookie" || lowerKey === "connection" || lowerKey === "keep-alive" || lowerKey === "proxy-authenticate" || lowerKey === "proxy-authorization" || lowerKey === "te" || lowerKey === "trailer" || lowerKey === "transfer-encoding" || lowerKey === "upgrade" || lowerKey.startsWith("access-control-")) {
13019
+ continue;
13020
+ }
13021
+ res.setHeader(key, value);
13022
+ }
13023
+ applyFetchProxyCors(res);
13024
+ const setCookie = proxyRes.headers["set-cookie"] ?? [];
13025
+ if (setCookie.length > 0) {
13026
+ res.setHeader(
13027
+ "x-sootsim-set-cookie",
13028
+ (Array.isArray(setCookie) ? setCookie : [setCookie]).join(", ")
13029
+ );
13030
+ }
13031
+ res.statusCode = status;
13032
+ await (0, import_promises2.pipeline)(proxyRes, res);
13033
+ };
13034
+ try {
13035
+ await proxy(upstreamUrl, originalMethod, body, 0);
12968
13036
  } catch (err) {
13037
+ if (res.headersSent) {
13038
+ res.destroy(err instanceof Error ? err : new Error(String(err)));
13039
+ return;
13040
+ }
12969
13041
  applyFetchProxyCors(res);
12970
13042
  res.writeHead(502, { "Content-Type": "text/plain" });
12971
13043
  res.end(`fetch proxy error: ${formatFetchProxyError(upstreamUrl.href, err)}`);
12972
- return;
12973
13044
  }
12974
- upstream.headers.forEach((value, key) => {
12975
- const lowerKey = key.toLowerCase();
12976
- if (lowerKey === "content-encoding" || lowerKey === "transfer-encoding" || lowerKey === "content-length" || lowerKey === "set-cookie" || lowerKey.startsWith("access-control-")) {
12977
- return;
12978
- }
12979
- res.setHeader(key, value);
12980
- });
12981
- applyFetchProxyCors(res);
12982
- const setCookie = upstream.headers.getSetCookie?.() ?? [];
12983
- if (setCookie.length > 0) {
12984
- res.setHeader("x-sootsim-set-cookie", setCookie.join(", "));
12985
- }
12986
- res.statusCode = upstream.status;
12987
- const buf = Buffer.from(await upstream.arrayBuffer());
12988
- res.end(buf);
12989
13045
  }
12990
13046
  function handleAppApiRequest(req, res) {
12991
13047
  const reqUrl = req.url || "";
@@ -13055,12 +13111,13 @@ function handleAppApiRequest(req, res) {
13055
13111
  req.pipe(proxyReq);
13056
13112
  return true;
13057
13113
  }
13058
- var import_http2, import_https, STRIP_FETCH_PROXY_HEADERS, FETCH_PROXY_CORS_HEADERS, APP_API_HEADER_REWRITES;
13114
+ var import_http2, import_https, import_promises2, STRIP_FETCH_PROXY_HEADERS, FETCH_PROXY_CORS_HEADERS, APP_API_HEADER_REWRITES;
13059
13115
  var init_fetch_proxy_handler = __esm({
13060
13116
  "src/host/fetch-proxy-handler.ts"() {
13061
13117
  "use strict";
13062
13118
  import_http2 = __toESM(require("http"), 1);
13063
13119
  import_https = __toESM(require("https"), 1);
13120
+ import_promises2 = require("stream/promises");
13064
13121
  init_fetch_proxy_overrides();
13065
13122
  STRIP_FETCH_PROXY_HEADERS = /* @__PURE__ */ new Set([
13066
13123
  "host",
@@ -16476,6 +16533,14 @@ function layoutGetNativeEval(opts = {}) {
16476
16533
  const abs = n.absolute || n.absolutePosition || { x: layout.x, y: layout.y }
16477
16534
  const text = typeof n.text === 'string' && n.text.trim() ? n.text.trim() : undefined
16478
16535
  const base = {
16536
+ ...(typeof n.nodeId === 'number'
16537
+ ? {
16538
+ nodeId: n.nodeId,
16539
+ ancestorIds: Array.isArray(n.ancestors)
16540
+ ? n.ancestors.map((ancestor) => ancestor && ancestor.nodeId).filter((id) => typeof id === 'number')
16541
+ : [],
16542
+ }
16543
+ : {}),
16479
16544
  testID: n.testID || n.testId || undefined,
16480
16545
  role: n.accessibilityRole || n.role || undefined,
16481
16546
  type: typeof n.type === 'string' ? n.type : 'node',
package/dist-lib/vite.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.238 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.240 | (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;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sootsim",
3
- "version": "0.1.238",
3
+ "version": "0.1.240",
4
4
  "description": "sootsim CLI + vite/metro plugins + skills registry. bridge client for driving the proprietary sootsim-engine over WebSocket.",
5
5
  "author": "Tamagui LLC",
6
6
  "license": "MIT",
@@ -25,6 +25,7 @@
25
25
 
26
26
  import http, { type IncomingMessage, type ServerResponse } from 'http'
27
27
  import https from 'https'
28
+ import { finished, pipeline } from 'stream/promises'
28
29
  import {
29
30
  FETCH_PROXY_BROWSER_USER_AGENT,
30
31
  getFetchProxyTargetHeaders,
@@ -98,22 +99,6 @@ function formatFetchProxyError(targetUrl: string, err: unknown): string {
98
99
  return message
99
100
  }
100
101
 
101
- function isTextProxyContentType(contentType: string | string[] | undefined): boolean {
102
- const value = Array.isArray(contentType) ? contentType[0] : contentType
103
- const normalized = value?.split(';', 1)[0]?.trim().toLowerCase()
104
- if (!normalized) return false
105
- return (
106
- normalized.startsWith('text/') ||
107
- normalized === 'application/json' ||
108
- normalized.endsWith('+json') ||
109
- normalized === 'application/x-www-form-urlencoded' ||
110
- normalized === 'application/xml' ||
111
- normalized.endsWith('+xml') ||
112
- normalized === 'application/javascript' ||
113
- normalized === 'application/graphql'
114
- )
115
- }
116
-
117
102
  export function buildFetchProxyHeaders(
118
103
  reqHeaders: Record<string, string | string[] | undefined>,
119
104
  targetUrl?: URL,
@@ -190,60 +175,127 @@ export async function handleFetchProxyRequest(
190
175
  return
191
176
  }
192
177
 
193
- const headers = buildFetchProxyHeaders(req.headers, upstreamUrl)
194
-
195
- let body: BodyInit | undefined
178
+ let body: Buffer | undefined
196
179
  if (req.method !== 'GET' && req.method !== 'HEAD') {
197
180
  const chunks: Buffer[] = []
198
181
  for await (const chunk of req) {
199
182
  chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk))
200
183
  }
201
184
  if (chunks.length > 0) {
202
- const bytes = Buffer.concat(chunks)
203
- body = isTextProxyContentType(req.headers['content-type'])
204
- ? bytes.toString('utf8')
205
- : bytes
185
+ body = Buffer.concat(chunks)
206
186
  }
207
187
  }
208
188
 
209
- let upstream: Response
210
- try {
211
- upstream = await fetch(upstreamUrl.href, {
212
- method: req.method,
213
- headers,
214
- body: body as BodyInit | undefined,
215
- redirect: 'follow',
189
+ const originalMethod = req.method || 'GET'
190
+ const proxy = async (
191
+ targetUrl: URL,
192
+ method: string,
193
+ nextBody: Buffer | undefined,
194
+ redirects: number,
195
+ ): Promise<void> => {
196
+ const transport = targetUrl.protocol === 'https:' ? https : http
197
+ const targetHeaders = buildFetchProxyHeaders(req.headers, targetUrl)
198
+ if (targetUrl.origin !== upstreamUrl.origin) {
199
+ delete targetHeaders.authorization
200
+ delete targetHeaders['proxy-authorization']
201
+ }
202
+ if (method === 'GET' || method === 'HEAD') {
203
+ delete targetHeaders['content-length']
204
+ delete targetHeaders['content-type']
205
+ } else if (nextBody) {
206
+ targetHeaders['content-length'] = String(nextBody.byteLength)
207
+ }
208
+
209
+ const proxyRes = await new Promise<IncomingMessage>((resolve, reject) => {
210
+ const proxyReq = transport.request(
211
+ {
212
+ hostname: targetUrl.hostname,
213
+ port: targetUrl.port || (targetUrl.protocol === 'https:' ? 443 : 80),
214
+ path: targetUrl.pathname + targetUrl.search,
215
+ method,
216
+ headers: targetHeaders,
217
+ },
218
+ resolve,
219
+ )
220
+ const abort = () => proxyReq.destroy(new Error('fetch proxy client disconnected'))
221
+ req.once('aborted', abort)
222
+ proxyReq.once('close', () => req.off('aborted', abort))
223
+ proxyReq.once('error', reject)
224
+ if (nextBody === undefined) proxyReq.end()
225
+ else proxyReq.end(nextBody)
216
226
  })
217
- } catch (err) {
218
- applyFetchProxyCors(res)
219
- res.writeHead(502, { 'Content-Type': 'text/plain' })
220
- res.end(`fetch proxy error: ${formatFetchProxyError(upstreamUrl.href, err)}`)
221
- return
222
- }
223
227
 
224
- upstream.headers.forEach((value, key) => {
225
- const lowerKey = key.toLowerCase()
228
+ const status = proxyRes.statusCode ?? 502
229
+ const location = proxyRes.headers.location
226
230
  if (
227
- lowerKey === 'content-encoding' ||
228
- lowerKey === 'transfer-encoding' ||
229
- lowerKey === 'content-length' ||
230
- lowerKey === 'set-cookie' ||
231
- lowerKey.startsWith('access-control-')
231
+ location &&
232
+ (status === 301 ||
233
+ status === 302 ||
234
+ status === 303 ||
235
+ status === 307 ||
236
+ status === 308)
232
237
  ) {
238
+ if (redirects >= 10) {
239
+ proxyRes.destroy()
240
+ throw new Error('too many redirects')
241
+ }
242
+ const switchToGet =
243
+ ((status === 301 || status === 302) && method === 'POST') ||
244
+ (status === 303 && method !== 'GET' && method !== 'HEAD')
245
+ const redirectUrl = new URL(location, targetUrl)
246
+ proxyRes.resume()
247
+ await finished(proxyRes)
248
+ await proxy(
249
+ redirectUrl,
250
+ switchToGet ? 'GET' : method,
251
+ switchToGet ? undefined : nextBody,
252
+ redirects + 1,
253
+ )
233
254
  return
234
255
  }
235
- res.setHeader(key, value)
236
- })
237
- applyFetchProxyCors(res)
238
256
 
239
- const setCookie = upstream.headers.getSetCookie?.() ?? []
240
- if (setCookie.length > 0) {
241
- res.setHeader('x-sootsim-set-cookie', setCookie.join(', '))
257
+ for (const [key, value] of Object.entries(proxyRes.headers)) {
258
+ const lowerKey = key.toLowerCase()
259
+ if (
260
+ value === undefined ||
261
+ lowerKey === 'set-cookie' ||
262
+ lowerKey === 'connection' ||
263
+ lowerKey === 'keep-alive' ||
264
+ lowerKey === 'proxy-authenticate' ||
265
+ lowerKey === 'proxy-authorization' ||
266
+ lowerKey === 'te' ||
267
+ lowerKey === 'trailer' ||
268
+ lowerKey === 'transfer-encoding' ||
269
+ lowerKey === 'upgrade' ||
270
+ lowerKey.startsWith('access-control-')
271
+ ) {
272
+ continue
273
+ }
274
+ res.setHeader(key, value)
275
+ }
276
+ applyFetchProxyCors(res)
277
+ const setCookie = proxyRes.headers['set-cookie'] ?? []
278
+ if (setCookie.length > 0) {
279
+ res.setHeader(
280
+ 'x-sootsim-set-cookie',
281
+ (Array.isArray(setCookie) ? setCookie : [setCookie]).join(', '),
282
+ )
283
+ }
284
+ res.statusCode = status
285
+ await pipeline(proxyRes, res)
242
286
  }
243
287
 
244
- res.statusCode = upstream.status
245
- const buf = Buffer.from(await upstream.arrayBuffer())
246
- res.end(buf)
288
+ try {
289
+ await proxy(upstreamUrl, originalMethod, body, 0)
290
+ } catch (err) {
291
+ if (res.headersSent) {
292
+ res.destroy(err instanceof Error ? err : new Error(String(err)))
293
+ return
294
+ }
295
+ applyFetchProxyCors(res)
296
+ res.writeHead(502, { 'Content-Type': 'text/plain' })
297
+ res.end(`fetch proxy error: ${formatFetchProxyError(upstreamUrl.href, err)}`)
298
+ }
247
299
  }
248
300
 
249
301
  export function handleAppApiRequest(req: IncomingMessage, res: ServerResponse): boolean {
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.238 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a,b,c,d}from"./chunk-SCLKEUCN.js";import"./chunk-YK4NG4BL.js";export{d as BETA_ASK_HEADLINE,b as BETA_LABEL,c as BETA_TAGLINE,a as IS_BETA};
@@ -1 +0,0 @@
1
- /*! sootsim v0.1.238 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
@@ -1 +0,0 @@
1
- /*! sootsim v0.1.238 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.238 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a}from"./chunk-OHLPCYOM.js";import"./chunk-YK4NG4BL.js";export{a as getCliVersion};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.238 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a,b,c,d,e}from"./chunk-5MQZW32V.js";import"./chunk-6UMCNLKY.js";import"./chunk-HC6JXVIP.js";import"./chunk-KGAN3JXK.js";import"./chunk-4DPHH2DS.js";import"./chunk-RTMLR7KA.js";import"./chunk-YNSDDYLM.js";import"./chunk-6PYVHZVH.js";import"./chunk-NCJGR7VZ.js";import"./chunk-XUOCSWW4.js";import"./chunk-DMSG7ESJ.js";import"./chunk-OHLPCYOM.js";import"./chunk-SCLKEUCN.js";import"./chunk-2FFZXFDY.js";import"./chunk-YK4NG4BL.js";export{c as daemonInstall,b as getDaemonServiceStatus,a as runDaemon,d as teardownDaemonService,e as teardownSootsimHome};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.238 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import"./chunk-UV4NF53M.js";import{f as a,g as b,h as c,i as d,j as e,k as f,l as g,m as h,n as i}from"./chunk-7OQU5M3J.js";import"./chunk-3KVQ35TN.js";import"./chunk-IHEPAACR.js";import"./chunk-NCJGR7VZ.js";import"./chunk-DMSG7ESJ.js";import"./chunk-YK4NG4BL.js";export{e as ALL_DRIVERS,i as buildDriverListRows,a as chromiumDriver,b as electronDriver,f as getAllDrivers,g as getDriver,c as playwrightDriver,h as resolveDriver,d as systemDriver};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.238 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{c,d,e,f,g,h}from"./chunk-CDAMSEOW.js";import"./chunk-XOKMWX3P.js";import"./chunk-MD5GBDM4.js";import{c as a,d as b}from"./chunk-CGQTOBHQ.js";import"./chunk-UYFE2VRP.js";import"./chunk-MT2HMCDI.js";import"./chunk-LYSW5PTM.js";import"./chunk-A46S76WN.js";import"./chunk-ECCUSCHO.js";import"./chunk-QAKSIRZO.js";import"./chunk-7OQU5M3J.js";import"./chunk-3KVQ35TN.js";import"./chunk-CU7M5IBW.js";import"./chunk-5MFTB3S4.js";import"./chunk-IHEPAACR.js";import"./chunk-EGRRMDLA.js";import"./chunk-54XALXOI.js";import"./chunk-XWGGIFDB.js";import"./chunk-CXV3CSSF.js";import"./chunk-QGFPGXNJ.js";import"./chunk-6UMCNLKY.js";import"./chunk-HC6JXVIP.js";import"./chunk-RTMLR7KA.js";import"./chunk-YNSDDYLM.js";import"./chunk-6PYVHZVH.js";import"./chunk-NCJGR7VZ.js";import"./chunk-XUOCSWW4.js";import"./chunk-DMSG7ESJ.js";import"./chunk-QGCNRLCM.js";import"./chunk-2FFZXFDY.js";import"./chunk-YK4NG4BL.js";export{e as discoverSootsimUrl,c as getLastFlowPreviewUploadResult,d as getLastFlowTraceSteps,g as hoistLeadingSimFlag,a as parseFlowFile,f as runFlowPlayback,h as runMaestroAuthoring,b as validateFlowFile};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.238 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a,b,c}from"./chunk-KGAN3JXK.js";import"./chunk-4DPHH2DS.js";import"./chunk-RTMLR7KA.js";import"./chunk-YNSDDYLM.js";import"./chunk-6PYVHZVH.js";import"./chunk-NCJGR7VZ.js";import"./chunk-XUOCSWW4.js";import"./chunk-DMSG7ESJ.js";import"./chunk-OHLPCYOM.js";import"./chunk-SCLKEUCN.js";import"./chunk-2FFZXFDY.js";import"./chunk-YK4NG4BL.js";export{c as printCommandHelp,b as printGroupHelp,a as printHelp};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.238 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{j as a,k as b}from"./chunk-CGQTOBHQ.js";import"./chunk-UYFE2VRP.js";import"./chunk-A46S76WN.js";import"./chunk-ECCUSCHO.js";import"./chunk-QAKSIRZO.js";import"./chunk-7OQU5M3J.js";import"./chunk-3KVQ35TN.js";import"./chunk-CU7M5IBW.js";import"./chunk-5MFTB3S4.js";import"./chunk-IHEPAACR.js";import"./chunk-EGRRMDLA.js";import"./chunk-54XALXOI.js";import"./chunk-XWGGIFDB.js";import"./chunk-CXV3CSSF.js";import"./chunk-QGFPGXNJ.js";import"./chunk-RTMLR7KA.js";import"./chunk-YNSDDYLM.js";import"./chunk-6PYVHZVH.js";import"./chunk-NCJGR7VZ.js";import"./chunk-XUOCSWW4.js";import"./chunk-DMSG7ESJ.js";import"./chunk-QGCNRLCM.js";import"./chunk-2FFZXFDY.js";import"./chunk-YK4NG4BL.js";export{a as printShellPerfReport,b as runInspect};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.238 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a}from"./chunk-HTTHCQQS.js";import"./chunk-3KVQ35TN.js";import"./chunk-4DN5YMPS.js";import"./chunk-YK4NG4BL.js";export{a as runInstallDesktop};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.238 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a,b}from"./chunk-EGRRMDLA.js";import"./chunk-YK4NG4BL.js";export{a as loadOptionalDemoApps,b as optionalDemoAppsSync};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.238 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a}from"./chunk-D5LYVGSE.js";import"./chunk-GI4YPHU6.js";import"./chunk-CXV3CSSF.js";import"./chunk-6PYVHZVH.js";import"./chunk-NCJGR7VZ.js";import"./chunk-DMSG7ESJ.js";import"./chunk-YK4NG4BL.js";export{a as runRuntime};