sootsim 0.1.215 → 0.1.217
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.
- package/detox/index.ts +30 -16
- package/dist-cli/bin.js +4 -4
- package/dist-cli/chunks/{agent-63EE3N4N.js → agent-4FX2PQLB.js} +2 -2
- package/dist-cli/chunks/{agent-wrapper-GIXQ4UC3.js → agent-wrapper-KIQTUCYG.js} +2 -2
- package/dist-cli/chunks/{app-fonts-T24PVENP.js → app-fonts-7XJS63Y2.js} +2 -2
- package/dist-cli/chunks/{assert-C2EJWQW3.js → assert-VQMDKAVI.js} +2 -2
- package/dist-cli/chunks/{auth-HYWSF7FV.js → auth-6JIMQLVG.js} +2 -2
- package/dist-cli/chunks/beta-N2ZUIDGA.js +2 -0
- package/dist-cli/chunks/{camera-TUULMDLJ.js → camera-BCXQMAB3.js} +2 -2
- package/dist-cli/chunks/{chunk-AKNZ6QBL.js → chunk-2MCDMCYQ.js} +1 -1
- package/dist-cli/chunks/{chunk-7COBEK2I.js → chunk-2QZEYMIG.js} +2 -2
- package/dist-cli/chunks/{chunk-FEFLFVIU.js → chunk-43HOXICB.js} +1 -1
- package/dist-cli/chunks/{chunk-LIFR6X36.js → chunk-5HXI2BXE.js} +2 -2
- package/dist-cli/chunks/chunk-5LY3QGYK.js +2 -0
- package/dist-cli/chunks/{chunk-2FEGONIZ.js → chunk-5MRHVSLH.js} +1 -1
- package/dist-cli/chunks/{chunk-ZT7M27FX.js → chunk-5PMHRL26.js} +2 -2
- package/dist-cli/chunks/{chunk-RIAS4TMS.js → chunk-5WGUBDNY.js} +3 -3
- package/dist-cli/chunks/{chunk-6NQYBCWC.js → chunk-72ACLZTK.js} +1 -1
- package/dist-cli/chunks/{chunk-HKEH2UOD.js → chunk-7GGP6CHB.js} +1 -1
- package/dist-cli/chunks/{chunk-EWYTZ7FV.js → chunk-C3L2JWQF.js} +31 -31
- package/dist-cli/chunks/{chunk-QGFTJYVC.js → chunk-CGQGD4YT.js} +1 -1
- package/dist-cli/chunks/{chunk-SADP73NH.js → chunk-DLGYFFRD.js} +2 -2
- package/dist-cli/chunks/{chunk-YTQ5RCVB.js → chunk-DPR6E3DA.js} +1 -1
- package/dist-cli/chunks/{chunk-VD2SYCCY.js → chunk-EDF3RMTS.js} +2 -2
- package/dist-cli/chunks/chunk-F3OVNA6L.js +2 -0
- package/dist-cli/chunks/{chunk-EB4FLAAE.js → chunk-FHZ72TK4.js} +2 -2
- package/dist-cli/chunks/{chunk-T4EGFOSE.js → chunk-FS73CB2S.js} +1 -1
- package/dist-cli/chunks/chunk-GLAMORG7.js +1 -0
- package/dist-cli/chunks/{chunk-QXJPLKP7.js → chunk-HKQG2TQP.js} +1 -1
- package/dist-cli/chunks/{chunk-KG6V4NCI.js → chunk-II5GPTCI.js} +2 -2
- package/dist-cli/chunks/chunk-IQUBZ6UH.js +119 -0
- package/dist-cli/chunks/{chunk-BU7V5UGD.js → chunk-IRCQILE3.js} +2 -2
- package/dist-cli/chunks/{chunk-CKCDJCPZ.js → chunk-JVV5UWFI.js} +1 -1
- package/dist-cli/chunks/chunk-KDMMOZWO.js +89 -0
- package/dist-cli/chunks/{chunk-OHQOMV2J.js → chunk-KPQIXJ6P.js} +2 -2
- package/dist-cli/chunks/{chunk-RFJMDMLK.js → chunk-OKKXVF4E.js} +2 -2
- package/dist-cli/chunks/chunk-P2FPQYLI.js +99 -0
- package/dist-cli/chunks/{chunk-CSJUJIRP.js → chunk-PH6F62XI.js} +2 -2
- package/dist-cli/chunks/{chunk-OUB7WT7Q.js → chunk-PNEWTGQD.js} +1 -1
- package/dist-cli/chunks/{chunk-XVYCMZMB.js → chunk-PNN5RIHU.js} +2 -2
- package/dist-cli/chunks/chunk-S3NTQ523.js +1 -0
- package/dist-cli/chunks/{chunk-5MUXEXEW.js → chunk-SBLVM6KT.js} +2 -2
- package/dist-cli/chunks/{chunk-UJZFS2JM.js → chunk-V33VVORZ.js} +2 -2
- package/dist-cli/chunks/{chunk-E6YKEDDM.js → chunk-VFM2GCJK.js} +1 -1
- package/dist-cli/chunks/{chunk-6USQVYW2.js → chunk-WOVVMHGW.js} +2 -2
- package/dist-cli/chunks/{chunk-AHG7WAP6.js → chunk-WSHEWWAP.js} +2 -2
- package/dist-cli/chunks/{chunk-VMYBUPRT.js → chunk-XGOENFDF.js} +93 -65
- package/dist-cli/chunks/{chunk-DVJZUBQB.js → chunk-XNLHQI4J.js} +1 -1
- package/dist-cli/chunks/{chunk-X7VZ7D6Y.js → chunk-YIEZXEFD.js} +3 -3
- package/dist-cli/chunks/{chunk-FWUGH36K.js → chunk-Z5DRCU5R.js} +2 -2
- package/dist-cli/chunks/{chunk-5GU7LW64.js → chunk-Z6H5YGVP.js} +1 -1
- package/dist-cli/chunks/{chunk-EGCQXWLS.js → chunk-ZP7IKLL5.js} +2 -2
- package/dist-cli/chunks/cli-version-57GES5K7.js +2 -0
- package/dist-cli/chunks/{compat-EL7PRWER.js → compat-VMLCACM3.js} +3 -3
- package/dist-cli/chunks/{config-IZZQIOI5.js → config-PTMQDYOZ.js} +2 -2
- package/dist-cli/chunks/{control-FHQBCUP6.js → control-SHITPCIX.js} +2 -2
- package/dist-cli/chunks/daemon-KHJZASBC.js +2 -0
- package/dist-cli/chunks/{debug-6CB5QEGF.js → debug-MJEQ2R54.js} +3 -3
- package/dist-cli/chunks/{desktop-DLU2VTNC.js → desktop-Z4LOP37S.js} +3 -3
- package/dist-cli/chunks/{detox-N2D2AY7S.js → detox-VGPLTJYZ.js} +2 -2
- package/dist-cli/chunks/{device-FGZWPD26.js → device-H5CH3XAB.js} +2 -2
- package/dist-cli/chunks/{diagnose-ICQE2EWG.js → diagnose-AIQGCXUP.js} +2 -2
- package/dist-cli/chunks/drivers-LRTSTFSZ.js +2 -0
- package/dist-cli/chunks/film-P66JPUHW.js +87 -0
- package/dist-cli/chunks/flow-JETK5JHP.js +2 -0
- package/dist-cli/chunks/help-XX557QGO.js +2 -0
- package/dist-cli/chunks/{home-paths-VWN4PHJ3.js → home-paths-WMQMWUNA.js} +2 -2
- package/dist-cli/chunks/inspect-JTBKTX2E.js +2 -0
- package/dist-cli/chunks/install-desktop-OFWYZIJ2.js +2 -0
- package/dist-cli/chunks/{login-FO2R5CSL.js → login-IAHY7E6Y.js} +4 -4
- package/dist-cli/chunks/{logout-L5R3GRIG.js → logout-2YEUFJAD.js} +2 -2
- package/dist-cli/chunks/{maestro-K57OH6RI.js → maestro-BSD43NA3.js} +3 -3
- package/dist-cli/chunks/{maestro-generate-7VVSWXKH.js → maestro-generate-QU74GL7P.js} +3 -3
- package/dist-cli/chunks/mode-UMJMUA3Y.js +24 -0
- package/dist-cli/chunks/optional-demo-registry-MS2YBMHN.js +2 -0
- package/dist-cli/chunks/{perf-AA66N7ML.js → perf-XMNXZFDY.js} +2 -2
- package/dist-cli/chunks/{record-HVK5TWAF.js → record-UCDYKK5M.js} +3 -3
- package/dist-cli/chunks/runtime-VNQTSGVX.js +2 -0
- package/dist-cli/chunks/{screenshot-command-TPVAQ6FC.js → screenshot-command-UZOLNSJN.js} +3 -3
- package/dist-cli/chunks/{screenshots-capture-OT5KMPQQ.js → screenshots-capture-NOWHE4AB.js} +2 -2
- package/dist-cli/chunks/{serve-3CTBVM5S.js → serve-L4XOZE3V.js} +2 -2
- package/dist-cli/chunks/{setup-JCJJQJKU.js → setup-O3TUZ5JW.js} +3 -3
- package/dist-cli/chunks/{skills-HTH527W2.js → skills-P4KO6RFE.js} +2 -2
- package/dist-cli/chunks/{storage-O6RNOFWM.js → storage-RTPEVRAI.js} +2 -2
- package/dist-cli/chunks/store-P23ZWVHH.js +2 -0
- package/dist-cli/chunks/telemetry-UFGF53JT.js +2 -0
- package/dist-cli/chunks/{timeline-RQHPAEK6.js → timeline-64CDTB5K.js} +2 -2
- package/dist-cli/chunks/{upgrade-OKNBSSBF.js → upgrade-OLGZ7K6Y.js} +2 -2
- package/dist-cli/chunks/upload-GQYWQIIG.js +2 -0
- package/dist-cli/chunks/{version-EY4PANXP.js → version-A5YSPPCX.js} +2 -2
- package/dist-cli/chunks/web-U6OTYNPM.js +2 -0
- package/dist-cli/chunks/{what-happened-MC5PTHCG.js → what-happened-Y3MVLKPF.js} +2 -2
- package/dist-lib/agent-daemon-client.cjs +1 -1
- package/dist-lib/agent-events.cjs +1 -1
- package/dist-lib/agent-identity.cjs +1 -1
- package/dist-lib/agent-sessions.cjs +1 -1
- package/dist-lib/attached-projects.cjs +1 -1
- package/dist-lib/auth/shared-session.cjs +1 -1
- package/dist-lib/backend-origin.cjs +1 -1
- package/dist-lib/beta.cjs +1 -1
- package/dist-lib/beta.mjs +1 -1
- package/dist-lib/bridge-constants.cjs +1 -1
- package/dist-lib/cli-constants.cjs +1 -1
- package/dist-lib/config.cjs +1 -1
- package/dist-lib/detox/index.cjs +108 -12
- package/dist-lib/dev-bundle-resolution.cjs +1 -1
- package/dist-lib/home-paths.cjs +1 -1
- package/dist-lib/host/bridge-host.cjs +1 -1
- package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
- package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
- package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
- package/dist-lib/host/websocket-proxy.cjs +1 -1
- package/dist-lib/index.cjs +1 -1
- package/dist-lib/jump-to-source-babel.cjs +1 -1
- package/dist-lib/menu.cjs +1 -1
- package/dist-lib/menu.mjs +1 -1
- package/dist-lib/metro.cjs +1 -1
- package/dist-lib/profiles.cjs +1 -1
- package/dist-lib/render-mode.cjs +1 -1
- package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
- package/dist-lib/sdk.cjs +57 -9
- package/dist-lib/sdk.mjs +57 -9
- package/dist-lib/skills.cjs +22 -14
- package/dist-lib/vite.cjs +1 -1
- package/package.json +1 -1
- package/skills/soot/SKILL.md +1 -0
- package/skills/sootsim-debug/SKILL.md +6 -8
- package/skills/sootsim-perf/SKILL.md +4 -4
- package/dist-cli/chunks/beta-YMHG327W.js +0 -2
- package/dist-cli/chunks/chunk-A3LHGXZW.js +0 -1
- package/dist-cli/chunks/chunk-AHWQZXFB.js +0 -119
- package/dist-cli/chunks/chunk-K7OZYJKD.js +0 -2
- package/dist-cli/chunks/chunk-KGSLGXWW.js +0 -2
- package/dist-cli/chunks/chunk-NJPDAYWO.js +0 -1
- package/dist-cli/chunks/chunk-VIXY7DGW.js +0 -97
- package/dist-cli/chunks/cli-version-DPI32W6E.js +0 -2
- package/dist-cli/chunks/daemon-GF5QBYWN.js +0 -2
- package/dist-cli/chunks/drivers-J4BHBZXD.js +0 -2
- package/dist-cli/chunks/flow-LTUM776G.js +0 -2
- package/dist-cli/chunks/help-LBG75ITV.js +0 -2
- package/dist-cli/chunks/inspect-XAEZTCMI.js +0 -2
- package/dist-cli/chunks/install-desktop-2CSEI2MD.js +0 -2
- package/dist-cli/chunks/mode-VPVEZ652.js +0 -111
- package/dist-cli/chunks/optional-demo-registry-D47EWM4J.js +0 -2
- package/dist-cli/chunks/runtime-EV7TFPWL.js +0 -2
- package/dist-cli/chunks/store-ANJJMDLX.js +0 -2
- package/dist-cli/chunks/telemetry-GZK77NUU.js +0 -2
- package/dist-cli/chunks/upload-KAY6K5ML.js +0 -2
- package/dist-cli/chunks/web-PI2BL42A.js +0 -2
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
/*! sootsim v0.1.215 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
-
function o(e,r,n,i){return{width:3,ringToggle:{top:e[0],height:e[1]},volumeUp:{top:r[0],height:r[1]},volumeDown:{top:n[0],height:n[1]},lock:{top:i[0],height:i[1]}}}var b={width:2.5,lock:{top:188.7,height:68.1},ringToggle:{top:113.2,height:36},volumeUp:{top:188.2,height:68.1},volumeDown:{top:269,height:68.1}},d={width:3,lock:{top:238,height:78},ringToggle:{top:-1e3,height:0},volumeUp:{top:336,height:62},volumeDown:{top:408,height:62}},g={width:3,lock:{top:248,height:72},ringToggle:{top:-1e3,height:0},volumeUp:{top:144,height:62},volumeDown:{top:216,height:62}},a=48;function t(e){return{...e,platform:"ios",navigationBarHeight:0,navigationBarMode:e.homeIndicatorHeight>0?"gesture":"none",displayCutout:{top:e.dynamicIsland?e.statusBarHeight:0,bottom:0,left:0,right:0},cameraCutout:null,osVersion:e.iosVersion,androidApiLevel:null,systemName:"iOS",manufacturer:"Apple",brand:"Apple",modelName:e.name}}var p={"canvas-workspace":t({name:"Canvas Workspace",width:1440,height:900,scale:1,statusBarHeight:0,homeIndicatorHeight:0,cornerRadius:0,bezelWidth:16,dynamicIsland:null,safeAreaInsets:{top:0,bottom:0,left:0,right:0},iosVersion:"26.4",physicalPPI:110,hardwareButtons:o([185.8,41.7],[258.2,67.6],[344,67.6],[281.5,106.9]),experimental:!0}),"iphone-se":t({name:"iPhone SE",width:375,height:667,scale:2,statusBarHeight:20,homeIndicatorHeight:0,cornerRadius:0,bezelWidth:28.7,dynamicIsland:null,safeAreaInsets:{top:20,bottom:0,left:0,right:0},iosVersion:"15.8",physicalPPI:326,hardwareButtons:b}),"iphone-14":t({name:"iPhone 14",width:390,height:844,scale:3,statusBarHeight:47,homeIndicatorHeight:34,cornerRadius:49,bezelWidth:20,dynamicIsland:null,safeAreaInsets:{top:47,bottom:34,left:0,right:0},iosVersion:"17.6",physicalPPI:460,hardwareButtons:o([141.7,29.7],[205.9,69.6],[289.5,69.6],[228.9,114.5])}),"iphone-15":t({name:"iPhone 15",width:393,height:852,scale:3,statusBarHeight:59,homeIndicatorHeight:34,cornerRadius:58,bezelWidth:18.7,dynamicIsland:{width:126,height:37.3,top:14.1},safeAreaInsets:{top:59,bottom:34,left:0,right:0},iosVersion:"17.6",physicalPPI:460,hardwareButtons:o([171.7,32],[235.8,65.3],[320.5,65.3],[280.6,105.2])}),"iphone-15-plus":t({name:"iPhone 15 Plus",width:430,height:932,scale:3,statusBarHeight:59,homeIndicatorHeight:34,cornerRadius:58,bezelWidth:17.8,dynamicIsland:{width:126,height:37.3,top:11.4},safeAreaInsets:{top:59,bottom:34,left:0,right:0},iosVersion:"17.6",physicalPPI:460,hardwareButtons:o([172.1,33],[236.1,66.6],[321.2,66.6],[281,106.8])}),"iphone-15-pro":t({name:"iPhone 15 Pro",width:393,height:852,scale:3,statusBarHeight:59,homeIndicatorHeight:34,cornerRadius:58,bezelWidth:15.8,dynamicIsland:{width:126,height:38,top:13.4},safeAreaInsets:{top:59,bottom:34,left:0,right:0},iosVersion:"18.2",physicalPPI:460,hardwareButtons:o([159.1,31.5],[220.1,61.9],[299,61.9],[260.8,98.9])}),"iphone-15-pro-max":t({name:"iPhone 15 Pro Max",width:430,height:932,scale:3,statusBarHeight:59,homeIndicatorHeight:34,cornerRadius:58,bezelWidth:15.8,dynamicIsland:{width:126,height:38,top:13.3},safeAreaInsets:{top:59,bottom:34,left:0,right:0},iosVersion:"18.2",physicalPPI:460,hardwareButtons:o([173.3,32.2],[253.4,61.7],[343.3,61.7],[268.5,98.5])}),"iphone-16":t({name:"iPhone 16",width:393,height:852,scale:3,statusBarHeight:59,homeIndicatorHeight:34,cornerRadius:58,bezelWidth:15.8,dynamicIsland:{width:126,height:37.3,top:11},safeAreaInsets:{top:59,bottom:34,left:0,right:0},iosVersion:"26.4",physicalPPI:460,hardwareButtons:o([159.1,31.5],[220.1,61.9],[299,61.9],[260.8,98.9])}),"iphone-16-plus":t({name:"iPhone 16 Plus",width:430,height:932,scale:3,statusBarHeight:59,homeIndicatorHeight:34,cornerRadius:58,bezelWidth:15.8,dynamicIsland:{width:126,height:37.3,top:11.4},safeAreaInsets:{top:59,bottom:34,left:0,right:0},iosVersion:"26.4",physicalPPI:460,hardwareButtons:o([173.3,32.2],[253.4,61.7],[343.3,61.7],[268.5,98.5])}),"iphone-16-pro":t({name:"iPhone 16 Pro",width:402,height:874,scale:3,statusBarHeight:62,homeIndicatorHeight:34,cornerRadius:64,bezelWidth:15.8,dynamicIsland:{width:126,height:38,top:13.5},safeAreaInsets:{top:62,bottom:34,left:0,right:0},iosVersion:"26.4",physicalPPI:460,hardwareButtons:o([159.1,31.5],[220.1,61.9],[299,61.9],[260.8,98.9])}),"iphone-16-pro-max":t({name:"iPhone 16 Pro Max",width:440,height:956,scale:3,statusBarHeight:62,homeIndicatorHeight:34,cornerRadius:64,bezelWidth:15.9,dynamicIsland:{width:126,height:38,top:14},safeAreaInsets:{top:62,bottom:34,left:0,right:0},iosVersion:"26.4",physicalPPI:460,hardwareButtons:o([178.8,32.2],[266.8,61.8],[352.7,61.8],[292.2,98.3])}),"iphone-17":t({name:"iPhone 17",width:402,height:874,scale:3,statusBarHeight:59,homeIndicatorHeight:34,cornerRadius:64,bezelWidth:15.8,dynamicIsland:{width:126,height:37.3,top:14},safeAreaInsets:{top:59,bottom:34,left:0,right:0},iosVersion:"26.4",physicalPPI:460,hardwareButtons:o([159.1,31.5],[220.1,61.9],[299,61.9],[260.8,98.9])}),"iphone-17-air":t({name:"iPhone Air",width:420,height:912,scale:3,statusBarHeight:59,homeIndicatorHeight:34,cornerRadius:64,bezelWidth:15.9,dynamicIsland:{width:126,height:38,top:20},safeAreaInsets:{top:59,bottom:34,left:0,right:0},iosVersion:"26.4",physicalPPI:460,hardwareButtons:o([178.8,32.2],[266.8,61.8],[352.7,61.8],[292.2,98.3])}),"iphone-17-pro":t({name:"iPhone 17 Pro",width:402,height:874,scale:3,statusBarHeight:59,homeIndicatorHeight:34,cornerRadius:64,bezelWidth:15.8,dynamicIsland:{width:126,height:38,top:14},safeAreaInsets:{top:59,bottom:34,left:0,right:0},iosVersion:"26.4",physicalPPI:460,hardwareButtons:o([159.1,31.5],[220.1,61.9],[299,61.9],[260.8,98.9])}),"iphone-17-pro-max":t({name:"iPhone 17 Pro Max",width:440,height:956,scale:3,statusBarHeight:62,homeIndicatorHeight:34,cornerRadius:64,bezelWidth:15.9,dynamicIsland:{width:126,height:38,top:14},safeAreaInsets:{top:62,bottom:34,left:0,right:0},iosVersion:"26.4",physicalPPI:460,hardwareButtons:o([178.8,32.2],[266.8,61.8],[352.7,61.8],[292.2,98.3])}),"pixel-8":{platform:"android",name:"Pixel 8",width:412,height:915,scale:2.625,statusBarHeight:40,homeIndicatorHeight:0,navigationBarHeight:a,navigationBarMode:"gesture",displayCutout:{top:40,bottom:0,left:0,right:0},cornerRadius:39,bezelWidth:13,dynamicIsland:null,cameraCutout:{diameter:24},safeAreaInsets:{top:40,bottom:a,left:0,right:0},osVersion:"15",iosVersion:"",androidApiLevel:35,systemName:"Android",manufacturer:"Google",brand:"google",modelName:"Pixel 8",physicalPPI:428,hardwareButtons:d},"pixel-8-three-button":{platform:"android",name:"Pixel 8 (3-button)",width:412,height:915,scale:2.625,statusBarHeight:40,homeIndicatorHeight:0,navigationBarHeight:48,navigationBarMode:"three-button",displayCutout:{top:40,bottom:0,left:0,right:0},cornerRadius:39,bezelWidth:13,dynamicIsland:null,cameraCutout:{diameter:24},safeAreaInsets:{top:40,bottom:48,left:0,right:0},osVersion:"15",iosVersion:"",androidApiLevel:35,systemName:"Android",manufacturer:"Google",brand:"google",modelName:"Pixel 8",physicalPPI:428,hardwareButtons:d},"pixel-9-pro-xl":{platform:"android",name:"Pixel 9 Pro XL",width:448,height:997,scale:3,statusBarHeight:40,homeIndicatorHeight:0,navigationBarHeight:a,navigationBarMode:"gesture",displayCutout:{top:40,bottom:0,left:0,right:0},cornerRadius:41,bezelWidth:12,dynamicIsland:null,cameraCutout:{diameter:24},safeAreaInsets:{top:40,bottom:a,left:0,right:0},osVersion:"15",iosVersion:"",androidApiLevel:35,systemName:"Android",manufacturer:"Google",brand:"google",modelName:"Pixel 9 Pro XL",physicalPPI:486,hardwareButtons:d},"galaxy-s24":{platform:"android",name:"Galaxy S24",width:360,height:780,scale:3,statusBarHeight:36,homeIndicatorHeight:0,navigationBarHeight:a,navigationBarMode:"gesture",displayCutout:{top:36,bottom:0,left:0,right:0},cornerRadius:36,bezelWidth:8,dynamicIsland:null,cameraCutout:{diameter:18},safeAreaInsets:{top:36,bottom:a,left:0,right:0},osVersion:"15",iosVersion:"",androidApiLevel:35,systemName:"Android",manufacturer:"Samsung",brand:"samsung",modelName:"SM-S921B",physicalPPI:416,hardwareButtons:g},"galaxy-s24-ultra":{platform:"android",name:"Galaxy S24 Ultra",width:384,height:824,scale:3.75,statusBarHeight:36,homeIndicatorHeight:0,navigationBarHeight:a,navigationBarMode:"gesture",displayCutout:{top:36,bottom:0,left:0,right:0},cornerRadius:24,bezelWidth:9,dynamicIsland:null,cameraCutout:{diameter:18},safeAreaInsets:{top:36,bottom:a,left:0,right:0},osVersion:"15",iosVersion:"",androidApiLevel:35,systemName:"Android",manufacturer:"Samsung",brand:"samsung",modelName:"SM-S928B",physicalPPI:505,hardwareButtons:g}},m="iphone-17-pro";function P(e){return p[e]}function h(){return Object.keys(p)}function v(){return h().filter(e=>!p[e].experimental)}var l={"iphone-6-9":{name:"iphone-6-9",label:'iPhone 6.7"',width:1284,height:2778,store:"apple"},"iphone-6-1":{name:"iphone-6-1",label:'iPhone 6.5"',width:1242,height:2688,store:"apple"},"android-phone":{name:"android-phone",label:"Google Play phone",width:1080,height:1920,store:"google"},"android-tablet-7":{name:"android-tablet-7",label:'Google Play 7" tablet',width:1200,height:1920,store:"google"},"android-tablet-10":{name:"android-tablet-10",label:'Google Play 10" tablet',width:1600,height:2560,store:"google"}},c={dark:{type:"gradient",direction:180,glow:"#4caeff",stops:[{offset:0,color:"#111827"},{offset:40,color:"#101725"},{offset:100,color:"#06080d"}]},cyan:{type:"gradient",direction:180,glow:"#25c3ec",stops:[{offset:0,color:"#1b465c"},{offset:32,color:"#122336"},{offset:100,color:"#05070b"}]},gold:{type:"gradient",direction:180,glow:"#ffc25a",stops:[{offset:0,color:"#3b2f1a"},{offset:34,color:"#18140d"},{offset:100,color:"#050505"}]},red:{type:"gradient",direction:180,glow:"#ff6178",stops:[{offset:0,color:"#3e1018"},{offset:35,color:"#17080c"},{offset:100,color:"#050405"}]}},B={color:"#25c3ec",blur:120,spread:52,opacity:.34},I="iphone-17-pro";var y=[{name:"white",value:"#ffffff"},{name:"gray-light",value:"#d1d5db"},{name:"gray",value:"#6b7280"},{name:"gray-dark",value:"#3b4350"},{name:"slate",value:"#2a3644"},{name:"black",value:"#000000"},{name:"cyan",value:"#25c3ec"},{name:"blue",value:"#3f7cff"},{name:"teal",value:"#1fc7b4"},{name:"green",value:"#42c95d"},{name:"lime",value:"#92d21b"},{name:"gold",value:"#f5c518"},{name:"orange",value:"#ff912e"},{name:"coral",value:"#ff6f5b"},{name:"red",value:"#ff4f6f"},{name:"berry",value:"#d054ff"},{name:"magenta",value:"#ff4eb8"}],f=Object.fromEntries(y.map(e=>[e.name,e.value]));function T(e){return f[e]??f.gray}function R(e){return Object.prototype.hasOwnProperty.call(l,e)?l[e]:null}function S(e){return{type:e.type,color:e.color,direction:e.direction,glow:e.glow,stops:e.stops?.map(r=>({...r}))}}function A(e){return Object.prototype.hasOwnProperty.call(c,e)?S(c[e]):null}var u={deviceModel:{type:"enum",default:m,description:"device model to simulate",cliFlag:"device",cliFlagShort:"d",options:h(),group:"device"},orientation:{type:"enum",default:"portrait",description:"screen orientation",cliFlag:"orientation",options:["portrait","landscape"],group:"device"},colorScheme:{type:"enum",default:"auto",description:"color scheme (auto follows system preference)",cliFlag:"theme",cliFlagShort:"t",options:["light","dark","auto"],group:"appearance"},reduceMotion:{type:"boolean",default:!1,description:"reduce motion",group:"appearance"},boldText:{type:"boolean",default:!1,description:"bold text",group:"appearance"},fontSize:{type:"number",default:1,description:"font size multiplier (1.0 = default)",group:"appearance",validate:e=>e>=.5&&e<=2},networkCondition:{type:"enum",default:"wifi",description:"simulated network condition",cliFlag:"network",options:["wifi","lte","fast-3g","slow-3g","offline"],group:"network"},language:{type:"string",default:"en",description:"language code (ISO 639-1)",cliFlag:"language",group:"locale"},region:{type:"string",default:"US",description:"region code (ISO 3166-1)",cliFlag:"region",group:"locale"},showTouches:{type:"boolean",default:!1,description:"show touch indicators",group:"simulator"},showFrame:{type:"boolean",default:!0,description:"show device frame",cliFlag:"frame",group:"simulator"},showTopBar:{type:"boolean",default:!0,description:"show simulator top bar",group:"simulator"},screenshotMode:{type:"boolean",default:!1,description:"show screenshot composition mode in the browser shell",group:"simulator"},threeMode:{type:"boolean",default:!1,description:"show the experimental 3d device stage in the browser shell",group:"simulator"},threeRecordingEditor:{type:"boolean",default:!1,description:"dock the 3d recording editor in the 3d stage (toggled from its rail)",group:"simulator"},screenshotCanvas:{type:"enum",default:"iphone-6-9",description:"target app-store canvas preset for screenshot mode",options:Object.keys(l),group:"simulator"},screenshotBackground:{type:"enum",default:"dark",description:"background preset rendered inside the screenshot canvas",options:Object.keys(c),group:"simulator"},screenshotText:{type:"enum",default:"bold-top",description:"text layout preset for the screenshot canvas",options:["bold-top","editorial-left","minimal-bottom","none"],group:"simulator"},screenshotPose:{type:"enum",default:"straight",description:"device pose preset inside the screenshot canvas",options:["straight","tilted-left","tilted-right","cut-bottom","cut-top"],group:"simulator"},screenshotDynamicSize:{type:"boolean",default:!1,description:"let the screenshot canvas rect fit available space (off = pin to exact preset pixels)",group:"simulator"},showStatusBar:{type:"boolean",default:!0,description:"show status bar",group:"simulator"},showHomeIndicator:{type:"boolean",default:!0,description:"show home indicator",group:"simulator"},alwaysShowLiveWebViews:{type:"boolean",default:!1,description:"always render WebViews as live browser views",group:"simulator"},a11yMode:{type:"enum",default:"delayed",description:"accessibility tree sync mode (off, delayed=100ms, active=30ms)",options:["off","delayed","active"],group:"simulator"},a11yDepth:{type:"enum",default:"deep",description:"accessibility tree structure depth (shallow or deep)",options:["shallow","deep"],group:"simulator"},inspectMode:{type:"boolean",default:!1,description:"inspect mode",group:"simulator"},errorReporting:{type:"boolean",default:!1,description:"send anonymous crash reports",group:"privacy"},agentProvider:{type:"enum",default:"codex",description:"ai agent used by the sootsim agent prompt bar",options:["codex","claude"],group:"agent"},onboardingComplete:{type:"boolean",default:!1,description:"first-run onboarding completed",group:"beta"},betaConsentVersion:{type:"number",default:0,description:"last accepted beta telemetry policy version",group:"beta"},detailedTelemetry:{type:"boolean",default:!0,description:"send detailed usage telemetry (sessions, perf samples)",group:"beta"}};function w(){if(typeof window>"u")return{};let e={};try{let r=new URLSearchParams(window.location.search),n=r.get("device");n&&u.deviceModel.options?.includes(n)&&(e.deviceModel=n);let i=r.get("colorScheme")??r.get("theme");i&&u.colorScheme.options?.includes(i)&&(e.colorScheme=i);let s=r.get("alwaysShowLiveWebViews");s==="1"||s==="true"?e.alwaysShowLiveWebViews=!0:(s==="0"||s==="false")&&(e.alwaysShowLiveWebViews=!1)}catch{}return e}function H(){let e={};for(let[r,n]of Object.entries(u))e[r]=n.default;return Object.assign(e,w()),e}export{B as a,I as b,T as c,R as d,S as e,A as f,p as g,P as h,v as i,u as j,w as k,H as l};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
/*! sootsim v0.1.215 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
-
var m={"--help":{type:"boolean",short:"-h"},"--version":{type:"boolean",short:"-V"},"--verbose":{type:"boolean",short:"-v"},"--port":{type:"number",short:"-p"},"--device":{type:"string",short:"-d"},"--theme":{type:"string",short:"-t"},"--headless":{type:"boolean"},"--driver":{type:"string"},"--sim":{type:"string"},"--session":{type:"string"},"--tab":{type:"string"}},p=new Set(["list","describe","find","get","do","wait","network","logs","shell"]),b=new Set(["do","get","wait","shell","debug"]),d=new Set(["detox","maestro","record","storage","perf","screenshot","mode","inspect","debug","timeline","what-happened","shell","assert","device","open","list","use","claim","close","compat","desktop","login","logout","auth","setup","serve","daemon","runtime","upgrade","version","skill","config","app-fonts","agent-wrapper","agent",...p]);function h(c){let r=c.slice(2),e={command:null,commandArgs:[],globalFlags:{},help:!1,version:!1,verbose:!1},s=0;for(;s<r.length;){let o=r[s];if(o==="--"){e.commandArgs.push(...r.slice(s+1));break}let i=Object.entries(m).find(([a,t])=>a===o||t.short===o);if(i){let[a,t]=i,l=a.replace(/^--/,"");if(t.type==="boolean")e.globalFlags[l]=!0,s++;else{let n=r[s+1];if(n===void 0||n.startsWith("-")){console.error(` warning: ${o} requires a value`),s++;continue}if(t.type==="number"){let g=Number(n);if(Number.isNaN(g)){console.error(` warning: ${o} requires a number, got "${n}"`),s+=2;continue}e.globalFlags[l]=g}else e.globalFlags[l]=n;s+=2}continue}if(!e.command&&!o.startsWith("-")){let a=o.indexOf("-");if(a>0){let t=o.slice(0,a),l=o.slice(a+1);if(b.has(t)&&l.length>0){e.command=t;let n=r.slice(s+1);e.commandArgs=[l,...n[0]==="--"?n.slice(1):n];break}}if(d.has(o)){e.command=o;let t=r.slice(s+1);e.commandArgs=t[0]==="--"?t.slice(1):t;break}e.commandArgs=r.slice(s);break}e.commandArgs.push(o),s++}return e.help=!!e.globalFlags.help,e.version=!!e.globalFlags.version,e.verbose=!!e.globalFlags.verbose,e}export{p as a,h as b};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
/*! sootsim v0.1.215 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
/*! sootsim v0.1.215 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
-
import{a as Ie,b as Ae,c as Ue}from"./chunk-7COBEK2I.js";import{c as ke}from"./chunk-5GU7LW64.js";import{d as xe}from"./chunk-HKEH2UOD.js";import{g as Be,i as Ee,k as B}from"./chunk-5MUXEXEW.js";import{d as Re}from"./chunk-2FEGONIZ.js";import{a as ve,b as k}from"./chunk-LIFR6X36.js";import{a as Se}from"./chunk-BU7V5UGD.js";import{createHash as ft}from"crypto";import{readFileSync as U}from"fs";import Oe from"path";import{gzipSync as ae,gunzipSync as gt}from"zlib";function _e(e){let t=(e||"").toLowerCase().split(";")[0].trim();return t?!(t.startsWith("image/")||t.startsWith("video/")||t.startsWith("audio/")||t==="font/woff2"||t==="application/font-woff2"||t==="application/zip"||t==="application/gzip"):!0}import{brotliCompressSync as rt,constants as st}from"node:zlib";var ot=9;function Pe(e){return rt(e,{params:{[st.BROTLI_PARAM_QUALITY]:ot}})}function oe(e,t){let r=new AbortController,o=setTimeout(()=>r.abort(new Error(`${t} timed out after ${e/1e3}s`)),e);return{signal:r.signal,cancel:()=>clearTimeout(o)}}async function it(e){let t=oe(12e4,`PUT ${e.url}`),r;try{r=await fetch(e.url,{method:"PUT",headers:{"content-type":e.contentType},body:e.bytes,signal:t.signal})}finally{t.cancel()}if(!r.ok){let o=await r.text().catch(()=>"");throw new Error(`PUT ${e.url} failed ${r.status}: ${o.slice(0,200)}`)}}async function at(e,t=8,r){let o=0,i=0,a=e.length;await Promise.all(Array.from({length:Math.min(t,a)},async()=>{for(;o<a;){let u=e[o++];await it(u),i++,r?.(i,a)}}))}function lt(e,t,r,o){let i=[];i.push({url:e.bundle.putUrl,contentType:e.bundle.contentType,bytes:t});for(let a of e.files){let u=r.get(a.urlhash);u&&i.push({url:a.putUrl,contentType:a.contentType,bytes:u})}e.events&&o?.eventsBytes&&i.push({url:e.events.putUrl,contentType:e.events.contentType,bytes:o.eventsBytes}),e.timeline&&o?.timelineBytes&&i.push({url:e.timeline.putUrl,contentType:e.timeline.contentType,bytes:o.timelineBytes}),e.flowVideo&&o?.videoBytes&&i.push({url:e.flowVideo.putUrl,contentType:e.flowVideo.contentType,bytes:o.videoBytes}),e.storage&&o?.storageBytes&&i.push({url:e.storage.putUrl,contentType:e.storage.contentType,bytes:o.storageBytes}),e.failureBundle&&o?.failureBundleBytes&&i.push({url:e.failureBundle.putUrl,contentType:e.failureBundle.contentType,bytes:o.failureBundleBytes});for(let a of e.snapshots??[]){let u=o?.snapshotBytes?.get(a.id);u&&i.push({url:a.putUrl,contentType:a.contentType,bytes:u})}return i}function ut(e){return e.replace(/\/+$/,"")}var J=class extends Error{constructor(r,o,i,a=""){super(r);this.status=o;this.phase=i;this.responseText=a;this.name="PresignedUploadError"}};async function Le(e){let t=ut(e.originBase),r={"content-type":"application/json"};e.authHeader&&(r.authorization=e.authHeader),e.adminBypassToken&&(r["x-soot-admin-upload-bypass"]=e.adminBypassToken);let o=oe(3e4,"init"),i;try{i=await fetch(`${t}/api/preview/upload/init`,{method:"POST",headers:r,body:JSON.stringify(e.initBody),signal:o.signal})}finally{o.cancel()}if(!i.ok){let g=await i.text().catch(()=>"");throw new J(`init failed: ${i.status} ${g.slice(0,200)}`,i.status,"init",g)}let a=await i.json(),u=lt(a,e.bundleBytes,e.filesByHash,e.extras);await at(u,e.concurrency??8,e.onPutProgress);let b=oe(3e4,"finalize"),f;try{f=await fetch(`${t}/api/preview/upload/finalize`,{method:"POST",headers:r,body:JSON.stringify({token:a.token}),signal:b.signal})}finally{b.cancel()}if(!f.ok){let g=await f.text().catch(()=>"");throw new J(`finalize failed: ${f.status} ${g.slice(0,200)}`,f.status,"finalize",g)}let C=await f.json();return{init:a,finalize:C}}function ct(e){return e!==null&&typeof e=="object"?e:null}function Fe(e){return typeof e=="number"&&Number.isFinite(e)?e:void 0}function ie(e){let t=ct(e);return t?t.schemaVersion===1&&Fe(t.t)!==void 0&&Fe(t.seq)!==void 0&&typeof t.context=="string"&&typeof t.kind=="string"&&"data"in t:!1}function dt(e,t){let r=[];for(let o of e.split(`
|
|
3
|
-
`)){let i=o.trim();if(i)try{let a=JSON.parse(i);t(a)&&r.push(a)}catch{}}return r}function $e(e){return dt(e,ie)}function ht(e){if(!e)return null;try{let t=JSON.parse(e);return typeof t.message=="string"&&t.message?t.message:null}catch{return null}}var je=process.env.SOOTSIM_UPLOAD_ORIGIN||"https://sootbean.com",He=process.env.SOOTSIM_PREVIEW_ORIGIN||"https://sootsim.com",ue="http://localhost:3000",yt=2e3;async function bt(e){if(e)return e;if(process.env.SOOTSIM_UPLOAD_ORIGIN)return process.env.SOOTSIM_UPLOAD_ORIGIN;try{let t=await fetch(`${ue}/api/preview/upload/init`,{method:"OPTIONS",signal:AbortSignal.timeout(yt)});if(t.ok||t.status===204||t.status===405)return ue}catch{}return je}function F(e){return e.replace(/\/$/,"")}function Mt(e){try{let r=new URL(e).hostname.replace(/^\[|\]$/g,"").toLowerCase();return r==="localhost"||r.endsWith(".localhost")||r==="0.0.0.0"||r==="::1"||/^127(?:\.\d{1,3}){3}$/.test(r)}catch{return!1}}function wt(e){try{let t=new URL(e).hostname.toLowerCase();return t==="sootbean.com"||t.endsWith(".sootbean.com")}catch{return!1}}function Tt(e,t){return t?F(t):process.env.SOOTSIM_PREVIEW_ORIGIN?F(process.env.SOOTSIM_PREVIEW_ORIGIN):Mt(e)?F(e):wt(e)?F(He):F(e)}function St(){console.log(`
|
|
4
|
-
sootsim record upload \u2014 publish the current recorded bundle as a /preview/<id> link
|
|
5
|
-
|
|
6
|
-
usage:
|
|
7
|
-
sootsim record upload [--origin <url>] [--public-origin <url>] (--events <path> | --video <path>) [--screenshot <path>] [--owner <org> --repo <repo>] [--sim <sim>] [--open] [--assets-only]
|
|
8
|
-
|
|
9
|
-
options:
|
|
10
|
-
--origin <url> upload target (default: auto)
|
|
11
|
-
prefers ${ue} when available, otherwise
|
|
12
|
-
falls back to ${je}
|
|
13
|
-
override with SOOTSIM_UPLOAD_ORIGIN env var
|
|
14
|
-
--public-origin <url>
|
|
15
|
-
public /preview link origin (default: ${He}
|
|
16
|
-
for prod uploads, upload origin for localhost/custom origins).
|
|
17
|
-
override with SOOTSIM_PREVIEW_ORIGIN env var
|
|
18
|
-
--events <path> path to a gzipped events .jsonl.gz file to attach
|
|
19
|
-
required unless --video is present; previews must
|
|
20
|
-
have replay or recording playback data
|
|
21
|
-
--screenshot <path>
|
|
22
|
-
path to a PNG thumbnail to attach to the share
|
|
23
|
-
--video <path> path to a mp4/gif flow recording. embedded inline
|
|
24
|
-
in the pr sticky comment served at
|
|
25
|
-
/api/preview/flow-video?id=<share-id>
|
|
26
|
-
--video-duration-ms <ms>
|
|
27
|
-
duration hint for attached flow video
|
|
28
|
-
--timeline-events <path>
|
|
29
|
-
extra trace timeline rows, JSONL or JSONL gz
|
|
30
|
-
--trace-frame-stats <path>
|
|
31
|
-
frame stats JSON returned by the recorder bridge
|
|
32
|
-
--failure-bundle <dir>
|
|
33
|
-
per-failure debug bundle dir written by the flow runner
|
|
34
|
-
(error.json, describe.json, a11y.txt, tree.txt,
|
|
35
|
-
console.json, screenshot.png). uploaded with the share
|
|
36
|
-
so failed CI runs are debuggable from the dashboard
|
|
37
|
-
--owner <org> associate a session upload with a linked org repo
|
|
38
|
-
--repo <repo> repo name for --owner; the signed-in user must belong
|
|
39
|
-
to the local/org team that owns the link
|
|
40
|
-
--billing-kind test_run
|
|
41
|
-
meter this upload as a natural-language test run
|
|
42
|
-
--sim <sim> target a specific sim (see: sootsim list)
|
|
43
|
-
--open open the resulting /preview/<id> url in the browser
|
|
44
|
-
--assets-only drop API/JSON/HTML records before upload; keep images,
|
|
45
|
-
fonts, css, js, and binary blobs. live-data demos hit
|
|
46
|
-
the real network at replay time instead of serving
|
|
47
|
-
recorded API snapshots
|
|
48
|
-
-h, --help
|
|
49
|
-
|
|
50
|
-
examples:
|
|
51
|
-
sootsim record upload --events ./my-session.jsonl.gz
|
|
52
|
-
sootsim record upload --origin http://localhost:3000 --events ./my-session.jsonl.gz --open
|
|
53
|
-
sootsim record upload --video /tmp/soot-flow.mp4 --video-duration-ms 12000
|
|
54
|
-
`)}function d(e,t){let r=e.findIndex(i=>i===t);if(r<0)return;let o=e[r+1];return e.splice(r,2),o}function Ce(e,t){let r=e.findIndex(o=>o===t);return r<0?!1:(e.splice(r,1),!0)}function Ne(e,t){if(!e)return;let r=Number(e);return(!Number.isFinite(r)||r<=0)&&(console.error(` invalid ${t}: ${e}`),process.exit(1)),Math.round(r)}function ze(e){let t=(e||"").toLowerCase().split(";")[0].trim();return t?!!(t.startsWith("image/")||t.startsWith("font/")||t.startsWith("video/")||t.startsWith("audio/")||t.startsWith("model/")||t==="text/css"||t==="application/javascript"||t==="text/javascript"||t==="application/wasm"||t==="application/font-woff"||t==="application/font-woff2"||t==="application/octet-stream"):!1}async function De(e){let t=await fetch(e);if(!t.ok)throw new Error(`fetch ${e} -> ${t.status} ${t.statusText}`);return new Uint8Array(await t.arrayBuffer())}function vt(e){return/\.bundle($|\?)/.test(e)||/\.js($|\?)/.test(e)?"application/javascript":/\.zip($|\?)/.test(e)?"application/zip":"application/javascript"}function xt(e){try{return new URL(e).searchParams.get("appFonts")||""}catch{return""}}function kt(e){try{return new URL(e).searchParams.get("appSplash")||""}catch{return""}}function Bt(e){try{let t=new URL(e);return t.searchParams.get("lazy")==="true"?(t.searchParams.set("lazy","false"),t.toString()):e}catch{return e}}async function Et(e,t){let o=[];for(let i=0;i<t;i+=15e5){let a=Math.min(i+15e5,t),u=await B(e,`(window.__sootsimLastTransformedBundle?.text || "").slice(${i}, ${a})`);if(typeof u!="string")return null;o.push(u)}return o.join("")}function Rt(e){return e.recordedDurationMs&&e.recordingStartedAtMs?{since:e.recordingStartedAtMs-1e4,until:e.recordingStartedAtMs+e.recordedDurationMs+5e3,limit:2e3}:{limit:2e3}}function It(e){let t=U(e),o=(t[0]===31&&t[1]===139?gt(t):t).toString("utf8");return $e(o)}function At(e){return JSON.parse(U(e,"utf8"))}function Ut(e){if(e===null||typeof e!="object")return[];let t=e,r=typeof t.startedAtEpochMs=="number"&&t.startedAtEpochMs>0?t.startedAtEpochMs:null;if(r===null||!Array.isArray(t.samples))return[];let o=[];for(let i of t.samples){if(!Array.isArray(i)||typeof i[0]!="number")continue;let a=u=>typeof u=="number"&&Number.isFinite(u)?Math.round(u*100)/100:0;o.push({schemaVersion:1,t:r+Math.round(i[0]),seq:o.length+1,context:"tenant",kind:"frame",data:{totalMs:a(i[1]),layoutMs:a(i[2]),renderMs:a(i[3]),copyMs:a(i[4])}})}return o}function _t(e){if(e===null||typeof e!="object")return e;let{samples:t,...r}=e;return r}function le(e){let t=new Map;for(let r of e)t.set(r.urlhash||r.url,r);return Array.from(t.values())}async function en(e,t){(e.includes("--help")||e.includes("-h"))&&(St(),process.exit(0));let r=[...e],o=await bt(d(r,"--origin")),i=Tt(o,d(r,"--public-origin")),a=d(r,"--events"),u=d(r,"--screenshot"),b=d(r,"--video"),f=d(r,"--timeline-events"),C=d(r,"--trace-frame-stats"),g=d(r,"--failure-bundle"),K=d(r,"--video-duration-ms"),ce=Ne(d(r,"--recorded-duration-ms"),"--recorded-duration-ms"),de=Ne(d(r,"--recording-started-at-ms"),"--recording-started-at-ms"),q=d(r,"--owner"),V=d(r,"--repo"),N=d(r,"--billing-kind"),Je=d(r,"--run-scope"),Ke=Ce(r,"--open");(q&&!V||!q&&V)&&(console.error(" --owner and --repo must be provided together"),process.exit(1)),N&&N!=="test_run"&&(console.error(` invalid --billing-kind: ${N}`),process.exit(1)),!a&&!b&&(console.error(" preview uploads require playback data: pass --events or --video.\n for a normal local preview, use `sootsim record --mode combined --open`\n or `sootsim maestro test --preview` instead of uploading a bundle-only snapshot."),process.exit(1));let pe=Ce(r,"--assets-only"),qe=Be(r,{stripBooleanFlags:[],stripValueFlags:[]}),M=Ee(qe),c,me=[],w=[],T=f?It(f):[],fe=C?At(C):null;T.push(...Ut(fe));let ge=T.length,W=null;try{if(c=await B(M,'(typeof window.__sootsimCaptureBundle === "function") ? window.__sootsimCaptureBundle() : null'),c?.bundleUrl){let l=new URL(c.bundleUrl).origin,[p,A]=await Promise.all([B(M,`(window.__sootsimPreviewRecorder?.list?.(${JSON.stringify(l)}) || [])`),B(M,`(async () => {
|
|
55
|
-
const list = window.__sootsimListWorkerFetchRecorder
|
|
56
|
-
return typeof list === 'function'
|
|
57
|
-
? await list(${JSON.stringify(l)})
|
|
58
|
-
: []
|
|
59
|
-
})()`)]);me=le([...p,...A]).filter(m=>{try{return!new URL(m.url).pathname.startsWith("/api/")}catch{return!0}});let L=await B(M,`(async () => {
|
|
60
|
-
const rec = window.__sootsimPreviewRecorder
|
|
61
|
-
const workerList = window.__sootsimListWorkerFetchRecorder
|
|
62
|
-
return {
|
|
63
|
-
main: rec?.list ? rec.list() : [],
|
|
64
|
-
worker: typeof workerList === 'function' ? await workerList() : [],
|
|
65
|
-
}
|
|
66
|
-
})()`),O=(L?le([...L.main,...L.worker]):[]).filter(m=>{try{return new URL(m.url).origin!==l}catch{return!1}}),x=O.length>0?{count:O.length,totalBytes:O.reduce((m,re)=>m+(re.size||0),0)}:null;if(x&&x.count>0){console.log(` ${x.count} recorded cross-origin responses (${(x.totalBytes/1024).toFixed(1)} KiB)`);let m=await B(M,`(async () => {
|
|
67
|
-
const rec = window.__sootsimPreviewRecorder
|
|
68
|
-
const workerDump = window.__sootsimDumpWorkerFetchRecorder
|
|
69
|
-
const bundleUrl = ${JSON.stringify(c.bundleUrl)}
|
|
70
|
-
const keep = (r) => {
|
|
71
|
-
try {
|
|
72
|
-
const u = new URL(r.url)
|
|
73
|
-
if (u.origin !== ${JSON.stringify(l)}) return true
|
|
74
|
-
// bundle-origin api responses came from the rewritten
|
|
75
|
-
// /__app-api proxy at record time (re-keyed by the
|
|
76
|
-
// recorder's unwrap step). they need bodies attached the
|
|
77
|
-
// same way as cross-origin records \u2014 direct re-fetch from
|
|
78
|
-
// the dev server lacks the bundle's session cookies.
|
|
79
|
-
if (r.url !== bundleUrl && u.pathname.startsWith('/api/')) return true
|
|
80
|
-
return false
|
|
81
|
-
} catch { return false }
|
|
82
|
-
}
|
|
83
|
-
return {
|
|
84
|
-
main: rec?.dump ? rec.dump().filter(keep) : [],
|
|
85
|
-
worker: typeof workerDump === 'function'
|
|
86
|
-
? (await workerDump()).filter(keep)
|
|
87
|
-
: [],
|
|
88
|
-
}
|
|
89
|
-
})()`);if(w=le([...m.main,...m.worker]),pe){let re=w.length;w=w.filter(se=>ze(se.contentType));let tt=x.totalBytes-w.reduce((se,nt)=>se+(nt.size||0),0);console.log(` --assets-only: kept ${w.length}/${re} records (dropped ${(tt/1024).toFixed(1)} KiB of API responses)`)}}}c?.transformedBundle&&(W=await Et(M,c.transformedBundle.byteLength));let n=await B(M,`(() => {
|
|
90
|
-
const bridge = window.SootSim?.bridges?.timeline ?? window.__sootsimTimeline
|
|
91
|
-
if (!bridge || typeof bridge.recent !== 'function') return null
|
|
92
|
-
return bridge.recent(${JSON.stringify(Rt({recordedDurationMs:ce,recordingStartedAtMs:de}))})
|
|
93
|
-
})()`).catch(l=>(console.warn(` warning: failed to capture trace timeline: ${l instanceof Error?l.message:String(l)}`),null)),s=Array.isArray(n?.events)?n.events:[];T=[...T,...s.filter(ie)].sort((l,p)=>l.t-p.t||l.seq-p.seq)}finally{M.close()}c||(console.error(" could not read bundle snapshot \u2014 is sootsim running and is the bundle loaded?"),process.exit(2)),c.bundleUrl||(console.error(` no ?bundle= URL on the current sootsim tab.
|
|
94
|
-
open the app you want to share first (e.g. sootsim open 8082), then run upload.`),process.exit(2));let h,G=!1;if(W!==null)h=new TextEncoder().encode(W),G=!0,console.log(` using post-transform bundle: ${(h.byteLength/1024).toFixed(1)} KiB`);else{let n=Bt(c.bundleUrl);n!==c.bundleUrl&&console.log(" forcing lazy=false for self-contained bundle"),console.log(` capturing: ${n}`),h=await De(n),console.log(` main bundle: ${(h.byteLength/1024).toFixed(1)} KiB`)}let z=me.filter(n=>n.url!==c.bundleUrl);pe&&(z=z.filter(n=>ze(n.contentType))),console.log(` fetching ${z.length} extra files\u2026`);let D=(await Promise.all(z.map(async n=>{try{let s=await De(n.url);return{...n,bytes:s}}catch(s){return console.error(` warning: failed to re-fetch ${n.url}: ${s instanceof Error?s.message:s}`),null}}))).filter(n=>!!n),Ve=D.reduce((n,s)=>n+s.bytes.byteLength,0);console.log(` ${D.length} extra files: ${(Ve/1024).toFixed(1)} KiB`);let E;a&&(E=U(a)),T.sort((n,s)=>n.t-s.t||n.seq-s.seq);let he=T.map(n=>JSON.stringify(n)).join(`
|
|
95
|
-
`),Y=ae(he?`${he}
|
|
96
|
-
`:"");console.log(` trace timeline: ${T.length} events${ge?` (${ge} from runner sidecars)`:""}`);let y;u&&(y=U(u),console.log(` attaching screenshot: ${(y.byteLength/1024).toFixed(1)} KiB`));let R,I;if(g){let n=p=>{try{return U(Oe.join(g,p),"utf8")}catch{return null}},s=p=>{let A=n(p);if(A===null)return null;try{return JSON.parse(A)}catch{return A}},l={error:s("error.json"),describe:s("describe.json"),console:s("console.json"),a11y:n("a11y.txt"),tree:n("tree.txt")};Object.values(l).some(p=>p!==null)&&(R=ae(JSON.stringify(l)),console.log(` attaching failure bundle: ${(R.byteLength/1024).toFixed(1)} KiB gz`));try{I=U(Oe.join(g,"screenshot.png"))}catch{}}let S,$,ye;if(b){if(S=U(b),$=b.endsWith(".mp4")?"video/mp4":b.endsWith(".gif")?"image/gif":void 0,$||(console.error(" preview flow videos must be mp4 or gif"),await k(),process.exit(1)),K){let n=Number(K);(!Number.isFinite(n)||n<=0)&&(console.error(` invalid --video-duration-ms: ${K}`),await k(),process.exit(1)),ye=Math.round(n)}console.log(` attaching flow video: ${(S.byteLength/1024).toFixed(1)} KiB (${$})`)}let _=Ie(),P=Ue(_),We=Se();ve({event:"preview_upload_started",identity:{userId:_?.kind==="session"?We?.user?.id??null:null,repoId:P?.repoId??null,installationId:P?.installationId??null},properties:{origin:o,hasAuth:!!_,authMode:_?.kind??"none",bundleBytes:h.byteLength,isTransformed:G,extraFiles:D.length,recordedFetches:w.length,hasEvents:!!E,traceTimelineEvents:T.length,hasScreenshot:!!y,hasVideo:!!S}}),_||(console.error(" preview uploads need auth."),console.error(" set SOOTSIM_API_KEY=sk_sootsim_..., run `sootsim login`, or use the soot github runner."),await k(),process.exit(1));let Ge=Ae(_),Ye=(()=>{try{return new URL(c.bundleUrl).origin}catch{return null}})(),j=(n,s,l,p,A,L,Te,O)=>{let x=_e(L),m=x?ae(n):n;return{url:s,urlhash:l,method:p,bodyHash:A,requestVaryHash:O,contentType:L,responseHeaders:Te,bytes:m,encoding:x?"gzip":void 0}},be=[],Q=xt(c.pageHref)||"";if(Q){let n=await xe(Q,{onStaged:({url:s,byteLength:l})=>console.log(` staged app font: ${s} (${(l/1024).toFixed(1)} KiB)`),onError:(s,l)=>console.error(` warning: failed to fetch app font ${s}: ${l instanceof Error?l.message:l}`)});for(let s of n)be.push(j(Buffer.from(s.bytes),s.url,s.urlhash,"GET","-",s.contentType))}let Me=[],X=kt(c.pageHref)||"";if(X){let n=await ke(X,{onStaged:({url:s,byteLength:l})=>console.log(` staged splash image: ${s} (${(l/1024).toFixed(1)} KiB)`),onError:(s,l)=>console.error(` warning: failed to fetch splash image ${s}: ${l instanceof Error?l.message:l}`)});for(let s of n)Me.push(j(Buffer.from(s.bytes),s.url,s.urlhash,"GET","-",s.contentType))}let Z=[...D.map(n=>j(n.bytes,n.url,n.urlhash,"GET","-",n.contentType,n.responseHeaders,n.requestVaryHash)),...w.map(n=>j(Buffer.from(n.bodyBase64,"base64"),n.url,n.urlhash,n.method||"GET",n.bodyHash||"-",n.contentType,n.responseHeaders,n.requestVaryHash)),...be,...Me],ee=Pe(h),Qe=ft("sha256").update(h).digest("hex");console.log(` bundle raw=${(h.byteLength/1024).toFixed(1)} KiB br=${(ee.byteLength/1024).toFixed(1)} KiB`);let Xe={contentHash:Qe,bundleSizeBytes:h.byteLength,bundleContentType:vt(c.bundleUrl),bundleEncoding:"br",bundleOrigin:Ye,runtimeVersion:c.runtimeVersion??void 0,appFonts:Q||void 0,appSplash:X||void 0,entry:c.entry,isTransformed:G,deviceSpec:c.deviceSpec,installationId:P?.installationId??void 0,repoId:P?.repoId,owner:q??P?.owner,repo:V??P?.repo,billingKind:N==="test_run"?"test_run":void 0,runScope:Je||void 0,files:Z.map(n=>({url:n.url,urlhash:n.urlhash,method:n.method,bodyHash:n.bodyHash,contentType:n.contentType,responseHeaders:n.responseHeaders,requestVaryHash:n.requestVaryHash,encoding:n.encoding,sizeBytes:n.bytes.byteLength})),events:E?{sizeBytes:E.byteLength}:void 0,timeline:{sizeBytes:Y.byteLength,encoding:"gzip"},traceFrameStats:_t(fe),recordedDurationMs:ce,recordingStartedAtMs:de,failureBundle:R?{sizeBytes:R.byteLength,encoding:"gzip"}:void 0,snapshots:(()=>{let n=[];return y&&n.push({id:"landing",label:"Landing",kind:"landing",t:0,contentType:"image/png",sizeBytes:y.byteLength}),I&&n.push({id:"failure",label:"Failure",kind:"failure",contentType:"image/png",sizeBytes:I.byteLength}),n.length>0?n:void 0})(),flowVideo:S&&$?{sizeBytes:S.byteLength,contentType:$,durationMs:ye}:void 0},we=new Map;for(let n of Z)we.set(n.urlhash,n.bytes);let te=new Map;y&&te.set("landing",y),I&&te.set("failure",I);let Ze=Date.now(),v=ee.byteLength;for(let n of Z)v+=n.bytes.byteLength;E&&(v+=E.byteLength),v+=Y.byteLength,y&&(v+=y.byteLength),I&&(v+=I.byteLength),R&&(v+=R.byteLength),S&&(v+=S.byteLength);let et=`${F(o)}/api/preview/upload/init`;console.log(` init: ${et}`);let H;try{let n=await Le({originBase:o,initBody:Xe,bundleBytes:ee,filesByHash:we,extras:{eventsBytes:E,timelineBytes:Y,videoBytes:S,failureBundleBytes:R,snapshotBytes:te},authHeader:Ge,concurrency:16});H=n.finalize;let s=1+n.init.files.length+(n.init.events?1:0)+(n.init.timeline?1:0)+n.init.snapshots.length+(n.init.flowVideo?1:0)+(n.init.failureBundle?1:0);console.log(` PUT ${s} objects in ${Date.now()-Ze}ms (${(v/1024).toFixed(1)} KiB)`)}catch(n){let s=n;s.phase==="init"&&s.status===401&&(console.error(" preview upload requires a valid login."),console.error(" run `sootsim login` and retry."),await k(),process.exit(1)),s.status===402&&(console.error(` ${ht(s.responseText)??"preview uploads require Personal, Team, or an active trial \u2014 upgrade from the billing dialog."}`),await k(),process.exit(1)),console.error(` ${s.message??`${s.phase??"upload"} failed: ${String(n)}`}`),await k(),process.exit(1)}let ne=`${i}${H.url}`;return console.log(`
|
|
97
|
-
stored ${H.filesStored??0} extra files`),console.log(` preview: ${ne}`),Ke&&await Re(ne),await k(),{previewUrl:ne,shareId:H.id}}export{bt as a,Tt as b,en as c};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
/*! sootsim v0.1.215 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
-
import{a,b,c,d,e}from"./chunk-RFJMDMLK.js";import"./chunk-LIFR6X36.js";import"./chunk-BU7V5UGD.js";import"./chunk-VD2SYCCY.js";import"./chunk-CSJUJIRP.js";import"./chunk-AHWQZXFB.js";import"./chunk-XVYCMZMB.js";import"./chunk-OUB7WT7Q.js";import"./chunk-YTQ5RCVB.js";import"./chunk-FEFLFVIU.js";import"./chunk-QGFTJYVC.js";import"./chunk-6NQYBCWC.js";import"./chunk-K7OZYJKD.js";import"./chunk-AKNZ6QBL.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.215 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
-
import"./chunk-NJPDAYWO.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-EB4FLAAE.js";import"./chunk-DVJZUBQB.js";import"./chunk-2FEGONIZ.js";import"./chunk-YTQ5RCVB.js";import"./chunk-FEFLFVIU.js";import"./chunk-AKNZ6QBL.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.215 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
-
import{c,d,e,f,g,h}from"./chunk-EWYTZ7FV.js";import{c as a,d as b}from"./chunk-VMYBUPRT.js";import"./chunk-KG6V4NCI.js";import"./chunk-OHQOMV2J.js";import"./chunk-VIXY7DGW.js";import"./chunk-7COBEK2I.js";import"./chunk-AHG7WAP6.js";import"./chunk-6USQVYW2.js";import"./chunk-A3LHGXZW.js";import"./chunk-5GU7LW64.js";import"./chunk-HKEH2UOD.js";import"./chunk-QXJPLKP7.js";import"./chunk-FWUGH36K.js";import"./chunk-T4EGFOSE.js";import"./chunk-5MUXEXEW.js";import"./chunk-EB4FLAAE.js";import"./chunk-DVJZUBQB.js";import"./chunk-2FEGONIZ.js";import"./chunk-KGSLGXWW.js";import"./chunk-EGCQXWLS.js";import"./chunk-LIFR6X36.js";import"./chunk-BU7V5UGD.js";import"./chunk-AHWQZXFB.js";import"./chunk-XVYCMZMB.js";import"./chunk-OUB7WT7Q.js";import"./chunk-YTQ5RCVB.js";import"./chunk-FEFLFVIU.js";import"./chunk-K7OZYJKD.js";import"./chunk-AKNZ6QBL.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.215 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
-
import{a,b,c}from"./chunk-VD2SYCCY.js";import"./chunk-CSJUJIRP.js";import"./chunk-AHWQZXFB.js";import"./chunk-XVYCMZMB.js";import"./chunk-OUB7WT7Q.js";import"./chunk-YTQ5RCVB.js";import"./chunk-FEFLFVIU.js";import"./chunk-QGFTJYVC.js";import"./chunk-6NQYBCWC.js";import"./chunk-K7OZYJKD.js";import"./chunk-AKNZ6QBL.js";export{c as printCommandHelp,b as printGroupHelp,a as printHelp};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
/*! sootsim v0.1.215 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
-
import{j as a,k as b}from"./chunk-VMYBUPRT.js";import"./chunk-KG6V4NCI.js";import"./chunk-AHG7WAP6.js";import"./chunk-6USQVYW2.js";import"./chunk-A3LHGXZW.js";import"./chunk-5GU7LW64.js";import"./chunk-HKEH2UOD.js";import"./chunk-QXJPLKP7.js";import"./chunk-FWUGH36K.js";import"./chunk-T4EGFOSE.js";import"./chunk-5MUXEXEW.js";import"./chunk-EB4FLAAE.js";import"./chunk-DVJZUBQB.js";import"./chunk-2FEGONIZ.js";import"./chunk-KGSLGXWW.js";import"./chunk-EGCQXWLS.js";import"./chunk-AHWQZXFB.js";import"./chunk-XVYCMZMB.js";import"./chunk-OUB7WT7Q.js";import"./chunk-YTQ5RCVB.js";import"./chunk-FEFLFVIU.js";import"./chunk-K7OZYJKD.js";import"./chunk-AKNZ6QBL.js";export{a as printShellPerfReport,b as runInspect};
|
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
/*! sootsim v0.1.215 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
-
import{g as x,i as k,l as D,m as v}from"./chunk-5MUXEXEW.js";import"./chunk-OUB7WT7Q.js";import"./chunk-YTQ5RCVB.js";import"./chunk-FEFLFVIU.js";import"./chunk-AKNZ6QBL.js";function q(e){let o=e[0]?.toLowerCase()??"toggle";return o!=="on"&&o!=="off"&&o!=="toggle"&&(console.error(` unknown argument: "${o}" (expected on | off | toggle)`),process.exit(1)),o}async function R(e,o,t){let n=x(e,{port:o.port}),r=q(n.positional),d=k({...n,commandTimeoutMs:5e3});try{let l=!!(await D(d,"SootSim.bridges.settings.get"))?.[t.modeKey],m=r==="on"?!0:r==="off"?!1:!l;if(l===m)return console.log(` ${t.displayName}: already ${m?"on":"off"}`),{current:l,target:m,changed:!1};if(!await d.send({type:"evaluate",acquireLock:!0,code:`(async () => {
|
|
3
|
-
const modeKey = ${JSON.stringify(t.modeKey)}
|
|
4
|
-
const target = ${JSON.stringify(m)}
|
|
5
|
-
window.dispatchEvent(new CustomEvent('sootsim:shell-command', {
|
|
6
|
-
detail: { type: 'fire-action', id: ${JSON.stringify(t.actionId)} },
|
|
7
|
-
}))
|
|
8
|
-
const deadline = Date.now() + 1200
|
|
9
|
-
while (Date.now() < deadline) {
|
|
10
|
-
if (Boolean(window.SootSim?.bridges?.settings?.get?.()?.[modeKey]) === target) {
|
|
11
|
-
return true
|
|
12
|
-
}
|
|
13
|
-
await new Promise((resolve) => setTimeout(resolve, 40))
|
|
14
|
-
}
|
|
15
|
-
return false
|
|
16
|
-
})()`}))throw new Error(`${t.displayName} did not change to ${m?"on":"off"}; the live shell may not support this mode`);return console.log(` ${t.displayName}: ${l?"on":"off"} -> ${m?"on":"off"}`),{current:l,target:m,changed:!0}}finally{d.close()}}async function z(e,o){(e.includes("--help")||e.includes("-h"))&&(console.log(`
|
|
17
|
-
sootsim mode screenshot \u2014 toggle the screenshot-mode chrome overlay
|
|
18
|
-
|
|
19
|
-
usage:
|
|
20
|
-
sootsim mode screenshot [on|off|toggle]
|
|
21
|
-
|
|
22
|
-
arguments:
|
|
23
|
-
on enable screenshot mode (enables showFrame if needed)
|
|
24
|
-
off disable screenshot mode
|
|
25
|
-
toggle flip the current state (default)
|
|
26
|
-
|
|
27
|
-
examples:
|
|
28
|
-
sootsim mode screenshot
|
|
29
|
-
sootsim mode screenshot on
|
|
30
|
-
sootsim mode screenshot off
|
|
31
|
-
`),process.exit(0)),await R(e,o,{modeKey:"screenshotMode",displayName:"screenshot-mode",actionId:"toggle-screenshot-mode"})}import{createHash as Y}from"node:crypto";import{mkdirSync as Q,readFileSync as K,readdirSync as X,unlinkSync as Z,writeFileSync as U}from"node:fs";import{dirname as ee,extname as oe,resolve as T}from"node:path";var C=12e3,te=18e4,ne=new Set(["load","seek","play","pause","render"]);async function L(e,o){(e.includes("--help")||e.includes("-h"))&&(console.log(`
|
|
32
|
-
sootsim mode three \u2014 toggle the 3d device stage
|
|
33
|
-
|
|
34
|
-
usage:
|
|
35
|
-
sootsim mode three [on|off|toggle]
|
|
36
|
-
sootsim mode three configure [options]
|
|
37
|
-
sootsim mode three load <timeline.json>
|
|
38
|
-
sootsim mode three seek <time-ms>
|
|
39
|
-
sootsim mode three play|pause
|
|
40
|
-
sootsim mode three render <timeline.json> --output <dir> [options]
|
|
41
|
-
|
|
42
|
-
arguments:
|
|
43
|
-
on enable 3d mode
|
|
44
|
-
off disable 3d mode
|
|
45
|
-
toggle flip the current state (default)
|
|
46
|
-
|
|
47
|
-
configure options:
|
|
48
|
-
--background <id> set the 3d background
|
|
49
|
-
--gradient <stops> custom gradient bg: comma-separated css hex stops,
|
|
50
|
-
e.g. "#0a0e1a,#16243f,#05080f" (overrides --background;
|
|
51
|
-
evenly spaced, or use "color@offset" for explicit %)
|
|
52
|
-
--gradient-angle <deg> custom gradient angle (default 180 = top\u2192bottom)
|
|
53
|
-
--colorway <id> set the phone colorway
|
|
54
|
-
--script <id> apply a camera preset pose
|
|
55
|
-
--progress <0..1> script progress to sample (default: 1)
|
|
56
|
-
--animate run the script instead of sampling one frame
|
|
57
|
-
--slow run the script slowly when --animate is set
|
|
58
|
-
--environment on|off enable or disable environment objects
|
|
59
|
-
--env-shape <id> orb | pill | diamond | pane
|
|
60
|
-
--env-spread <id> tight | medium | wide
|
|
61
|
-
--env-size <id> small | medium | large
|
|
62
|
-
--env-color <id> peach | gold | mint | sky | violet
|
|
63
|
-
--env-glow on|off enable or disable environment glow
|
|
64
|
-
--env-plastic on|off enable or disable environment plastic material
|
|
65
|
-
--setting <id> none | room | white-backdrop
|
|
66
|
-
--focus on|off enable or disable Focus depth of field
|
|
67
|
-
--focus-amount <id> subtle | medium | strong | dramatic
|
|
68
|
-
--focus-range <id> tight | balanced | wide
|
|
69
|
-
--reset-pose return to the default hero pose before other changes
|
|
70
|
-
|
|
71
|
-
render options:
|
|
72
|
-
--output <dir> write frame-%05d.png + timeline-render.json
|
|
73
|
-
--fps <number> frames per second (default: 30)
|
|
74
|
-
--width <px> exact output width (default: 1920)
|
|
75
|
-
--height <px> exact output height (default: 1080)
|
|
76
|
-
--from <ms> first timeline time (default: 0)
|
|
77
|
-
--to <ms> exclusive end time (default: timeline duration)
|
|
78
|
-
--overwrite replace this command's existing frames in the dir
|
|
79
|
-
|
|
80
|
-
examples:
|
|
81
|
-
sootsim mode three
|
|
82
|
-
sootsim mode three on
|
|
83
|
-
sootsim mode three configure --script hero-arc --background gradient-neon
|
|
84
|
-
sootsim mode three configure --environment on --env-shape pane --setting room
|
|
85
|
-
sootsim mode three render ./cinematic.json --output ./frames --fps 30
|
|
86
|
-
sootsim mode three off
|
|
87
|
-
`),process.exit(0));let t=ae(e);if(t){await me(t,e,o);return}if(re(e)){await ie(e,o);return}(await R(e,o,{modeKey:"threeMode",displayName:"three-mode",actionId:"toggle-three-mode"})).target&&await se(e,o)}function re(e){return e[0]==="configure"||e.some(o=>["--background","--gradient","--gradient-angle","--colorway","--script","--progress","--animate","--slow","--environment","--env-shape","--env-spread","--env-size","--env-color","--env-glow","--env-plastic","--setting","--focus","--focus-amount","--focus-range","--reset-pose"].includes(o))}async function ie(e,o){let t=x(e,{port:o.port,stripBooleanFlags:["--animate","--slow","--reset-pose"],stripValueFlags:["--background","--gradient","--gradient-angle","--colorway","--script","--progress","--environment","--env-shape","--env-spread","--env-size","--env-color","--env-glow","--env-plastic","--setting","--focus","--focus-amount","--focus-range"]}),n=ue(e),r=k({...t,commandTimeoutMs:C+1e3});try{await I(r);let d=await v(r,"SootSim.bridges.threeMode.configure",n);console.log(` three-mode: configured (${fe(d)})`)}finally{r.close()}}async function se(e,o){let t=x(e,{port:o.port}),n=k({...t,commandTimeoutMs:C+1e3});try{await I(n)}finally{n.close()}}async function I(e){let o=await e.send({type:"evaluate",code:`(async () => {
|
|
88
|
-
const deadline = Date.now() + ${C}
|
|
89
|
-
while (Date.now() < deadline) {
|
|
90
|
-
const settings = window.SootSim?.bridges?.settings?.get?.()
|
|
91
|
-
if (settings && settings.threeMode !== true) {
|
|
92
|
-
return { ready: false, disabled: true }
|
|
93
|
-
}
|
|
94
|
-
const bridge = window.SootSim?.bridges?.threeMode
|
|
95
|
-
const state = typeof bridge?.getState === 'function' ? bridge.getState() : null
|
|
96
|
-
if (state?.ready === true) return state
|
|
97
|
-
await new Promise((resolve) => setTimeout(resolve, 50))
|
|
98
|
-
}
|
|
99
|
-
const bridge = window.SootSim?.bridges?.threeMode
|
|
100
|
-
const state = typeof bridge?.getState === 'function' ? bridge.getState() : null
|
|
101
|
-
return state || { ready: false }
|
|
102
|
-
})()`});if(o?.ready===!0)return o;throw o?.disabled?new Error("3d mode is off; run `sootsim mode three on` before configure"):new Error("3d mode runtime did not become ready")}function ae(e){for(let o=0;o<e.length;o+=1){let t=e[o];if(t==="--sim"||t==="--port"||t==="-p"){o+=1;continue}if(!t.startsWith("-"))return ne.has(t)?t:null}return null}function V(e,o){let t=e.indexOf(o);return t>=0?e[t+1]:void 0}function F(e,o,t,n=0){let r=V(e,o);if(r===void 0)return t;let d=Number.parseFloat(r);if(!Number.isFinite(d)||d<n)throw new Error(`${o} expects a number greater than or equal to ${n}`);return d}function J(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function de(e,o){let t=oe(e).toLowerCase();return o==="recording"?t===".mp4"||t===".m4v"?"video/mp4":"video/webm":t===".jpg"||t===".jpeg"?"image/jpeg":t===".webp"?"image/webp":"image/png"}function j(e,o){if(Array.isArray(e))return e.map(n=>j(n,o));if(!J(e))return e;let t={};for(let[n,r]of Object.entries(e))t[n]=j(r,o);if((t.type==="recording"||t.type==="screenshot")&&typeof t.src=="string"&&!/^(?:blob:|data:|https?:)/i.test(t.src)){let n=T(o,t.src),r=K(n);t.src=`data:${de(n,t.type)};base64,${r.toString("base64")}`}return t}function le(e){let o=T(e),t=JSON.parse(K(o,"utf8"));return{absolutePath:o,timeline:j(t,ee(o))}}async function ce(e){await v(e,"SootSim.bridges.settings.set","threeMode",!0),await I(e)}async function me(e,o,t){let n=x(o,{port:t.port,commandTimeoutMs:te,stripBooleanFlags:["--overwrite"],stripValueFlags:["--output","--fps","--width","--height","--from","--to"]}),r=k(n);try{if(await ce(r),e==="seek"){let i=n.positional[1],u=i===void 0?Number.NaN:Number.parseFloat(i);if(!Number.isFinite(u))throw new Error("three-mode seek expects time in ms");let f=await v(r,"SootSim.bridges.threeMode.seek",u);console.log(` three-mode: ${Math.round(f.timeMs)}ms / ${Math.round(f.durationMs)}ms (${f.shotId??"no shot"})`);return}if(e==="play"||e==="pause"){let i=await v(r,`SootSim.bridges.threeMode.${e}`),u=J(i.timeline)?i.timeline:{};console.log(` three-mode: ${e} (${Math.round(Number(u.timeMs??0))}ms)`);return}let d=n.positional[1];if(!d)throw new Error(`three-mode ${e} expects a timeline JSON path`);let g=le(d),l=await v(r,"SootSim.bridges.threeMode.loadTimeline",g.timeline);if(e==="load"){console.log(` three-mode: loaded ${g.absolutePath} (${Math.round(l.durationMs)}ms)`);return}let m=V(o,"--output");if(!m)throw new Error("three-mode render requires --output <dir>");let p=T(m),w=F(o,"--fps",30,.001),b=Math.round(F(o,"--width",1920,1)),B=Math.round(F(o,"--height",1080,1)),y=F(o,"--from",0,0),h=F(o,"--to",l.durationMs,0);if(h<=y||h>l.durationMs)throw new Error(`--to must be greater than --from and at most ${l.durationMs}`);let s=1e3/w,a=Math.ceil((h-y)/s);Q(p,{recursive:!0});let c=X(p).filter(i=>/^frame-\d{5}\.png$/.test(i)||i==="timeline-render.json");if(c.length>0&&!o.includes("--overwrite"))throw new Error(`${p} already has timeline frames; pass --overwrite to replace them`);for(let i of c)Z(T(p,i));let M=[],$=4;for(let i=0;i<a;i+=$){let u=Math.min($,a-i),f=y+i*s,G=Math.min(h,f+u*s),N=await v(r,"SootSim.bridges.threeMode.renderFrames",{fps:w,from:f,to:G,width:b,height:B,count:u});if(N.frames.length!==u)throw new Error(`3d renderer returned ${N.frames.length} frames for a ${u}-frame batch`);for(let S of N.frames){let H=i+S.index,_=`frame-${String(H).padStart(5,"0")}.png`,A=S.dataUrl.indexOf(",");if(A<0||!S.dataUrl.slice(0,A).includes("image/png;base64"))throw new Error(`3d renderer returned a non-PNG frame at ${S.timeMs}ms`);let P=Buffer.from(S.dataUrl.slice(A+1),"base64");U(T(p,_),P),M.push({file:_,timeMs:S.timeMs,sha256:Y("sha256").update(P).digest("hex"),alpha:S.alpha})}process.stderr.write(`\r three-mode: rendered ${Math.min(i+u,a)}/${a}`)}process.stderr.write(`
|
|
103
|
-
`);let O={version:1,timeline:g.absolutePath,fps:w,from:y,to:h,width:b,height:B,frameCount:a,transparent:M.every(i=>i.alpha.transparentPixels>0),frames:M};U(T(p,"timeline-render.json"),`${JSON.stringify(O,null,2)}
|
|
104
|
-
`),console.log(` three-mode: wrote ${a} deterministic RGBA frames to ${p}`)}finally{r.close()}}function ue(e){let o=s=>e.find((a,c)=>e[c-1]===s),t={},n=o("--colorway");n&&(t.colorway=n);let r=o("--background");r&&(t.background=r);let d=o("--gradient");if(d){let s=d.split(",").map($=>$.trim()).filter(Boolean),a=s.map(($,O)=>{let[i,u]=$.split("@"),f=u!==void 0?Number.parseFloat(u):s.length>1?O/(s.length-1):0;return f>1&&(f=f/100),Number.isFinite(f)||(f=s.length>1?O/(s.length-1):0),{color:i.trim(),offset:f}}),c=o("--gradient-angle"),M=c===void 0?void 0:Number.parseFloat(c);if(c!==void 0&&!Number.isFinite(M))throw new Error(`--gradient-angle expects a number, got "${c}"`);t.customGradient={stops:a,...M!==void 0?{angleDeg:M}:{}}}let g=o("--setting");if(g){if(g!=="none"&&g!=="room"&&g!=="white-backdrop")throw new Error(`--setting expects none, room, or white-backdrop, got "${g}"`);t.setting=g}let l={},m=E(o("--focus"),"--focus");m!==void 0&&(l.enabled=m);for(let[s,a]of[["--focus-amount","amount"],["--focus-range","range"]]){let c=o(s);c&&(l[a]=c)}Object.keys(l).length>0&&(t.focus=l),e.includes("--reset-pose")&&(t.resetPose=!0);let p=E(o("--environment"),"--environment"),w={},b={};for(let[s,a]of[["--env-shape","shape"],["--env-spread","spread"],["--env-size","size"],["--env-color","color"]]){let c=o(s);c&&(w[a]=c)}let B=E(o("--env-glow"),"--env-glow");B!==void 0&&(b.glow=B);let y=E(o("--env-plastic"),"--env-plastic");y!==void 0&&(b.plastic=y),(p!==void 0||Object.keys(w).length>0||Object.keys(b).length>0)&&(t.environment=p===!1?!1:{pins:w,effects:b});let h=o("--script");if(h){let s=o("--progress"),a=s===void 0?1:Number.parseFloat(s);if(!Number.isFinite(a))throw new Error(`--progress expects a number from 0 to 1, got "${s}"`);t.script={id:h,progress:a,animate:e.includes("--animate"),slow:e.includes("--slow")}}return t}function E(e,o){if(e===void 0)return;let t=e.toLowerCase();if(["on","true","yes","1"].includes(t))return!0;if(["off","false","no","0"].includes(t))return!1;throw new Error(`${o} expects on or off, got "${e}"`)}function fe(e){return[`ready=${!!e.ready}`,`background=${String(e.background??"unknown")}`,`colorway=${String(e.colorway??"unknown")}`,`environment=${e.environmentActive?"on":"off"}`,`setting=${String(e.setting??"none")}`,`focus=${e.focus&&typeof e.focus=="object"&&e.focus.enabled?"on":"off"}`].join(", ")}var ge=new Set(["--sim","--port","-p"]),pe=new Set(["screenshot","three"]);function he(e){for(let o=0;o<e.length;o++){let t=e[o];if(t.startsWith("-")){ge.has(t)&&o++;continue}return pe.has(t)?{name:t,index:o}:null}return null}function we(e,o){return[...e.slice(0,o),...e.slice(o+1)]}function W(){console.log(`
|
|
105
|
-
sootsim mode \u2014 toggle live display modes
|
|
106
|
-
|
|
107
|
-
usage:
|
|
108
|
-
sootsim mode screenshot [on|off|toggle]
|
|
109
|
-
sootsim mode three [on|off|toggle]
|
|
110
|
-
sootsim mode three configure [options]
|
|
111
|
-
`)}async function Re(e,o){if(e.includes("--help")||e.includes("-h")){W();return}let t=he(e);t||(W(),process.exit(1));let n=we(e,t.index);if(t.name==="screenshot"){await z(n,o);return}await L(n,o)}export{Re as runMode};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
/*! sootsim v0.1.215 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
-
import{a}from"./chunk-RIAS4TMS.js";import"./chunk-UJZFS2JM.js";import"./chunk-5MUXEXEW.js";import"./chunk-OUB7WT7Q.js";import"./chunk-YTQ5RCVB.js";import"./chunk-FEFLFVIU.js";import"./chunk-AKNZ6QBL.js";export{a as runRuntime};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
/*! sootsim v0.1.215 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
-
import{a,b,c}from"./chunk-VIXY7DGW.js";import"./chunk-7COBEK2I.js";import"./chunk-5GU7LW64.js";import"./chunk-HKEH2UOD.js";import"./chunk-5MUXEXEW.js";import"./chunk-2FEGONIZ.js";import"./chunk-LIFR6X36.js";import"./chunk-BU7V5UGD.js";import"./chunk-OUB7WT7Q.js";import"./chunk-YTQ5RCVB.js";import"./chunk-FEFLFVIU.js";import"./chunk-AKNZ6QBL.js";export{a as resolveDefaultUploadOrigin,b as resolvePublicPreviewOrigin,c as runUpload};
|