sootsim 0.1.291 → 0.1.293

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 (159) hide show
  1. package/detox/expectations.ts +32 -12
  2. package/dist-cli/bin.js +5 -5
  3. package/dist-cli/chunks/{agent-EDS4HRKB.js → agent-YWI2NWL7.js} +2 -2
  4. package/dist-cli/chunks/{agent-wrapper-ZCSAPGFF.js → agent-wrapper-IYJ7UZOA.js} +2 -2
  5. package/dist-cli/chunks/{app-fonts-4WW4EQEW.js → app-fonts-FQFUC4LR.js} +2 -2
  6. package/dist-cli/chunks/{assert-XEWAR4HT.js → assert-XUCELWAC.js} +2 -2
  7. package/dist-cli/chunks/{auth-SAYME64O.js → auth-4DQTV3OW.js} +2 -2
  8. package/dist-cli/chunks/beta-CFDAW6UN.js +2 -0
  9. package/dist-cli/chunks/{camera-2AHKTJ5I.js → camera-RYOHBVZA.js} +2 -2
  10. package/dist-cli/chunks/{chunk-7CU7FXRN.js → chunk-2M57EAWS.js} +1 -1
  11. package/dist-cli/chunks/{chunk-LJU4JU3N.js → chunk-2VKTOZQ5.js} +2 -2
  12. package/dist-cli/chunks/{chunk-NGPK2CLP.js → chunk-2XYCSFGN.js} +3 -3
  13. package/dist-cli/chunks/{chunk-UQLIMTO6.js → chunk-3UX6AY2B.js} +1 -1
  14. package/dist-cli/chunks/{chunk-R36NUSCM.js → chunk-4B4VFT73.js} +2 -2
  15. package/dist-cli/chunks/{chunk-KQKLLUX5.js → chunk-547W23BB.js} +2 -2
  16. package/dist-cli/chunks/{chunk-KSN2WTV6.js → chunk-67CIS55C.js} +1 -1
  17. package/dist-cli/chunks/{chunk-VK3IISND.js → chunk-6IFJLHDA.js} +1 -1
  18. package/dist-cli/chunks/{chunk-NRXMKMIJ.js → chunk-6VVLDYPV.js} +2 -2
  19. package/dist-cli/chunks/{chunk-LD5ZN4ZU.js → chunk-7B6RGFTM.js} +2 -2
  20. package/dist-cli/chunks/{chunk-HFJEB4UJ.js → chunk-7H34H74K.js} +2 -2
  21. package/dist-cli/chunks/{chunk-HQRKN435.js → chunk-7H5G4HUK.js} +2 -2
  22. package/dist-cli/chunks/{chunk-OC6PU44E.js → chunk-ACSTEPSD.js} +1 -1
  23. package/dist-cli/chunks/chunk-AFRXWKTA.js +118 -0
  24. package/dist-cli/chunks/{chunk-7GKJ3U2Z.js → chunk-B7TX4WFB.js} +2 -2
  25. package/dist-cli/chunks/{chunk-EFTPP4W3.js → chunk-BQT5YDTV.js} +3 -3
  26. package/dist-cli/chunks/{chunk-NPP6ZJLD.js → chunk-DE4ZA3NL.js} +2 -2
  27. package/dist-cli/chunks/{chunk-462J7KLI.js → chunk-E5WYXRGV.js} +3 -3
  28. package/dist-cli/chunks/chunk-HKMWUN7F.js +2 -0
  29. package/dist-cli/chunks/{chunk-5CJQNMXY.js → chunk-J6P2UPXH.js} +2 -2
  30. package/dist-cli/chunks/{chunk-GJDCBMAP.js → chunk-JOPKZVOW.js} +1 -1
  31. package/dist-cli/chunks/{chunk-EPJO7YNS.js → chunk-K5JEUI5G.js} +1 -1
  32. package/dist-cli/chunks/{chunk-5D5XSE5V.js → chunk-KC5SCOGS.js} +2 -2
  33. package/dist-cli/chunks/{chunk-FWC4J42U.js → chunk-LA5DIO33.js} +1 -1
  34. package/dist-cli/chunks/{chunk-653O3F3M.js → chunk-LOQLZFRK.js} +2 -2
  35. package/dist-cli/chunks/{chunk-QOIOK64H.js → chunk-MOU2WLO4.js} +1 -1
  36. package/dist-cli/chunks/{chunk-LHBU5QMM.js → chunk-NCCMRFXU.js} +1 -1
  37. package/dist-cli/chunks/{chunk-5IBT7JOS.js → chunk-PCAPHXN3.js} +2 -2
  38. package/dist-cli/chunks/chunk-QXDXUDJD.js +1 -0
  39. package/dist-cli/chunks/{chunk-NN4CZ2QW.js → chunk-RKXHQ2Q3.js} +1 -1
  40. package/dist-cli/chunks/{chunk-Z6I5M7VJ.js → chunk-RMLJXP7T.js} +2 -2
  41. package/dist-cli/chunks/chunk-RV67J726.js +2 -0
  42. package/dist-cli/chunks/{chunk-UZA3Q67P.js → chunk-TJS5IMOH.js} +1 -1
  43. package/dist-cli/chunks/{chunk-KTTLGU7Y.js → chunk-U3564F2Y.js} +2 -2
  44. package/dist-cli/chunks/{chunk-3FBFOGQJ.js → chunk-UOHGYYSO.js} +1 -1
  45. package/dist-cli/chunks/{chunk-DLMAMKWL.js → chunk-UPKYK52K.js} +2 -2
  46. package/dist-cli/chunks/{chunk-GZON2OYB.js → chunk-USJTVC7T.js} +1 -1
  47. package/dist-cli/chunks/{chunk-U6GFEFUD.js → chunk-VO74GDXL.js} +3 -3
  48. package/dist-cli/chunks/{chunk-76O3ZWTI.js → chunk-VZ44FQDG.js} +1 -1
  49. package/dist-cli/chunks/chunk-WI36YJ23.js +2 -0
  50. package/dist-cli/chunks/{chunk-5NGZRMTN.js → chunk-WOWLO4LL.js} +1 -1
  51. package/dist-cli/chunks/chunk-WP3TFHFL.js +10 -0
  52. package/dist-cli/chunks/{chunk-KBG6WN24.js → chunk-WPPMUUML.js} +2 -2
  53. package/dist-cli/chunks/{chunk-ZYS5SEB2.js → chunk-WVMYRKSS.js} +2 -2
  54. package/dist-cli/chunks/chunk-YNG4C3ZS.js +2 -0
  55. package/dist-cli/chunks/{chunk-JTZNB4PB.js → chunk-YRFWATLA.js} +2 -2
  56. package/dist-cli/chunks/{cleanup-KXX5W42A.js → cleanup-BLFDJSFS.js} +2 -2
  57. package/dist-cli/chunks/cli-version-TQHZOK4L.js +2 -0
  58. package/dist-cli/chunks/{compat-VDVJ2I74.js → compat-Q3WCSTB7.js} +3 -3
  59. package/dist-cli/chunks/{config-FIQQP5FR.js → config-NHNMRRNB.js} +2 -2
  60. package/dist-cli/chunks/control-I7YBDRJT.js +2 -0
  61. package/dist-cli/chunks/daemon-4R3SZLZY.js +2 -0
  62. package/dist-cli/chunks/{debug-LPLH46JF.js → debug-PGRMZFXA.js} +3 -3
  63. package/dist-cli/chunks/{desktop-4HDRWKMN.js → desktop-NVTQ37LH.js} +3 -3
  64. package/dist-cli/chunks/{detox-U23WKW23.js → detox-W3JDXS76.js} +2 -2
  65. package/dist-cli/chunks/{device-HZKTA7ZV.js → device-KQYN3EVK.js} +2 -2
  66. package/dist-cli/chunks/{diagnose-M64QUWBW.js → diagnose-CPUKSGNO.js} +2 -2
  67. package/dist-cli/chunks/disk-cleanup-2COWZWBC.js +2 -0
  68. package/dist-cli/chunks/drivers-RRZM6E72.js +2 -0
  69. package/dist-cli/chunks/{film-4IB44CT3.js → film-VZGAZ2YY.js} +3 -3
  70. package/dist-cli/chunks/flow-VH6DFDQ4.js +2 -0
  71. package/dist-cli/chunks/help-3HQ2RINO.js +2 -0
  72. package/dist-cli/chunks/{hidden-runtime-alias-UEU5POA4.js → hidden-runtime-alias-KWHABCNZ.js} +2 -2
  73. package/dist-cli/chunks/{home-paths-2C4YKPPX.js → home-paths-O4CGYVHF.js} +2 -2
  74. package/dist-cli/chunks/inspect-PKMJGXDH.js +2 -0
  75. package/dist-cli/chunks/install-desktop-K5TP3ZHJ.js +2 -0
  76. package/dist-cli/chunks/{login-MY54AOXW.js → login-KPN4Z26Q.js} +4 -4
  77. package/dist-cli/chunks/{logout-LYR2RDJY.js → logout-E3UCJAMC.js} +2 -2
  78. package/dist-cli/chunks/{maestro-4RAMCNZQ.js → maestro-PYA4AHTS.js} +3 -3
  79. package/dist-cli/chunks/{maestro-generate-CBSUR73A.js → maestro-generate-KCMYWPWL.js} +3 -3
  80. package/dist-cli/chunks/{mode-2KATMMXB.js → mode-AEB7G2SJ.js} +2 -2
  81. package/dist-cli/chunks/optional-demo-registry-AIWOBAAA.js +2 -0
  82. package/dist-cli/chunks/{perf-FVL2ZRQW.js → perf-YLXGZI3E.js} +2 -2
  83. package/dist-cli/chunks/permissions-7VMVZOUV.js +11 -0
  84. package/dist-cli/chunks/{record-TCD4VLNH.js → record-AVQO45PE.js} +3 -3
  85. package/dist-cli/chunks/runtime-HOGETVVD.js +2 -0
  86. package/dist-cli/chunks/{screenshot-command-ENCJ4W2W.js → screenshot-command-LACQLA4N.js} +3 -3
  87. package/dist-cli/chunks/{screenshots-capture-FVVMZPFO.js → screenshots-capture-PROOBSGB.js} +2 -2
  88. package/dist-cli/chunks/{serve-HNHS3QBP.js → serve-FJN2FRGW.js} +2 -2
  89. package/dist-cli/chunks/{setup-MRLIGVU4.js → setup-IVV4NRYQ.js} +3 -3
  90. package/dist-cli/chunks/{skills-2LW5BE7P.js → skills-WYR3PJOH.js} +2 -2
  91. package/dist-cli/chunks/{storage-KH5HQF3V.js → storage-GM7K4MGM.js} +2 -2
  92. package/dist-cli/chunks/store-YLVHPKG7.js +2 -0
  93. package/dist-cli/chunks/telemetry-MQKB6PFX.js +2 -0
  94. package/dist-cli/chunks/{timeline-BWFBU4VM.js → timeline-R5UL3N4T.js} +2 -2
  95. package/dist-cli/chunks/{upgrade-GZFX4JEO.js → upgrade-RWHSFZRX.js} +2 -2
  96. package/dist-cli/chunks/upload-RBH4XGJ2.js +2 -0
  97. package/dist-cli/chunks/{version-OKMVZCP5.js → version-7K6TVQOW.js} +2 -2
  98. package/dist-cli/chunks/web-46ZPQCAL.js +2 -0
  99. package/dist-cli/chunks/{what-happened-MC7JDW6C.js → what-happened-K24TSJZX.js} +2 -2
  100. package/dist-lib/agent-daemon-client.cjs +1 -1
  101. package/dist-lib/agent-events.cjs +1 -1
  102. package/dist-lib/agent-identity.cjs +1 -1
  103. package/dist-lib/agent-sessions.cjs +1 -1
  104. package/dist-lib/attached-projects.cjs +1 -1
  105. package/dist-lib/auth/shared-session.cjs +1 -1
  106. package/dist-lib/backend-origin.cjs +1 -1
  107. package/dist-lib/beta.cjs +1 -1
  108. package/dist-lib/beta.mjs +1 -1
  109. package/dist-lib/bridge-constants.cjs +1 -1
  110. package/dist-lib/cli-constants.cjs +1 -1
  111. package/dist-lib/config.cjs +1 -1
  112. package/dist-lib/detox/index.cjs +24 -6
  113. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  114. package/dist-lib/home-paths.cjs +1 -1
  115. package/dist-lib/host/bridge-host.cjs +411 -66
  116. package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
  117. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  118. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  119. package/dist-lib/host/websocket-proxy.cjs +1 -1
  120. package/dist-lib/index.cjs +1 -1
  121. package/dist-lib/jump-to-source-babel.cjs +1 -1
  122. package/dist-lib/menu.cjs +38 -2
  123. package/dist-lib/menu.mjs +38 -2
  124. package/dist-lib/metro.cjs +1 -1
  125. package/dist-lib/profiles.cjs +1 -1
  126. package/dist-lib/render-mode.cjs +1 -1
  127. package/dist-lib/scripts/dev-server-scanner.cjs +354 -2
  128. package/dist-lib/sdk.cjs +1 -1
  129. package/dist-lib/sdk.mjs +1 -1
  130. package/dist-lib/skills.cjs +443 -91
  131. package/dist-lib/vite.cjs +1 -1
  132. package/package.json +2 -1
  133. package/scripts/dev-server-scanner.ts +27 -1
  134. package/skills/contrast/SKILL.md +1 -0
  135. package/src/menu.ts +38 -1
  136. package/src/settings-bundle.ts +439 -0
  137. package/dist-cli/chunks/beta-HKVUNMLY.js +0 -2
  138. package/dist-cli/chunks/chunk-5ZBUNUUE.js +0 -2
  139. package/dist-cli/chunks/chunk-7NW75BHD.js +0 -5
  140. package/dist-cli/chunks/chunk-H7F2BILD.js +0 -118
  141. package/dist-cli/chunks/chunk-IDZP6WN5.js +0 -2
  142. package/dist-cli/chunks/chunk-IGPDVTHJ.js +0 -2
  143. package/dist-cli/chunks/chunk-KU3T3N2W.js +0 -1
  144. package/dist-cli/chunks/chunk-ZEYCE3XJ.js +0 -2
  145. package/dist-cli/chunks/cli-version-IQXVYN67.js +0 -2
  146. package/dist-cli/chunks/control-GDBZBVQC.js +0 -2
  147. package/dist-cli/chunks/daemon-Y76JSFGV.js +0 -2
  148. package/dist-cli/chunks/disk-cleanup-P662TT6J.js +0 -2
  149. package/dist-cli/chunks/drivers-CKWEDYVG.js +0 -2
  150. package/dist-cli/chunks/flow-WDFYSQKC.js +0 -2
  151. package/dist-cli/chunks/help-2S3OHQLT.js +0 -2
  152. package/dist-cli/chunks/inspect-SKU24VE3.js +0 -2
  153. package/dist-cli/chunks/install-desktop-RKURHJ34.js +0 -2
  154. package/dist-cli/chunks/optional-demo-registry-26Q7AW7X.js +0 -2
  155. package/dist-cli/chunks/runtime-Z3D53UGW.js +0 -2
  156. package/dist-cli/chunks/store-IBEI6PK4.js +0 -2
  157. package/dist-cli/chunks/telemetry-3T56HLDZ.js +0 -2
  158. package/dist-cli/chunks/upload-PCXRS5D7.js +0 -2
  159. package/dist-cli/chunks/web-ZHCP6WFY.js +0 -2
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.291 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.293 | (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.291 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.293 | (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.291 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.293 | (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.291 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.293 | (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.291 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.293 | (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.291 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.293 | (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.291 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.293 | (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;
@@ -62,6 +62,36 @@ function appMenu() {
62
62
  shortcutLabel: "settings",
63
63
  showInShortcutDocs: true
64
64
  },
65
+ {
66
+ label: "Settings Pages",
67
+ items: [
68
+ {
69
+ label: "Accessibility",
70
+ action: "open-settings-page",
71
+ actionPayload: "accessibility"
72
+ },
73
+ {
74
+ label: "Display & Text Size",
75
+ action: "open-settings-page",
76
+ actionPayload: "display-and-text-size"
77
+ },
78
+ {
79
+ label: "Notifications",
80
+ action: "open-settings-page",
81
+ actionPayload: "notifications"
82
+ },
83
+ {
84
+ label: "Apps",
85
+ action: "open-settings-page",
86
+ actionPayload: "apps"
87
+ },
88
+ {
89
+ label: "Privacy & Security",
90
+ action: "open-settings-page",
91
+ actionPayload: "privacy"
92
+ }
93
+ ]
94
+ },
65
95
  { type: "separator" },
66
96
  {
67
97
  label: "Hide SootSim",
@@ -282,9 +312,15 @@ function windowMenu(state) {
282
312
  label: "Show Top Bar",
283
313
  type: "checkbox",
284
314
  checked: state.showTopBar,
285
- enabled: state.showBezels,
286
315
  action: "toggle-topbar"
287
316
  },
317
+ {
318
+ label: "Show Rail",
319
+ type: "checkbox",
320
+ checked: state.showRail,
321
+ action: "toggle-rail",
322
+ hiddenIn: "electron"
323
+ },
288
324
  {
289
325
  label: "Screenshot",
290
326
  type: "checkbox",
package/dist-lib/menu.mjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.291 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.293 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/menu.ts
4
4
  var SOOTSIM_ENGINE_EVENT_NAME = "sootsim:engine-event";
@@ -29,6 +29,36 @@ function appMenu() {
29
29
  shortcutLabel: "settings",
30
30
  showInShortcutDocs: true
31
31
  },
32
+ {
33
+ label: "Settings Pages",
34
+ items: [
35
+ {
36
+ label: "Accessibility",
37
+ action: "open-settings-page",
38
+ actionPayload: "accessibility"
39
+ },
40
+ {
41
+ label: "Display & Text Size",
42
+ action: "open-settings-page",
43
+ actionPayload: "display-and-text-size"
44
+ },
45
+ {
46
+ label: "Notifications",
47
+ action: "open-settings-page",
48
+ actionPayload: "notifications"
49
+ },
50
+ {
51
+ label: "Apps",
52
+ action: "open-settings-page",
53
+ actionPayload: "apps"
54
+ },
55
+ {
56
+ label: "Privacy & Security",
57
+ action: "open-settings-page",
58
+ actionPayload: "privacy"
59
+ }
60
+ ]
61
+ },
32
62
  { type: "separator" },
33
63
  {
34
64
  label: "Hide SootSim",
@@ -249,9 +279,15 @@ function windowMenu(state) {
249
279
  label: "Show Top Bar",
250
280
  type: "checkbox",
251
281
  checked: state.showTopBar,
252
- enabled: state.showBezels,
253
282
  action: "toggle-topbar"
254
283
  },
284
+ {
285
+ label: "Show Rail",
286
+ type: "checkbox",
287
+ checked: state.showRail,
288
+ action: "toggle-rail",
289
+ hiddenIn: "electron"
290
+ },
255
291
  {
256
292
  label: "Screenshot",
257
293
  type: "checkbox",
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.291 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.293 | (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.291 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.293 | (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.291 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.293 | (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.291 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.293 | (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;
@@ -33,6 +33,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
33
33
  var dev_server_scanner_exports = {};
34
34
  __export(dev_server_scanner_exports, {
35
35
  __applyManifestForTests: () => __applyManifestForTests,
36
+ __attachAppSettingsBundleForTests: () => __attachAppSettingsBundleForTests,
36
37
  __isSootSimSelfServerForTests: () => __isSootSimSelfServerForTests,
37
38
  __resetScannerCache: () => __resetScannerCache,
38
39
  __shouldReuseScannerCacheEntry: () => __shouldReuseScannerCacheEntry,
@@ -98,6 +99,342 @@ function normalizeNativeDevBundleUrl(bundleUrl) {
98
99
  }
99
100
  }
100
101
 
102
+ // src/settings-bundle.ts
103
+ var import_promises = require("node:fs/promises");
104
+ var import_node_path = require("node:path");
105
+ var import_plist = __toESM(require("@expo/plist"), 1);
106
+ var MAX_PLIST_BYTES = 1048576;
107
+ var MAX_CHILD_DEPTH = 8;
108
+ var MAX_PLIST_FILES = 32;
109
+ var MAX_SPECIFIERS = 512;
110
+ var settingsBundleCache = /* @__PURE__ */ new Map();
111
+ function isRecord(value) {
112
+ return typeof value === "object" && value !== null && !Array.isArray(value);
113
+ }
114
+ function resolvePlistParser(value) {
115
+ if (!isRecord(value)) return null;
116
+ const direct = value.parse;
117
+ if (typeof direct === "function") {
118
+ return (source) => Reflect.apply(direct, value, [source]);
119
+ }
120
+ const nested = value.default;
121
+ if (!isRecord(nested)) return null;
122
+ const nestedParse = nested.parse;
123
+ return typeof nestedParse === "function" ? (source) => Reflect.apply(nestedParse, nested, [source]) : null;
124
+ }
125
+ var parsePlist = resolvePlistParser(import_plist.default);
126
+ function optionalString(value) {
127
+ return typeof value === "string" ? value : void 0;
128
+ }
129
+ function requiredString(value) {
130
+ if (typeof value !== "string") return null;
131
+ const normalized = value.trim();
132
+ return normalized ? normalized : null;
133
+ }
134
+ function finiteNumber(value) {
135
+ return typeof value === "number" && Number.isFinite(value) ? value : null;
136
+ }
137
+ function preferenceValue(value) {
138
+ if (typeof value === "string" || typeof value === "boolean") return value;
139
+ return finiteNumber(value);
140
+ }
141
+ function keyboardType(value) {
142
+ if (typeof value !== "string") return void 0;
143
+ switch (value.replaceAll(/[-_\s]/g, "").toLowerCase()) {
144
+ case "alphabet":
145
+ return "alphabet";
146
+ case "numbersandpunctuation":
147
+ return "numbers-and-punctuation";
148
+ case "numberpad":
149
+ return "number-pad";
150
+ case "url":
151
+ return "url";
152
+ case "emailaddress":
153
+ return "email-address";
154
+ case "namephonepad":
155
+ return "name-phone-pad";
156
+ case "asciicapable":
157
+ return "ascii-capable";
158
+ default:
159
+ return void 0;
160
+ }
161
+ }
162
+ function autocapitalization(value) {
163
+ if (typeof value !== "string") return void 0;
164
+ switch (value.replaceAll(/[-_\s]/g, "").toLowerCase()) {
165
+ case "none":
166
+ return "none";
167
+ case "sentences":
168
+ return "sentences";
169
+ case "words":
170
+ return "words";
171
+ case "allcharacters":
172
+ return "all-characters";
173
+ default:
174
+ return void 0;
175
+ }
176
+ }
177
+ function autocorrection(value) {
178
+ if (typeof value === "boolean") return value;
179
+ if (typeof value !== "string") return void 0;
180
+ switch (value.trim().toLowerCase()) {
181
+ case "yes":
182
+ return true;
183
+ case "no":
184
+ return false;
185
+ default:
186
+ return void 0;
187
+ }
188
+ }
189
+ function safeChildPlistName(value) {
190
+ const file = requiredString(value);
191
+ if (!file || file.includes("/") || file.includes("\\") || file.includes("..")) {
192
+ return null;
193
+ }
194
+ return {
195
+ file,
196
+ name: file.toLowerCase().endsWith(".plist") ? file : `${file}.plist`
197
+ };
198
+ }
199
+ async function readableSettingsBundle(path) {
200
+ try {
201
+ const root = await (0, import_promises.stat)((0, import_node_path.join)(path, "Root.plist"));
202
+ return root.isFile() && root.size <= MAX_PLIST_BYTES;
203
+ } catch {
204
+ return false;
205
+ }
206
+ }
207
+ async function findSettingsBundle(projectRoot) {
208
+ const directCandidates = [
209
+ (0, import_node_path.join)(projectRoot, "Settings.bundle"),
210
+ (0, import_node_path.join)(projectRoot, "ios", "Settings.bundle")
211
+ ];
212
+ for (const candidate of directCandidates) {
213
+ if (await readableSettingsBundle(candidate)) return candidate;
214
+ }
215
+ try {
216
+ const iosRoot = (0, import_node_path.join)(projectRoot, "ios");
217
+ const children = await (0, import_promises.readdir)(iosRoot, { withFileTypes: true });
218
+ const candidates = children.filter(
219
+ (entry) => entry.isDirectory() && entry.name !== "Pods" && entry.name !== "build" && !entry.name.startsWith(".")
220
+ ).map((entry) => (0, import_node_path.join)(iosRoot, entry.name, "Settings.bundle")).sort();
221
+ for (const candidate of candidates) {
222
+ if (await readableSettingsBundle(candidate)) return candidate;
223
+ }
224
+ } catch {
225
+ }
226
+ return null;
227
+ }
228
+ async function settingsBundleFingerprint(bundlePath) {
229
+ try {
230
+ const entries = await (0, import_promises.readdir)(bundlePath, { withFileTypes: true });
231
+ const names = entries.filter((entry) => entry.isFile() && entry.name.toLowerCase().endsWith(".plist")).map((entry) => entry.name).sort().slice(0, MAX_PLIST_FILES + 1);
232
+ if (names.length === 0 || names.length > MAX_PLIST_FILES) return null;
233
+ const parts = await Promise.all(
234
+ names.map(async (name) => {
235
+ const metadata = await (0, import_promises.stat)((0, import_node_path.join)(bundlePath, name));
236
+ if (!metadata.isFile() || metadata.size > MAX_PLIST_BYTES) return null;
237
+ return `${name}:${metadata.size}:${metadata.mtimeMs}:${metadata.ctimeMs}`;
238
+ })
239
+ );
240
+ if (parts.some((part) => part === null)) return null;
241
+ return parts.join("|");
242
+ } catch {
243
+ return null;
244
+ }
245
+ }
246
+ async function parsePlistRecord(path) {
247
+ try {
248
+ if (!parsePlist) return null;
249
+ const metadata = await (0, import_promises.stat)(path);
250
+ if (!metadata.isFile() || metadata.size > MAX_PLIST_BYTES) return null;
251
+ const source = await (0, import_promises.readFile)(path, "utf8");
252
+ const parsed = parsePlist(source);
253
+ return isRecord(parsed) ? parsed : null;
254
+ } catch {
255
+ return null;
256
+ }
257
+ }
258
+ function normalizeMultiValue(raw, key, title) {
259
+ if (!Array.isArray(raw.Values) || !Array.isArray(raw.Titles)) return null;
260
+ const values = [];
261
+ const titles = [];
262
+ let optionType;
263
+ const pairCount = Math.min(raw.Values.length, raw.Titles.length);
264
+ for (let index = 0; index < pairCount; index++) {
265
+ const value = preferenceValue(raw.Values[index]);
266
+ const optionTitle = optionalString(raw.Titles[index]);
267
+ if (value === null || optionTitle === void 0) continue;
268
+ const valueType = typeof value === "string" ? "string" : typeof value === "number" ? "number" : "boolean";
269
+ if (optionType !== void 0 && valueType !== optionType) continue;
270
+ optionType = valueType;
271
+ values.push(value);
272
+ titles.push(optionTitle);
273
+ }
274
+ const firstValue = values[0];
275
+ if (firstValue === void 0) return null;
276
+ const declaredDefault = preferenceValue(raw.DefaultValue);
277
+ const defaultValue = declaredDefault !== null && values.includes(declaredDefault) ? declaredDefault : firstValue;
278
+ return {
279
+ type: "multi-value",
280
+ key,
281
+ title,
282
+ defaultValue,
283
+ currentValue: defaultValue,
284
+ values,
285
+ titles
286
+ };
287
+ }
288
+ async function normalizeSpecifier(raw, context) {
289
+ if (!isRecord(raw)) return null;
290
+ if (context.budget.specifiers >= MAX_SPECIFIERS) return null;
291
+ const type = requiredString(raw.Type);
292
+ if (!type) return null;
293
+ context.budget.specifiers += 1;
294
+ if (type === "PSGroupSpecifier") {
295
+ const title2 = optionalString(raw.Title);
296
+ const footer = optionalString(raw.FooterText);
297
+ return {
298
+ type: "group",
299
+ ...title2 !== void 0 ? { title: title2 } : null,
300
+ ...footer !== void 0 ? { footer } : null
301
+ };
302
+ }
303
+ const key = requiredString(raw.Key);
304
+ if (type === "PSSliderSpecifier") {
305
+ if (!key) return null;
306
+ const minimumValue = finiteNumber(raw.MinimumValue);
307
+ const maximumValue = finiteNumber(raw.MaximumValue);
308
+ if (minimumValue === null || maximumValue === null || maximumValue <= minimumValue) {
309
+ return null;
310
+ }
311
+ const declaredDefault = finiteNumber(raw.DefaultValue);
312
+ const defaultValue = Math.min(
313
+ maximumValue,
314
+ Math.max(minimumValue, declaredDefault ?? minimumValue)
315
+ );
316
+ const title2 = optionalString(raw.Title);
317
+ const minimumValueImage = optionalString(raw.MinimumValueImage);
318
+ const maximumValueImage = optionalString(raw.MaximumValueImage);
319
+ return {
320
+ type: "slider",
321
+ key,
322
+ defaultValue,
323
+ currentValue: defaultValue,
324
+ minimumValue,
325
+ maximumValue,
326
+ ...title2 !== void 0 ? { title: title2 } : null,
327
+ ...minimumValueImage !== void 0 ? { minimumValueImage } : null,
328
+ ...maximumValueImage !== void 0 ? { maximumValueImage } : null
329
+ };
330
+ }
331
+ if (type === "PSChildPaneSpecifier") {
332
+ const title2 = requiredString(raw.Title);
333
+ const child = safeChildPlistName(raw.File);
334
+ if (!title2 || !child || context.depth >= MAX_CHILD_DEPTH) return null;
335
+ const childSpecifiers = await parseSpecifierFile(child.name, {
336
+ ...context,
337
+ depth: context.depth + 1
338
+ });
339
+ if (!childSpecifiers || childSpecifiers.length === 0) return null;
340
+ return {
341
+ type: "child-pane",
342
+ title: title2,
343
+ file: child.file,
344
+ specifiers: childSpecifiers
345
+ };
346
+ }
347
+ if (!key) return null;
348
+ const title = requiredString(raw.Title) ?? key;
349
+ if (type === "PSToggleSwitchSpecifier") {
350
+ const defaultValue = typeof raw.DefaultValue === "boolean" ? raw.DefaultValue : false;
351
+ return {
352
+ type: "toggle",
353
+ key,
354
+ title,
355
+ defaultValue,
356
+ currentValue: defaultValue
357
+ };
358
+ }
359
+ if (type === "PSTextFieldSpecifier") {
360
+ const defaultValue = optionalString(raw.DefaultValue) ?? "";
361
+ const placeholder = optionalString(raw.Placeholder);
362
+ const resolvedKeyboardType = keyboardType(raw.KeyboardType);
363
+ const resolvedAutocapitalization = autocapitalization(raw.AutocapitalizationType);
364
+ const resolvedAutocorrection = autocorrection(raw.AutocorrectionType);
365
+ return {
366
+ type: "text",
367
+ key,
368
+ title,
369
+ defaultValue,
370
+ currentValue: defaultValue,
371
+ ...placeholder !== void 0 ? { placeholder } : null,
372
+ ...typeof raw.IsSecure === "boolean" ? { secure: raw.IsSecure } : null,
373
+ ...resolvedKeyboardType ? { keyboardType: resolvedKeyboardType } : null,
374
+ ...resolvedAutocapitalization ? { autocapitalization: resolvedAutocapitalization } : null,
375
+ ...resolvedAutocorrection !== void 0 ? { autocorrection: resolvedAutocorrection } : null
376
+ };
377
+ }
378
+ if (type === "PSMultiValueSpecifier" || type === "PSRadioGroupSpecifier") {
379
+ return normalizeMultiValue(raw, key, title);
380
+ }
381
+ if (type === "PSTitleValueSpecifier") {
382
+ const defaultValue = preferenceValue(raw.DefaultValue) ?? "";
383
+ return {
384
+ type: "title-value",
385
+ key,
386
+ title,
387
+ defaultValue,
388
+ currentValue: defaultValue
389
+ };
390
+ }
391
+ return null;
392
+ }
393
+ async function parseSpecifierFile(fileName, context) {
394
+ const cached2 = context.fileCache.get(fileName);
395
+ if (cached2 !== void 0) return cached2;
396
+ if (context.stack.has(fileName) || context.budget.files >= MAX_PLIST_FILES) {
397
+ return null;
398
+ }
399
+ context.budget.files += 1;
400
+ const root = await parsePlistRecord((0, import_node_path.join)(context.bundlePath, fileName));
401
+ if (!root || !Array.isArray(root.PreferenceSpecifiers)) {
402
+ context.fileCache.set(fileName, null);
403
+ return null;
404
+ }
405
+ const stack = new Set(context.stack);
406
+ stack.add(fileName);
407
+ const specifiers = [];
408
+ for (const raw of root.PreferenceSpecifiers) {
409
+ if (context.budget.specifiers >= MAX_SPECIFIERS) break;
410
+ const specifier = await normalizeSpecifier(raw, { ...context, stack });
411
+ if (specifier) specifiers.push(specifier);
412
+ }
413
+ context.fileCache.set(fileName, specifiers);
414
+ return specifiers;
415
+ }
416
+ async function readAppSettingsBundle(projectRoot) {
417
+ const bundlePath = await findSettingsBundle(projectRoot);
418
+ if (!bundlePath) return null;
419
+ const fingerprint = await settingsBundleFingerprint(bundlePath);
420
+ if (!fingerprint) return null;
421
+ const cached2 = settingsBundleCache.get(bundlePath);
422
+ if (cached2?.fingerprint === fingerprint) return cached2.specifiers;
423
+ const specifiers = await parseSpecifierFile("Root.plist", {
424
+ bundlePath,
425
+ depth: 0,
426
+ budget: { files: 0, specifiers: 0 },
427
+ stack: /* @__PURE__ */ new Set(),
428
+ fileCache: /* @__PURE__ */ new Map()
429
+ });
430
+ const normalized = specifiers && specifiers.length > 0 ? specifiers : null;
431
+ settingsBundleCache.set(bundlePath, { fingerprint, specifiers: normalized });
432
+ return normalized;
433
+ }
434
+ function __resetAppSettingsBundleCacheForTests() {
435
+ settingsBundleCache.clear();
436
+ }
437
+
101
438
  // scripts/optional-demo-registry.ts
102
439
  var REGISTRY_SPECIFIER = "./demo-app-registry.ts";
103
440
  var cached = null;
@@ -498,7 +835,19 @@ function __resetScannerCache() {
498
835
  knownOne.clear();
499
836
  enrichmentCache.clear();
500
837
  enrichmentInFlight.clear();
838
+ __resetAppSettingsBundleCacheForTests();
839
+ }
840
+ async function attachAppSettingsBundle(result, projectRoot) {
841
+ const settingsBundle = await readAppSettingsBundle(projectRoot);
842
+ if (settingsBundle) {
843
+ result.settingsBundle = settingsBundle;
844
+ result.settingsStorageScopeUrl = result.bundleUrl;
845
+ } else {
846
+ delete result.settingsBundle;
847
+ delete result.settingsStorageScopeUrl;
848
+ }
501
849
  }
850
+ var __attachAppSettingsBundleForTests = attachAppSettingsBundle;
502
851
  async function scanDevServers(opts = {}) {
503
852
  await loadOptionalDemoApps();
504
853
  const processes = await discoverListeningProcesses(opts.excludePorts);
@@ -554,7 +903,9 @@ async function scanDevServers(opts = {}) {
554
903
  if (!pid) return;
555
904
  result.pid = pid;
556
905
  const cwd = await resolveProcessCwd(pid);
557
- if (cwd) result.cwd = cwd;
906
+ if (!cwd) return;
907
+ result.cwd = cwd;
908
+ await attachAppSettingsBundle(result, cwd);
558
909
  })
559
910
  );
560
911
  const livePids = new Set(pidByPort.values());
@@ -566,6 +917,7 @@ async function scanDevServers(opts = {}) {
566
917
  // Annotate the CommonJS export names for ESM import in node:
567
918
  0 && (module.exports = {
568
919
  __applyManifestForTests,
920
+ __attachAppSettingsBundleForTests,
569
921
  __isSootSimSelfServerForTests,
570
922
  __resetScannerCache,
571
923
  __shouldReuseScannerCacheEntry,
package/dist-lib/sdk.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.291 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.293 | (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.291 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.293 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // cli/commands/inspect/core.ts
4
4
  function resolveMaxMsFlag(args, fallbackMs) {