sootsim 0.1.277 → 0.1.279

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 (146) hide show
  1. package/README.md +5 -0
  2. package/detox/index.ts +10 -1
  3. package/dist-cli/bin.js +4 -4
  4. package/dist-cli/chunks/{agent-PQDKNOTV.js → agent-H5ERFFC5.js} +2 -2
  5. package/dist-cli/chunks/{agent-wrapper-K6CABYXW.js → agent-wrapper-64X727WI.js} +2 -2
  6. package/dist-cli/chunks/{app-fonts-KN5MSMYV.js → app-fonts-E6LPMGZ3.js} +2 -2
  7. package/dist-cli/chunks/{assert-GUPFV6IJ.js → assert-I4VVJPO5.js} +2 -2
  8. package/dist-cli/chunks/{auth-5XC6DVCU.js → auth-E5GZB6QZ.js} +2 -2
  9. package/dist-cli/chunks/beta-2X6QCFMD.js +2 -0
  10. package/dist-cli/chunks/{camera-PZ2OBBRX.js → camera-VGBVN6DS.js} +2 -2
  11. package/dist-cli/chunks/{chunk-CWEK5QNW.js → chunk-2WLOJJ5X.js} +2 -2
  12. package/dist-cli/chunks/{chunk-GXSLKPR7.js → chunk-4IHZPNWS.js} +3 -3
  13. package/dist-cli/chunks/{chunk-UMLDNNPZ.js → chunk-4O3WVDTB.js} +1 -1
  14. package/dist-cli/chunks/{chunk-VD2M5QYJ.js → chunk-5CIUH3X4.js} +1 -1
  15. package/dist-cli/chunks/{chunk-C3WRCJD2.js → chunk-5PRQPJNM.js} +3 -3
  16. package/dist-cli/chunks/{chunk-LB3RYIGF.js → chunk-5QSYOKLY.js} +2 -2
  17. package/dist-cli/chunks/{chunk-YAKW2UEX.js → chunk-7FPRE55K.js} +2 -2
  18. package/dist-cli/chunks/{chunk-CBCJ4AQI.js → chunk-7HY4FE7U.js} +1 -1
  19. package/dist-cli/chunks/{chunk-KKOFAS26.js → chunk-A2J7SXX3.js} +2 -2
  20. package/dist-cli/chunks/{chunk-YGW7PHH7.js → chunk-BEWRATIO.js} +2 -2
  21. package/dist-cli/chunks/{chunk-7CUTFN2B.js → chunk-DSNAAOVP.js} +2 -2
  22. package/dist-cli/chunks/{chunk-2PAP54WQ.js → chunk-EK2TUEDC.js} +1 -1
  23. package/dist-cli/chunks/{chunk-BK6ZOIKJ.js → chunk-F2ZR2DRV.js} +6 -6
  24. package/dist-cli/chunks/{chunk-7O7CMNJZ.js → chunk-GKHVITBS.js} +1 -1
  25. package/dist-cli/chunks/{chunk-DS4BEICQ.js → chunk-GLEBBDJM.js} +2 -2
  26. package/dist-cli/chunks/{chunk-D6JRMDNG.js → chunk-GMGIWXFB.js} +2 -2
  27. package/dist-cli/chunks/{chunk-BZKIFVVT.js → chunk-HCPEYAQN.js} +1 -1
  28. package/dist-cli/chunks/{chunk-L4QENHJZ.js → chunk-HKAG5BPE.js} +2 -2
  29. package/dist-cli/chunks/chunk-IH3D7E76.js +1 -0
  30. package/dist-cli/chunks/{chunk-WEFETSZ3.js → chunk-JMJFMOLR.js} +1 -1
  31. package/dist-cli/chunks/{chunk-EZ3NRNO4.js → chunk-JN5O6EEW.js} +1 -1
  32. package/dist-cli/chunks/{chunk-ESGHJ7B5.js → chunk-L3LQYO72.js} +2 -2
  33. package/dist-cli/chunks/{chunk-GFZL5QCF.js → chunk-LZCDA666.js} +2 -2
  34. package/dist-cli/chunks/{chunk-QMK5JX65.js → chunk-NEOE46RK.js} +3 -3
  35. package/dist-cli/chunks/{chunk-X2Q3OBZV.js → chunk-NYAN6XIZ.js} +1 -1
  36. package/dist-cli/chunks/{chunk-HFAYH7V2.js → chunk-O4NYHLZC.js} +2 -2
  37. package/dist-cli/chunks/{chunk-A7KAYBO5.js → chunk-O75DZMED.js} +1 -1
  38. package/dist-cli/chunks/{chunk-PVZMRKBA.js → chunk-P4AUH3VR.js} +1 -1
  39. package/dist-cli/chunks/{chunk-KAYYW6JY.js → chunk-PBJLDS4H.js} +1 -1
  40. package/dist-cli/chunks/{chunk-542VPKWI.js → chunk-POPDJ3IP.js} +2 -2
  41. package/dist-cli/chunks/{chunk-SZU6CQ5X.js → chunk-QBJ4RTXC.js} +1 -1
  42. package/dist-cli/chunks/{chunk-C6Q256CQ.js → chunk-QUYFCRSJ.js} +1 -1
  43. package/dist-cli/chunks/{chunk-QSW4OLNL.js → chunk-R24YKQMF.js} +1 -1
  44. package/dist-cli/chunks/{chunk-BRCINMNJ.js → chunk-RWY5DV52.js} +2 -2
  45. package/dist-cli/chunks/{chunk-IZ53TCEP.js → chunk-S6LOX2QK.js} +2 -2
  46. package/dist-cli/chunks/{chunk-AHPOA4WU.js → chunk-SFXFVFVZ.js} +3 -3
  47. package/dist-cli/chunks/{chunk-N7X5E65B.js → chunk-TMRN6EDJ.js} +1 -1
  48. package/dist-cli/chunks/{chunk-24X7V5TX.js → chunk-Y2KPDH63.js} +2 -2
  49. package/dist-cli/chunks/{chunk-YBY4VBXN.js → chunk-YGY6D6FY.js} +4 -4
  50. package/dist-cli/chunks/{chunk-5XEGGPXT.js → chunk-YQBEMAQG.js} +2 -2
  51. package/dist-cli/chunks/{chunk-FJ7BTTM4.js → chunk-ZGFU5I3E.js} +2 -2
  52. package/dist-cli/chunks/{chunk-UQODWZKG.js → chunk-ZIT4O42R.js} +2 -2
  53. package/dist-cli/chunks/{chunk-7ZCITH7N.js → chunk-ZLDIIFSJ.js} +1 -1
  54. package/dist-cli/chunks/{chunk-UN526KU5.js → chunk-ZM3XRHJY.js} +1 -1
  55. package/dist-cli/chunks/cli-version-RYYIVGUP.js +2 -0
  56. package/dist-cli/chunks/{compat-HAWBHLWJ.js → compat-Y72EMDFM.js} +3 -3
  57. package/dist-cli/chunks/{config-FMJRHQZB.js → config-IAHJWFL6.js} +2 -2
  58. package/dist-cli/chunks/{control-LKACBZ43.js → control-ATTJDQQV.js} +2 -2
  59. package/dist-cli/chunks/daemon-PB2UGELR.js +2 -0
  60. package/dist-cli/chunks/{debug-7OWQA4DQ.js → debug-VCSAJRDD.js} +3 -3
  61. package/dist-cli/chunks/{desktop-LQRIEWDV.js → desktop-NQIBCWFF.js} +3 -3
  62. package/dist-cli/chunks/{detox-VKLPAZ4C.js → detox-DDESD2SF.js} +2 -2
  63. package/dist-cli/chunks/{device-7RPH2OQH.js → device-3K23A2RW.js} +2 -2
  64. package/dist-cli/chunks/{diagnose-CCZGZ4B2.js → diagnose-2WG7VQWA.js} +2 -2
  65. package/dist-cli/chunks/drivers-X4RAFUNH.js +2 -0
  66. package/dist-cli/chunks/{film-4H6D2JL5.js → film-LZSGGWRL.js} +3 -3
  67. package/dist-cli/chunks/flow-CWNVNLKS.js +2 -0
  68. package/dist-cli/chunks/help-DYWNRSW6.js +2 -0
  69. package/dist-cli/chunks/{hidden-runtime-alias-2GIUUD7E.js → hidden-runtime-alias-P5K5MPOZ.js} +2 -2
  70. package/dist-cli/chunks/{home-paths-CXYL3NFQ.js → home-paths-XDGLL6FZ.js} +2 -2
  71. package/dist-cli/chunks/inspect-5RS2N5HD.js +2 -0
  72. package/dist-cli/chunks/install-desktop-DWW656NS.js +2 -0
  73. package/dist-cli/chunks/{login-KMOEWDV6.js → login-K4KM3FDX.js} +4 -4
  74. package/dist-cli/chunks/{logout-XWJMGGUU.js → logout-U5TCALQR.js} +2 -2
  75. package/dist-cli/chunks/{maestro-4EIARJ3S.js → maestro-3P3IMOO3.js} +3 -3
  76. package/dist-cli/chunks/{maestro-generate-VH477MZO.js → maestro-generate-CKNSAPNX.js} +3 -3
  77. package/dist-cli/chunks/{mode-YUZNL4P3.js → mode-EOFWHBTF.js} +2 -2
  78. package/dist-cli/chunks/optional-demo-registry-3JJHBOLE.js +2 -0
  79. package/dist-cli/chunks/{perf-732D7HVV.js → perf-QBEP6PGF.js} +2 -2
  80. package/dist-cli/chunks/{record-446A6JFA.js → record-YCWZ7X2N.js} +3 -3
  81. package/dist-cli/chunks/runtime-IPPKWABG.js +2 -0
  82. package/dist-cli/chunks/{screenshot-command-J52BKVGN.js → screenshot-command-Z7ZFFFFI.js} +3 -3
  83. package/dist-cli/chunks/{screenshots-capture-VFXZIID6.js → screenshots-capture-2QFGWQXK.js} +2 -2
  84. package/dist-cli/chunks/{serve-EYOABWCZ.js → serve-C46LOAWR.js} +14 -14
  85. package/dist-cli/chunks/{setup-NO3KEWNF.js → setup-UKMIUCHR.js} +3 -3
  86. package/dist-cli/chunks/{skills-IR2PBNGM.js → skills-VFN2RRT3.js} +2 -2
  87. package/dist-cli/chunks/{storage-ZAMM6TX4.js → storage-UOYMJ4XI.js} +2 -2
  88. package/dist-cli/chunks/store-W4OBL3E2.js +2 -0
  89. package/dist-cli/chunks/telemetry-FEIMOEK3.js +2 -0
  90. package/dist-cli/chunks/{timeline-4UYV2NXG.js → timeline-Y575NBHS.js} +2 -2
  91. package/dist-cli/chunks/{upgrade-EME3JYHO.js → upgrade-XTD56L7Q.js} +2 -2
  92. package/dist-cli/chunks/upload-6FOMKTP6.js +2 -0
  93. package/dist-cli/chunks/{version-4ESSNY6X.js → version-V5EG7ZS4.js} +2 -2
  94. package/dist-cli/chunks/web-R6QOOAD4.js +2 -0
  95. package/dist-cli/chunks/{what-happened-JRDFGSYS.js → what-happened-PMD4CHS3.js} +2 -2
  96. package/dist-lib/agent-daemon-client.cjs +1 -1
  97. package/dist-lib/agent-events.cjs +1 -1
  98. package/dist-lib/agent-identity.cjs +1 -1
  99. package/dist-lib/agent-sessions.cjs +1 -1
  100. package/dist-lib/attached-projects.cjs +1 -1
  101. package/dist-lib/auth/shared-session.cjs +1 -1
  102. package/dist-lib/backend-origin.cjs +1 -1
  103. package/dist-lib/beta.cjs +1 -1
  104. package/dist-lib/beta.mjs +1 -1
  105. package/dist-lib/bridge-constants.cjs +1 -1
  106. package/dist-lib/cli-constants.cjs +1 -1
  107. package/dist-lib/config.cjs +1 -1
  108. package/dist-lib/detox/index.cjs +11 -2
  109. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  110. package/dist-lib/home-paths.cjs +1 -1
  111. package/dist-lib/host/bridge-host.cjs +28 -14
  112. package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
  113. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  114. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  115. package/dist-lib/host/websocket-proxy.cjs +1 -1
  116. package/dist-lib/index.cjs +1 -1
  117. package/dist-lib/jump-to-source-babel.cjs +1 -1
  118. package/dist-lib/menu.cjs +1 -1
  119. package/dist-lib/menu.mjs +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/dev-server-scanner.cjs +1 -1
  124. package/dist-lib/sdk.cjs +4 -1
  125. package/dist-lib/sdk.mjs +4 -1
  126. package/dist-lib/skills.cjs +168 -23
  127. package/dist-lib/vite.cjs +1 -1
  128. package/package.json +1 -1
  129. package/skills/sootsim-debug/SKILL.md +1 -2
  130. package/skills/sootsim-setup/SKILL.md +2 -2
  131. package/src/host/bridge-host.ts +33 -18
  132. package/dist-cli/chunks/beta-RLGL67X2.js +0 -2
  133. package/dist-cli/chunks/chunk-P77AGQWO.js +0 -1
  134. package/dist-cli/chunks/cli-version-DUPRL2HF.js +0 -2
  135. package/dist-cli/chunks/daemon-DOMHEOIZ.js +0 -2
  136. package/dist-cli/chunks/drivers-LIEPQUQP.js +0 -2
  137. package/dist-cli/chunks/flow-K6CDVL6R.js +0 -2
  138. package/dist-cli/chunks/help-AYW3UBO6.js +0 -2
  139. package/dist-cli/chunks/inspect-ZYXAJC3I.js +0 -2
  140. package/dist-cli/chunks/install-desktop-5RHPDNZN.js +0 -2
  141. package/dist-cli/chunks/optional-demo-registry-DD7SUT2X.js +0 -2
  142. package/dist-cli/chunks/runtime-CCCISJXE.js +0 -2
  143. package/dist-cli/chunks/store-IW6RV5TY.js +0 -2
  144. package/dist-cli/chunks/telemetry-I64MRQAZ.js +0 -2
  145. package/dist-cli/chunks/upload-ALD2GD4T.js +0 -2
  146. package/dist-cli/chunks/web-EJFL3SD3.js +0 -2
@@ -1,5 +1,5 @@
1
- /*! sootsim v0.1.277 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{C as N,D as F,F as y,Q as T,R as b,S}from"./chunk-QMK5JX65.js";import{g as A,i as _}from"./chunk-BK6ZOIKJ.js";import"./chunk-EZ3NRNO4.js";import{c as k}from"./chunk-7ZCITH7N.js";import"./chunk-2PAP54WQ.js";import"./chunk-QSW4OLNL.js";function O(n){let t=[];for(let e=0;e<n.length;e++)if(n[e]==="--since"&&e+1<n.length){t.push(e,e+1);let s=n[e+1].trim(),l=/^(\d+(?:\.\d+)?)(ms|s|m)?$/.exec(s);if(l){let r=Number(l[1]),u=l[2]??"ms",v=u==="s"?r*1e3:u==="m"?r*6e4:r;return{since:Date.now()-v,consumed:t}}let i=Number(s);if(Number.isFinite(i)&&i>1e12)return{since:i,consumed:t}}return{consumed:t}}function B(n){let t=[];for(let e=0;e<n.length;e++)if(n[e]==="--kinds"&&e+1<n.length)return t.push(e,e+1),{kinds:n[e+1].split(",").map(s=>s.trim()).filter(Boolean),consumed:t};return{consumed:t}}function D(n){let t=[];for(let e=0;e<n.length;e++)if(n[e]==="--limit"&&e+1<n.length){t.push(e,e+1);let s=Number(n[e+1]);if(Number.isFinite(s)&&s>0)return{limit:s,consumed:t}}return{consumed:t}}function x(n){let t=[],e={label:"initial state",events:[],startedAt:n[0]?.t??null};t.push(e);for(let s of n)if(e.events.push(s),s.kind==="screen"||s.kind==="route"){let l=s.data,i=l?.phase;if(!i||i==="enter"||i==="appear"||i==="active"){let r=l?.name||l?.activeName||l?.path||l?.pathname||s.kind;t.length===1&&e.events.length===1?e.label=`${s.kind}: ${r}`:(e={label:`${s.kind}: ${r}`,events:[],startedAt:s.t},t.push(e))}}return t}async function J(n,t){let e=A(n,{port:t.port,stripBooleanFlags:["--summary","--all","--json","--no-advance","--help","-h","--flow","--noisy"],stripValueFlags:["--since","--kinds","--limit"]});(n.includes("--help")||n.includes("-h"))&&(console.log(`
1
+ /*! sootsim v0.1.279 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{C as N,D as F,F as y,Q as T,R as b,S}from"./chunk-NEOE46RK.js";import{g as A,i as _}from"./chunk-F2ZR2DRV.js";import"./chunk-JN5O6EEW.js";import{c as k}from"./chunk-ZLDIIFSJ.js";import"./chunk-EK2TUEDC.js";import"./chunk-R24YKQMF.js";function O(n){let t=[];for(let e=0;e<n.length;e++)if(n[e]==="--since"&&e+1<n.length){t.push(e,e+1);let s=n[e+1].trim(),l=/^(\d+(?:\.\d+)?)(ms|s|m)?$/.exec(s);if(l){let r=Number(l[1]),u=l[2]??"ms",v=u==="s"?r*1e3:u==="m"?r*6e4:r;return{since:Date.now()-v,consumed:t}}let i=Number(s);if(Number.isFinite(i)&&i>1e12)return{since:i,consumed:t}}return{consumed:t}}function B(n){let t=[];for(let e=0;e<n.length;e++)if(n[e]==="--kinds"&&e+1<n.length)return t.push(e,e+1),{kinds:n[e+1].split(",").map(s=>s.trim()).filter(Boolean),consumed:t};return{consumed:t}}function D(n){let t=[];for(let e=0;e<n.length;e++)if(n[e]==="--limit"&&e+1<n.length){t.push(e,e+1);let s=Number(n[e+1]);if(Number.isFinite(s)&&s>0)return{limit:s,consumed:t}}return{consumed:t}}function x(n){let t=[],e={label:"initial state",events:[],startedAt:n[0]?.t??null};t.push(e);for(let s of n)if(e.events.push(s),s.kind==="screen"||s.kind==="route"){let l=s.data,i=l?.phase;if(!i||i==="enter"||i==="appear"||i==="active"){let r=l?.name||l?.activeName||l?.path||l?.pathname||s.kind;t.length===1&&e.events.length===1?e.label=`${s.kind}: ${r}`:(e={label:`${s.kind}: ${r}`,events:[],startedAt:s.t},t.push(e))}}return t}async function J(n,t){let e=A(n,{port:t.port,stripBooleanFlags:["--summary","--all","--json","--no-advance","--help","-h","--flow","--noisy"],stripValueFlags:["--since","--kinds","--limit"]});(n.includes("--help")||n.includes("-h"))&&(console.log(`
3
3
  sootsim what-happened \u2014 show recent events from the semantic timeline
4
4
 
5
5
  usage:
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.277 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.279 | (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;
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.277 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.279 | (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 __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.277 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.279 | (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 __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.277 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.279 | (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;
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.277 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.279 | (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;
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.277 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.279 | (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;
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.277 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.279 | (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 __defProp = Object.defineProperty;
package/dist-lib/beta.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.277 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.279 | (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 __defProp = Object.defineProperty;
package/dist-lib/beta.mjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.277 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.279 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/beta.ts
4
4
  var IS_BETA = true;
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.277 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.279 | (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 __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.277 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.279 | (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 __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.277 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.279 | (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 __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.277 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.279 | (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;
@@ -2291,7 +2291,16 @@ var device = {
2291
2291
  },
2292
2292
  async pressBack() {
2293
2293
  if (device._platform !== "android") return;
2294
- await element(by.id("android-nav-back")).tap();
2294
+ const page = getPage();
2295
+ const dispatched = await page.evaluate(async () => {
2296
+ const goBack = window.SootSim?.bridges?.mainShell?.goBack;
2297
+ if (typeof goBack !== "function") return false;
2298
+ return await goBack() !== false;
2299
+ });
2300
+ if (!dispatched) throw new Error("sootsim Android back bridge is not installed");
2301
+ if (_synchronizationEnabled) {
2302
+ await waitForSootsimIdle(page);
2303
+ }
2295
2304
  },
2296
2305
  // raw coordinate tap, bypassing the element-based visibility/hit-test path.
2297
2306
  // mirrors detox 20.x device.tap({ x, y }) on real iOS — used when the
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.277 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.279 | (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 __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.277 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.279 | (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;
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.277 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.279 | (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;
@@ -4780,26 +4780,40 @@ var SootSimBridgeHost = class _SootSimBridgeHost {
4780
4780
  if (sim?.ws.readyState === import_ws2.WebSocket.OPEN) return sim;
4781
4781
  return null;
4782
4782
  }
4783
- const primary = this.primarySimId != null ? this.sims.get(this.primarySimId) : null;
4784
- if (primary?.ws.readyState === import_ws2.WebSocket.OPEN && primary.url) return primary;
4785
- let pagelessFallback = null;
4786
- for (const sim of this.sims.values()) {
4787
- if (sim.ws.readyState !== import_ws2.WebSocket.OPEN) continue;
4788
- if (sim.url) return sim;
4789
- pagelessFallback ??= sim;
4790
- }
4791
- if (primary?.ws.readyState === import_ws2.WebSocket.OPEN) return primary;
4792
- return pagelessFallback;
4783
+ const candidates = this.getDefaultSimCandidates();
4784
+ return candidates.find((sim) => sim.id === this.primarySimId) ?? candidates[0] ?? null;
4785
+ }
4786
+ getDefaultSimCandidates() {
4787
+ const open = Array.from(this.sims.values()).filter(
4788
+ (sim) => sim.ws.readyState === import_ws2.WebSocket.OPEN
4789
+ );
4790
+ const registered = open.filter((sim) => sim.url);
4791
+ return registered.length > 0 ? registered : open;
4793
4792
  }
4794
4793
  async waitForSim(simId, options = {}) {
4795
4794
  const attempts = options.attempts ?? 10;
4796
4795
  const intervalMs = options.intervalMs ?? 200;
4797
4796
  for (let attempt = 0; attempt < attempts; attempt++) {
4798
- const sim = this.getOpenSim(simId);
4799
- if (sim) return sim;
4797
+ if (!simId) {
4798
+ const candidates = this.getDefaultSimCandidates();
4799
+ if (candidates.length > 1) {
4800
+ throw new Error(
4801
+ `multiple sims are connected: ${candidates.map((sim) => sim.id).join(", ")}; run \`sootsim use <sim>\` or pass \`--sim <sim>\``
4802
+ );
4803
+ }
4804
+ const candidate = candidates[0];
4805
+ if (candidate) return candidate;
4806
+ } else {
4807
+ const sim = this.getOpenSim(simId);
4808
+ if (sim) return sim;
4809
+ }
4800
4810
  await new Promise((resolve) => setTimeout(resolve, intervalMs));
4801
4811
  }
4802
- throw new Error(simId ? `no sim connected with id ${simId}` : "no sim connected");
4812
+ if (!simId) throw new Error("no sim connected");
4813
+ const openSimIds = this.getDefaultSimCandidates().map((sim) => sim.id);
4814
+ throw new Error(
4815
+ `no sim connected with id ${simId}` + (openSimIds.length > 0 ? `; connected sims: ${openSimIds.join(", ")}` : "")
4816
+ );
4803
4817
  }
4804
4818
  shouldPromoteSim(sim) {
4805
4819
  const current = this.primarySimId ? this.sims.get(this.primarySimId) : null;
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.277 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.279 | (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;
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.277 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.279 | (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 __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.277 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.279 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/host/fetch-proxy-overrides.ts
4
4
  var FETCH_PROXY_BROWSER_USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36";
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.277 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.279 | (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 __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.277 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.279 | (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;
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.277 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.279 | (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 __defProp = Object.defineProperty;
package/dist-lib/menu.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.277 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.279 | (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 __defProp = Object.defineProperty;
package/dist-lib/menu.mjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.277 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.279 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/menu.ts
4
4
  var SOOTSIM_ENGINE_EVENT_NAME = "sootsim:engine-event";
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.277 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.279 | (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;
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.277 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.279 | (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;
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.277 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.279 | (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 __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.277 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.279 | (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/dist-lib/sdk.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.277 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.279 | (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 __defProp = Object.defineProperty;
@@ -1003,6 +1003,9 @@ async function inspectWaitReady(bridge, timeoutMs = 2e4, options = {}) {
1003
1003
  bridgeError = "";
1004
1004
  } catch (error) {
1005
1005
  bridgeError = error instanceof Error ? error.message : String(error);
1006
+ if (bridgeError.startsWith("multiple sims are connected:") || bridgeError.startsWith("saved sim ")) {
1007
+ throw error;
1008
+ }
1006
1009
  }
1007
1010
  const now = Date.now();
1008
1011
  const status = {
package/dist-lib/sdk.mjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.277 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.279 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // cli/commands/inspect/core.ts
4
4
  function resolveMaxMsFlag(args, fallbackMs) {
@@ -912,6 +912,9 @@ async function inspectWaitReady(bridge, timeoutMs = 2e4, options = {}) {
912
912
  bridgeError = "";
913
913
  } catch (error) {
914
914
  bridgeError = error instanceof Error ? error.message : String(error);
915
+ if (bridgeError.startsWith("multiple sims are connected:") || bridgeError.startsWith("saved sim ")) {
916
+ throw error;
917
+ }
915
918
  }
916
919
  const now = Date.now();
917
920
  const status = {
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.277 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.279 | (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;
@@ -1446,6 +1446,19 @@ var init_registry = __esm({
1446
1446
  }
1447
1447
  ]
1448
1448
  },
1449
+ "sift-react-native": {
1450
+ category: "Analytics",
1451
+ stubType: "native",
1452
+ versions: [
1453
+ {
1454
+ range: ">=0.1.0",
1455
+ coverage: 0.95,
1456
+ note: "native-seam only. Upstream JavaScript runs from the bundle; Sift configuration and identity methods are accepted without collecting or delivering fraud telemetry.",
1457
+ working: "setSiftConfig, setUserId, unsetUserId, upload, setPageName",
1458
+ missing: "no Sift device fingerprint collection, lifecycle collection, or backend delivery; intentionally absent for the development simulator"
1459
+ }
1460
+ ]
1461
+ },
1449
1462
  "@react-native-clipboard/clipboard": {
1450
1463
  category: "Essentials",
1451
1464
  stubType: "native",
@@ -1888,6 +1901,19 @@ var init_registry = __esm({
1888
1901
  }
1889
1902
  ]
1890
1903
  },
1904
+ "react-native-image-size": {
1905
+ category: "Image",
1906
+ stubType: "native",
1907
+ versions: [
1908
+ {
1909
+ range: ">=1.0.0",
1910
+ coverage: 0.95,
1911
+ note: "native-seam: the real package runs from the bundle and RNImageSize resolves dimensions through the engine image decoder",
1912
+ working: "getSize for browser-decodable remote, file, blob, and data image URIs; decoded dimensions include browser-applied EXIF orientation",
1913
+ missing: "the explicit Android rotation field is normalized to zero after browser decoding applies orientation"
1914
+ }
1915
+ ]
1916
+ },
1891
1917
  "react-native-config": {
1892
1918
  category: "Device & Platform",
1893
1919
  stubType: "native",
@@ -5638,10 +5664,10 @@ var init_registry = __esm({
5638
5664
  versions: [
5639
5665
  {
5640
5666
  range: ">=0.7.0",
5641
- coverage: 0.82,
5642
- note: "native-seam only \u2014 real react-native-quick-crypto JS runs from the bundle against a SootSim-provided global.__QuickCryptoProxy. The seam implements the synchronous native primitives that can be faithfully backed in the browser (random, hash/HMAC, PBKDF2, AES-CBC/CTR/GCM, AES secret-key handles) and leaves unsupported native-only RSA/sign/keygen paths as explicit unsupported operations.",
5643
- working: "upstream package JS and export surface, global __QuickCryptoProxy install before module evaluation, random/randomFill/getRandomValues via upstream JS, createHash/createHmac host objects, pbkdf2 callback/promise form and pbkdf2Sync, AES-CBC/GCM/CTR host ciphers, AES WebCrypto secret-key import/export and encrypt/decrypt",
5644
- missing: "synchronous RSA publicEncrypt/publicDecrypt/privateDecrypt, createSign/createVerify, generateKeyPair, RSA/ECDH WebCrypto key paths, AES-KW, and legacy ciphers such as DES/RC4/ChaCha20."
5667
+ coverage: 0.9,
5668
+ note: "native-seam only. Real react-native-quick-crypto JS runs from the bundle against either a SootSim-provided global.__QuickCryptoProxy or registered Nitro hybrid objects. The seam implements random, hash/HMAC, PBKDF2, AES-CBC/CTR/GCM, AES secret-key handles, and asynchronous RSA-OAEP WebCrypto key generation and encryption.",
5669
+ working: "upstream package JS and export surface, global __QuickCryptoProxy and Nitro hybrid-object install before module evaluation, random/randomFill/getRandomValues via upstream JS, createHash/createHmac host objects, pbkdf2 callback/promise form and pbkdf2Sync, AES-CBC/GCM/CTR host ciphers, AES WebCrypto secret-key import/export and encrypt/decrypt, RSA-OAEP subtle.generateKey plus JWK export/import and encrypt/decrypt",
5670
+ missing: "synchronous RSA key generation and publicEncrypt/publicDecrypt/privateDecrypt, createSign/createVerify, ECDH WebCrypto key paths, general asymmetric DER import, AES-KW, and legacy ciphers such as DES/RC4/ChaCha20."
5645
5671
  }
5646
5672
  ]
5647
5673
  },
@@ -5775,9 +5801,49 @@ var init_registry = __esm({
5775
5801
  versions: [
5776
5802
  {
5777
5803
  range: ">=15.0.0",
5778
- coverage: 1,
5779
- note: 'load-safe noop \u2014 GLView component renders null; createContextAsync rejects with "host bridge required" so apps with optional WebGL paths take their fallback',
5780
- missing: "no WebGL canvas in tenant worker. browsers have WebGL but sootsim renders through CanvasKit on the host \u2014 bridging requires a future host-side GL surface"
5804
+ coverage: 0.9,
5805
+ note: "native-seam only. upstream GLView and context APIs run from the guest bundle over the browser WebGL2 implementation in the tenant worker",
5806
+ working: "GLView context creation, WebGL2 commands, endFrameEXP presentation, view resizing, headless createContextAsync and destroyContextAsync, full-canvas snapshots, and @react-three/fiber native Canvas rendering",
5807
+ missing: "camera textures, native object destruction, experimental worklet contexts, asset-object texture uploads, and exact native MSAA sample counts"
5808
+ }
5809
+ ]
5810
+ },
5811
+ three: {
5812
+ category: "UI Components",
5813
+ stubType: "works",
5814
+ versions: [
5815
+ {
5816
+ range: ">=0.156.0",
5817
+ coverage: 0.96,
5818
+ note: "real pure-JavaScript package runs from the guest bundle; WebGLRenderer uses the browser WebGL2 context supplied by expo-gl",
5819
+ working: "scenes, cameras, geometry, lights, standard materials, shaders, animation, and WebGLRenderer",
5820
+ missing: "browser DOM integrations and loaders that require unsupported expo-gl asset-object texture uploads"
5821
+ }
5822
+ ]
5823
+ },
5824
+ "@react-three/fiber": {
5825
+ category: "UI Components",
5826
+ stubType: "works",
5827
+ versions: [
5828
+ {
5829
+ range: ">=9.0.0",
5830
+ coverage: 0.93,
5831
+ note: "real native entry and reconciler run from the guest bundle; Canvas mounts upstream expo-gl and presents each useFrame render through endFrameEXP",
5832
+ working: "native Canvas, declarative Three elements, useFrame, useThree, lights, materials, cameras, events, and continuous animation",
5833
+ missing: "asset-backed texture loading and browser-only DOM event integrations"
5834
+ }
5835
+ ]
5836
+ },
5837
+ "expo-three": {
5838
+ category: "UI Components",
5839
+ stubType: "works",
5840
+ versions: [
5841
+ {
5842
+ range: ">=8.0.0",
5843
+ coverage: 0.75,
5844
+ note: "real pure-JavaScript package runs from the guest bundle on the expo-gl WebGL2 context",
5845
+ working: "Three renderer construction and helpers that use plain WebGL resources",
5846
+ missing: "asset and texture helpers that depend on expo-gl asset-object uploads, camera textures, or browser DOM image elements"
5781
5847
  }
5782
5848
  ]
5783
5849
  },
@@ -7669,6 +7735,44 @@ var init_registry = __esm({
7669
7735
  }
7670
7736
  ]
7671
7737
  },
7738
+ "react-native-key-command": {
7739
+ category: "Keyboard",
7740
+ stubType: "native",
7741
+ versions: [
7742
+ {
7743
+ range: ">=1.0.0",
7744
+ coverage: 1,
7745
+ note: "native-seam: the real package validation and NativeEventEmitter wrapper run from the bundle; KeyCommand mirrors iOS and Android constants, registration, unregistration, and hardware-key delivery",
7746
+ working: "platform-native modifier and input constants, registerKeyCommands, unregisterKeyCommands, onKeyCommand events for registered hardware shortcuts"
7747
+ }
7748
+ ]
7749
+ },
7750
+ "@expensify/react-native-background-task": {
7751
+ category: "Device & Platform",
7752
+ stubType: "native",
7753
+ versions: [
7754
+ {
7755
+ range: ">=0.0.0",
7756
+ coverage: 0.85,
7757
+ note: "native-seam: the real task registry and NativeEventEmitter run from the bundle; Android job registration succeeds without inventing browser background execution",
7758
+ working: "defineTask registration, listener lifecycle, foreground JavaScript task registry",
7759
+ missing: "Android JobScheduler execution while the browser tab is suspended or closed"
7760
+ }
7761
+ ]
7762
+ },
7763
+ "group-ib-fp": {
7764
+ category: "Analytics",
7765
+ stubType: "native",
7766
+ versions: [
7767
+ {
7768
+ range: ">=3.0.0",
7769
+ coverage: 0.95,
7770
+ note: "native-seam: the real FP class, enums, validation, and event subscription surface run from the bundle; native configuration calls complete without collecting or delivering fraud telemetry",
7771
+ working: "customer, URL, header, key, login, session, attribute, capability, run/stop, cookie, and listener APIs with Android callback shapes",
7772
+ missing: "device fingerprint collection, Group-IB network delivery, and native session events"
7773
+ }
7774
+ ]
7775
+ },
7672
7776
  "@callstack/react-native-brownfield": {
7673
7777
  category: "Device & Platform",
7674
7778
  stubType: "native",
@@ -9111,6 +9215,32 @@ var init_registry = __esm({
9111
9215
  }
9112
9216
  ]
9113
9217
  },
9218
+ "react-native-quick-actions": {
9219
+ category: "Device & Platform",
9220
+ stubType: "native",
9221
+ versions: [
9222
+ {
9223
+ range: ">=0.3.0",
9224
+ coverage: 0.9,
9225
+ note: "native-seam only. Upstream Android and iOS JavaScript runs from the bundle; ReactAppShortcuts stores dynamic shortcut items in memory and starts with no launcher action.",
9226
+ working: "setShortcutItems, clearShortcutItems, popInitialAction, isSupported",
9227
+ missing: "no home-screen launcher shortcut or host OS launch event"
9228
+ }
9229
+ ]
9230
+ },
9231
+ "@joplin/react-native-alarm-notification": {
9232
+ category: "Device & Platform",
9233
+ stubType: "native",
9234
+ versions: [
9235
+ {
9236
+ range: ">=3.7.0",
9237
+ coverage: 0.8,
9238
+ note: "native-seam only. Upstream JavaScript runs from the bundle; RNAlarmNotification stores scheduled alarm records in memory and reports no notification-launch payload.",
9239
+ working: "scheduleAlarm, deleteAlarm, deleteRepeatingAlarm, getScheduledAlarms, getAlarmInfo, listener and permission methods",
9240
+ missing: "no host OS alarm scheduling, notification delivery, sound, or notification-launch events"
9241
+ }
9242
+ ]
9243
+ },
9114
9244
  "@rn-org/react-native-shortcuts": {
9115
9245
  category: "Device & Platform",
9116
9246
  stubType: "native",
@@ -15349,26 +15479,40 @@ var init_bridge_host = __esm({
15349
15479
  if (sim?.ws.readyState === import_ws2.WebSocket.OPEN) return sim;
15350
15480
  return null;
15351
15481
  }
15352
- const primary = this.primarySimId != null ? this.sims.get(this.primarySimId) : null;
15353
- if (primary?.ws.readyState === import_ws2.WebSocket.OPEN && primary.url) return primary;
15354
- let pagelessFallback = null;
15355
- for (const sim of this.sims.values()) {
15356
- if (sim.ws.readyState !== import_ws2.WebSocket.OPEN) continue;
15357
- if (sim.url) return sim;
15358
- pagelessFallback ??= sim;
15359
- }
15360
- if (primary?.ws.readyState === import_ws2.WebSocket.OPEN) return primary;
15361
- return pagelessFallback;
15482
+ const candidates = this.getDefaultSimCandidates();
15483
+ return candidates.find((sim) => sim.id === this.primarySimId) ?? candidates[0] ?? null;
15484
+ }
15485
+ getDefaultSimCandidates() {
15486
+ const open = Array.from(this.sims.values()).filter(
15487
+ (sim) => sim.ws.readyState === import_ws2.WebSocket.OPEN
15488
+ );
15489
+ const registered = open.filter((sim) => sim.url);
15490
+ return registered.length > 0 ? registered : open;
15362
15491
  }
15363
15492
  async waitForSim(simId, options = {}) {
15364
15493
  const attempts = options.attempts ?? 10;
15365
15494
  const intervalMs = options.intervalMs ?? 200;
15366
15495
  for (let attempt = 0; attempt < attempts; attempt++) {
15367
- const sim = this.getOpenSim(simId);
15368
- if (sim) return sim;
15496
+ if (!simId) {
15497
+ const candidates = this.getDefaultSimCandidates();
15498
+ if (candidates.length > 1) {
15499
+ throw new Error(
15500
+ `multiple sims are connected: ${candidates.map((sim) => sim.id).join(", ")}; run \`sootsim use <sim>\` or pass \`--sim <sim>\``
15501
+ );
15502
+ }
15503
+ const candidate = candidates[0];
15504
+ if (candidate) return candidate;
15505
+ } else {
15506
+ const sim = this.getOpenSim(simId);
15507
+ if (sim) return sim;
15508
+ }
15369
15509
  await new Promise((resolve5) => setTimeout(resolve5, intervalMs));
15370
15510
  }
15371
- throw new Error(simId ? `no sim connected with id ${simId}` : "no sim connected");
15511
+ if (!simId) throw new Error("no sim connected");
15512
+ const openSimIds = this.getDefaultSimCandidates().map((sim) => sim.id);
15513
+ throw new Error(
15514
+ `no sim connected with id ${simId}` + (openSimIds.length > 0 ? `; connected sims: ${openSimIds.join(", ")}` : "")
15515
+ );
15372
15516
  }
15373
15517
  shouldPromoteSim(sim) {
15374
15518
  const current = this.primarySimId ? this.sims.get(this.primarySimId) : null;
@@ -16164,10 +16308,11 @@ function createBridge(wsPort, opts = {}) {
16164
16308
  return await sendOnce(sentSimId);
16165
16309
  } catch (error) {
16166
16310
  const message = error instanceof Error ? error.message : String(error);
16167
- if (opts.simIdSource !== "flag" && sentSimId && cmd.simId === void 0 && message === `no sim connected with id ${sentSimId}`) {
16311
+ const missingSimMessage = `no sim connected with id ${sentSimId}`;
16312
+ if (opts.simIdSource !== "flag" && sentSimId && cmd.simId === void 0 && (message === missingSimMessage || message.startsWith(`${missingSimMessage};`))) {
16168
16313
  clearCurrentSimId();
16169
16314
  throw new Error(
16170
- `saved sim ${sentSimId} is gone; run \`sootsim list\` and \`sootsim use <sim>\`, or open a fresh sim`
16315
+ `saved sim ${sentSimId} is gone${message.slice(missingSimMessage.length)}; run \`sootsim list\` and \`sootsim use <sim>\`, or open a fresh sim`
16171
16316
  );
16172
16317
  }
16173
16318
  throw error;
package/dist-lib/vite.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.277 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.279 | (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.277",
3
+ "version": "0.1.279",
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",
@@ -62,8 +62,7 @@ regression test. a pile of ad-hoc logs helps no one and gets deleted.
62
62
  changes, and duplicate strings. add `testID` during implementation and
63
63
  query against it.
64
64
  - **pin a sim once.** if more than one is live, an unpinned command
65
- hits the first and produces results from the wrong app. `sootsim use
66
- <id>` at the start of the workflow.
65
+ refuses to choose. run `sootsim use <id>` at the start of the workflow.
67
66
  - **`debug eval` is an escape hatch.** if a top-level command feels
68
67
  broken or missing, file an issue — every agent after you benefits from
69
68
  a better CLI, not a pile of ad-hoc scripts.