sootsim 0.1.218 → 0.1.219

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/README.md +5 -3
  2. package/detox/index.ts +6 -7
  3. package/dist-cli/bin.js +4 -4
  4. package/dist-cli/chunks/{agent-TQJDQNML.js → agent-ZV6ME4EG.js} +2 -2
  5. package/dist-cli/chunks/{agent-wrapper-OAOFXHX2.js → agent-wrapper-EGFEAPFH.js} +2 -2
  6. package/dist-cli/chunks/{app-fonts-4VPAP3RZ.js → app-fonts-ZWVEYPCN.js} +2 -2
  7. package/dist-cli/chunks/{assert-DKNRGH4M.js → assert-SC3W6UNR.js} +2 -2
  8. package/dist-cli/chunks/{auth-ZYOAQEI2.js → auth-7OTPNXUI.js} +2 -2
  9. package/dist-cli/chunks/beta-QPKHTN3A.js +2 -0
  10. package/dist-cli/chunks/{camera-BJCRYG27.js → camera-RQGNYESB.js} +2 -2
  11. package/dist-cli/chunks/{chunk-AHTGZMT4.js → chunk-2CCJGEVS.js} +2 -2
  12. package/dist-cli/chunks/{chunk-OTCJCVFR.js → chunk-2DOBRWPU.js} +3 -3
  13. package/dist-cli/chunks/{chunk-T2NAWDMZ.js → chunk-2U4CK5R5.js} +2 -2
  14. package/dist-cli/chunks/{chunk-AY5S4CWZ.js → chunk-3B5UXJ3Y.js} +1 -1
  15. package/dist-cli/chunks/{chunk-V64N734Y.js → chunk-3GQ2VZT3.js} +2 -2
  16. package/dist-cli/chunks/{chunk-TNEHHCMZ.js → chunk-3PMTZACY.js} +2 -2
  17. package/dist-cli/chunks/{chunk-KLBOD2JL.js → chunk-3QEIIJ4U.js} +2 -2
  18. package/dist-cli/chunks/{chunk-NN7XOWXY.js → chunk-4KBHOKFR.js} +3 -3
  19. package/dist-cli/chunks/{chunk-LIR2VPPJ.js → chunk-7EMJ67H5.js} +9 -9
  20. package/dist-cli/chunks/{chunk-SXS5SPIZ.js → chunk-7RSH52LR.js} +1 -1
  21. package/dist-cli/chunks/{chunk-73WAFGRP.js → chunk-7VZLWO2D.js} +2 -2
  22. package/dist-cli/chunks/{chunk-4DLUGQXQ.js → chunk-AWM244TZ.js} +3 -3
  23. package/dist-cli/chunks/{chunk-YMFQOXT4.js → chunk-BTLNZG23.js} +1 -1
  24. package/dist-cli/chunks/{chunk-CJHPCUUV.js → chunk-C5LRFEF4.js} +1 -1
  25. package/dist-cli/chunks/{chunk-JDCABF7Y.js → chunk-EMWJQRT7.js} +2 -2
  26. package/dist-cli/chunks/{chunk-XB6FCXX3.js → chunk-FGIGSM4Z.js} +2 -2
  27. package/dist-cli/chunks/{chunk-TGXLBFTC.js → chunk-FJPEIFZW.js} +1 -1
  28. package/dist-cli/chunks/{chunk-QWJG2WVA.js → chunk-G26OO66G.js} +1 -1
  29. package/dist-cli/chunks/{chunk-F5H6XTMN.js → chunk-GXIL7GMS.js} +1 -1
  30. package/dist-cli/chunks/{chunk-Q7U5TPQN.js → chunk-I6SPORCZ.js} +1 -1
  31. package/dist-cli/chunks/{chunk-CRPOEKYT.js → chunk-ITYDRFAM.js} +3 -3
  32. package/dist-cli/chunks/chunk-J3WU2XCQ.js +1 -0
  33. package/dist-cli/chunks/{chunk-6WWKUDWP.js → chunk-JEMQ2DRI.js} +2 -2
  34. package/dist-cli/chunks/{chunk-ZJI2JP7F.js → chunk-JT5JOWHK.js} +1 -1
  35. package/dist-cli/chunks/{chunk-FEMAFOUH.js → chunk-JVJNG6BQ.js} +2 -2
  36. package/dist-cli/chunks/{chunk-Z4QP44SI.js → chunk-JYU7BIGJ.js} +2 -2
  37. package/dist-cli/chunks/{chunk-DVZVP32W.js → chunk-KLTHI6RE.js} +2 -2
  38. package/dist-cli/chunks/{chunk-L5HYRG4P.js → chunk-LNNBPSAL.js} +2 -2
  39. package/dist-cli/chunks/{chunk-AK4CONMS.js → chunk-LUWFFYQL.js} +2 -2
  40. package/dist-cli/chunks/chunk-NVDHSK33.js +119 -0
  41. package/dist-cli/chunks/{chunk-FAUOGIHF.js → chunk-PMERG7PS.js} +1 -1
  42. package/dist-cli/chunks/{chunk-EEUNNW2P.js → chunk-PYIMY6VO.js} +1 -1
  43. package/dist-cli/chunks/{chunk-IKZ4Z6ND.js → chunk-QH5KCAPX.js} +1 -1
  44. package/dist-cli/chunks/{chunk-VOZZ62OJ.js → chunk-RCHJJ5GW.js} +1 -1
  45. package/dist-cli/chunks/{chunk-RZMI7IKL.js → chunk-UEA4JYEY.js} +2 -2
  46. package/dist-cli/chunks/{chunk-MW3G72KG.js → chunk-V4VPUZVL.js} +91 -14
  47. package/dist-cli/chunks/{chunk-24FHNNST.js → chunk-WTWTKL3R.js} +6 -6
  48. package/dist-cli/chunks/chunk-Y6Y7QQLA.js +1 -0
  49. package/dist-cli/chunks/{chunk-7NP5BWIH.js → chunk-Y7GPDSA2.js} +1 -1
  50. package/dist-cli/chunks/{chunk-CMGPYPUE.js → chunk-ZGTMYSKV.js} +2 -2
  51. package/dist-cli/chunks/{chunk-Q7K5GJR4.js → chunk-ZHMKPUDR.js} +2 -2
  52. package/dist-cli/chunks/{chunk-2HJU3NAO.js → chunk-ZNDD2KOF.js} +1 -1
  53. package/dist-cli/chunks/{chunk-B4KB5TBV.js → chunk-ZXFWW4MR.js} +1 -1
  54. package/dist-cli/chunks/cli-version-ZUBCW7QA.js +2 -0
  55. package/dist-cli/chunks/{compat-IETPHSZ3.js → compat-WICAPL25.js} +3 -3
  56. package/dist-cli/chunks/{config-BOOBJ25W.js → config-MGQCNMDQ.js} +2 -2
  57. package/dist-cli/chunks/{control-U52Q4YES.js → control-GW7OQZ2R.js} +2 -2
  58. package/dist-cli/chunks/daemon-2A2YTRXY.js +2 -0
  59. package/dist-cli/chunks/{debug-X4AW6CXJ.js → debug-54HQV7MN.js} +3 -3
  60. package/dist-cli/chunks/{desktop-HHREMDE2.js → desktop-5FWYDFK2.js} +3 -3
  61. package/dist-cli/chunks/{detox-AXETJDTZ.js → detox-75KJXI7K.js} +2 -2
  62. package/dist-cli/chunks/{device-B7PBIMER.js → device-VRR2CFKN.js} +2 -2
  63. package/dist-cli/chunks/{diagnose-7YEDF42J.js → diagnose-DS623ULB.js} +2 -2
  64. package/dist-cli/chunks/drivers-6QFTJGK6.js +2 -0
  65. package/dist-cli/chunks/{film-XQMAOELQ.js → film-6I22LQ4E.js} +3 -3
  66. package/dist-cli/chunks/flow-4RXVOUUF.js +2 -0
  67. package/dist-cli/chunks/help-IXPZBF5H.js +2 -0
  68. package/dist-cli/chunks/{home-paths-I3NOFS6P.js → home-paths-D7QIYKT2.js} +2 -2
  69. package/dist-cli/chunks/inspect-SU5K5IER.js +2 -0
  70. package/dist-cli/chunks/install-desktop-PN4SCIMA.js +2 -0
  71. package/dist-cli/chunks/{login-O4ZPWWEU.js → login-ETKHVL7Z.js} +4 -4
  72. package/dist-cli/chunks/{logout-REEPRXWZ.js → logout-FLW7LPE3.js} +2 -2
  73. package/dist-cli/chunks/{maestro-OCUCS5DY.js → maestro-D3MAAOMX.js} +3 -3
  74. package/dist-cli/chunks/{maestro-generate-VHUHJFHR.js → maestro-generate-73HS4LME.js} +3 -3
  75. package/dist-cli/chunks/{mode-T24V4RZ4.js → mode-SOXJRJIN.js} +2 -2
  76. package/dist-cli/chunks/optional-demo-registry-N2J3NEGC.js +2 -0
  77. package/dist-cli/chunks/{perf-ZUER6TVQ.js → perf-YAKR4GMN.js} +2 -2
  78. package/dist-cli/chunks/{record-XDKPMUBK.js → record-HWKSSN3E.js} +3 -3
  79. package/dist-cli/chunks/runtime-ZUWXQ46T.js +2 -0
  80. package/dist-cli/chunks/{screenshot-command-MMUGPJ4I.js → screenshot-command-UNDC4C2R.js} +3 -3
  81. package/dist-cli/chunks/screenshots-capture-QZSUIT4R.js +41 -0
  82. package/dist-cli/chunks/{serve-BCATAS4S.js → serve-D66T2PP3.js} +2 -2
  83. package/dist-cli/chunks/{setup-LXPQLQ6I.js → setup-FML4JBOA.js} +9 -9
  84. package/dist-cli/chunks/{skills-OOPLWNI2.js → skills-O2KIPSJ6.js} +2 -2
  85. package/dist-cli/chunks/{storage-E7MGHPIG.js → storage-T7MGNCI7.js} +2 -2
  86. package/dist-cli/chunks/store-WTRJT3P5.js +2 -0
  87. package/dist-cli/chunks/telemetry-7HV5GWEK.js +2 -0
  88. package/dist-cli/chunks/{timeline-4AN6A5CV.js → timeline-OQEJCRNZ.js} +2 -2
  89. package/dist-cli/chunks/upgrade-TL36WOFS.js +4 -0
  90. package/dist-cli/chunks/upload-7CIEKZM6.js +2 -0
  91. package/dist-cli/chunks/{version-LI2X5HLA.js → version-XG3TA6TB.js} +2 -2
  92. package/dist-cli/chunks/web-LVUK3CHP.js +2 -0
  93. package/dist-cli/chunks/{what-happened-2NTKQ4AT.js → what-happened-SASUKQEF.js} +2 -2
  94. package/dist-lib/agent-daemon-client.cjs +1 -1
  95. package/dist-lib/agent-events.cjs +1 -1
  96. package/dist-lib/agent-identity.cjs +1 -1
  97. package/dist-lib/agent-sessions.cjs +1 -1
  98. package/dist-lib/attached-projects.cjs +1 -1
  99. package/dist-lib/auth/shared-session.cjs +1 -1
  100. package/dist-lib/backend-origin.cjs +1 -1
  101. package/dist-lib/beta.cjs +1 -1
  102. package/dist-lib/beta.mjs +1 -1
  103. package/dist-lib/bridge-constants.cjs +1 -1
  104. package/dist-lib/cli-constants.cjs +1 -1
  105. package/dist-lib/config.cjs +1 -1
  106. package/dist-lib/detox/index.cjs +53 -7
  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 +1 -1
  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 +1 -1
  123. package/dist-lib/sdk.mjs +1 -1
  124. package/dist-lib/skills.cjs +164 -20
  125. package/dist-lib/vite.cjs +1 -1
  126. package/package.json +1 -1
  127. package/src/skills/builtin/a11y-review.ts +4 -1
  128. package/src/skills/builtin/perf-profile.ts +4 -1
  129. package/src/skills/builtin/screenshot-all.ts +4 -1
  130. package/src/skills/builtin/visual-diff.ts +4 -1
  131. package/dist-cli/chunks/beta-HL46FNX3.js +0 -2
  132. package/dist-cli/chunks/chunk-BZRIJJIK.js +0 -1
  133. package/dist-cli/chunks/chunk-FP3DRAKI.js +0 -119
  134. package/dist-cli/chunks/chunk-OUZAVYUG.js +0 -1
  135. package/dist-cli/chunks/cli-version-5FG6LIHX.js +0 -2
  136. package/dist-cli/chunks/daemon-EJDBU2UY.js +0 -2
  137. package/dist-cli/chunks/drivers-325S27FC.js +0 -2
  138. package/dist-cli/chunks/flow-V2SWGBAR.js +0 -2
  139. package/dist-cli/chunks/help-F4VH4LXF.js +0 -2
  140. package/dist-cli/chunks/inspect-NY5VGZNC.js +0 -2
  141. package/dist-cli/chunks/install-desktop-X7SXH7IN.js +0 -2
  142. package/dist-cli/chunks/optional-demo-registry-HPLGNZCO.js +0 -2
  143. package/dist-cli/chunks/runtime-4A24ALGX.js +0 -2
  144. package/dist-cli/chunks/screenshots-capture-OM6BE572.js +0 -41
  145. package/dist-cli/chunks/store-3DU64I7C.js +0 -2
  146. package/dist-cli/chunks/telemetry-AKRLP3AR.js +0 -2
  147. package/dist-cli/chunks/upgrade-FRBWFDPI.js +0 -4
  148. package/dist-cli/chunks/upload-XGUWNMYV.js +0 -2
  149. package/dist-cli/chunks/web-UDCVLGPU.js +0 -2
@@ -1,5 +1,5 @@
1
- /*! sootsim v0.1.218 | (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-7NP5BWIH.js";import{g as A,i as _}from"./chunk-AHTGZMT4.js";import"./chunk-Q7U5TPQN.js";import{b as k}from"./chunk-CJHPCUUV.js";import"./chunk-YMFQOXT4.js";import"./chunk-EEUNNW2P.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.219 | (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-Y7GPDSA2.js";import{g as A,i as _}from"./chunk-2CCJGEVS.js";import"./chunk-I6SPORCZ.js";import{b as k}from"./chunk-C5LRFEF4.js";import"./chunk-BTLNZG23.js";import"./chunk-PYIMY6VO.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.218 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.219 | (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.218 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.219 | (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.218 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.219 | (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.218 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.219 | (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.218 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.219 | (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.218 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.219 | (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.218 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.219 | (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.218 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.219 | (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.218 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.219 | (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.218 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.219 | (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.218 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.219 | (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.218 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.219 | (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.218 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.219 | (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;
@@ -118,6 +118,7 @@ async function launchReapedScoped(launch) {
118
118
  };
119
119
  return { browser, reapNow };
120
120
  }
121
+ var gpuChromeMissing = false;
121
122
  function gpuChromeArgs() {
122
123
  const angle = process.platform === "darwin" ? "metal" : process.platform === "linux" ? "vulkan" : "default";
123
124
  return [
@@ -128,6 +129,52 @@ function gpuChromeArgs() {
128
129
  "--ignore-gpu-blocklist"
129
130
  ];
130
131
  }
132
+ function gpuChromeLaunchOptions(opts = {}) {
133
+ const callerArgs = Array.isArray(opts.args) ? opts.args : [];
134
+ const callerIgnored = Array.isArray(opts.ignoreDefaultArgs) ? opts.ignoreDefaultArgs : [];
135
+ return {
136
+ ...opts,
137
+ channel: "chrome",
138
+ args: [...gpuChromeArgs(), ...callerArgs],
139
+ ignoreDefaultArgs: [...callerIgnored, "--enable-unsafe-swiftshader"]
140
+ };
141
+ }
142
+ function preferGpuChrome(launch, opts) {
143
+ return async () => {
144
+ const allowSoftwareFallback = process.env.CI === "true" || process.env.CI === "1" || process.env.GITHUB_ACTIONS === "true";
145
+ if (!gpuChromeMissing) {
146
+ try {
147
+ const callerArgs = Array.isArray(opts.args) ? opts.args : [];
148
+ if (!allowSoftwareFallback && callerArgs.some(
149
+ (arg) => arg === "--enable-unsafe-swiftshader" || /^--use-angle=(?:swiftshader|swiftshader-webgl)$/i.test(String(arg))
150
+ )) {
151
+ throw new Error("[reap-browser] refused local SwiftShader launch arguments");
152
+ }
153
+ return await launch(gpuChromeLaunchOptions(opts));
154
+ } catch (err) {
155
+ const msg = err instanceof Error ? err.message : String(err);
156
+ const missing = /not found at|not installed|Chromium distribution|Executable doesn't exist|No such file/i.test(
157
+ msg
158
+ );
159
+ if (!missing) throw err;
160
+ if (!allowSoftwareFallback) {
161
+ throw new Error(
162
+ "[reap-browser] system Chrome is required for local GPU browser work; bundled Chromium/SwiftShader fallback is disabled. Install Chrome or run `npx playwright install chrome`.",
163
+ { cause: err }
164
+ );
165
+ }
166
+ gpuChromeMissing = true;
167
+ console.warn(
168
+ "[reap-browser] CI system Chrome not found, falling back to bundled Chromium software rendering."
169
+ );
170
+ }
171
+ }
172
+ return launch(opts);
173
+ };
174
+ }
175
+ async function launchReapedChromeScoped(launch, opts = {}) {
176
+ return launchReapedScoped(preferGpuChrome(launch, opts));
177
+ }
131
178
 
132
179
  // detox/gestures.ts
133
180
  async function waitForSootsimGestureHandler(page, viewTag, handlerName) {
@@ -1651,13 +1698,12 @@ var device = {
1651
1698
  _platform: DETOX_PLATFORM,
1652
1699
  async launchApp(opts) {
1653
1700
  if (!_browser) {
1654
- const launched = await launchReapedScoped(
1655
- () => import_playwright.chromium.launch({
1656
- channel: "chrome",
1701
+ const launched = await launchReapedChromeScoped(
1702
+ (options) => import_playwright.chromium.launch(options),
1703
+ {
1657
1704
  headless: true,
1658
- args: [...gpuChromeArgs(), "--enable-unsafe-webgpu"],
1659
- ignoreDefaultArgs: ["--enable-unsafe-swiftshader"]
1660
- })
1705
+ args: ["--enable-unsafe-webgpu"]
1706
+ }
1661
1707
  );
1662
1708
  _browser = launched.browser;
1663
1709
  _reapBrowserNow = launched.reapNow;
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.218 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.219 | (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.218 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.219 | (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.218 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.219 | (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.218 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.219 | (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.218 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.219 | (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.218 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.219 | (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.218 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.219 | (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.218 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.219 | (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.218 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.219 | (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.218 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.219 | (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.218 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.219 | (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.218 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.219 | (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.218 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.219 | (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.218 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.219 | (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.218 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.219 | (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.218 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.219 | (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/sdk.mjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.218 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.219 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // cli/commands/inspect/core.ts
4
4
  function resolveMaxMsFlag(args, fallbackMs) {
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.218 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.219 | (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;
@@ -103,8 +103,8 @@ var init_registry = __esm({
103
103
  range: ">=2.30.0",
104
104
  coverage: 0.9,
105
105
  note: "tap, pan, pinch, rotation, fling, long press, race, manual, simultaneous",
106
- working: "GestureDetector, Gesture.Tap/Pan/Pinch/Rotation/Fling/LongPress/Manual/Race/Simultaneous/Exclusive/Hover, ScrollView/FlatList, Switch/RefreshControl, Pressable/Text, Touchables, BaseButton/RawButton/RectButton/BorderlessButton/PureNativeButton, Swipeable, ReanimatedSwipeable, GestureHandlerRootView, createNativeWrapper, gestureHandlerRootHOC, PointerType/MouseButton/HoverEffect exports, velocity tracking, activeOffsets, multi-tap",
107
- missing: "DrawerLayout (passthrough noop), NativeViewGestureHandler still lacks native-scroll coupling and handlerTag semantics, cross-detector simultaneousWithExternalGesture/requireExternalGestureToFail, ForceTouch semantics are placeholder-only"
106
+ working: "GestureDetector, Gesture.Tap/Pan/Pinch/Rotation/Fling/LongPress/Manual/Race/Simultaneous/Exclusive/Hover, simultaneousWithExternalGesture/requireExternalGestureToFail/blocksExternalGesture, ScrollView/FlatList, Switch/RefreshControl, Pressable/Text, Touchables, BaseButton/RawButton/RectButton/BorderlessButton/PureNativeButton, Swipeable, ReanimatedSwipeable, GestureHandlerRootView, createNativeWrapper, gestureHandlerRootHOC, PointerType/MouseButton/HoverEffect exports, velocity tracking, activeOffsets, multi-tap",
107
+ missing: "DrawerLayout (passthrough noop), NativeViewGestureHandler still lacks native-scroll coupling and handlerTag semantics, ForceTouch semantics are placeholder-only"
108
108
  }
109
109
  ]
110
110
  },
@@ -268,10 +268,10 @@ var init_registry = __esm({
268
268
  versions: [
269
269
  {
270
270
  range: ">=0.1.0",
271
- coverage: 0.93,
272
- note: "core thread-bridging APIs + runtime-kind type guards + runtime-id-keyed executors + shareable/synchronizable guards + custom serializable registry + feature flag readers all stubbed for sootsim semantics (one peer runtime via SAB-backed worklet runtime).",
273
- working: "runOnJS, runOnUI/Sync/Async, scheduleOnRN/UI/Runtime, runOnRuntime, runOnRuntimeAsync, runOnRuntimeSyncWithId, scheduleOnRuntimeWithId, makeShareable, createShareable (3-arg form with hostDecorator), createSerializable, createSynchronizable, isShareable, isSynchronizable, isWorkletFunction, isShareableRef, isSerializableRef, makeShareableCloneRecursive/OnUIRecursive, executeOnUIRuntimeSync, createWorkletRuntime, callMicrotasks, WorkletsModule, RuntimeKind enum, getRuntimeKind, isRNRuntime, isUIRuntime, isWorkerRuntime, isWorkletRuntime, UIRuntimeId, getUIRuntimeHolder, getUISchedulerHolder, registerCustomSerializable, getStaticFeatureFlag, getDynamicFeatureFlag, setDynamicFeatureFlag, Worklets namespace",
274
- missing: "cross-runtime structured-clone hooks for custom registered classes (registration is accepted but the SAB\u2194postMessage bridge does not consult it yet \u2014 apps that register custom classes still rely on structured-clone defaults), dynamic feature flag fan-out across the tenant\u2194shell split (setDynamicFeatureFlag is a noop write)"
271
+ coverage: 0.9,
272
+ note: "core RN\u2194UI thread bridging, runtime-kind guards, UI-runtime-id execution, shareable/synchronizable guards, custom serializable registration, and feature flag readers use the SAB-backed tenant\u2194shell runtime.",
273
+ working: "runOnJS, runOnUI/Sync/Async, scheduleOnRN/UI, UI-runtime runOnRuntime/runOnRuntimeSyncWithId/scheduleOnRuntimeWithId, makeShareable, createShareable (3-arg form with hostDecorator), createSerializable, createSynchronizable, isShareable, isSynchronizable, isWorkletFunction, isShareableRef, isSerializableRef, makeShareableCloneRecursive/OnUIRecursive, executeOnUIRuntimeSync, callMicrotasks, WorkletsModule, RuntimeKind enum, getRuntimeKind, isRNRuntime, isUIRuntime, isWorkerRuntime, isWorkletRuntime, UIRuntimeId, getUIRuntimeHolder, getUISchedulerHolder, registerCustomSerializable, getStaticFeatureFlag, getDynamicFeatureFlag, setDynamicFeatureFlag, Worklets namespace",
274
+ missing: "isolated named runtimes are not implemented: createWorkletRuntime, Worklets.createRuntime/createContext, and named run/schedule calls throw explicitly instead of returning inert handles; cross-runtime structured-clone hooks for custom registered classes; dynamic feature flag fan-out across the tenant\u2194shell split"
275
275
  }
276
276
  ]
277
277
  },
@@ -11611,7 +11611,7 @@ function mkfifoSync(p) {
11611
11611
  import_node_fs4.default.unlinkSync(p);
11612
11612
  }
11613
11613
  }
11614
- const result = (0, import_node_child_process.spawnSync)("mkfifo", ["-m", "600", p]);
11614
+ const result = (0, import_node_child_process2.spawnSync)("mkfifo", ["-m", "600", p]);
11615
11615
  if (result.status !== 0) {
11616
11616
  throw new Error(
11617
11617
  `mkfifo(${p}) failed: ${result.stderr?.toString().trim() || "unknown error"}`
@@ -11679,7 +11679,7 @@ async function startSession(opts) {
11679
11679
  if (claudeSessionUuid) {
11680
11680
  wrapperArgs.push("--claude-session-uuid", claudeSessionUuid);
11681
11681
  }
11682
- const child = (0, import_node_child_process.spawn)(cmd, wrapperArgs, {
11682
+ const child = (0, import_node_child_process2.spawn)(cmd, wrapperArgs, {
11683
11683
  detached: true,
11684
11684
  stdio: "ignore",
11685
11685
  env: {
@@ -11827,11 +11827,11 @@ async function waitForFirstEvent(fifo, predicate, timeoutMs) {
11827
11827
  import_node_fs4.default.closeSync(fd);
11828
11828
  }
11829
11829
  }
11830
- var import_node_child_process, import_node_crypto2, import_node_fs4, import_node_path3, import_node_readline, AgentSessionError;
11830
+ var import_node_child_process2, import_node_crypto2, import_node_fs4, import_node_path3, import_node_readline, AgentSessionError;
11831
11831
  var init_agent_sessions = __esm({
11832
11832
  "src/agent-sessions.ts"() {
11833
11833
  "use strict";
11834
- import_node_child_process = require("node:child_process");
11834
+ import_node_child_process2 = require("node:child_process");
11835
11835
  import_node_crypto2 = require("node:crypto");
11836
11836
  import_node_fs4 = __toESM(require("node:fs"), 1);
11837
11837
  import_node_path3 = __toESM(require("node:path"), 1);
@@ -11892,7 +11892,7 @@ async function sendPromptToAgentbusSession(input) {
11892
11892
  const command = resolveAgentbusCommand(input.command);
11893
11893
  const timeoutMs = input.timeoutMs ?? 15e3;
11894
11894
  await new Promise((resolve5, reject) => {
11895
- const child = (0, import_node_child_process2.spawn)(command, ["send", sessionId, text], {
11895
+ const child = (0, import_node_child_process3.spawn)(command, ["send", sessionId, text], {
11896
11896
  stdio: ["ignore", "ignore", "pipe"],
11897
11897
  env: process.env
11898
11898
  });
@@ -11927,11 +11927,11 @@ async function sendPromptToAgentbusSession(input) {
11927
11927
  });
11928
11928
  });
11929
11929
  }
11930
- var import_node_child_process2, import_node_fs5, import_node_os2, import_node_path4;
11930
+ var import_node_child_process3, import_node_fs5, import_node_os2, import_node_path4;
11931
11931
  var init_agentbus_prompt = __esm({
11932
11932
  "src/agentbus-prompt.ts"() {
11933
11933
  "use strict";
11934
- import_node_child_process2 = require("node:child_process");
11934
+ import_node_child_process3 = require("node:child_process");
11935
11935
  import_node_fs5 = __toESM(require("node:fs"), 1);
11936
11936
  import_node_os2 = __toESM(require("node:os"), 1);
11937
11937
  import_node_path4 = __toESM(require("node:path"), 1);
@@ -13385,8 +13385,8 @@ var init_bridge_host = __esm({
13385
13385
  }
13386
13386
  if (msg.type === "runtime:use") {
13387
13387
  const version = typeof msg.version === "string" ? msg.version : "";
13388
- const installed = listInstalledRuntimes();
13389
- if (!installed.includes(version)) {
13388
+ const installed2 = listInstalledRuntimes();
13389
+ if (!installed2.includes(version)) {
13390
13390
  try {
13391
13391
  ws.send(
13392
13392
  JSON.stringify({
@@ -18852,6 +18852,142 @@ module.exports = __toCommonJS(registry_exports);
18852
18852
  var fs10 = __toESM(require("fs"), 1);
18853
18853
  var path10 = __toESM(require("path"), 1);
18854
18854
 
18855
+ // ../../scripts/lib/reap-browser.ts
18856
+ var import_node_child_process = require("node:child_process");
18857
+ function rootChromePid(b) {
18858
+ const w = b;
18859
+ if (w && typeof w.process === "function") {
18860
+ try {
18861
+ const p = w.process();
18862
+ if (p && typeof p.pid === "number" && p.pid > 0) return p.pid;
18863
+ } catch {
18864
+ }
18865
+ }
18866
+ if (w && typeof w.browser === "function") {
18867
+ try {
18868
+ const child = w.browser();
18869
+ if (child) return rootChromePid(child);
18870
+ } catch {
18871
+ }
18872
+ }
18873
+ return null;
18874
+ }
18875
+ function killTree(pid) {
18876
+ let kids = [];
18877
+ try {
18878
+ kids = (0, import_node_child_process.execSync)(`pgrep -P ${pid} || true`).toString().split("\n").filter(Boolean);
18879
+ } catch {
18880
+ }
18881
+ for (const k of kids) killTree(Number(k));
18882
+ try {
18883
+ process.kill(pid, "SIGKILL");
18884
+ } catch {
18885
+ }
18886
+ }
18887
+ var reapPids = /* @__PURE__ */ new Set();
18888
+ var installed = false;
18889
+ function installReaper() {
18890
+ if (installed) return;
18891
+ installed = true;
18892
+ const reap = () => {
18893
+ for (const pid of reapPids) killTree(pid);
18894
+ };
18895
+ process.on("SIGTERM", () => {
18896
+ reap();
18897
+ process.exit(0);
18898
+ });
18899
+ process.on("SIGINT", () => {
18900
+ reap();
18901
+ process.exit(0);
18902
+ });
18903
+ process.on("exit", reap);
18904
+ }
18905
+ async function launchReapedScoped(launch) {
18906
+ const browser = await launch();
18907
+ const root = rootChromePid(browser);
18908
+ const mine = /* @__PURE__ */ new Set();
18909
+ if (root != null) {
18910
+ mine.add(root);
18911
+ reapPids.add(root);
18912
+ installReaper();
18913
+ }
18914
+ const evented = browser;
18915
+ if (typeof evented.on === "function") {
18916
+ evented.on("disconnected", () => {
18917
+ for (const pid of mine) reapPids.delete(pid);
18918
+ });
18919
+ }
18920
+ const reapNow = () => {
18921
+ for (const pid of mine) {
18922
+ killTree(pid);
18923
+ reapPids.delete(pid);
18924
+ }
18925
+ mine.clear();
18926
+ };
18927
+ return { browser, reapNow };
18928
+ }
18929
+ async function launchReaped(launch) {
18930
+ const { browser } = await launchReapedScoped(launch);
18931
+ return browser;
18932
+ }
18933
+ var gpuChromeMissing = false;
18934
+ function gpuChromeArgs() {
18935
+ const angle = process.platform === "darwin" ? "metal" : process.platform === "linux" ? "vulkan" : "default";
18936
+ return [
18937
+ `--use-angle=${angle}`,
18938
+ "--enable-gpu",
18939
+ "--enable-gpu-rasterization",
18940
+ "--enable-zero-copy",
18941
+ "--ignore-gpu-blocklist"
18942
+ ];
18943
+ }
18944
+ function gpuChromeLaunchOptions(opts = {}) {
18945
+ const callerArgs = Array.isArray(opts.args) ? opts.args : [];
18946
+ const callerIgnored = Array.isArray(opts.ignoreDefaultArgs) ? opts.ignoreDefaultArgs : [];
18947
+ return {
18948
+ ...opts,
18949
+ channel: "chrome",
18950
+ args: [...gpuChromeArgs(), ...callerArgs],
18951
+ ignoreDefaultArgs: [...callerIgnored, "--enable-unsafe-swiftshader"]
18952
+ };
18953
+ }
18954
+ function preferGpuChrome(launch, opts) {
18955
+ return async () => {
18956
+ const allowSoftwareFallback = process.env.CI === "true" || process.env.CI === "1" || process.env.GITHUB_ACTIONS === "true";
18957
+ if (!gpuChromeMissing) {
18958
+ try {
18959
+ const callerArgs = Array.isArray(opts.args) ? opts.args : [];
18960
+ if (!allowSoftwareFallback && callerArgs.some(
18961
+ (arg) => arg === "--enable-unsafe-swiftshader" || /^--use-angle=(?:swiftshader|swiftshader-webgl)$/i.test(String(arg))
18962
+ )) {
18963
+ throw new Error("[reap-browser] refused local SwiftShader launch arguments");
18964
+ }
18965
+ return await launch(gpuChromeLaunchOptions(opts));
18966
+ } catch (err) {
18967
+ const msg = err instanceof Error ? err.message : String(err);
18968
+ const missing = /not found at|not installed|Chromium distribution|Executable doesn't exist|No such file/i.test(
18969
+ msg
18970
+ );
18971
+ if (!missing) throw err;
18972
+ if (!allowSoftwareFallback) {
18973
+ throw new Error(
18974
+ "[reap-browser] system Chrome is required for local GPU browser work; bundled Chromium/SwiftShader fallback is disabled. Install Chrome or run `npx playwright install chrome`.",
18975
+ { cause: err }
18976
+ );
18977
+ }
18978
+ gpuChromeMissing = true;
18979
+ console.warn(
18980
+ "[reap-browser] CI system Chrome not found, falling back to bundled Chromium software rendering."
18981
+ );
18982
+ }
18983
+ }
18984
+ return launch(opts);
18985
+ };
18986
+ }
18987
+ async function launchReapedChrome(launch, opts = {}) {
18988
+ return launchReaped(preferGpuChrome(launch, opts));
18989
+ }
18990
+
18855
18991
  // src/skills/builtin/a11y-review.ts
18856
18992
  var skill = {
18857
18993
  name: "a11y-review",
@@ -18870,7 +19006,9 @@ var skill = {
18870
19006
  const { chromium } = await import("playwright");
18871
19007
  const path11 = await import("path");
18872
19008
  const fs11 = await import("fs");
18873
- const browser = await chromium.launch({ channel: "chrome", headless: true });
19009
+ const browser = await launchReapedChrome((options) => chromium.launch(options), {
19010
+ headless: true
19011
+ });
18874
19012
  const page = await browser.newPage({ viewport: { width: 500, height: 900 } });
18875
19013
  try {
18876
19014
  await page.goto(context.url, { waitUntil: "networkidle" });
@@ -19148,7 +19286,9 @@ var skill4 = {
19148
19286
  const { chromium } = await import("playwright");
19149
19287
  const path11 = await import("path");
19150
19288
  const fs11 = await import("fs");
19151
- const browser = await chromium.launch({ channel: "chrome", headless: true });
19289
+ const browser = await launchReapedChrome((options) => chromium.launch(options), {
19290
+ headless: true
19291
+ });
19152
19292
  const page = await browser.newPage({ viewport: { width: 500, height: 900 } });
19153
19293
  try {
19154
19294
  await page.goto(context.url, { waitUntil: "networkidle" });
@@ -19207,7 +19347,9 @@ var skill5 = {
19207
19347
  const { chromium } = await import("playwright");
19208
19348
  const path11 = await import("path");
19209
19349
  const fs11 = await import("fs");
19210
- const browser = await chromium.launch({ channel: "chrome", headless: true });
19350
+ const browser = await launchReapedChrome((options) => chromium.launch(options), {
19351
+ headless: true
19352
+ });
19211
19353
  const page = await browser.newPage({ viewport: { width: 500, height: 900 } });
19212
19354
  try {
19213
19355
  await page.goto(context.url, { waitUntil: "networkidle" });
@@ -19255,7 +19397,9 @@ var skill6 = {
19255
19397
  const { chromium } = await import("playwright");
19256
19398
  const path11 = await import("path");
19257
19399
  const fs11 = await import("fs");
19258
- const browser = await chromium.launch({ channel: "chrome", headless: true });
19400
+ const browser = await launchReapedChrome((options) => chromium.launch(options), {
19401
+ headless: true
19402
+ });
19259
19403
  const page = await browser.newPage({ viewport: { width: 500, height: 900 } });
19260
19404
  try {
19261
19405
  await page.goto(context.url, { waitUntil: "networkidle" });
package/dist-lib/vite.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.218 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.219 | (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.218",
3
+ "version": "0.1.219",
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",
@@ -1,5 +1,6 @@
1
1
  // built-in skill: accessibility audit
2
2
 
3
+ import { launchReapedChrome } from '../../../../../scripts/lib/reap-browser'
3
4
  import type { SootSimSkill } from '../types'
4
5
 
5
6
  export const skill: SootSimSkill = {
@@ -23,7 +24,9 @@ export const skill: SootSimSkill = {
23
24
  // sootsim renders CanvasKit — require GPU-backed Chrome (Metal). the
24
25
  // bundled swiftshader shell software-renders the canvas and pegs every
25
26
  // core; never use it for sootsim.
26
- const browser = await chromium.launch({ channel: 'chrome', headless: true })
27
+ const browser = await launchReapedChrome((options) => chromium.launch(options), {
28
+ headless: true,
29
+ })
27
30
  const page = await browser.newPage({ viewport: { width: 500, height: 900 } })
28
31
 
29
32
  try {