sootsim 0.1.138 → 0.1.140

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 (161) hide show
  1. package/dist-cli/bin.js +3 -3
  2. package/dist-cli/chunks/{agent-TD7SHXRH.js → agent-N767ME6M.js} +2 -2
  3. package/dist-cli/chunks/{agent-wrapper-H6JLLQAZ.js → agent-wrapper-ELHIUFZZ.js} +2 -2
  4. package/dist-cli/chunks/{app-fonts-JDQFGE3V.js → app-fonts-OZ3OSNAJ.js} +2 -2
  5. package/dist-cli/chunks/{assert-2XLXLJOD.js → assert-GGFUQBNB.js} +2 -2
  6. package/dist-cli/chunks/auto-bootstrap-L5E6XMCK.js +2 -0
  7. package/dist-cli/chunks/beta-D74SDA2L.js +2 -0
  8. package/dist-cli/chunks/camera-5PYEDLLB.js +20 -0
  9. package/dist-cli/chunks/chunk-4FBFOWV3.js +4 -0
  10. package/dist-cli/chunks/{chunk-7ELG4PYE.js → chunk-4FGNOWB6.js} +1 -1
  11. package/dist-cli/chunks/{chunk-ZSPUTLK7.js → chunk-5EP5RRNS.js} +35 -34
  12. package/dist-cli/chunks/{chunk-BA3QQ5B3.js → chunk-5VTYMBUK.js} +2 -2
  13. package/dist-cli/chunks/chunk-6KUVOSFF.js +79 -0
  14. package/dist-cli/chunks/{chunk-CTXIRBH2.js → chunk-77TL74AM.js} +1 -1
  15. package/dist-cli/chunks/{chunk-BDOLDROC.js → chunk-7SMEXHWJ.js} +1 -1
  16. package/dist-cli/chunks/{chunk-JFQVDRBK.js → chunk-AI65UVSN.js} +52 -4
  17. package/dist-cli/chunks/{chunk-XWHR6IKV.js → chunk-AOICEZCA.js} +2 -2
  18. package/dist-cli/chunks/chunk-AP2MOP44.js +2 -0
  19. package/dist-cli/chunks/chunk-BEA3AO36.js +5 -0
  20. package/dist-cli/chunks/{chunk-PILBWKNB.js → chunk-BGXNYXBC.js} +1 -1
  21. package/dist-cli/chunks/{chunk-FFVME5EQ.js → chunk-BLQBPN76.js} +2 -2
  22. package/dist-cli/chunks/{chunk-Q4J2SESV.js → chunk-BM7QWZRI.js} +2 -2
  23. package/dist-cli/chunks/{chunk-5N5MQQM5.js → chunk-C3FURRBF.js} +1 -1
  24. package/dist-cli/chunks/{chunk-RHU73TIJ.js → chunk-CQ3LV5VL.js} +2 -2
  25. package/dist-cli/chunks/chunk-EH6YDCSN.js +119 -0
  26. package/dist-cli/chunks/{chunk-T3HJHXXN.js → chunk-EMNVJOEL.js} +3 -3
  27. package/dist-cli/chunks/{chunk-C563J47N.js → chunk-FYUDIUFX.js} +2 -2
  28. package/dist-cli/chunks/{chunk-WHIZNJLR.js → chunk-GI43DDEI.js} +1 -1
  29. package/dist-cli/chunks/{chunk-KLFGCFE4.js → chunk-GL74P6NR.js} +1 -1
  30. package/dist-cli/chunks/{chunk-GYZ5ZZMH.js → chunk-GYZNLDBX.js} +2 -2
  31. package/dist-cli/chunks/chunk-HPTMLB7V.js +2 -0
  32. package/dist-cli/chunks/{chunk-NPUHFOSG.js → chunk-MRQRJINW.js} +1 -1
  33. package/dist-cli/chunks/{chunk-IEGRNKTT.js → chunk-N2XPC4Z7.js} +2 -2
  34. package/dist-cli/chunks/chunk-NQG4R5K2.js +1 -0
  35. package/dist-cli/chunks/{chunk-62DPZPFC.js → chunk-O2SQNUDP.js} +1 -1
  36. package/dist-cli/chunks/{chunk-I7RL227U.js → chunk-PBS47TD5.js} +2 -2
  37. package/dist-cli/chunks/chunk-Q5Z7P54I.js +2 -0
  38. package/dist-cli/chunks/{chunk-FBDOREAI.js → chunk-QOZ2Q4FH.js} +1 -1
  39. package/dist-cli/chunks/{chunk-SX6BVZL5.js → chunk-QRRBQE6M.js} +2 -2
  40. package/dist-cli/chunks/{chunk-KJOBH5CA.js → chunk-QXOZB7WD.js} +2 -2
  41. package/dist-cli/chunks/{chunk-3XBLSPSH.js → chunk-R5F7XGAO.js} +3 -3
  42. package/dist-cli/chunks/{chunk-VIZ5BLM2.js → chunk-RAY2DLSK.js} +1 -1
  43. package/dist-cli/chunks/{chunk-TP3NTZUM.js → chunk-REIC7HRW.js} +1 -1
  44. package/dist-cli/chunks/chunk-S7I6ZCT2.js +1 -0
  45. package/dist-cli/chunks/{chunk-GSGRNYPC.js → chunk-SSZBFWV7.js} +1 -1
  46. package/dist-cli/chunks/chunk-UHTE6FLK.js +69 -0
  47. package/dist-cli/chunks/{chunk-MZ7TYYP7.js → chunk-WGDXZMKT.js} +2 -2
  48. package/dist-cli/chunks/chunk-WN3WZEE5.js +1 -0
  49. package/dist-cli/chunks/{chunk-JEL7BQG7.js → chunk-X6AWKKL4.js} +2 -2
  50. package/dist-cli/chunks/{chunk-T6QPOIJN.js → chunk-XGYD25DJ.js} +1 -1
  51. package/dist-cli/chunks/{chunk-XV6XIC4J.js → chunk-ZGDJ5TFU.js} +2 -2
  52. package/dist-cli/chunks/{chunk-KBOMW6U3.js → chunk-ZN4Z2W7F.js} +2 -2
  53. package/dist-cli/chunks/{chunk-MNKYCXHQ.js → chunk-ZVQOEMXS.js} +52 -52
  54. package/dist-cli/chunks/cli-version-EZRTEUXF.js +2 -0
  55. package/dist-cli/chunks/{compat-6KRCWKBL.js → compat-U3772TUK.js} +3 -3
  56. package/dist-cli/chunks/{config-JGTLOWS6.js → config-6CZCIYKJ.js} +2 -2
  57. package/dist-cli/chunks/{control-3LHOESUK.js → control-NVA25O65.js} +2 -2
  58. package/dist-cli/chunks/{cpu-profile-KWE5IXBN.js → cpu-profile-WRLTZYO6.js} +2 -2
  59. package/dist-cli/chunks/{daemon-S5LNAQAU.js → daemon-QQPGLGS6.js} +2 -2
  60. package/dist-cli/chunks/{debug-KJ3TNXUN.js → debug-RKYLSDZV.js} +3 -3
  61. package/dist-cli/chunks/{detox-UJIPM47N.js → detox-ZRUQQU22.js} +2 -2
  62. package/dist-cli/chunks/{device-23SEWSUA.js → device-HXTOLEWY.js} +2 -2
  63. package/dist-cli/chunks/{diagnose-53JGSJF2.js → diagnose-QN4E4WA6.js} +2 -2
  64. package/dist-cli/chunks/drivers-EVK22AX5.js +2 -0
  65. package/dist-cli/chunks/{electron-F43274XT.js → electron-ZHRC4WQ5.js} +3 -3
  66. package/dist-cli/chunks/flow-ICCRVJVX.js +2 -0
  67. package/dist-cli/chunks/help-QMZ35MIQ.js +2 -0
  68. package/dist-cli/chunks/{hints-6EFUPUX6.js → hints-HCHKMDUE.js} +2 -2
  69. package/dist-cli/chunks/{home-paths-TAGKOEXO.js → home-paths-3OHKRAE4.js} +2 -2
  70. package/dist-cli/chunks/{inspect-UVBYBYJB.js → inspect-QXUBDKJJ.js} +3 -3
  71. package/dist-cli/chunks/install-JSDZIE2T.js +2 -0
  72. package/dist-cli/chunks/{install-desktop-M2QEFAIN.js → install-desktop-QCX44BGL.js} +7 -7
  73. package/dist-cli/chunks/{keys-IJNQHCGZ.js → keys-VEP2KPUF.js} +2 -2
  74. package/dist-cli/chunks/{launch-UK4I6UYE.js → launch-K4BPQLTP.js} +3 -3
  75. package/dist-cli/chunks/{login-OBLKQALN.js → login-UVC5XRKR.js} +4 -4
  76. package/dist-cli/chunks/{logout-HUOLFAU6.js → logout-3VW34IBA.js} +2 -2
  77. package/dist-cli/chunks/{maestro-B6JMWFEO.js → maestro-HTFXXMLR.js} +2 -2
  78. package/dist-cli/chunks/optional-demo-registry-5YYEAL46.js +2 -0
  79. package/dist-cli/chunks/{preview-TYICI3EN.js → preview-TZYJMLEJ.js} +2 -2
  80. package/dist-cli/chunks/{profile-NQO5HFFJ.js → profile-HDJRF7YB.js} +2 -2
  81. package/dist-cli/chunks/{react-WXEGMAH6.js → react-RLJR26M7.js} +2 -2
  82. package/dist-cli/chunks/{record-3DK7CCXV.js → record-2LDDHHUY.js} +2 -2
  83. package/dist-cli/chunks/runtime-QPYF2WQX.js +2 -0
  84. package/dist-cli/chunks/{runtime-delivery-QAHWI6JH.js → runtime-delivery-3F6O57E5.js} +2 -2
  85. package/dist-cli/chunks/{screenshot-SQ7ETUJY.js → screenshot-QAUSSEPK.js} +2 -2
  86. package/dist-cli/chunks/{screenshot-mode-YYIBQI6S.js → screenshot-mode-K6HEVK4K.js} +2 -2
  87. package/dist-cli/chunks/{screenshots-YH5P24GR.js → screenshots-TWMCGUBT.js} +2 -2
  88. package/dist-cli/chunks/{server-PVYHPTCD.js → server-ZPIZCBW5.js} +3 -3
  89. package/dist-cli/chunks/setup-repo-VHOZJEIV.js +2 -0
  90. package/dist-cli/chunks/{skills-2V2A7R4O.js → skills-NI3RH7CW.js} +2 -2
  91. package/dist-cli/chunks/{start-JKY3T6AY.js → start-G6CQL6HJ.js} +4 -4
  92. package/dist-cli/chunks/store-F6MJUJYW.js +2 -0
  93. package/dist-cli/chunks/telemetry-DM2Y7OQJ.js +2 -0
  94. package/dist-cli/chunks/{test-FVA5WGGM.js → test-V47D6EPK.js} +3 -3
  95. package/dist-cli/chunks/{three-mode-GVODLLP3.js → three-mode-G7N3LRHM.js} +2 -2
  96. package/dist-cli/chunks/{timeline-LCJYWJBG.js → timeline-EBUOILTJ.js} +2 -2
  97. package/dist-cli/chunks/{upgrade-4TVPQJRL.js → upgrade-OQJLTCQP.js} +2 -2
  98. package/dist-cli/chunks/upload-W3YCA65H.js +2 -0
  99. package/dist-cli/chunks/{version-2XWRCYTM.js → version-3YJPPUE5.js} +2 -2
  100. package/dist-cli/chunks/web-ZKUX5ICX.js +2 -0
  101. package/dist-cli/chunks/{what-happened-R57H6WK6.js → what-happened-HOY3TA42.js} +2 -2
  102. package/dist-cli/chunks/{whoami-YCVHJHIM.js → whoami-GOCSBVTG.js} +2 -2
  103. package/dist-lib/agent-daemon-client.cjs +1 -1
  104. package/dist-lib/agent-events.cjs +1 -1
  105. package/dist-lib/agent-sessions.cjs +1 -1
  106. package/dist-lib/attached-projects.cjs +42 -820
  107. package/dist-lib/auth/shared-session.cjs +1 -1
  108. package/dist-lib/backend-origin.cjs +1 -1
  109. package/dist-lib/beta.cjs +1 -1
  110. package/dist-lib/beta.mjs +1 -1
  111. package/dist-lib/bridge-constants.cjs +1 -1
  112. package/dist-lib/cli-constants.cjs +1 -1
  113. package/dist-lib/config.cjs +1 -1
  114. package/dist-lib/detox/index.cjs +1 -1
  115. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  116. package/dist-lib/home-paths.cjs +1 -1
  117. package/dist-lib/host/bridge-host.cjs +179 -956
  118. package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
  119. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  120. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  121. package/dist-lib/host/websocket-proxy.cjs +1 -1
  122. package/dist-lib/index.cjs +1 -1
  123. package/dist-lib/metro.cjs +1 -1
  124. package/dist-lib/profiles.cjs +1 -1
  125. package/dist-lib/render-mode.cjs +1 -1
  126. package/dist-lib/scripts/dev-server-scanner.cjs +29 -797
  127. package/dist-lib/sdk.cjs +1 -1
  128. package/dist-lib/sdk.mjs +1 -1
  129. package/dist-lib/skills.cjs +660 -1032
  130. package/dist-lib/vite.cjs +1 -1
  131. package/package.json +2 -6
  132. package/scripts/dev-server-scanner.ts +10 -2
  133. package/scripts/optional-demo-registry.ts +54 -0
  134. package/src/attached-projects.ts +6 -27
  135. package/dist-cli/chunks/auto-bootstrap-Q7Z5522T.js +0 -2
  136. package/dist-cli/chunks/beta-LW4TRSKL.js +0 -2
  137. package/dist-cli/chunks/chunk-3AVKOCIL.js +0 -5
  138. package/dist-cli/chunks/chunk-BXITI3GQ.js +0 -4
  139. package/dist-cli/chunks/chunk-DBJCMZX7.js +0 -1
  140. package/dist-cli/chunks/chunk-DV4DKAHB.js +0 -64
  141. package/dist-cli/chunks/chunk-KYAAYSMS.js +0 -2
  142. package/dist-cli/chunks/chunk-M6GZUJXH.js +0 -62
  143. package/dist-cli/chunks/chunk-N4DFR7UX.js +0 -79
  144. package/dist-cli/chunks/chunk-N7TXV2XT.js +0 -1
  145. package/dist-cli/chunks/chunk-SIKDBA2E.js +0 -119
  146. package/dist-cli/chunks/chunk-YB7NANNJ.js +0 -1
  147. package/dist-cli/chunks/chunk-ZS55UGAA.js +0 -2
  148. package/dist-cli/chunks/cli-version-ROECZHPK.js +0 -2
  149. package/dist-cli/chunks/demo-app-registry-SU74KYFQ.js +0 -2
  150. package/dist-cli/chunks/drivers-LQS4T2IT.js +0 -2
  151. package/dist-cli/chunks/flow-H4F2X23Y.js +0 -2
  152. package/dist-cli/chunks/help-BT5NJNJ5.js +0 -2
  153. package/dist-cli/chunks/install-P5R6747T.js +0 -2
  154. package/dist-cli/chunks/runtime-IFNZGBPZ.js +0 -2
  155. package/dist-cli/chunks/setup-repo-Y63FUXRC.js +0 -2
  156. package/dist-cli/chunks/store-KNRC4EGM.js +0 -2
  157. package/dist-cli/chunks/telemetry-HDSITSDA.js +0 -2
  158. package/dist-cli/chunks/upload-3AXP6K6R.js +0 -2
  159. package/dist-cli/chunks/web-4Z6SFQFV.js +0 -2
  160. package/dist-lib/scripts/demo-app-registry.cjs +0 -818
  161. package/scripts/demo-app-registry.ts +0 -1006
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.138 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.140 | (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;
@@ -94,809 +94,41 @@ function normalizeNativeDevBundleUrl(bundleUrl) {
94
94
  }
95
95
  }
96
96
 
97
- // scripts/demo-app-registry.ts
98
- var import_node_fs = require("node:fs");
99
- var import_node_os = require("node:os");
100
- var import_node_path = require("node:path");
101
- var HOME = (0, import_node_os.homedir)();
102
- function findWorkspaceRoot(startDir) {
103
- let dir = startDir;
104
- while (true) {
105
- if ((0, import_node_fs.existsSync)((0, import_node_path.join)(dir, "pnpm-workspace.yaml")) || (0, import_node_fs.existsSync)((0, import_node_path.join)(dir, "turbo.json")) || (0, import_node_fs.existsSync)((0, import_node_path.join)(dir, "nx.json")) || (0, import_node_fs.existsSync)((0, import_node_path.join)(dir, "lerna.json"))) {
106
- return dir;
107
- }
108
- const packageJsonPath = (0, import_node_path.join)(dir, "package.json");
109
- if ((0, import_node_fs.existsSync)(packageJsonPath)) {
110
- try {
111
- const pkg = JSON.parse((0, import_node_fs.readFileSync)(packageJsonPath, "utf8"));
112
- if (pkg.workspaces) return dir;
113
- } catch {
114
- }
115
- }
116
- const parent = (0, import_node_path.dirname)(dir);
117
- if (parent === dir) return null;
118
- dir = parent;
119
- }
120
- }
121
- function resolveWorkspaceScriptPath(workspaceRelativePath, packageRelativePath) {
122
- const workspaceRoot = findWorkspaceRoot(process.cwd());
123
- const candidates = [
124
- workspaceRoot ? (0, import_node_path.resolve)(workspaceRoot, workspaceRelativePath) : null,
125
- (0, import_node_path.resolve)(process.cwd(), workspaceRelativePath),
126
- (0, import_node_path.resolve)(process.cwd(), packageRelativePath)
127
- ].filter((candidate) => Boolean(candidate));
128
- for (const candidate of candidates) {
129
- if ((0, import_node_fs.existsSync)(candidate)) return candidate;
130
- }
131
- return candidates[0] ?? (0, import_node_path.resolve)(process.cwd(), workspaceRelativePath);
132
- }
133
- var getExpensifyProxyScript = () => resolveWorkspaceScriptPath(
134
- "packages/sootsim-engine/scripts/expensify-web-proxy.ts",
135
- "scripts/expensify-web-proxy.ts"
136
- );
137
- var getRainbowMetadataProxyScript = () => resolveWorkspaceScriptPath(
138
- "packages/sootsim-engine/scripts/rainbow-metadata-proxy.ts",
139
- "scripts/rainbow-metadata-proxy.ts"
140
- );
141
- var getMattermostRNUtilsNativeModule = () => resolveWorkspaceScriptPath(
142
- "packages/compat/src/stubs/mattermost-rnutils-native.ts",
143
- "../compat/src/stubs/mattermost-rnutils-native.ts"
144
- );
145
- var getMattermostKeychainNativeModule = () => resolveWorkspaceScriptPath(
146
- "packages/compat/src/stubs/native-seams/react-native-keychain-manager.ts",
147
- "../compat/src/stubs/native-seams/react-native-keychain-manager.ts"
148
- );
149
- var getMattermostNetworkClientNativeModule = () => resolveWorkspaceScriptPath(
150
- "packages/compat/src/stubs/mattermost-network-client-native.ts",
151
- "../compat/src/stubs/mattermost-network-client-native.ts"
152
- );
153
- var getMattermostPreviewServerScript = () => resolveWorkspaceScriptPath(
154
- "packages/sootsim-engine/scripts/mattermost-preview-server.ts",
155
- "scripts/mattermost-preview-server.ts"
156
- );
157
- var EXPENSIFY_NATIVE_PROXY_ENV = {
158
- USE_NGROK: "true",
159
- NGROK_URL: "http://localhost:9000/",
160
- SECURE_NGROK_URL: "http://localhost:9000/"
161
- };
162
- var MATTERMOST_DIR = (0, import_node_path.join)(HOME, "github/mattermost-mobile");
163
- var UNISWAP_REPO_DIR = (0, import_node_path.join)(HOME, "github/uniswap-interface");
164
- var UNISWAP_APP_DIR = (0, import_node_path.join)(UNISWAP_REPO_DIR, "apps/mobile");
165
- var UNISWAP_ENV_LOCAL_FILE = (0, import_node_path.join)(UNISWAP_REPO_DIR, ".env.defaults.local");
166
- var UNISWAP_PLACEHOLDER = "stored-in-.env.local";
167
- var UNISWAP_DEMO_ENV_MARKER = "# sootsim demo env overrides";
168
- var UNISWAP_FORCE_UPGRADE_HOOK_FILE = (0, import_node_path.join)(
169
- UNISWAP_REPO_DIR,
170
- "packages/uniswap/src/features/forceUpgrade/hooks/useForceUpgradeStatus.ts"
171
- );
172
- var UNISWAP_FORCE_UPGRADE_NOTIFICATION_FILE = (0, import_node_path.join)(
173
- UNISWAP_REPO_DIR,
174
- "apps/mobile/src/notification-service/data-sources/createForceUpgradeNotificationDataSource.ts"
175
- );
176
- var UNISWAP_FORCE_UPGRADE_PATCH_MARKER = "SOOTSIM_DEMO_DISABLE_FORCE_UPGRADE";
177
- function parseEnvFile(filePath) {
178
- if (!(0, import_node_fs.existsSync)(filePath)) return {};
179
- const env = {};
180
- const source = (0, import_node_fs.readFileSync)(filePath, "utf8");
181
- for (const rawLine of source.split(/\r?\n/)) {
182
- const line = rawLine.trim();
183
- if (!line || line.startsWith("#")) continue;
184
- const match = line.match(/^([A-Za-z_][A-Za-z0-9_]*)\s*=\s*(.*)$/);
185
- if (!match) continue;
186
- let value = match[2].trim();
187
- if (value.startsWith('"') && value.endsWith('"') || value.startsWith("'") && value.endsWith("'")) {
188
- value = value.slice(1, -1);
189
- }
190
- env[match[1]] = value;
191
- }
192
- return env;
193
- }
194
- function isUsableUniswapEnvValue(value) {
195
- if (!value) return false;
196
- const trimmed = value.trim();
197
- if (!trimmed) return false;
198
- if (trimmed.includes(UNISWAP_PLACEHOLDER)) return false;
199
- if (trimmed === "TRADING_API_KEY" || trimmed === "UNISWAP_API_KEY") return false;
200
- return true;
201
- }
202
- function pickEnvValue(sources, keys) {
203
- for (const source of sources) {
204
- for (const key of keys) {
205
- const value = source[key];
206
- if (isUsableUniswapEnvValue(value)) return value.trim();
207
- }
208
- }
209
- return void 0;
210
- }
211
- function resolveUniswapDemoEnv() {
212
- const localEnv = parseEnvFile(UNISWAP_ENV_LOCAL_FILE);
213
- const webEnv = parseEnvFile((0, import_node_path.join)(UNISWAP_REPO_DIR, "apps/web/.env"));
214
- const sources = [
215
- process.env,
216
- localEnv,
217
- webEnv
218
- ];
219
- const env = {};
220
- const bindings = [
221
- ["AMPLITUDE_PROXY_URL_OVERRIDE", ["REACT_APP_AMPLITUDE_PROXY_URL"]],
222
- ["QUICKNODE_ENDPOINT_NAME", ["REACT_APP_QUICKNODE_ENDPOINT_NAME"]],
223
- ["QUICKNODE_ENDPOINT_TOKEN", ["REACT_APP_QUICKNODE_ENDPOINT_TOKEN"]],
224
- ["INFURA_KEY", ["REACT_APP_INFURA_KEY"]],
225
- ["STATSIG_API_KEY", ["REACT_APP_STATSIG_API_KEY"]],
226
- ["STATSIG_PROXY_URL_OVERRIDE", ["REACT_APP_STATSIG_PROXY_URL"]],
227
- ["WALLETCONNECT_PROJECT_ID", ["REACT_APP_WALLET_CONNECT_PROJECT_ID"]],
228
- ["WALLETCONNECT_PROJECT_ID_BETA", ["REACT_APP_WALLET_CONNECT_PROJECT_ID"]],
229
- ["WALLETCONNECT_PROJECT_ID_DEV", ["REACT_APP_WALLET_CONNECT_PROJECT_ID"]],
230
- ["TRADING_API_KEY", ["REACT_APP_TRADING_API_KEY"]],
231
- ["UNISWAP_API_KEY", []]
232
- ];
233
- for (const [target, aliases] of bindings) {
234
- const value = pickEnvValue(sources, [target, ...aliases]);
235
- if (!value) continue;
236
- env[target] = value;
237
- for (const alias of aliases) {
238
- env[alias] = value;
239
- }
240
- }
241
- const hasPrivateGatewayKeys = isUsableUniswapEnvValue(env.TRADING_API_KEY) && isUsableUniswapEnvValue(env.UNISWAP_API_KEY);
242
- if (!hasPrivateGatewayKeys) {
243
- const publicGraphqlUrl = pickEnvValue(sources, ["GRAPHQL_URL_OVERRIDE", "REACT_APP_AWS_API_ENDPOINT"]) || "https://interface.gateway.uniswap.org/v1/graphql";
244
- env.API_BASE_URL_OVERRIDE = "https://interface.gateway.uniswap.org";
245
- env.API_BASE_URL_V2_OVERRIDE = "https://interface.gateway.uniswap.org/v2";
246
- env.GRAPHQL_URL_OVERRIDE = publicGraphqlUrl;
247
- env.TRADING_API_URL_OVERRIDE = "https://trading-api-labs.interface.gateway.uniswap.org";
248
- env.FOR_API_URL_OVERRIDE = "https://for.interface.gateway.uniswap.org/v2/FOR.v1.FORService";
249
- }
250
- return env;
251
- }
252
- function ensureUniswapDemoEnvLocal() {
253
- const existingSource = (0, import_node_fs.existsSync)(UNISWAP_ENV_LOCAL_FILE) ? (0, import_node_fs.readFileSync)(UNISWAP_ENV_LOCAL_FILE, "utf8") : "";
254
- if (existingSource && !existingSource.includes(UNISWAP_DEMO_ENV_MARKER)) {
255
- return;
256
- }
257
- const env = resolveUniswapDemoEnv();
258
- const lines = [UNISWAP_DEMO_ENV_MARKER];
259
- for (const [key, value] of Object.entries(env).sort(([a], [b]) => a.localeCompare(b))) {
260
- lines.push(`${key}=${JSON.stringify(value)}`);
261
- }
262
- lines.push("");
263
- (0, import_node_fs.writeFileSync)(UNISWAP_ENV_LOCAL_FILE, `${lines.join("\n")}
264
- `);
265
- }
266
- function ensureUniswapForceUpgradePatched() {
267
- const hookNeedle = `export function useForceUpgradeStatus(): ForceUpgradeStatus {
268
- `;
269
- const hookPatch = ` // sootsim demo: bypass the force-upgrade gate during local engine demos.
270
- return 'not-required'
271
-
272
- `;
273
- const hookLegacyPatch = ` // sootsim demo: bypass the force-upgrade gate during local engine demos.
274
- if (process.env.${UNISWAP_FORCE_UPGRADE_PATCH_MARKER} === 'true') {
275
- return 'not-required'
276
- }
277
-
278
- `;
279
- const notificationNeedle = ` const getForceUpgradeStatus = (): ForceUpgradeStatus => {
280
- `;
281
- const notificationPatch = ` // sootsim demo: bypass the force-upgrade gate during local engine demos.
282
- return 'not-required'
283
-
284
- `;
285
- const notificationLegacyPatch = ` // sootsim demo: bypass the force-upgrade gate during local engine demos.
286
- if (process.env.${UNISWAP_FORCE_UPGRADE_PATCH_MARKER} === 'true') {
287
- return 'not-required'
288
- }
289
-
290
- `;
291
- const patchWithMigration = (filePath, needle, patch, legacyPatch) => {
292
- const source = (0, import_node_fs.readFileSync)(filePath, "utf8");
293
- if (source.includes(patch)) return;
294
- if (source.includes(legacyPatch)) {
295
- (0, import_node_fs.writeFileSync)(filePath, source.replace(legacyPatch, patch));
296
- return;
297
- }
298
- if (!source.includes(needle)) {
299
- throw new Error(
300
- `uniswap demo patch failed: expected snippet not found in ${filePath}`
301
- );
302
- }
303
- (0, import_node_fs.writeFileSync)(filePath, source.replace(needle, `${needle}${patch}`));
304
- };
305
- patchWithMigration(
306
- UNISWAP_FORCE_UPGRADE_HOOK_FILE,
307
- hookNeedle,
308
- hookPatch,
309
- hookLegacyPatch
310
- );
311
- patchWithMigration(
312
- UNISWAP_FORCE_UPGRADE_NOTIFICATION_FILE,
313
- notificationNeedle,
314
- notificationPatch,
315
- notificationLegacyPatch
316
- );
317
- }
318
- var JOPLIN_DIR = (0, import_node_path.join)(HOME, "github/joplin");
319
- var JOPLIN_APP_DIR = (0, import_node_path.join)(JOPLIN_DIR, "packages/app-mobile");
320
- var JOPLIN_WATCH_ROOTS = [
321
- "packages/lib",
322
- "packages/renderer",
323
- "packages/turndown",
324
- "packages/turndown-plugin-gfm",
325
- "packages/editor",
326
- "packages/tools",
327
- "packages/utils",
328
- "packages/fork-htmlparser2",
329
- "packages/fork-uslug",
330
- "packages/fork-sax",
331
- "packages/htmlpack",
332
- "packages/react-native-saf-x",
333
- "packages/react-native-alarm-notification"
334
- ];
335
- function ensureJoplinWatchmanConfigs() {
336
- if (!(0, import_node_fs.existsSync)(JOPLIN_DIR)) return;
337
- for (const rel of JOPLIN_WATCH_ROOTS) {
338
- const dir = (0, import_node_path.join)(JOPLIN_DIR, rel);
339
- if (!(0, import_node_fs.existsSync)(dir)) continue;
340
- const cfg = (0, import_node_path.join)(dir, ".watchmanconfig");
341
- if (!(0, import_node_fs.existsSync)(cfg)) (0, import_node_fs.writeFileSync)(cfg, "{}\n");
342
- }
343
- }
344
- var JOPLIN_BUILD_SENTINELS = [
345
- "packages/lib/models/Setting.js",
346
- "packages/turndown/lib/turndown.cjs.js",
347
- "packages/app-mobile/pluginAssets/index.js"
348
- ];
349
- function ensureJoplinBuilt() {
350
- if (!(0, import_node_fs.existsSync)(JOPLIN_DIR)) return;
351
- const missing = JOPLIN_BUILD_SENTINELS.filter(
352
- (rel) => !(0, import_node_fs.existsSync)((0, import_node_path.join)(JOPLIN_DIR, rel))
353
- );
354
- if (missing.length === 0) return;
355
- const { execSync } = require("node:child_process");
356
- execSync("yarn buildParallel", {
357
- cwd: JOPLIN_DIR,
358
- stdio: "inherit",
359
- env: { ...process.env, NO_FLIPPER: "1", CI: "" }
360
- });
361
- const stillMissing = JOPLIN_BUILD_SENTINELS.filter(
362
- (rel) => !(0, import_node_fs.existsSync)((0, import_node_path.join)(JOPLIN_DIR, rel))
363
- );
364
- if (stillMissing.length > 0) {
365
- throw new Error(
366
- `joplin demo: yarn buildParallel did not produce: ${stillMissing.join(", ")}`
367
- );
368
- }
369
- }
370
- var RAINBOW_DIR = (0, import_node_path.join)(HOME, "github/rainbow");
371
- var RAINBOW_GRAPHQL_DIR = (0, import_node_path.join)(RAINBOW_DIR, "src/graphql");
372
- var RAINBOW_GRAPHQL_CONFIG_FILE = (0, import_node_path.join)(RAINBOW_GRAPHQL_DIR, "config.js");
373
- var RAINBOW_NETWORKS_FILE = (0, import_node_path.join)(RAINBOW_DIR, "src/references/networks.json");
374
- var RAINBOW_METADATA_BASE_URL = "https://metadata.p.rainbow.me";
375
- var RAINBOW_METADATA_PROXY_PORT = 9011;
376
- var RAINBOW_DEMO_METADATA_BASE_URL = `http://127.0.0.1:${RAINBOW_METADATA_PROXY_PORT}`;
377
- var RAINBOW_PUBLIC_ENS_GRAPHQL_URL = "https://api.thegraph.com/subgraphs/name/ensdomains/ens";
378
- var RAINBOW_DEMO_QUOTE_SIGNER = "0x0000000000000000000000000000000000000000";
379
- var RAINBOW_DEMO_RELAY_URL = "https://relay.rainbow.me";
380
- var RAINBOW_DEMO_MASTER_KEY = "sootsim-rainbow-demo-master-key-do-not-use-for-real-wallets";
381
- var RAINBOW_DEMO_RPC_PROXY_BASE_URL = "https://rpc.rainbow.me/v1";
382
- var RAINBOW_DEMO_RPC_API_KEY = "";
383
- var RAINBOW_DEMO_PUBLIC_RPC_URLS = {
384
- "1": "https://ethereum-rpc.publicnode.com"
385
- };
386
- var RAINBOW_DEMO_SERVICE_API_KEY = "sootsim-rainbow-demo-api-key";
387
- var RAINBOW_DEMO_SECURE_WALLET_HASH_KEY = "0x736f6f7473696d2d7261696e626f772d64656d6f2d686173682d6b6579000000";
388
- var RAINBOW_DEMO_WALLETCONNECT_PROJECT_ID = "00000000000000000000000000000000";
389
- var RAINBOW_GRAPHQL_SENTINELS = [
390
- "src/graphql/__generated__/ens.ts",
391
- "src/graphql/__generated__/metadata.ts",
392
- "src/graphql/__generated__/metadataPOST.ts"
393
- ];
394
- function runRainbowSetupCommand(command, cwd) {
395
- const { execSync } = require("node:child_process");
396
- execSync(command, {
397
- cwd,
398
- stdio: "inherit",
399
- env: {
400
- ...process.env,
401
- METADATA_BASE_URL: RAINBOW_METADATA_BASE_URL,
402
- RAINBOW_RELAY_QUOTE_SIGNER: process.env.RAINBOW_RELAY_QUOTE_SIGNER ?? RAINBOW_DEMO_QUOTE_SIGNER
403
- }
404
- });
405
- }
406
- function ensureRainbowGraphqlConfig() {
407
- if (!(0, import_node_fs.existsSync)(RAINBOW_GRAPHQL_DIR)) return;
408
- const source = (0, import_node_fs.existsSync)(RAINBOW_GRAPHQL_CONFIG_FILE) ? (0, import_node_fs.readFileSync)(RAINBOW_GRAPHQL_CONFIG_FILE, "utf8") : "";
409
- if (source.includes(RAINBOW_PUBLIC_ENS_GRAPHQL_URL) && source.includes(RAINBOW_METADATA_BASE_URL)) {
410
- return;
411
- }
412
- (0, import_node_fs.writeFileSync)(
413
- RAINBOW_GRAPHQL_CONFIG_FILE,
414
- `exports.config = {
415
- ens: {
416
- __name: 'ens',
417
- document: './queries/ens.graphql',
418
- schema: {
419
- method: 'POST',
420
- url: '${RAINBOW_PUBLIC_ENS_GRAPHQL_URL}',
421
- },
422
- },
423
- metadata: {
424
- __name: 'metadata',
425
- document: './queries/metadata.graphql',
426
- schema: { method: 'GET', url: '${RAINBOW_METADATA_BASE_URL}/v1/graph' },
427
- },
428
- metadataPOST: {
429
- __name: 'metadataPOST',
430
- document: './queries/metadata.graphql',
431
- schema: { method: 'POST', url: '${RAINBOW_METADATA_BASE_URL}/v1/graph' },
432
- },
433
- arc: {
434
- __name: 'arc',
435
- document: './queries/arc.graphql',
436
- schema: {
437
- method: 'GET',
438
- url: 'https://arc-graphql.rainbow.me/graphql',
439
- headers: {
440
- 'x-api-key': 'ARC_GRAPHQL_API_KEY',
441
- },
442
- },
443
- },
444
- arcDev: {
445
- __name: 'arcDev',
446
- document: './queries/arc.graphql',
447
- schema: {
448
- method: 'GET',
449
- url: 'https://arc-graphql.rainbowdotme.workers.dev/graphql',
450
- headers: {},
451
- },
452
- },
453
- };
454
- `
455
- );
456
- }
457
- function resolveRainbowDemoEnv() {
458
- const env = {
459
- ENABLE_DEV_MODE: "1",
460
- IS_TESTING: "false",
461
- METADATA_BASE_URL: process.env.RAINBOW_METADATA_BASE_URL ?? RAINBOW_DEMO_METADATA_BASE_URL,
462
- ADDYS_API_KEY: process.env.ADDYS_API_KEY ?? RAINBOW_DEMO_SERVICE_API_KEY,
463
- ADDYS_BASE_URL: process.env.ADDYS_BASE_URL ?? RAINBOW_DEMO_METADATA_BASE_URL,
464
- PLATFORM_API_KEY: process.env.PLATFORM_API_KEY ?? RAINBOW_DEMO_SERVICE_API_KEY,
465
- PLATFORM_BASE_URL: process.env.PLATFORM_BASE_URL ?? RAINBOW_DEMO_METADATA_BASE_URL,
466
- RAINBOW_MASTER_KEY: process.env.RAINBOW_MASTER_KEY ?? RAINBOW_DEMO_MASTER_KEY,
467
- RAINBOW_RELAY_QUOTE_SIGNER: process.env.RAINBOW_RELAY_QUOTE_SIGNER ?? RAINBOW_DEMO_QUOTE_SIGNER,
468
- RAINBOW_RELAY_URL: process.env.RAINBOW_RELAY_URL ?? RAINBOW_DEMO_RELAY_URL,
469
- RPC_PROXY_API_KEY_PROD: RAINBOW_DEMO_RPC_API_KEY,
470
- RPC_PROXY_BASE_URL_PROD: process.env.RAINBOW_RPC_PROXY_BASE_URL ?? process.env.RPC_PROXY_BASE_URL_PROD ?? RAINBOW_DEMO_RPC_PROXY_BASE_URL,
471
- SECURE_WALLET_HASH_KEY: process.env.SECURE_WALLET_HASH_KEY ?? RAINBOW_DEMO_SECURE_WALLET_HASH_KEY,
472
- WC_PROJECT_ID: process.env.WC_PROJECT_ID ?? process.env.RAINBOW_WALLETCONNECT_PROJECT_ID ?? RAINBOW_DEMO_WALLETCONNECT_PROJECT_ID
473
- };
474
- const optionalEnvVars = [
475
- "ADDYS_API_KEY",
476
- "ADDYS_BASE_URL",
477
- "IMGIX_DOMAIN",
478
- "IMGIX_TOKEN",
479
- "PLATFORM_API_KEY",
480
- "PLATFORM_BASE_URL",
481
- "RAINBOW_TEST_WALLET",
482
- "RAINBOW_RELAY_API_KEY",
483
- "RAINBOW_RELAY_URL",
484
- "SECURE_WALLET_HASH_KEY",
485
- "TOKEN_SEARCH_URL"
486
- ];
487
- for (const key of optionalEnvVars) {
488
- const value = process.env[key];
489
- if (value) env[key] = value;
490
- }
491
- return env;
492
- }
493
- function ensureRainbowDemoNetworks() {
494
- if (!(0, import_node_fs.existsSync)(RAINBOW_NETWORKS_FILE)) return;
495
- const payload = JSON.parse((0, import_node_fs.readFileSync)(RAINBOW_NETWORKS_FILE, "utf8"));
496
- if (!Array.isArray(payload.networks)) return;
497
- let changed = false;
498
- for (const network of payload.networks) {
499
- const url = network.id ? RAINBOW_DEMO_PUBLIC_RPC_URLS[network.id] : void 0;
500
- if (!url || !network.defaultRPC) continue;
501
- if (network.defaultRPC.url === url) continue;
502
- network.defaultRPC.url = url;
503
- changed = true;
504
- }
505
- if (changed) {
506
- (0, import_node_fs.writeFileSync)(RAINBOW_NETWORKS_FILE, `${JSON.stringify(payload)}
507
- `);
508
- }
509
- }
510
- function ensureRainbowSetup() {
511
- if (!(0, import_node_fs.existsSync)(RAINBOW_DIR)) return;
512
- ensureRainbowGraphqlConfig();
513
- if (!(0, import_node_fs.existsSync)((0, import_node_path.join)(RAINBOW_GRAPHQL_DIR, "node_modules/.bin/graphql-codegen"))) {
514
- runRainbowSetupCommand("fnm exec --using=22 yarn install", RAINBOW_GRAPHQL_DIR);
515
- }
516
- const missingGraphql = RAINBOW_GRAPHQL_SENTINELS.some(
517
- (rel) => !(0, import_node_fs.existsSync)((0, import_node_path.join)(RAINBOW_DIR, rel))
518
- );
519
- if (missingGraphql) {
520
- runRainbowSetupCommand("fnm exec --using=22 yarn codegen", RAINBOW_GRAPHQL_DIR);
521
- }
522
- if (!(0, import_node_fs.existsSync)(RAINBOW_NETWORKS_FILE)) {
523
- runRainbowSetupCommand("fnm exec --using=22 yarn fetch:networks", RAINBOW_DIR);
524
- }
525
- ensureRainbowDemoNetworks();
526
- }
527
- var ARTSY_DIR = (0, import_node_path.join)(HOME, "github/eigen");
528
- var ARTSY_KEYS_FILE = (0, import_node_path.join)(ARTSY_DIR, "keys.shared.json");
529
- var ARTSY_METAFLAGS_FILE = (0, import_node_path.join)(ARTSY_DIR, "metaflags.json");
530
- var ARTSY_RELAY_SENTINEL = (0, import_node_path.join)(ARTSY_DIR, "src/__generated__/.relay-complete");
531
- function readArtsyKeysPayload() {
532
- if (!(0, import_node_fs.existsSync)(ARTSY_KEYS_FILE)) return void 0;
97
+ // scripts/optional-demo-registry.ts
98
+ var REGISTRY_SPECIFIER = "./demo-app-registry.ts";
99
+ var cached = null;
100
+ async function loadOptionalDemoApps() {
101
+ if (cached) return cached;
533
102
  try {
534
- const parsed = JSON.parse((0, import_node_fs.readFileSync)(ARTSY_KEYS_FILE, "utf8"));
535
- if (!parsed || typeof parsed !== "object") return void 0;
536
- const secure = parsed.secure && typeof parsed.secure === "object" ? parsed.secure : void 0;
537
- const publicKeys = parsed.public && typeof parsed.public === "object" ? parsed.public : void 0;
538
- if (!secure && !publicKeys) return void 0;
539
- return { secure, public: publicKeys };
103
+ const mod = await import(
104
+ /* @vite-ignore */
105
+ REGISTRY_SPECIFIER
106
+ );
107
+ cached = Array.isArray(mod.APPS) ? mod.APPS : [];
540
108
  } catch {
541
- return void 0;
109
+ cached = [];
542
110
  }
111
+ return cached;
543
112
  }
544
- function resolveArtsyRuntimeConfig() {
545
- const email = process.env.SOOTSIM_ARTSY_EMAIL ?? process.env.MAESTRO_TEST_EMAIL;
546
- const password = process.env.SOOTSIM_ARTSY_PASSWORD ?? process.env.MAESTRO_TEST_PASSWORD;
547
- const keys = readArtsyKeysPayload();
548
- const env = {};
549
- if (email && password) {
550
- env.SOOTSIM_LAUNCH_ARGUMENTS = JSON.stringify({
551
- email,
552
- password,
553
- useMaestroInit: true
554
- });
555
- }
556
- if (keys) {
557
- env.SOOTSIM_REACT_NATIVE_KEYS_JSON = JSON.stringify(keys);
558
- }
559
- if (Object.keys(env).length === 0) return void 0;
560
- return {
561
- env
562
- };
563
- }
564
- function ensureArtsySetup() {
565
- if (!(0, import_node_fs.existsSync)(ARTSY_DIR)) return;
566
- const { execSync } = require("node:child_process");
567
- const yarnRelease = (0, import_node_path.join)(ARTSY_DIR, ".yarn/releases/yarn-4.10.3.cjs");
568
- if ((0, import_node_fs.existsSync)(yarnRelease)) {
569
- const src = (0, import_node_fs.readFileSync)(yarnRelease, "utf8");
570
- const needle = '["clone","-c core.autocrlf=false",';
571
- if (src.includes(needle)) {
572
- (0, import_node_fs.writeFileSync)(
573
- yarnRelease,
574
- src.replace(needle, '["clone","-c","core.autocrlf=false",')
575
- );
576
- }
577
- }
578
- if (!(0, import_node_fs.existsSync)((0, import_node_path.join)(ARTSY_DIR, "node_modules/.yarn-state.yml"))) {
579
- execSync("yarn install", {
580
- cwd: ARTSY_DIR,
581
- stdio: "inherit",
582
- env: { ...process.env, YARN_CHECKSUM_BEHAVIOR: "update" }
583
- });
584
- }
585
- if (!(0, import_node_fs.existsSync)(ARTSY_KEYS_FILE) || !(0, import_node_fs.existsSync)(ARTSY_METAFLAGS_FILE)) {
586
- try {
587
- execSync("yarn setup:oss", { cwd: ARTSY_DIR, stdio: "inherit" });
588
- } catch {
589
- if (!(0, import_node_fs.existsSync)(ARTSY_KEYS_FILE) || !(0, import_node_fs.existsSync)(ARTSY_METAFLAGS_FILE)) {
590
- throw new Error("artsy demo: setup:oss did not create keys/metaflags");
591
- }
592
- }
593
- }
594
- const rnlaPkgJson = (0, import_node_path.join)(
595
- ARTSY_DIR,
596
- "node_modules/react-native-launch-arguments/package.json"
597
- );
598
- if ((0, import_node_fs.existsSync)(rnlaPkgJson)) {
599
- const raw = (0, import_node_fs.readFileSync)(rnlaPkgJson, "utf8");
600
- if (raw.includes('"dist/index.js"')) {
601
- (0, import_node_fs.writeFileSync)(rnlaPkgJson, raw.replace('"dist/index.js"', '"src/index.ts"'));
602
- }
603
- }
604
- if (!(0, import_node_fs.existsSync)(ARTSY_RELAY_SENTINEL)) {
605
- execSync("yarn relay", { cwd: ARTSY_DIR, stdio: "inherit" });
606
- (0, import_node_fs.writeFileSync)(ARTSY_RELAY_SENTINEL, "");
607
- }
113
+ function optionalDemoAppsSync() {
114
+ return cached ?? [];
608
115
  }
609
- var APPS = [
610
- {
611
- name: "bluesky",
612
- label: "Bluesky",
613
- dir: (0, import_node_path.join)(HOME, "github/bluesky"),
614
- preferredPort: 8082,
615
- framework: "expo",
616
- command: (p) => ({ cmd: `npx expo start --port ${p}` }),
617
- credentials: {
618
- envVars: ["SOOTSIM_BLUESKY_PASSWORD"],
619
- known: { HANDLE: "natew.bsky.social" }
620
- }
621
- },
622
- {
623
- name: "3pc",
624
- label: "3PunchConvo",
625
- dir: (0, import_node_path.join)(HOME, "lightstrike-labs/three-punch-convo-app/apps/one"),
626
- preferredPort: 8081,
627
- framework: "one",
628
- command: (p) => ({ cmd: "npx one dev", env: { ONE_PORT: String(p) } })
629
- },
630
- {
631
- name: "uniswap",
632
- label: "Uniswap",
633
- dir: UNISWAP_APP_DIR,
634
- preferredPort: 8085,
635
- framework: "expo",
636
- prepare: () => {
637
- ensureUniswapDemoEnvLocal();
638
- ensureUniswapForceUpgradePatched();
639
- },
640
- command: (p) => ({
641
- cmd: `npx expo start --clear --port ${p}`,
642
- // prefer the real local mobile env when present, otherwise fall back
643
- // to Uniswap's checked-in public web RPC settings so demo boots cleanly.
644
- env: resolveUniswapDemoEnv()
645
- })
646
- },
647
- {
648
- name: "takeout",
649
- label: "Takeout",
650
- dir: (0, import_node_path.join)(HOME, "takeout"),
651
- preferredPort: 8086,
652
- framework: "one",
653
- // takeout needs more than Metro for the demo to actually work: better-auth
654
- // (login), zero-cache (sync), and a postgres for both. `bun lite` brings
655
- // up the orez-backed stack (PG + zero + s3 in one binary) plus the One
656
- // dev server. takeout's env system shifts every port (web, pg, zero,
657
- // minio) uniformly by PORT_OFFSET, so we derive offset = port - 8081
658
- // (the base web port) to keep all backend ports clear of the default
659
- // dev stack while pinning One to the demo slot. OREZ_DATA_DIR is isolated
660
- // to a per-demo path so we don't fight a soot dev orez that may already
661
- // be holding pglite locks on ~/takeout/.orez (soot can attach takeout as
662
- // a project and spin up its own orez against the same data dir).
663
- readyTimeoutMs: 24e4,
664
- managedPorts: (p) => {
665
- const offset = p - 8081;
666
- return [5433 + offset, 4848 + offset, 9200 + offset];
667
- },
668
- command: (p) => ({
669
- cmd: "bun lite:demo",
670
- env: {
671
- TAKEOUT_ENV_MODE: "development",
672
- PORT_OFFSET: String(p - 8081),
673
- OREZ_DATA_DIR: `${HOME}/.cache/sootsim-demo/takeout-orez`,
674
- VITE_DEMO_MODE: "1",
675
- ZERO_APP_ID: "takeout",
676
- ZERO_APP_PUBLICATIONS: "zero_takeout",
677
- ZERO_CVR_MAX_CONNS: "4",
678
- ZERO_NUM_SYNC_WORKERS: "2",
679
- ZERO_UPSTREAM_MAX_CONNS: "8"
680
- }
681
- })
682
- },
683
- {
684
- name: "expensify",
685
- label: "Expensify",
686
- dir: (0, import_node_path.join)(HOME, "github/expensify"),
687
- preferredPort: 8087,
688
- framework: "rock",
689
- runtimeConfig: {
690
- env: EXPENSIFY_NATIVE_PROXY_ENV
691
- },
692
- sidecars: [
693
- {
694
- name: "web-proxy",
695
- port: 9e3,
696
- readyPath: "/api/Ping",
697
- command: () => ({
698
- cmd: `bun ${JSON.stringify(getExpensifyProxyScript())}`,
699
- env: EXPENSIFY_NATIVE_PROXY_ENV
700
- })
701
- }
702
- ],
703
- command: (p) => ({
704
- cmd: `fnm exec --using=20.20.0 npx rock start --port ${p} --no-interactive`,
705
- env: EXPENSIFY_NATIVE_PROXY_ENV
706
- })
707
- },
708
- {
709
- name: "artsy",
710
- label: "Artsy",
711
- dir: ARTSY_DIR,
712
- preferredPort: 8088,
713
- framework: "expo",
714
- runtimeConfig: resolveArtsyRuntimeConfig(),
715
- prepare: () => {
716
- ensureArtsySetup();
717
- },
718
- command: (p) => ({
719
- // eigen's `yarn start` wraps `react-native start` with a relay watcher
720
- // via concurrently; for the demo we run relay once in prepare and
721
- // invoke the metro server directly so --port is respected.
722
- cmd: `npx react-native start --port ${p}`
723
- }),
724
- credentials: {
725
- envVars: ["SOOTSIM_ARTSY_EMAIL", "SOOTSIM_ARTSY_PASSWORD"],
726
- note: "auto-login reuses Artsy\u2019s built-in Maestro launch-arguments hook"
727
- }
728
- },
729
- {
730
- name: "rainbow",
731
- label: "Rainbow",
732
- dir: RAINBOW_DIR,
733
- preferredPort: 8089,
734
- framework: "rock",
735
- sidecars: [
736
- {
737
- name: "metadata-proxy",
738
- port: RAINBOW_METADATA_PROXY_PORT,
739
- readyPath: "/health",
740
- command: () => ({
741
- cmd: `bun ${JSON.stringify(getRainbowMetadataProxyScript())}`,
742
- env: {
743
- PORT: String(RAINBOW_METADATA_PROXY_PORT),
744
- RAINBOW_PUBLIC_RPC_URLS: JSON.stringify(RAINBOW_DEMO_PUBLIC_RPC_URLS),
745
- RAINBOW_UPSTREAM_METADATA_BASE_URL: RAINBOW_METADATA_BASE_URL
746
- }
747
- })
748
- }
749
- ],
750
- prepare: () => {
751
- ensureRainbowSetup();
752
- },
753
- command: (p) => ({
754
- cmd: `fnm exec --using=22 yarn start --port ${p} --reset-cache`,
755
- env: resolveRainbowDemoEnv()
756
- }),
757
- credentials: {
758
- envVars: ["RAINBOW_TEST_WALLET"],
759
- optionalEnvVars: [
760
- "RAINBOW_WALLETCONNECT_PROJECT_ID",
761
- "WC_PROJECT_ID",
762
- "IMGIX_DOMAIN",
763
- "IMGIX_TOKEN"
764
- ],
765
- note: "launcher supplies demo encryption, public mainnet RPC, and a placeholder WalletConnect project id; use only a public throwaway mnemonic for RAINBOW_TEST_WALLET"
766
- }
767
- },
768
- {
769
- name: "rocket-chat",
770
- label: "Rocket.Chat",
771
- dir: (0, import_node_path.join)(HOME, "github/Rocket.Chat.ReactNative"),
772
- preferredPort: 8093,
773
- framework: "expo",
774
- command: (p) => ({
775
- cmd: `npx react-native start --port ${p}`,
776
- env: { RUNNING_E2E_TESTS: "true" }
777
- }),
778
- credentials: {
779
- envVars: [
780
- "ROCKET_CHAT_DEMO_SERVER",
781
- "ROCKET_CHAT_DEMO_USERNAME",
782
- "ROCKET_CHAT_DEMO_PASSWORD"
783
- ],
784
- known: { SERVER: "https://mobile.qa.rocket.chat" },
785
- note: "use packages/sootsim-engine/scripts/rocket-chat-demo-auth.ts to create/login a disposable QA user and print the rocketchat://auth deep link"
786
- }
787
- },
788
- {
789
- name: "mattermost",
790
- label: "Mattermost",
791
- dir: MATTERMOST_DIR,
792
- preferredPort: 8090,
793
- framework: "expo",
794
- sidecars: [
795
- {
796
- name: "preview-server",
797
- port: 8065,
798
- readyPath: "/api/v4/system/ping",
799
- command: () => ({
800
- cmd: `bun ${JSON.stringify(getMattermostPreviewServerScript())}`
801
- })
802
- }
803
- ],
804
- runtimeConfig: {
805
- modules: {
806
- // mattermost patches react-native-keychain's JS entry in its own
807
- // repo; run that package and provide only the native manager seam.
808
- "react-native-keychain": false,
809
- "dist/assets/config.json": {
810
- inline: {
811
- AuthUrlScheme: "mmauth://",
812
- AuthUrlSchemeDev: "mmauthbeta://",
813
- DefaultServerUrl: "http://localhost:8065",
814
- DefaultServerName: "Mattermost Demo",
815
- TestServerUrl: "http://localhost:8065",
816
- AutoSelectServerUrl: true,
817
- WebsiteURL: "https://mattermost.com",
818
- ServerNoticeURL: "https://github.com/mattermost/mattermost-server/blob/master/NOTICE.txt",
819
- MobileNoticeURL: "https://github.com/mattermost/mattermost-mobile/blob/master/NOTICE.txt",
820
- RudderApiKey: "",
821
- SentryEnabled: false,
822
- SentryDsnIos: "",
823
- SentryDsnAndroid: "",
824
- SentryOptions: {
825
- deactivateStacktraceMerging: true,
826
- autoBreadcrumbs: {
827
- xhr: false,
828
- console: true
829
- },
830
- severityLevelFilter: ["fatal"]
831
- },
832
- ShowReview: false,
833
- ShowOnboarding: false,
834
- ExperimentalNormalizeMarkdownLinks: false,
835
- CustomRequestHeaders: {},
836
- CollectNetworkMetrics: false
837
- }
838
- }
839
- },
840
- nativeModules: {
841
- RNKeychainManager: { file: getMattermostKeychainNativeModule() },
842
- RNUtils: { file: getMattermostRNUtilsNativeModule() },
843
- GenericClient: { file: getMattermostNetworkClientNativeModule() },
844
- ApiClient: { file: getMattermostNetworkClientNativeModule() },
845
- WebSocketClient: { file: getMattermostNetworkClientNativeModule() }
846
- }
847
- },
848
- command: (p) => ({
849
- cmd: `npx react-native start --host 127.0.0.1 --port ${p}`
850
- }),
851
- credentials: {
852
- known: {
853
- SERVER: "http://localhost:8065",
854
- USERNAME: "demo",
855
- PASSWORD: "DemoPassword1!"
856
- },
857
- note: "local mattermost-preview seeded through the real REST API; no signup or OTP needed"
858
- }
859
- },
860
- {
861
- name: "joplin",
862
- label: "Joplin",
863
- dir: JOPLIN_APP_DIR,
864
- preferredPort: 8084,
865
- framework: "expo",
866
- // joplin is local-first: sync.target defaults to 0 ("None") and the
867
- // mobile startup runs WelcomeUtils.install() on first launch, which
868
- // seeds a "Welcome!" folder + welcome notes. no login or external
869
- // credentials are needed for a usable demo — just boot it. tenant
870
- // bedrock SQLite (via react-native-sqlite-storage stub) carries the
871
- // seeded notes across reloads.
872
- prepare: () => {
873
- ensureJoplinWatchmanConfigs();
874
- ensureJoplinBuilt();
875
- },
876
- command: (p) => ({
877
- cmd: `npx expo start --port ${p}`,
878
- env: { BROWSERSLIST_IGNORE_OLD_DATA: "true" }
879
- }),
880
- credentials: {
881
- note: "no login required \u2014 sync.target=0 (None), seed via WelcomeUtils"
882
- }
883
- }
884
- ];
885
116
 
886
117
  // scripts/dev-server-scanner.ts
887
118
  var execP = (0, import_util.promisify)(import_child_process.exec);
119
+ void loadOptionalDemoApps();
888
120
  var TIMEOUT_MS = 250;
889
121
  var MANIFEST_TIMEOUT_MS = 1500;
890
122
  var TCP_GATE_MS = 120;
891
123
  function tcpPing(port, timeout = TCP_GATE_MS) {
892
- return new Promise((resolve2) => {
124
+ return new Promise((resolve) => {
893
125
  const sock = new import_net.default.Socket();
894
126
  let settled = false;
895
127
  const done = (ok) => {
896
128
  if (settled) return;
897
129
  settled = true;
898
130
  sock.destroy();
899
- resolve2(ok);
131
+ resolve(ok);
900
132
  };
901
133
  sock.setTimeout(timeout);
902
134
  sock.once("connect", () => done(true));
@@ -906,7 +138,7 @@ function tcpPing(port, timeout = TCP_GATE_MS) {
906
138
  });
907
139
  }
908
140
  function httpGet(port, path, method = "GET", timeout = TIMEOUT_MS, headers = {}) {
909
- return new Promise((resolve2) => {
141
+ return new Promise((resolve) => {
910
142
  const req = import_http.default.request(
911
143
  { hostname: "localhost", port, path, method, timeout, headers },
912
144
  (res) => {
@@ -920,14 +152,14 @@ function httpGet(port, path, method = "GET", timeout = TIMEOUT_MS, headers = {})
920
152
  })();
921
153
  res.on(
922
154
  "end",
923
- () => resolve2({ statusCode: res.statusCode || 0, body, contentType })
155
+ () => resolve({ statusCode: res.statusCode || 0, body, contentType })
924
156
  );
925
157
  }
926
158
  );
927
- req.on("error", () => resolve2(null));
159
+ req.on("error", () => resolve(null));
928
160
  req.setTimeout(timeout, () => {
929
161
  req.destroy();
930
- resolve2(null);
162
+ resolve(null);
931
163
  });
932
164
  req.end();
933
165
  });
@@ -1006,8 +238,8 @@ async function discoverListeningPorts(excludePorts = []) {
1006
238
  var cwdByPid = /* @__PURE__ */ new Map();
1007
239
  async function resolveProcessCwd(pid) {
1008
240
  if (pid <= 0) return null;
1009
- const cached = cwdByPid.get(pid);
1010
- if (cached) return cached;
241
+ const cached2 = cwdByPid.get(pid);
242
+ if (cached2) return cached2;
1011
243
  try {
1012
244
  const { stdout } = await execP(`lsof -p ${pid} -a -d cwd -Fn 2>/dev/null`, {
1013
245
  encoding: "utf8",
@@ -1039,7 +271,7 @@ function makeResult(port, framework) {
1039
271
  };
1040
272
  }
1041
273
  function withRuntimeConfig(port, bundleUrl) {
1042
- const knownApp = APPS.find((app) => app.preferredPort === port);
274
+ const knownApp = optionalDemoAppsSync().find((app) => app.preferredPort === port);
1043
275
  const configured = knownApp?.runtimeConfig ? applySootSimConfigToUrl(bundleUrl, knownApp.runtimeConfig) : bundleUrl;
1044
276
  return normalizeNativeDevBundleUrl(configured);
1045
277
  }
@@ -1224,12 +456,12 @@ async function scanDevServers(opts = {}) {
1224
456
  const results = [];
1225
457
  const toProbe = [];
1226
458
  for (const { port, pid } of processes) {
1227
- const cached = portCache.get(port);
1228
- if (cached && __shouldReuseScannerCacheEntry(cached, pid)) {
1229
- if (cached.result) results.push(cached.result);
459
+ const cached2 = portCache.get(port);
460
+ if (cached2 && __shouldReuseScannerCacheEntry(cached2, pid)) {
461
+ if (cached2.result) results.push(cached2.result);
1230
462
  continue;
1231
463
  }
1232
- if (cached && cached.pid !== pid) {
464
+ if (cached2 && cached2.pid !== pid) {
1233
465
  knownNonPatched.delete(port);
1234
466
  knownNonExpo.delete(port);
1235
467
  knownOne.delete(port);