sootsim 0.1.127 → 0.1.129

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 (149) hide show
  1. package/dist-cli/bin.js +3 -3
  2. package/dist-cli/chunks/{agent-LUN4QHOL.js → agent-2CLXZJCE.js} +2 -2
  3. package/dist-cli/chunks/{agent-wrapper-APEJDITM.js → agent-wrapper-DMTETGFP.js} +2 -2
  4. package/dist-cli/chunks/{app-fonts-AKZ7ZDOK.js → app-fonts-25BQNOJE.js} +2 -2
  5. package/dist-cli/chunks/{assert-MFPNYG7R.js → assert-EYRTQ6ER.js} +2 -2
  6. package/dist-cli/chunks/auto-bootstrap-NB4SLPAE.js +2 -0
  7. package/dist-cli/chunks/beta-2LKOVRW5.js +2 -0
  8. package/dist-cli/chunks/{chunk-GNG6W27T.js → chunk-3QJLWCBD.js} +2 -2
  9. package/dist-cli/chunks/{chunk-GNYI3JAB.js → chunk-4DT5LVP3.js} +1 -1
  10. package/dist-cli/chunks/{chunk-LF3KGYGE.js → chunk-4PN5EVFA.js} +2 -2
  11. package/dist-cli/chunks/{chunk-5UWZ47FH.js → chunk-56IYXKG5.js} +1 -1
  12. package/dist-cli/chunks/{chunk-ZP3CCVT7.js → chunk-5AR7JQNL.js} +1 -1
  13. package/dist-cli/chunks/{chunk-4JCC7SR2.js → chunk-5ITNDSDP.js} +2 -2
  14. package/dist-cli/chunks/{chunk-OKAG4ZKD.js → chunk-5T5OIH3R.js} +2 -2
  15. package/dist-cli/chunks/{chunk-HNEBMDYQ.js → chunk-5Y4V7DHL.js} +2 -2
  16. package/dist-cli/chunks/{chunk-ZGXZQPYO.js → chunk-7FDXV4PE.js} +2 -2
  17. package/dist-cli/chunks/{chunk-5WIVTKYW.js → chunk-7HRQGZ7J.js} +1 -1
  18. package/dist-cli/chunks/{chunk-7DAYDZ6K.js → chunk-AQSGGVCD.js} +3 -3
  19. package/dist-cli/chunks/{chunk-NDGBW36P.js → chunk-CHCJWMYW.js} +1 -1
  20. package/dist-cli/chunks/chunk-DLMQVCTV.js +1 -0
  21. package/dist-cli/chunks/{chunk-FMCKRPCU.js → chunk-EMTFJESP.js} +1 -1
  22. package/dist-cli/chunks/{chunk-B56YQYVI.js → chunk-EP3L4A52.js} +1 -1
  23. package/dist-cli/chunks/{chunk-L2CWZNGS.js → chunk-EP3YPVJY.js} +2 -2
  24. package/dist-cli/chunks/{chunk-24GWVHOQ.js → chunk-FSYDDBEL.js} +2 -2
  25. package/dist-cli/chunks/{chunk-SM2JP7BO.js → chunk-GPUIF547.js} +1 -1
  26. package/dist-cli/chunks/{chunk-36AO2O2R.js → chunk-HHI7444G.js} +57 -17
  27. package/dist-cli/chunks/{chunk-FGTMXDHE.js → chunk-IAG3ZUAE.js} +2 -2
  28. package/dist-cli/chunks/{chunk-DQAWYKPD.js → chunk-IFHNUWKU.js} +2 -2
  29. package/dist-cli/chunks/{chunk-Y4YKDIS6.js → chunk-J4RRVZLG.js} +1 -1
  30. package/dist-cli/chunks/{chunk-7JJF24H4.js → chunk-KG247GVZ.js} +2 -2
  31. package/dist-cli/chunks/{chunk-2YJLYAL3.js → chunk-LNU7WB6Z.js} +2 -2
  32. package/dist-cli/chunks/{chunk-BY4HZZZH.js → chunk-MMR2PBWA.js} +3 -3
  33. package/dist-cli/chunks/{chunk-MT6WASRO.js → chunk-NHK744OV.js} +1 -1
  34. package/dist-cli/chunks/{chunk-7QBGAHCM.js → chunk-NW72VNGA.js} +3 -3
  35. package/dist-cli/chunks/chunk-PAZWCF3C.js +1 -0
  36. package/dist-cli/chunks/{chunk-52XT4NSH.js → chunk-PEQUGH7X.js} +2 -2
  37. package/dist-cli/chunks/{chunk-VIXWXLVX.js → chunk-PSMCJQXE.js} +2 -2
  38. package/dist-cli/chunks/{chunk-DC6VXHIZ.js → chunk-QF6IUOSK.js} +1 -1
  39. package/dist-cli/chunks/{chunk-CSXM46RX.js → chunk-QJCDLCY7.js} +2 -2
  40. package/dist-cli/chunks/chunk-QMDFOSCP.js +1 -0
  41. package/dist-cli/chunks/{chunk-6D4U74IK.js → chunk-RJ6BJSSK.js} +2 -2
  42. package/dist-cli/chunks/{chunk-FPVP3O53.js → chunk-SY4CNQ7Q.js} +2 -2
  43. package/dist-cli/chunks/{chunk-IWSLRFIG.js → chunk-T73PO7QP.js} +2 -2
  44. package/dist-cli/chunks/{chunk-3U2ZPTHG.js → chunk-VXLPV53O.js} +2 -2
  45. package/dist-cli/chunks/{chunk-TGJWE3CN.js → chunk-WA4F3S3O.js} +2 -2
  46. package/dist-cli/chunks/{chunk-FG6YYUCT.js → chunk-WAK4QVNM.js} +1 -1
  47. package/dist-cli/chunks/{chunk-NKJJMS2M.js → chunk-WB3P3VGN.js} +1 -1
  48. package/dist-cli/chunks/{chunk-5WSDKWL7.js → chunk-X6UBD524.js} +2 -2
  49. package/dist-cli/chunks/chunk-XLUUJCSP.js +2 -0
  50. package/dist-cli/chunks/{chunk-3DHE4SHG.js → chunk-Y3YURX2A.js} +1 -1
  51. package/dist-cli/chunks/{chunk-YVB5QNKO.js → chunk-YKXKGZSJ.js} +1 -1
  52. package/dist-cli/chunks/cli-version-I3UMBT5O.js +2 -0
  53. package/dist-cli/chunks/{compat-JELEOJPN.js → compat-EIQNZ4JY.js} +3 -3
  54. package/dist-cli/chunks/{config-REAVTZCI.js → config-WBBB4KAF.js} +2 -2
  55. package/dist-cli/chunks/control-EX3VXQ7V.js +2 -0
  56. package/dist-cli/chunks/{cpu-profile-OGVBRPW7.js → cpu-profile-334GREGX.js} +2 -2
  57. package/dist-cli/chunks/{daemon-ZUOHTLAC.js → daemon-J65WSF5U.js} +2 -2
  58. package/dist-cli/chunks/{debug-G533AR4F.js → debug-DB737GNO.js} +3 -3
  59. package/dist-cli/chunks/{detox-TBWG4AR3.js → detox-GYZJZZB6.js} +2 -2
  60. package/dist-cli/chunks/{device-PQEM6FOV.js → device-CNPPTXFU.js} +2 -2
  61. package/dist-cli/chunks/{diagnose-4J75PLPF.js → diagnose-ERZANOHM.js} +2 -2
  62. package/dist-cli/chunks/drivers-7YH3VVVZ.js +2 -0
  63. package/dist-cli/chunks/{electron-A2SD7F3N.js → electron-4BT5EQHI.js} +3 -3
  64. package/dist-cli/chunks/flow-OFD6LF6V.js +2 -0
  65. package/dist-cli/chunks/help-FRUNM3LL.js +2 -0
  66. package/dist-cli/chunks/{hints-7PG63DKS.js → hints-VUH6VBJ7.js} +2 -2
  67. package/dist-cli/chunks/{home-paths-QIX4W62B.js → home-paths-ECU3BYCS.js} +2 -2
  68. package/dist-cli/chunks/{inspect-T3H6FTHE.js → inspect-KKQJ5KQV.js} +4 -4
  69. package/dist-cli/chunks/install-LZLX3YZP.js +2 -0
  70. package/dist-cli/chunks/{install-desktop-AJ7MV6OQ.js → install-desktop-Q6QSPYQS.js} +3 -3
  71. package/dist-cli/chunks/{keys-ODRTRJX7.js → keys-XMG7L2AL.js} +2 -2
  72. package/dist-cli/chunks/{launch-5BF5JBYF.js → launch-WH323264.js} +3 -3
  73. package/dist-cli/chunks/{login-MQ2PDQNI.js → login-3YYWFKB3.js} +4 -4
  74. package/dist-cli/chunks/{logout-KH374434.js → logout-U77GYAWT.js} +2 -2
  75. package/dist-cli/chunks/{maestro-J5GGRVH6.js → maestro-NQEF23G7.js} +2 -2
  76. package/dist-cli/chunks/{preview-CCPCRU6W.js → preview-AOTCHNWB.js} +2 -2
  77. package/dist-cli/chunks/{profile-MTL2HU6F.js → profile-57CSZI4O.js} +2 -2
  78. package/dist-cli/chunks/{react-UTYPZQWT.js → react-5JGWHJCG.js} +2 -2
  79. package/dist-cli/chunks/{record-AFRD6E2J.js → record-JQW5AQDG.js} +2 -2
  80. package/dist-cli/chunks/runtime-3PEHSFYI.js +2 -0
  81. package/dist-cli/chunks/{runtime-delivery-PJZCHZOA.js → runtime-delivery-2SY6VTTC.js} +2 -2
  82. package/dist-cli/chunks/{screenshot-AQHIB3G7.js → screenshot-LNYP7U72.js} +2 -2
  83. package/dist-cli/chunks/{screenshot-mode-NOOW6RL5.js → screenshot-mode-LMUUUFJY.js} +2 -2
  84. package/dist-cli/chunks/{screenshots-KVKV2KAZ.js → screenshots-R7T7DOBG.js} +2 -2
  85. package/dist-cli/chunks/{server-6KNS5Y7Q.js → server-7H67CYP4.js} +12 -12
  86. package/dist-cli/chunks/setup-repo-QJEHYA7R.js +2 -0
  87. package/dist-cli/chunks/{skills-62FUBTDY.js → skills-SDSSTD44.js} +2 -2
  88. package/dist-cli/chunks/{start-XBAW57QL.js → start-MQAJ7GA6.js} +4 -4
  89. package/dist-cli/chunks/store-ZYMG4VDY.js +2 -0
  90. package/dist-cli/chunks/telemetry-AXLZH6Y2.js +2 -0
  91. package/dist-cli/chunks/{test-TSJ5PCO6.js → test-3IWJYEBS.js} +3 -3
  92. package/dist-cli/chunks/{three-mode-VK2D4NYV.js → three-mode-4F5PHPL2.js} +2 -2
  93. package/dist-cli/chunks/{timeline-HY7B7HAW.js → timeline-XDSEYH2S.js} +2 -2
  94. package/dist-cli/chunks/{upgrade-BHZN6X5M.js → upgrade-DH362WFZ.js} +2 -2
  95. package/dist-cli/chunks/upload-TJUKEH3W.js +2 -0
  96. package/dist-cli/chunks/{version-YFEE6ZGK.js → version-FRIIGCBS.js} +2 -2
  97. package/dist-cli/chunks/web-D3OXRMIU.js +2 -0
  98. package/dist-cli/chunks/{what-happened-VDAD5V3N.js → what-happened-QWW5OLBU.js} +2 -2
  99. package/dist-cli/chunks/{whoami-ONERUEKE.js → whoami-HU3F2UE5.js} +2 -2
  100. package/dist-lib/agent-daemon-client.cjs +1 -1
  101. package/dist-lib/agent-events.cjs +1 -1
  102. package/dist-lib/agent-sessions.cjs +1 -1
  103. package/dist-lib/attached-projects.cjs +1 -1
  104. package/dist-lib/auth/shared-session.cjs +1 -1
  105. package/dist-lib/backend-origin.cjs +1 -1
  106. package/dist-lib/beta.cjs +1 -1
  107. package/dist-lib/beta.mjs +1 -1
  108. package/dist-lib/bridge-constants.cjs +1 -1
  109. package/dist-lib/cli-constants.cjs +1 -1
  110. package/dist-lib/config.cjs +1 -1
  111. package/dist-lib/detox/index.cjs +1 -1
  112. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  113. package/dist-lib/home-paths.cjs +1 -1
  114. package/dist-lib/host/bridge-host.cjs +20 -7
  115. package/dist-lib/host/fetch-proxy-handler.cjs +20 -7
  116. package/dist-lib/host/fetch-proxy-overrides.cjs +10 -6
  117. package/dist-lib/host/fetch-proxy-overrides.mjs +10 -6
  118. package/dist-lib/host/websocket-proxy.cjs +1 -1
  119. package/dist-lib/index.cjs +1 -1
  120. package/dist-lib/metro.cjs +1 -1
  121. package/dist-lib/profiles.cjs +1 -1
  122. package/dist-lib/render-mode.cjs +1 -1
  123. package/dist-lib/scripts/demo-app-registry.cjs +1 -1
  124. package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
  125. package/dist-lib/sdk.cjs +65 -11
  126. package/dist-lib/sdk.mjs +64 -11
  127. package/dist-lib/skills.cjs +27 -13
  128. package/dist-lib/vite.cjs +1 -1
  129. package/package.json +1 -1
  130. package/src/host/fetch-proxy-handler.ts +23 -2
  131. package/src/host/fetch-proxy-overrides.ts +17 -5
  132. package/dist-cli/chunks/auto-bootstrap-LBKZGZZF.js +0 -2
  133. package/dist-cli/chunks/beta-VGO5KHIW.js +0 -2
  134. package/dist-cli/chunks/chunk-3WXNKHSH.js +0 -1
  135. package/dist-cli/chunks/chunk-FW5SXCE2.js +0 -2
  136. package/dist-cli/chunks/chunk-QVIEWXVS.js +0 -1
  137. package/dist-cli/chunks/chunk-UWEGL2QF.js +0 -1
  138. package/dist-cli/chunks/cli-version-YVYBW43E.js +0 -2
  139. package/dist-cli/chunks/control-3AUN3AWZ.js +0 -2
  140. package/dist-cli/chunks/drivers-PNGLYCLQ.js +0 -2
  141. package/dist-cli/chunks/flow-THQYC2Y4.js +0 -2
  142. package/dist-cli/chunks/help-ASEA4FFM.js +0 -2
  143. package/dist-cli/chunks/install-FXTDM3ZL.js +0 -2
  144. package/dist-cli/chunks/runtime-SE4VB7MF.js +0 -2
  145. package/dist-cli/chunks/setup-repo-XXEF6YK3.js +0 -2
  146. package/dist-cli/chunks/store-FOWKJFEJ.js +0 -2
  147. package/dist-cli/chunks/telemetry-FDYR6W5E.js +0 -2
  148. package/dist-cli/chunks/upload-B6UNK5GQ.js +0 -2
  149. package/dist-cli/chunks/web-KNX5TVQW.js +0 -2
package/dist-lib/sdk.mjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.127 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.129 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // cli/commands/inspect/core.ts
4
4
  function resolveMaxMsFlag(args, fallbackMs) {
@@ -166,6 +166,39 @@ var LAYOUT_GET_NATIVE_EVAL = `(async () => {
166
166
  const n = typeof raw === 'number' ? raw : (typeof raw === 'string' ? parseFloat(raw) : NaN)
167
167
  return Number.isFinite(n) ? Math.round(n) : 0
168
168
  }
169
+ // styling extractors \u2014 omit boring defaults so the agent only sees notable
170
+ // styling (low opacity, struck text, clipping, a real border/color).
171
+ const colorStr = (v) => {
172
+ if (v == null) return undefined
173
+ const s = String(v).split(' ').join('')
174
+ return s && s !== 'transparent' && s !== 'rgba(0,0,0,0)' ? s : undefined
175
+ }
176
+ const opacityOf = (style) => {
177
+ const o = style && style.opacity
178
+ const n = typeof o === 'number' ? o : (typeof o === 'string' ? parseFloat(o) : NaN)
179
+ return Number.isFinite(n) && n < 1 ? Math.round(n * 100) / 100 : undefined
180
+ }
181
+ const weightOf = (style) => {
182
+ const w = style && style.fontWeight
183
+ const n = typeof w === 'number' ? w : (typeof w === 'string' ? parseInt(w, 10) : NaN)
184
+ return Number.isFinite(n) && n >= 600 ? n : undefined
185
+ }
186
+ const decoOf = (style) => {
187
+ const d = style && (style.textDecorationLine || style.textDecoration)
188
+ return d && d !== 'none' && d !== 'normal' ? String(d).split(' ')[0] : undefined
189
+ }
190
+ const overflowOf = (style) => (style && style.overflow === 'hidden' ? 'hidden' : undefined)
191
+ const borderWOf = (style) => {
192
+ if (!style) return undefined
193
+ const keys = ['borderWidth','borderTopWidth','borderBottomWidth','borderLeftWidth','borderRightWidth']
194
+ let max = 0
195
+ for (const k of keys) {
196
+ const r = style[k]
197
+ const n = typeof r === 'number' ? r : (typeof r === 'string' ? parseFloat(r) : NaN)
198
+ if (Number.isFinite(n)) max = Math.max(max, n)
199
+ }
200
+ return max > 0 ? Math.round(max) : undefined
201
+ }
169
202
 
170
203
  const isVisible = (n) => {
171
204
  const layout = n && n.layout
@@ -196,6 +229,13 @@ var LAYOUT_GET_NATIVE_EVAL = `(async () => {
196
229
  borderRadius: radiusOf(style),
197
230
  padding: { t: round(pad.top), r: round(pad.right), b: round(pad.bottom), l: round(pad.left) },
198
231
  fontSize: fontSizeOf(style),
232
+ color: text ? colorStr(style.color) : undefined,
233
+ bg: colorStr(style.backgroundColor),
234
+ opacity: opacityOf(style),
235
+ fontWeight: weightOf(style),
236
+ textDecoration: decoOf(style),
237
+ overflow: overflowOf(style),
238
+ borderWidth: borderWOf(style),
199
239
  }
200
240
  })
201
241
  })()`;
@@ -203,7 +243,7 @@ async function inspectGetLayout(bridge) {
203
243
  const raw = await bridge.send({ type: "evaluate", code: LAYOUT_GET_NATIVE_EVAL });
204
244
  return Array.isArray(raw) ? raw : [];
205
245
  }
206
- function formatLayoutElements(elements) {
246
+ function formatLayoutElements(elements, opts) {
207
247
  if (elements.length === 0) return " no visible elements found";
208
248
  const lines = elements.map((el) => {
209
249
  const ident = el.testID ? `#${el.testID}` : el.selector ? el.selector : el.role ? `[${el.role}]` : `<${el.type}>`;
@@ -215,6 +255,15 @@ function formatLayoutElements(elements) {
215
255
  parts.push(uniform ? `pad:${p.t}` : `pad:${p.t},${p.r},${p.b},${p.l}`);
216
256
  }
217
257
  if (el.fontSize > 0) parts.push(`font:${el.fontSize}`);
258
+ if (opts?.styling) {
259
+ if (el.fontWeight) parts.push(`weight:${el.fontWeight}`);
260
+ if (el.color) parts.push(`color:${el.color}`);
261
+ if (el.bg) parts.push(`bg:${el.bg}`);
262
+ if (el.opacity != null) parts.push(`opacity:${el.opacity}`);
263
+ if (el.textDecoration) parts.push(`deco:${el.textDecoration}`);
264
+ if (el.overflow) parts.push(`overflow:${el.overflow}`);
265
+ if (el.borderWidth) parts.push(`border:${el.borderWidth}`);
266
+ }
218
267
  if (el.text) {
219
268
  const text = el.text.length > 40 ? `${el.text.slice(0, 39)}\u2026` : el.text;
220
269
  parts.push(`"${text}"`);
@@ -599,8 +648,11 @@ var WAIT_READY_PROGRESS_INTERVAL_MS = 2e3;
599
648
  function readyProbeHasContent(probe) {
600
649
  return probe.targets > 0 || probe.nodes >= READY_CONTENT_NODE_FLOOR;
601
650
  }
651
+ function readyProbeHasTargetContent(probe) {
652
+ return probe.targets > 0;
653
+ }
602
654
  function waitReadyReason(status) {
603
- return status.externalError ? `guest app errored: ${status.externalError}` : status.loadingText ? `still showing "${status.loadingText}"` : status.externalReady === false ? "guest app is still loading" : status.flag !== true ? "guest app has not emitted sootsim:externalAppReady" : status.targets <= 0 ? "ready flag emitted but no visible app content is inspectable yet" : "node tree is still changing";
655
+ return status.externalError ? `guest app errored: ${status.externalError}` : status.loadingText ? `still showing "${status.loadingText}"` : status.externalReady === false ? "guest app is still loading" : status.flag !== true && status.targets > 0 ? "native content is rendered but the ready signal has not settled" : status.flag !== true ? "guest app has not emitted sootsim:externalAppReady" : status.targets <= 0 ? "ready flag emitted but no visible app content is inspectable yet" : "node tree is still changing";
604
656
  }
605
657
  async function inspectWaitReady(bridge, timeoutMs = 2e4, options = {}) {
606
658
  const start = Date.now();
@@ -642,14 +694,14 @@ async function inspectWaitReady(bridge, timeoutMs = 2e4, options = {}) {
642
694
  lastNodes = last.nodes;
643
695
  nodeStableSince = now;
644
696
  }
645
- if (last.flag === true) {
646
- if (last.externalReady !== false && !last.externalError && !last.loadingText && readyProbeHasContent(last)) {
647
- if (now - nodeStableSince >= READY_NODE_STABLE_MS) {
648
- return {
649
- ...status,
650
- ready: true
651
- };
652
- }
697
+ const hasReadySignal = last.flag === true && readyProbeHasContent(last);
698
+ const hasRenderedContentWithoutReadySignal = last.flag !== true && readyProbeHasTargetContent(last);
699
+ if ((hasReadySignal || hasRenderedContentWithoutReadySignal) && last.externalReady !== false && !last.externalError && !last.loadingText) {
700
+ if (now - nodeStableSince >= READY_NODE_STABLE_MS) {
701
+ return {
702
+ ...status,
703
+ ready: true
704
+ };
653
705
  }
654
706
  }
655
707
  if (options.onProgress && progressIntervalMs > 0 && now >= nextProgressAt) {
@@ -1643,6 +1695,7 @@ export {
1643
1695
  isTapSuccess,
1644
1696
  rankInteractive,
1645
1697
  readyProbeHasContent,
1698
+ readyProbeHasTargetContent,
1646
1699
  resolveFindMode,
1647
1700
  resolveMaxMsFlag,
1648
1701
  scoreInteractive,
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.127 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.129 | (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;
@@ -3045,13 +3045,13 @@ var init_registry = __esm({
3045
3045
  },
3046
3046
  "expo-dev-client": {
3047
3047
  category: "Expo SDK",
3048
- stubType: "build-only",
3048
+ stubType: "native",
3049
3049
  versions: [
3050
3050
  {
3051
3051
  range: ">=1.0.0",
3052
3052
  coverage: 1,
3053
- note: "config/dev tooling package whose only runtime export is `isDevelopmentBuild` \u2014 correctly returns false in the sootsim preview (it is not an Expo Go dev build). The entire (tiny) public runtime surface is implemented; build-time CLI behavior is out of runtime scope.",
3054
- working: "isDevelopmentBuild"
3053
+ note: "native-seam: the real package (`export * from 'expo-dev-menu'`) runs from the bundle; the ExpoDevMenu expo native module (openMenu/closeMenu/hideMenu/addDevMenuCallbacks) is installed inline by stubs/expo-modules-core.ts as an honest no-op so registerDevMenuItems and the menu controls boot without crashing. Custom dev-menu entries are not surfaced (a dev-build affordance), matching how the native module is absent in a production build.",
3054
+ working: "openMenu, closeMenu, hideMenu, registerDevMenuItems"
3055
3055
  }
3056
3056
  ]
3057
3057
  },
@@ -5335,9 +5335,10 @@ var init_registry = __esm({
5335
5335
  versions: [
5336
5336
  {
5337
5337
  range: ">=0.5.0",
5338
- coverage: 1,
5339
- note: "load-safe noop \u2014 Galeria root passes children through; Galeria.Image / Galeria.Popup render null; useGaleria returns no-op { open, close, images: [] }",
5340
- missing: "no native QLPreviewController \u2014 apps see their gallery layout render but tapping an image does not open the native preview overlay (deferred \u2014 could be wired through host bridge)"
5338
+ coverage: 0.92,
5339
+ note: "native-seam only - upstream Galeria root / Galeria.Image / context run from the bundle; the Expo Galeria view manager opens SootSim's shared image viewer with thumbnail transition, Galeria-specific chrome, swipe, pinch, rotation, double-tap zoom, and dismiss",
5340
+ working: "Galeria root, Galeria.Image, grouped urls, Image.resolveAssetSource mapping, tap-to-open from thumbnail, grouped thumbnail registry for close transitions, fullscreen viewer, adjacent-image swipe, pinch/rotate/double-tap zoom, vertical dismiss, close control, right nav action callback, page indicators, hidePageIndicators, hideBlurOverlay, light/dark theme, onIndexChange, onDismiss, onLongPress",
5341
+ missing: "SF Symbol names render as textual controls instead of exact symbol glyphs; no native blur effect when blur overlay is shown; natural image dimensions are async and fall back to screen aspect until measured"
5341
5342
  }
5342
5343
  ]
5343
5344
  },
@@ -12467,16 +12468,17 @@ function headerOverridesFor(hostname) {
12467
12468
  const host = hostname.toLowerCase();
12468
12469
  for (const override of HOST_HEADER_OVERRIDES) {
12469
12470
  if (host === override.hostSuffix || host.endsWith(`.${override.hostSuffix}`)) {
12470
- return override.headers;
12471
+ return override;
12471
12472
  }
12472
12473
  }
12473
- return {};
12474
+ return void 0;
12474
12475
  }
12475
12476
  function getFetchProxyTargetHeaders(targetUrl) {
12477
+ const hostOverrides = headerOverridesFor(targetUrl.hostname);
12476
12478
  return {
12477
12479
  "accept-encoding": "identity",
12478
- "user-agent": FETCH_PROXY_BROWSER_USER_AGENT,
12479
- ...headerOverridesFor(targetUrl.hostname)
12480
+ ...hostOverrides?.suppressBrowserUserAgent ? {} : { "user-agent": FETCH_PROXY_BROWSER_USER_AGENT },
12481
+ ...hostOverrides?.headers
12480
12482
  };
12481
12483
  }
12482
12484
  var FETCH_PROXY_BROWSER_USER_AGENT, HOST_HEADER_OVERRIDES;
@@ -12490,7 +12492,10 @@ var init_fetch_proxy_overrides = __esm({
12490
12492
  headers: {
12491
12493
  origin: "https://app.uniswap.org",
12492
12494
  referer: "https://app.uniswap.org/"
12493
- }
12495
+ },
12496
+ // uniswap's native gateway accepts the app origin, but forcing a desktop
12497
+ // browser ua on native api posts returns a bogus 414/tcp-stack response.
12498
+ suppressBrowserUserAgent: true
12494
12499
  }
12495
12500
  ];
12496
12501
  }
@@ -12516,6 +12521,12 @@ function formatFetchProxyError(targetUrl, err) {
12516
12521
  }
12517
12522
  return message;
12518
12523
  }
12524
+ function isTextProxyContentType(contentType) {
12525
+ const value = Array.isArray(contentType) ? contentType[0] : contentType;
12526
+ const normalized = value?.split(";", 1)[0]?.trim().toLowerCase();
12527
+ if (!normalized) return false;
12528
+ 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";
12529
+ }
12519
12530
  function buildFetchProxyHeaders(reqHeaders, targetUrl) {
12520
12531
  const headers = {};
12521
12532
  for (const [key, value] of Object.entries(reqHeaders)) {
@@ -12581,7 +12592,10 @@ async function handleFetchProxyRequest(req, res) {
12581
12592
  for await (const chunk of req) {
12582
12593
  chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
12583
12594
  }
12584
- if (chunks.length > 0) body = Buffer.concat(chunks);
12595
+ if (chunks.length > 0) {
12596
+ const bytes = Buffer.concat(chunks);
12597
+ body = isTextProxyContentType(req.headers["content-type"]) ? bytes.toString("utf8") : bytes;
12598
+ }
12585
12599
  }
12586
12600
  let upstream;
12587
12601
  try {
package/dist-lib/vite.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.127 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.129 | (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.127",
3
+ "version": "0.1.129",
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",
@@ -98,6 +98,22 @@ function formatFetchProxyError(targetUrl: string, err: unknown): string {
98
98
  return message
99
99
  }
100
100
 
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
+
101
117
  export function buildFetchProxyHeaders(
102
118
  reqHeaders: Record<string, string | string[] | undefined>,
103
119
  targetUrl?: URL,
@@ -176,13 +192,18 @@ export async function handleFetchProxyRequest(
176
192
 
177
193
  const headers = buildFetchProxyHeaders(req.headers, upstreamUrl)
178
194
 
179
- let body: Buffer | undefined
195
+ let body: BodyInit | undefined
180
196
  if (req.method !== 'GET' && req.method !== 'HEAD') {
181
197
  const chunks: Buffer[] = []
182
198
  for await (const chunk of req) {
183
199
  chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk))
184
200
  }
185
- if (chunks.length > 0) body = Buffer.concat(chunks)
201
+ if (chunks.length > 0) {
202
+ const bytes = Buffer.concat(chunks)
203
+ body = isTextProxyContentType(req.headers['content-type'])
204
+ ? bytes.toString('utf8')
205
+ : bytes
206
+ }
186
207
  }
187
208
 
188
209
  let upstream: Response
@@ -10,6 +10,7 @@ export const FETCH_PROXY_BROWSER_USER_AGENT =
10
10
  const HOST_HEADER_OVERRIDES: Array<{
11
11
  hostSuffix: string
12
12
  headers: Record<string, string>
13
+ suppressBrowserUserAgent?: boolean
13
14
  }> = [
14
15
  {
15
16
  hostSuffix: 'uniswap.org',
@@ -17,23 +18,34 @@ const HOST_HEADER_OVERRIDES: Array<{
17
18
  origin: 'https://app.uniswap.org',
18
19
  referer: 'https://app.uniswap.org/',
19
20
  },
21
+ // uniswap's native gateway accepts the app origin, but forcing a desktop
22
+ // browser ua on native api posts returns a bogus 414/tcp-stack response.
23
+ suppressBrowserUserAgent: true,
20
24
  },
21
25
  ]
22
26
 
23
- function headerOverridesFor(hostname: string): Record<string, string> {
27
+ function headerOverridesFor(hostname: string):
28
+ | {
29
+ headers: Record<string, string>
30
+ suppressBrowserUserAgent?: boolean
31
+ }
32
+ | undefined {
24
33
  const host = hostname.toLowerCase()
25
34
  for (const override of HOST_HEADER_OVERRIDES) {
26
35
  if (host === override.hostSuffix || host.endsWith(`.${override.hostSuffix}`)) {
27
- return override.headers
36
+ return override
28
37
  }
29
38
  }
30
- return {}
39
+ return undefined
31
40
  }
32
41
 
33
42
  export function getFetchProxyTargetHeaders(targetUrl: URL): Record<string, string> {
43
+ const hostOverrides = headerOverridesFor(targetUrl.hostname)
34
44
  return {
35
45
  'accept-encoding': 'identity',
36
- 'user-agent': FETCH_PROXY_BROWSER_USER_AGENT,
37
- ...headerOverridesFor(targetUrl.hostname),
46
+ ...(hostOverrides?.suppressBrowserUserAgent
47
+ ? {}
48
+ : { 'user-agent': FETCH_PROXY_BROWSER_USER_AGENT }),
49
+ ...hostOverrides?.headers,
38
50
  }
39
51
  }
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.127 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a,b,c,d}from"./chunk-BY4HZZZH.js";import"./chunk-52XT4NSH.js";import"./chunk-ZP3CCVT7.js";import"./chunk-5WIVTKYW.js";import"./chunk-Y4YKDIS6.js";import"./chunk-B56YQYVI.js";export{c as ensureDaemonRunning,a as ensureRuntimeInstalled,d as ensureSootsimReady,b as resolveBootstrapPort};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.127 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a,b,c,d,e}from"./chunk-5UWZ47FH.js";import"./chunk-B56YQYVI.js";export{e as BETA_ASK_HEADLINE,c as BETA_LABEL,d as BETA_TAGLINE,b as BETA_VERSION_TARGET,a as IS_BETA};
@@ -1 +0,0 @@
1
- /*! sootsim v0.1.127 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.127 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- var t="http://localhost:5173/";export{t as a};
@@ -1 +0,0 @@
1
- /*! sootsim v0.1.127 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
@@ -1 +0,0 @@
1
- /*! sootsim v0.1.127 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.127 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a}from"./chunk-MT6WASRO.js";import"./chunk-B56YQYVI.js";export{a as getCliVersion};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.127 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{d as a,e as b,f as c,g as d,h as e,i as f,j as g,k as h,l as i,m as j,n as k,o as l,p as m,q as n,r as o,s as p,t as q,u as r,v as s}from"./chunk-7JJF24H4.js";import"./chunk-FGTMXDHE.js";import"./chunk-6D4U74IK.js";import"./chunk-36AO2O2R.js";import"./chunk-YVB5QNKO.js";import"./chunk-52XT4NSH.js";import"./chunk-VIXWXLVX.js";import"./chunk-3DHE4SHG.js";import"./chunk-3WXNKHSH.js";import"./chunk-OKAG4ZKD.js";import"./chunk-DC6VXHIZ.js";import"./chunk-ZP3CCVT7.js";import"./chunk-FW5SXCE2.js";import"./chunk-5WIVTKYW.js";import"./chunk-Y4YKDIS6.js";import"./chunk-B56YQYVI.js";export{e as buildOpenUrl,d as buildShellUrl,q as closeSimsBulk,r as planBulkCloseTargets,i as playwrightHostPidForSim,g as printConnectedSims,b as resolveBundleTarget,c as resolveDefaultShellBaseUrl,a as resolveDriverConnectWaitOptions,p as runClaimCommand,s as runCloseCommand,o as runFocusCommand,l as runListCommand,m as runOpenCommand,n as runUseCommand,j as signalDriverLaunchConnected,f as summarizeSimUrl,k as terminatePlaywrightHostsForSims,h as waitForSimMatch};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.127 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import"./chunk-UWEGL2QF.js";import{a,b,c,d,e,f,g,h,i}from"./chunk-VIXWXLVX.js";import"./chunk-3DHE4SHG.js";import"./chunk-3WXNKHSH.js";import"./chunk-OKAG4ZKD.js";import"./chunk-DC6VXHIZ.js";import"./chunk-ZP3CCVT7.js";import"./chunk-Y4YKDIS6.js";import"./chunk-B56YQYVI.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.127 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a as c,b as d,c as e,d as f}from"./chunk-7DAYDZ6K.js";import"./chunk-3U2ZPTHG.js";import"./chunk-QVIEWXVS.js";import"./chunk-ZGXZQPYO.js";import"./chunk-L2CWZNGS.js";import"./chunk-TGJWE3CN.js";import{d as a,e as b}from"./chunk-DQAWYKPD.js";import"./chunk-7JJF24H4.js";import"./chunk-FGTMXDHE.js";import"./chunk-6D4U74IK.js";import"./chunk-36AO2O2R.js";import"./chunk-YVB5QNKO.js";import"./chunk-52XT4NSH.js";import"./chunk-VIXWXLVX.js";import"./chunk-3DHE4SHG.js";import"./chunk-3WXNKHSH.js";import"./chunk-OKAG4ZKD.js";import"./chunk-DC6VXHIZ.js";import"./chunk-ZP3CCVT7.js";import"./chunk-HNEBMDYQ.js";import"./chunk-GNG6W27T.js";import"./chunk-LF3KGYGE.js";import"./chunk-FW5SXCE2.js";import"./chunk-5WIVTKYW.js";import"./chunk-2YJLYAL3.js";import"./chunk-FG6YYUCT.js";import"./chunk-Y4YKDIS6.js";import"./chunk-B56YQYVI.js";export{c as discoverSootsimUrl,e as hoistLeadingSimFlag,a as parseFlowFile,f as runFlow,d as runFlowPlayback,b as validateFlowFile};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.127 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a,b,c}from"./chunk-5WSDKWL7.js";import"./chunk-LF3KGYGE.js";import"./chunk-NDGBW36P.js";import"./chunk-FW5SXCE2.js";import"./chunk-5WIVTKYW.js";import"./chunk-MT6WASRO.js";import"./chunk-5UWZ47FH.js";import"./chunk-FG6YYUCT.js";import"./chunk-Y4YKDIS6.js";import"./chunk-B56YQYVI.js";export{c as printCommandHelp,b as printGroupHelp,a as printHelp};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.127 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a as o}from"./chunk-FPVP3O53.js";import"./chunk-GNYI3JAB.js";import"./chunk-BY4HZZZH.js";import"./chunk-52XT4NSH.js";import"./chunk-ZP3CCVT7.js";import"./chunk-HNEBMDYQ.js";import"./chunk-GNG6W27T.js";import"./chunk-5WIVTKYW.js";import"./chunk-Y4YKDIS6.js";import"./chunk-B56YQYVI.js";async function t(n){console.error(" note: `sootsim install` is now `sootsim setup-repo`. forwarding\u2026\n"),await o(n)}export{t as runInstall};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.127 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a,b}from"./chunk-7QBGAHCM.js";import"./chunk-52XT4NSH.js";import"./chunk-ZP3CCVT7.js";import"./chunk-5WIVTKYW.js";import"./chunk-IWSLRFIG.js";import"./chunk-Y4YKDIS6.js";import"./chunk-B56YQYVI.js";export{b as formatReleaseEntry,a as runRuntime};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.127 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a}from"./chunk-FPVP3O53.js";import"./chunk-GNYI3JAB.js";import"./chunk-BY4HZZZH.js";import"./chunk-52XT4NSH.js";import"./chunk-ZP3CCVT7.js";import"./chunk-HNEBMDYQ.js";import"./chunk-GNG6W27T.js";import"./chunk-5WIVTKYW.js";import"./chunk-Y4YKDIS6.js";import"./chunk-B56YQYVI.js";export{a as runSetupRepo};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.127 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a}from"./chunk-2YJLYAL3.js";import"./chunk-FG6YYUCT.js";import"./chunk-B56YQYVI.js";export{a as settingsStore};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.127 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a,b}from"./chunk-HNEBMDYQ.js";import"./chunk-GNG6W27T.js";import"./chunk-Y4YKDIS6.js";import"./chunk-B56YQYVI.js";export{b as flushCliTelemetry,a as trackCliEvent};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.127 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a,b,c}from"./chunk-L2CWZNGS.js";import"./chunk-TGJWE3CN.js";import"./chunk-YVB5QNKO.js";import"./chunk-52XT4NSH.js";import"./chunk-3WXNKHSH.js";import"./chunk-DC6VXHIZ.js";import"./chunk-ZP3CCVT7.js";import"./chunk-HNEBMDYQ.js";import"./chunk-GNG6W27T.js";import"./chunk-5WIVTKYW.js";import"./chunk-Y4YKDIS6.js";import"./chunk-B56YQYVI.js";export{a as resolveDefaultUploadOrigin,b as resolvePublicPreviewOrigin,c as runUpload};