sootsim 0.1.237 → 0.1.239

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-NIH7EKHN.js → agent-5KVGVFXJ.js} +2 -2
  3. package/dist-cli/chunks/{agent-wrapper-CANNQ3WM.js → agent-wrapper-YVXMSV3X.js} +2 -2
  4. package/dist-cli/chunks/{app-fonts-7WJKCFDA.js → app-fonts-IXF6YPQZ.js} +2 -2
  5. package/dist-cli/chunks/{assert-XUTQTOYN.js → assert-FMNM5VTT.js} +2 -2
  6. package/dist-cli/chunks/{auth-XX355P3M.js → auth-LNSDYZU4.js} +2 -2
  7. package/dist-cli/chunks/beta-BH6RPXQU.js +2 -0
  8. package/dist-cli/chunks/{camera-GDVYCC7S.js → camera-INMAD3CG.js} +2 -2
  9. package/dist-cli/chunks/{chunk-RAKITL2V.js → chunk-44WCYVFQ.js} +2 -2
  10. package/dist-cli/chunks/{chunk-JQMTWVQA.js → chunk-544G2PCM.js} +2 -2
  11. package/dist-cli/chunks/{chunk-QKRYUPTF.js → chunk-5VCOEPSJ.js} +2 -2
  12. package/dist-cli/chunks/{chunk-6MFHTRAJ.js → chunk-6XF2EHL2.js} +1 -1
  13. package/dist-cli/chunks/{chunk-3M7SGDD2.js → chunk-BKDHODNB.js} +1 -1
  14. package/dist-cli/chunks/{chunk-7QA2WPR3.js → chunk-BWKVAEAJ.js} +1 -1
  15. package/dist-cli/chunks/{chunk-JQZWNFDY.js → chunk-CJRALJVV.js} +1 -1
  16. package/dist-cli/chunks/{chunk-KGJRDFXS.js → chunk-CUDTQFGP.js} +2 -2
  17. package/dist-cli/chunks/{chunk-WARY5JGO.js → chunk-D4YH5KNQ.js} +2 -2
  18. package/dist-cli/chunks/{chunk-6ERIV33O.js → chunk-DJIWF2SR.js} +1 -1
  19. package/dist-cli/chunks/{chunk-W7FIMC6T.js → chunk-ECPEYFHV.js} +2 -2
  20. package/dist-cli/chunks/{chunk-NUSQ5DIM.js → chunk-EQYRXSBE.js} +2 -2
  21. package/dist-cli/chunks/{chunk-O5PWKD7X.js → chunk-FOTAUF7Q.js} +1 -1
  22. package/dist-cli/chunks/{chunk-4Y6UGVWJ.js → chunk-GI2S43VF.js} +1 -1
  23. package/dist-cli/chunks/{chunk-ETGOES6M.js → chunk-HE5NBBLH.js} +3 -3
  24. package/dist-cli/chunks/{chunk-AFUTBEVW.js → chunk-HJW6SASW.js} +1 -1
  25. package/dist-cli/chunks/{chunk-73DTCUXW.js → chunk-HV2ZRFGP.js} +1 -1
  26. package/dist-cli/chunks/chunk-J7SEKMNI.js +1 -0
  27. package/dist-cli/chunks/{chunk-5MG75PQR.js → chunk-JBUMYCFR.js} +4 -4
  28. package/dist-cli/chunks/{chunk-EOJFP7X2.js → chunk-JOSDTQZ3.js} +2 -2
  29. package/dist-cli/chunks/{chunk-JXGITBPW.js → chunk-JPNTLGLA.js} +2 -2
  30. package/dist-cli/chunks/{chunk-3MUI7YAX.js → chunk-KCS6OYQV.js} +2 -2
  31. package/dist-cli/chunks/{chunk-S5CSRSWR.js → chunk-LWE27HF7.js} +3 -3
  32. package/dist-cli/chunks/{chunk-LF5KTGTH.js → chunk-MDOTB5DP.js} +2 -2
  33. package/dist-cli/chunks/{chunk-E2JJWRNU.js → chunk-NDU5EJFW.js} +2 -2
  34. package/dist-cli/chunks/{chunk-M6CBJ5XY.js → chunk-NJQSCTFC.js} +130 -89
  35. package/dist-cli/chunks/chunk-NO6RQXYN.js +1 -0
  36. package/dist-cli/chunks/{chunk-BAW63ZF6.js → chunk-P5JIE7R6.js} +2 -2
  37. package/dist-cli/chunks/{chunk-ERAS4JM4.js → chunk-PVIUYYIS.js} +2 -2
  38. package/dist-cli/chunks/{chunk-62CZZGL3.js → chunk-QHJLYAOH.js} +2 -2
  39. package/dist-cli/chunks/{chunk-T4YTIZS6.js → chunk-QYVGMN3I.js} +46 -15
  40. package/dist-cli/chunks/{chunk-4NZEQ4MZ.js → chunk-R5I2OBQM.js} +2 -2
  41. package/dist-cli/chunks/{chunk-WDB42DJI.js → chunk-SBSL3DUQ.js} +1 -1
  42. package/dist-cli/chunks/{chunk-ALJ2MN26.js → chunk-SLIYVKRX.js} +1 -1
  43. package/dist-cli/chunks/{chunk-SBVVBTVB.js → chunk-SOZIIFPY.js} +3 -3
  44. package/dist-cli/chunks/{chunk-URCBOIED.js → chunk-SRMYUHBI.js} +1 -1
  45. package/dist-cli/chunks/{chunk-JMHDKBST.js → chunk-UZRZGXQ4.js} +2 -2
  46. package/dist-cli/chunks/{chunk-3TLRWV6X.js → chunk-VBO7OQLR.js} +2 -2
  47. package/dist-cli/chunks/{chunk-XLT2RL6P.js → chunk-VIM3WDAA.js} +1 -1
  48. package/dist-cli/chunks/{chunk-WPFTIHKG.js → chunk-WXYRA447.js} +1 -1
  49. package/dist-cli/chunks/{chunk-GHN465L7.js → chunk-X7JZ4KTU.js} +1 -1
  50. package/dist-cli/chunks/{chunk-2X4Q4CJX.js → chunk-XWPQVHOL.js} +2 -2
  51. package/dist-cli/chunks/{chunk-ZULXAIOA.js → chunk-YIS2RXPE.js} +1 -1
  52. package/dist-cli/chunks/{chunk-NNE2PWQJ.js → chunk-ZL2KSYJP.js} +1 -1
  53. package/dist-cli/chunks/cli-version-7KCROGJR.js +2 -0
  54. package/dist-cli/chunks/{compat-6WNQAVEB.js → compat-VYOIJUW6.js} +3 -3
  55. package/dist-cli/chunks/{config-WQAHBZKL.js → config-ZJIIQF6K.js} +2 -2
  56. package/dist-cli/chunks/{control-RSW5SZNO.js → control-KFAL3LD7.js} +2 -2
  57. package/dist-cli/chunks/daemon-TJXAVVUE.js +2 -0
  58. package/dist-cli/chunks/{debug-73FQE5N6.js → debug-RCY6BSLW.js} +3 -3
  59. package/dist-cli/chunks/{desktop-OVNY5GJQ.js → desktop-FRZILY3U.js} +3 -3
  60. package/dist-cli/chunks/{detox-3P2L6FYU.js → detox-W2HOZRDP.js} +2 -2
  61. package/dist-cli/chunks/{device-D4W3FFEB.js → device-WRWT7SEE.js} +2 -2
  62. package/dist-cli/chunks/{diagnose-VGWGP46V.js → diagnose-3KSX2NJC.js} +2 -2
  63. package/dist-cli/chunks/drivers-SJOWPOA3.js +2 -0
  64. package/dist-cli/chunks/{film-5ZP2ICET.js → film-QN7NUW6Z.js} +3 -3
  65. package/dist-cli/chunks/flow-Q4XCAPIT.js +2 -0
  66. package/dist-cli/chunks/help-FRVJH7SB.js +2 -0
  67. package/dist-cli/chunks/{hidden-runtime-alias-6ORU5BU5.js → hidden-runtime-alias-NIH62HCH.js} +2 -2
  68. package/dist-cli/chunks/{home-paths-TPX7JREW.js → home-paths-3CPTCZDU.js} +2 -2
  69. package/dist-cli/chunks/inspect-5ZZN4UJN.js +2 -0
  70. package/dist-cli/chunks/install-desktop-MIY6DLN6.js +2 -0
  71. package/dist-cli/chunks/{login-DGC5FTDF.js → login-HQ3356B6.js} +4 -4
  72. package/dist-cli/chunks/{logout-PDQBKY4G.js → logout-LVVXQS5S.js} +2 -2
  73. package/dist-cli/chunks/{maestro-3JSIIS5X.js → maestro-34Y7GOG5.js} +3 -3
  74. package/dist-cli/chunks/{maestro-generate-GCSWSG2K.js → maestro-generate-XBIZ7Z6U.js} +3 -3
  75. package/dist-cli/chunks/{mode-N5XFREJ5.js → mode-VXZR6I46.js} +2 -2
  76. package/dist-cli/chunks/optional-demo-registry-5JSIUIMF.js +2 -0
  77. package/dist-cli/chunks/{perf-WPRQA46P.js → perf-IBHKDDFN.js} +2 -2
  78. package/dist-cli/chunks/{record-SRLNC52N.js → record-S5WYHPNR.js} +3 -3
  79. package/dist-cli/chunks/runtime-5K5JFYOZ.js +2 -0
  80. package/dist-cli/chunks/{screenshot-command-SDVOFZPU.js → screenshot-command-T65M2SYC.js} +3 -3
  81. package/dist-cli/chunks/{screenshots-capture-UNF423TF.js → screenshots-capture-75AHIYWA.js} +2 -2
  82. package/dist-cli/chunks/{serve-I6ZP6LCF.js → serve-OJVA6PNV.js} +2 -2
  83. package/dist-cli/chunks/{setup-KB2N4BV6.js → setup-TLQ2VM3F.js} +3 -3
  84. package/dist-cli/chunks/{skills-Z7LFL4PF.js → skills-LZZDB6V5.js} +2 -2
  85. package/dist-cli/chunks/{storage-TLR45DGA.js → storage-G2IZ2WAD.js} +2 -2
  86. package/dist-cli/chunks/store-X6HDJ5SE.js +2 -0
  87. package/dist-cli/chunks/telemetry-AHMOJS6L.js +2 -0
  88. package/dist-cli/chunks/{timeline-5VYYMGSC.js → timeline-L4CFSXX3.js} +2 -2
  89. package/dist-cli/chunks/{upgrade-BEMPTIE6.js → upgrade-5USALUAU.js} +2 -2
  90. package/dist-cli/chunks/upload-OWMPT3Z7.js +2 -0
  91. package/dist-cli/chunks/{version-BFBYH5U7.js → version-RQZPUNJO.js} +2 -2
  92. package/dist-cli/chunks/web-YQ6XAB5F.js +2 -0
  93. package/dist-cli/chunks/{what-happened-HQOFQYP5.js → what-happened-JLAM7TBD.js} +2 -2
  94. package/dist-lib/agent-daemon-client.cjs +2 -2
  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 +2 -2
  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 +2 -2
  110. package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
  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 +122 -7
  123. package/dist-lib/sdk.mjs +122 -7
  124. package/dist-lib/skills.cjs +55 -10
  125. package/dist-lib/vite.cjs +1 -1
  126. package/package.json +1 -1
  127. package/src/agent-sessions.ts +4 -5
  128. package/src/vite-plugin.ts +3 -6
  129. package/dist-cli/chunks/beta-TGYZFOQJ.js +0 -2
  130. package/dist-cli/chunks/chunk-D4J6U3GH.js +0 -1
  131. package/dist-cli/chunks/chunk-TCXJDB7I.js +0 -1
  132. package/dist-cli/chunks/cli-version-CWJ4E23R.js +0 -2
  133. package/dist-cli/chunks/daemon-WCJIE7IG.js +0 -2
  134. package/dist-cli/chunks/drivers-NHFMITWU.js +0 -2
  135. package/dist-cli/chunks/flow-4KLRYEIU.js +0 -2
  136. package/dist-cli/chunks/help-CMC766TA.js +0 -2
  137. package/dist-cli/chunks/inspect-JNFBNXXE.js +0 -2
  138. package/dist-cli/chunks/install-desktop-TT4BA2NZ.js +0 -2
  139. package/dist-cli/chunks/optional-demo-registry-36MD5PON.js +0 -2
  140. package/dist-cli/chunks/runtime-JPMZUBIX.js +0 -2
  141. package/dist-cli/chunks/store-6FCWQNXM.js +0 -2
  142. package/dist-cli/chunks/telemetry-Q2DXNKX4.js +0 -2
  143. package/dist-cli/chunks/upload-2F643M7Y.js +0 -2
  144. package/dist-cli/chunks/web-7O2LHQ4V.js +0 -2
package/dist-lib/sdk.mjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.237 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.239 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // cli/commands/inspect/core.ts
4
4
  function resolveMaxMsFlag(args, fallbackMs) {
@@ -148,12 +148,20 @@ async function inspectDescribe(bridge, dumpOpts) {
148
148
  }
149
149
  function layoutGetNativeEval(opts = {}) {
150
150
  const includeStyle = opts.styling === true;
151
+ const filter = opts.filter?.trim().toLowerCase() ?? "";
151
152
  return `(async () => {
152
153
  const t = window.__sootsimTest
153
154
  if (!t || typeof t.listInspectable !== 'function') return []
154
155
  const list = await t.listInspectable({})
155
156
  if (!Array.isArray(list)) return []
156
157
  const includeStyle = ${JSON.stringify(includeStyle)}
158
+ // narrows by ELEMENT, not by style field: fewer rows, full detail on each.
159
+ const filter = ${JSON.stringify(filter)}
160
+ const matchesFilter = (n, text) => {
161
+ if (!filter) return true
162
+ const fields = [text, n.testID || n.testId, n.accessibilityRole || n.role, n.type]
163
+ return fields.some((f) => typeof f === 'string' && f.toLowerCase().includes(filter))
164
+ }
157
165
 
158
166
  const num = (v) => (typeof v === 'number' && Number.isFinite(v) ? v : 0)
159
167
  const round = (v) => Math.round(num(v))
@@ -210,6 +218,17 @@ function layoutGetNativeEval(opts = {}) {
210
218
  }
211
219
  return max > 0 ? Math.round(max) : undefined
212
220
  }
221
+ // only meaningful alongside a real border width, so it is resolved by the
222
+ // caller below rather than on its own.
223
+ const borderColorOf = (style) => {
224
+ if (!style) return undefined
225
+ const keys = ['borderColor','borderTopColor','borderBottomColor','borderLeftColor','borderRightColor']
226
+ for (const k of keys) {
227
+ const c = colorStr(style[k])
228
+ if (c) return c
229
+ }
230
+ return undefined
231
+ }
213
232
 
214
233
  const isVisible = (n) => {
215
234
  const layout = n && n.layout
@@ -223,11 +242,22 @@ function layoutGetNativeEval(opts = {}) {
223
242
  return abs.x + layout.width > 0 && abs.y + layout.height > 0 && abs.x < screenW && abs.y < screenH
224
243
  }
225
244
 
226
- return list.filter(isVisible).map((n) => {
245
+ return list.filter(isVisible).filter((n) => {
246
+ const t = typeof n.text === 'string' && n.text.trim() ? n.text.trim() : undefined
247
+ return matchesFilter(n, t)
248
+ }).map((n) => {
227
249
  const layout = n.layout || { x: 0, y: 0, width: 0, height: 0 }
228
250
  const abs = n.absolute || n.absolutePosition || { x: layout.x, y: layout.y }
229
251
  const text = typeof n.text === 'string' && n.text.trim() ? n.text.trim() : undefined
230
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
+ : {}),
231
261
  testID: n.testID || n.testId || undefined,
232
262
  role: n.accessibilityRole || n.role || undefined,
233
263
  type: typeof n.type === 'string' ? n.type : 'node',
@@ -242,6 +272,7 @@ function layoutGetNativeEval(opts = {}) {
242
272
  // fall back across both so radius/fontSize survive either shape.
243
273
  const style = Object.assign({}, n.style || {}, n.computedStyle || {})
244
274
  const pad = (n.boxModel && n.boxModel.padding) || {}
275
+ const borderWidth = borderWOf(style)
245
276
  return {
246
277
  ...base,
247
278
  borderRadius: radiusOf(style),
@@ -253,7 +284,8 @@ function layoutGetNativeEval(opts = {}) {
253
284
  fontWeight: weightOf(style),
254
285
  textDecoration: decoOf(style),
255
286
  overflow: overflowOf(style),
256
- borderWidth: borderWOf(style),
287
+ borderWidth,
288
+ borderColor: borderWidth ? borderColorOf(style) : undefined,
257
289
  }
258
290
  })
259
291
  })()`;
@@ -285,7 +317,11 @@ function formatLayoutElements(elements, opts) {
285
317
  if (el.opacity != null) parts.push(`opacity:${el.opacity}`);
286
318
  if (el.textDecoration) parts.push(`deco:${el.textDecoration}`);
287
319
  if (el.overflow) parts.push(`overflow:${el.overflow}`);
288
- if (el.borderWidth) parts.push(`border:${el.borderWidth}`);
320
+ if (el.borderWidth) {
321
+ parts.push(
322
+ el.borderColor ? `border:${el.borderWidth}/${el.borderColor}` : `border:${el.borderWidth}`
323
+ );
324
+ }
289
325
  }
290
326
  if (el.text) {
291
327
  const text = el.text.length > 40 ? `${el.text.slice(0, 39)}\u2026` : el.text;
@@ -931,7 +967,13 @@ async function inspectScrollStateAt(bridge, x, y) {
931
967
  path: "__sootsimTest.getScrollStateAt",
932
968
  args: [x, y]
933
969
  });
934
- 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
+ };
935
977
  }
936
978
  async function inspectLogs(bridge) {
937
979
  const res = await bridge.send({
@@ -1441,6 +1483,7 @@ function tapTiming(agent, opts = {}) {
1441
1483
  }
1442
1484
  function isTapSuccess(result) {
1443
1485
  if (!result || result.hit === false || result.ok === false) return false;
1486
+ if (result.requestedTargetMatched === false) return false;
1444
1487
  if (result.pointerTapHandled === false && !result.keyboardOpened && !result.isTextInput) {
1445
1488
  return false;
1446
1489
  }
@@ -1448,6 +1491,7 @@ function isTapSuccess(result) {
1448
1491
  }
1449
1492
  function tapTargetFromPayload(payload, textFallback) {
1450
1493
  return {
1494
+ nodeId: payload.target?.nodeId ?? payload.match?.nodeId ?? payload.node?.nodeId ?? null,
1451
1495
  id: payload.target?.id ?? payload.match?.id ?? payload.node?.id ?? null,
1452
1496
  testID: payload.target?.testID ?? payload.match?.testID ?? payload.node?.testID ?? null,
1453
1497
  text: payload.target?.text ?? payload.target?.accessibilityLabel ?? payload.match?.text ?? payload.match?.accessibilityLabel ?? payload.node?.text ?? textFallback ?? null,
@@ -1493,12 +1537,83 @@ async function tapResolvedTarget(bridge, args) {
1493
1537
  lastOffscreenAt = at;
1494
1538
  } else {
1495
1539
  lastOffscreenAt = null;
1496
- 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({
1497
1611
  type: "tap",
1498
1612
  x: payload.cx,
1499
1613
  y: payload.cy,
1500
- target: tapTargetFromPayload(payload, args.textFallback)
1614
+ target: requestedTarget
1501
1615
  });
1616
+ const result = dispatched && typeof dispatched === "object" ? { ...dispatched, ...verification } : { hit: !!dispatched, ...verification };
1502
1617
  lastResult = result;
1503
1618
  if (isTapSuccess(result)) return { payload, result, attempts };
1504
1619
  }
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.237 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.239 | (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
  },
@@ -11885,7 +11898,7 @@ function tryWorkspaceSootsim() {
11885
11898
  const buildMtime = import_node_fs4.default.statSync(distBin).mtimeMs;
11886
11899
  if (buildMtime < srcMtime) {
11887
11900
  console.warn(
11888
- `[sootsim] dist-cli/bin.js is older than agent-wrapper.ts \u2014 rebuild with \`bun run --cwd packages/sootsim build:cli\` (watch:cli:binary builds dist-bin/ instead).`
11901
+ `[sootsim] dist-cli/bin.js is older than agent-wrapper.ts \u2014 rebuild with \`bun run --cwd packages/sootsim build:cli\`.`
11889
11902
  );
11890
11903
  }
11891
11904
  }
@@ -16374,12 +16387,20 @@ var init_app_state_reset = __esm({
16374
16387
  // cli/commands/inspect/core.ts
16375
16388
  function layoutGetNativeEval(opts = {}) {
16376
16389
  const includeStyle = opts.styling === true;
16390
+ const filter = opts.filter?.trim().toLowerCase() ?? "";
16377
16391
  return `(async () => {
16378
16392
  const t = window.__sootsimTest
16379
16393
  if (!t || typeof t.listInspectable !== 'function') return []
16380
16394
  const list = await t.listInspectable({})
16381
16395
  if (!Array.isArray(list)) return []
16382
16396
  const includeStyle = ${JSON.stringify(includeStyle)}
16397
+ // narrows by ELEMENT, not by style field: fewer rows, full detail on each.
16398
+ const filter = ${JSON.stringify(filter)}
16399
+ const matchesFilter = (n, text) => {
16400
+ if (!filter) return true
16401
+ const fields = [text, n.testID || n.testId, n.accessibilityRole || n.role, n.type]
16402
+ return fields.some((f) => typeof f === 'string' && f.toLowerCase().includes(filter))
16403
+ }
16383
16404
 
16384
16405
  const num = (v) => (typeof v === 'number' && Number.isFinite(v) ? v : 0)
16385
16406
  const round = (v) => Math.round(num(v))
@@ -16436,6 +16457,17 @@ function layoutGetNativeEval(opts = {}) {
16436
16457
  }
16437
16458
  return max > 0 ? Math.round(max) : undefined
16438
16459
  }
16460
+ // only meaningful alongside a real border width, so it is resolved by the
16461
+ // caller below rather than on its own.
16462
+ const borderColorOf = (style) => {
16463
+ if (!style) return undefined
16464
+ const keys = ['borderColor','borderTopColor','borderBottomColor','borderLeftColor','borderRightColor']
16465
+ for (const k of keys) {
16466
+ const c = colorStr(style[k])
16467
+ if (c) return c
16468
+ }
16469
+ return undefined
16470
+ }
16439
16471
 
16440
16472
  const isVisible = (n) => {
16441
16473
  const layout = n && n.layout
@@ -16449,11 +16481,22 @@ function layoutGetNativeEval(opts = {}) {
16449
16481
  return abs.x + layout.width > 0 && abs.y + layout.height > 0 && abs.x < screenW && abs.y < screenH
16450
16482
  }
16451
16483
 
16452
- return list.filter(isVisible).map((n) => {
16484
+ return list.filter(isVisible).filter((n) => {
16485
+ const t = typeof n.text === 'string' && n.text.trim() ? n.text.trim() : undefined
16486
+ return matchesFilter(n, t)
16487
+ }).map((n) => {
16453
16488
  const layout = n.layout || { x: 0, y: 0, width: 0, height: 0 }
16454
16489
  const abs = n.absolute || n.absolutePosition || { x: layout.x, y: layout.y }
16455
16490
  const text = typeof n.text === 'string' && n.text.trim() ? n.text.trim() : undefined
16456
16491
  const base = {
16492
+ ...(typeof n.nodeId === 'number'
16493
+ ? {
16494
+ nodeId: n.nodeId,
16495
+ ancestorIds: Array.isArray(n.ancestors)
16496
+ ? n.ancestors.map((ancestor) => ancestor && ancestor.nodeId).filter((id) => typeof id === 'number')
16497
+ : [],
16498
+ }
16499
+ : {}),
16457
16500
  testID: n.testID || n.testId || undefined,
16458
16501
  role: n.accessibilityRole || n.role || undefined,
16459
16502
  type: typeof n.type === 'string' ? n.type : 'node',
@@ -16468,6 +16511,7 @@ function layoutGetNativeEval(opts = {}) {
16468
16511
  // fall back across both so radius/fontSize survive either shape.
16469
16512
  const style = Object.assign({}, n.style || {}, n.computedStyle || {})
16470
16513
  const pad = (n.boxModel && n.boxModel.padding) || {}
16514
+ const borderWidth = borderWOf(style)
16471
16515
  return {
16472
16516
  ...base,
16473
16517
  borderRadius: radiusOf(style),
@@ -16479,7 +16523,8 @@ function layoutGetNativeEval(opts = {}) {
16479
16523
  fontWeight: weightOf(style),
16480
16524
  textDecoration: decoOf(style),
16481
16525
  overflow: overflowOf(style),
16482
- borderWidth: borderWOf(style),
16526
+ borderWidth,
16527
+ borderColor: borderWidth ? borderColorOf(style) : undefined,
16483
16528
  }
16484
16529
  })
16485
16530
  })()`;
package/dist-lib/vite.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.237 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.239 | (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.237",
3
+ "version": "0.1.239",
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",
@@ -97,9 +97,9 @@ export function resolveSootsimInvocation(): { cmd: string; prefixArgs: string[]
97
97
  // workspace build artifacts — tried for every non-CLI-entry node context
98
98
  // (electron dev, vite-plugin-hosted daemon, random script) before falling
99
99
  // back to argv. prefers the compiled bun binary because `bun dev` runs
100
- // `watch:cli:binary` and that stays fresh; dist-cli/bin.js is the node
101
- // fallback but only `watch:cli` (not in the default dev graph) refreshes
102
- // it, so we warn when it's older than agent-wrapper.ts.
100
+ // `watch:cli:binary`; the same dev graph runs `watch:cli` to keep the node
101
+ // fallback and browser-facing dist-lib exports fresh. still warn when a
102
+ // caller starts outside that graph with stale artifacts.
103
103
  const workspace = tryWorkspaceSootsim()
104
104
  if (workspace) return workspace
105
105
 
@@ -140,8 +140,7 @@ function tryWorkspaceSootsim(): { cmd: string; prefixArgs: string[] } | null {
140
140
  if (buildMtime < srcMtime) {
141
141
  console.warn(
142
142
  `[sootsim] dist-cli/bin.js is older than agent-wrapper.ts — ` +
143
- `rebuild with \`bun run --cwd packages/sootsim build:cli\` ` +
144
- `(watch:cli:binary builds dist-bin/ instead).`,
143
+ `rebuild with \`bun run --cwd packages/sootsim build:cli\`.`,
145
144
  )
146
145
  }
147
146
  }
@@ -474,12 +474,9 @@ export function reanimatedNativeSeamRedirect(): Plugin {
474
474
  /\.(native|web|ios|android)$/,
475
475
  '',
476
476
  )
477
- // upstream's `fabricUtils.{ts,js}` `getShadowNodeWrapperFromRef` requires
478
- // `ref.__internalInstanceHandle` (Fabric's react-shadow-tree handle) and
479
- // throws otherwise. on sootsim refs come through as raw SootSimNodes
480
- // without that handle. redirect to a sootsim-aware version that
481
- // lazy-attaches the handle before reading it. see
482
- // `react-native-reanimated-fabric-utils.ts`.
477
+ // keep fabricUtils on the SootSim Fabric public-instance contract. the
478
+ // redirected module reads the constructor-attached handle for native
479
+ // refs and uses ReactFabric's renderer lookup for composite refs.
483
480
  if (basename === 'fabricUtils' && importer !== reanimatedFabricUtilsRedirectPath) {
484
481
  return reanimatedFabricUtilsRedirectPath
485
482
  }
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.237 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a,b,c,d}from"./chunk-3M7SGDD2.js";import"./chunk-7QA2WPR3.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.237 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
@@ -1 +0,0 @@
1
- /*! sootsim v0.1.237 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.237 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a}from"./chunk-ZULXAIOA.js";import"./chunk-7QA2WPR3.js";export{a as getCliVersion};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.237 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a,b,c,d,e}from"./chunk-4NZEQ4MZ.js";import"./chunk-JMHDKBST.js";import"./chunk-EOJFP7X2.js";import"./chunk-3TLRWV6X.js";import"./chunk-3MUI7YAX.js";import"./chunk-W7FIMC6T.js";import"./chunk-KGJRDFXS.js";import"./chunk-73DTCUXW.js";import"./chunk-ALJ2MN26.js";import"./chunk-AFUTBEVW.js";import"./chunk-O5PWKD7X.js";import"./chunk-ZULXAIOA.js";import"./chunk-3M7SGDD2.js";import"./chunk-JQZWNFDY.js";import"./chunk-7QA2WPR3.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.237 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import"./chunk-D4J6U3GH.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-62CZZGL3.js";import"./chunk-GHN465L7.js";import"./chunk-NNE2PWQJ.js";import"./chunk-ALJ2MN26.js";import"./chunk-O5PWKD7X.js";import"./chunk-7QA2WPR3.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.237 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{c,d,e,f,g,h}from"./chunk-ETGOES6M.js";import"./chunk-QKRYUPTF.js";import"./chunk-6ERIV33O.js";import{c as a,d as b}from"./chunk-M6CBJ5XY.js";import"./chunk-BAW63ZF6.js";import"./chunk-WARY5JGO.js";import"./chunk-JXGITBPW.js";import"./chunk-E2JJWRNU.js";import"./chunk-LF5KTGTH.js";import"./chunk-TCXJDB7I.js";import"./chunk-62CZZGL3.js";import"./chunk-GHN465L7.js";import"./chunk-URCBOIED.js";import"./chunk-6MFHTRAJ.js";import"./chunk-NNE2PWQJ.js";import"./chunk-WDB42DJI.js";import"./chunk-2X4Q4CJX.js";import"./chunk-T4YTIZS6.js";import"./chunk-JQMTWVQA.js";import"./chunk-WPFTIHKG.js";import"./chunk-JMHDKBST.js";import"./chunk-EOJFP7X2.js";import"./chunk-W7FIMC6T.js";import"./chunk-KGJRDFXS.js";import"./chunk-73DTCUXW.js";import"./chunk-ALJ2MN26.js";import"./chunk-AFUTBEVW.js";import"./chunk-O5PWKD7X.js";import"./chunk-RAKITL2V.js";import"./chunk-JQZWNFDY.js";import"./chunk-7QA2WPR3.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.237 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a,b,c}from"./chunk-3TLRWV6X.js";import"./chunk-3MUI7YAX.js";import"./chunk-W7FIMC6T.js";import"./chunk-KGJRDFXS.js";import"./chunk-73DTCUXW.js";import"./chunk-ALJ2MN26.js";import"./chunk-AFUTBEVW.js";import"./chunk-O5PWKD7X.js";import"./chunk-ZULXAIOA.js";import"./chunk-3M7SGDD2.js";import"./chunk-JQZWNFDY.js";import"./chunk-7QA2WPR3.js";export{c as printCommandHelp,b as printGroupHelp,a as printHelp};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.237 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{j as a,k as b}from"./chunk-M6CBJ5XY.js";import"./chunk-BAW63ZF6.js";import"./chunk-E2JJWRNU.js";import"./chunk-LF5KTGTH.js";import"./chunk-TCXJDB7I.js";import"./chunk-62CZZGL3.js";import"./chunk-GHN465L7.js";import"./chunk-URCBOIED.js";import"./chunk-6MFHTRAJ.js";import"./chunk-NNE2PWQJ.js";import"./chunk-WDB42DJI.js";import"./chunk-2X4Q4CJX.js";import"./chunk-T4YTIZS6.js";import"./chunk-JQMTWVQA.js";import"./chunk-WPFTIHKG.js";import"./chunk-W7FIMC6T.js";import"./chunk-KGJRDFXS.js";import"./chunk-73DTCUXW.js";import"./chunk-ALJ2MN26.js";import"./chunk-AFUTBEVW.js";import"./chunk-O5PWKD7X.js";import"./chunk-RAKITL2V.js";import"./chunk-JQZWNFDY.js";import"./chunk-7QA2WPR3.js";export{a as printShellPerfReport,b as runInspect};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.237 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a}from"./chunk-S5CSRSWR.js";import"./chunk-GHN465L7.js";import"./chunk-4Y6UGVWJ.js";import"./chunk-7QA2WPR3.js";export{a as runInstallDesktop};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.237 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a,b}from"./chunk-WDB42DJI.js";import"./chunk-7QA2WPR3.js";export{a as loadOptionalDemoApps,b as optionalDemoAppsSync};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.237 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a}from"./chunk-SBVVBTVB.js";import"./chunk-ERAS4JM4.js";import"./chunk-JQMTWVQA.js";import"./chunk-73DTCUXW.js";import"./chunk-ALJ2MN26.js";import"./chunk-O5PWKD7X.js";import"./chunk-7QA2WPR3.js";export{a as runRuntime};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.237 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a}from"./chunk-RAKITL2V.js";import"./chunk-JQZWNFDY.js";import"./chunk-7QA2WPR3.js";export{a as settingsStore};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.237 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a,b}from"./chunk-JMHDKBST.js";import"./chunk-EOJFP7X2.js";import"./chunk-O5PWKD7X.js";import"./chunk-7QA2WPR3.js";export{b as flushCliTelemetry,a as trackCliEvent};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.237 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{e as a,f as b,g as c}from"./chunk-WARY5JGO.js";import"./chunk-JXGITBPW.js";import"./chunk-URCBOIED.js";import"./chunk-6MFHTRAJ.js";import"./chunk-NNE2PWQJ.js";import"./chunk-JQMTWVQA.js";import"./chunk-JMHDKBST.js";import"./chunk-EOJFP7X2.js";import"./chunk-73DTCUXW.js";import"./chunk-ALJ2MN26.js";import"./chunk-O5PWKD7X.js";import"./chunk-7QA2WPR3.js";export{a as resolveDefaultUploadOrigin,b as resolvePublicPreviewOrigin,c as runUpload};