sootsim 0.1.131 → 0.1.133

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 (153) hide show
  1. package/dist-cli/bin.js +3 -3
  2. package/dist-cli/chunks/{agent-E2VVCGQU.js → agent-HUV6ZDVC.js} +2 -2
  3. package/dist-cli/chunks/{agent-wrapper-33VFUNED.js → agent-wrapper-DWQ4YJ2L.js} +2 -2
  4. package/dist-cli/chunks/{app-fonts-3L2XX7Y7.js → app-fonts-KZU5WKNH.js} +2 -2
  5. package/dist-cli/chunks/{assert-IWNIHSQZ.js → assert-O6MCNH6B.js} +2 -2
  6. package/dist-cli/chunks/auto-bootstrap-LTOQSXRM.js +2 -0
  7. package/dist-cli/chunks/beta-Y2OJHTRQ.js +2 -0
  8. package/dist-cli/chunks/{chunk-NBV6N5JG.js → chunk-2NV5VDY3.js} +2 -2
  9. package/dist-cli/chunks/{chunk-CIDY56TT.js → chunk-2OST4PMS.js} +2 -2
  10. package/dist-cli/chunks/{chunk-WMMBJ6EZ.js → chunk-4CQXBMKU.js} +1 -1
  11. package/dist-cli/chunks/{chunk-U6ZEGWUP.js → chunk-7BCTUWOM.js} +2 -2
  12. package/dist-cli/chunks/chunk-7SYFZZK3.js +2 -0
  13. package/dist-cli/chunks/{chunk-7FOWPTRL.js → chunk-A34CFM2J.js} +1 -1
  14. package/dist-cli/chunks/chunk-AEYD4ODQ.js +1 -0
  15. package/dist-cli/chunks/{chunk-BG5XSXNN.js → chunk-AKIYNT56.js} +1 -1
  16. package/dist-cli/chunks/{chunk-CRRUICMV.js → chunk-BC357P2N.js} +2 -2
  17. package/dist-cli/chunks/{chunk-54UKEUZT.js → chunk-BHPSNVNR.js} +3 -3
  18. package/dist-cli/chunks/chunk-D3OLBBEO.js +1 -0
  19. package/dist-cli/chunks/{chunk-M3EAG7DW.js → chunk-DYNVMRON.js} +2 -2
  20. package/dist-cli/chunks/{chunk-WVXACDTN.js → chunk-ESQVUOW2.js} +2 -2
  21. package/dist-cli/chunks/{chunk-JB2XTOTE.js → chunk-FJRIG6HG.js} +2 -2
  22. package/dist-cli/chunks/chunk-FXB2ETM3.js +4 -0
  23. package/dist-cli/chunks/{chunk-CTJ2JTGG.js → chunk-G4OBKVUY.js} +1 -1
  24. package/dist-cli/chunks/{chunk-SL3QE2ZH.js → chunk-GCNZ32Y7.js} +2 -2
  25. package/dist-cli/chunks/{chunk-APVJC2UU.js → chunk-GDHDUANQ.js} +2 -2
  26. package/dist-cli/chunks/{chunk-DII4JH4V.js → chunk-GMHBZDQA.js} +1 -1
  27. package/dist-cli/chunks/{chunk-DHAAKK5S.js → chunk-HEOJB2Q7.js} +2 -2
  28. package/dist-cli/chunks/{chunk-WCLVBJP6.js → chunk-HSNSCKU6.js} +2 -2
  29. package/dist-cli/chunks/{chunk-S2HUCQ2V.js → chunk-IMG7XQRR.js} +2 -2
  30. package/dist-cli/chunks/{chunk-T3EWCDR6.js → chunk-KFN2YKGC.js} +1 -1
  31. package/dist-cli/chunks/{chunk-F5KSHD45.js → chunk-KHC77NFP.js} +3 -3
  32. package/dist-cli/chunks/{chunk-CUISMI5W.js → chunk-KUTTVAMM.js} +1 -1
  33. package/dist-cli/chunks/chunk-LK6Y3IGB.js +64 -0
  34. package/dist-cli/chunks/{chunk-J6LN6U7I.js → chunk-MTXMNE75.js} +1 -1
  35. package/dist-cli/chunks/{chunk-34474744.js → chunk-NNRWRRI5.js} +3 -3
  36. package/dist-cli/chunks/{chunk-UDR5W52Q.js → chunk-OO3C2GYN.js} +2 -2
  37. package/dist-cli/chunks/{chunk-ENZN7H6M.js → chunk-PZSY7LCJ.js} +1 -1
  38. package/dist-cli/chunks/{chunk-LN2EUFKP.js → chunk-Q3GCZEPC.js} +1 -1
  39. package/dist-cli/chunks/{chunk-7SHQYZAV.js → chunk-QGPM7UTZ.js} +1 -1
  40. package/dist-cli/chunks/{chunk-WBH7RWVG.js → chunk-R4PCQVBM.js} +2 -2
  41. package/dist-cli/chunks/{chunk-LTEPSJWI.js → chunk-ROINTL2P.js} +2 -2
  42. package/dist-cli/chunks/chunk-RPQCGJI7.js +5 -0
  43. package/dist-cli/chunks/{chunk-ENEBFN4F.js → chunk-SKF4RZDK.js} +2 -2
  44. package/dist-cli/chunks/{chunk-SIHVPRJ5.js → chunk-THJDQ2EB.js} +1 -1
  45. package/dist-cli/chunks/{chunk-CTZWPA6E.js → chunk-TTCMDOP6.js} +2 -2
  46. package/dist-cli/chunks/{chunk-GU4JWEE2.js → chunk-UJBMEBQF.js} +1 -1
  47. package/dist-cli/chunks/{chunk-NF6TBFVQ.js → chunk-VO3QIOCT.js} +1 -1
  48. package/dist-cli/chunks/{chunk-72F7IBXI.js → chunk-VZB6MROZ.js} +2 -2
  49. package/dist-cli/chunks/{chunk-Y6P7ZGST.js → chunk-XEGM2NRW.js} +2 -2
  50. package/dist-cli/chunks/{chunk-LTDKALGE.js → chunk-YL3KKAZR.js} +1 -1
  51. package/dist-cli/chunks/chunk-YP4W6KI5.js +1 -0
  52. package/dist-cli/chunks/chunk-YZVZA6IX.js +2 -0
  53. package/dist-cli/chunks/cli-version-RQJHNNYX.js +2 -0
  54. package/dist-cli/chunks/{compat-G7MILF5C.js → compat-3BWLNHPY.js} +3 -3
  55. package/dist-cli/chunks/{config-EK2MX5TM.js → config-H7YEVE5J.js} +2 -2
  56. package/dist-cli/chunks/control-ZFU3T2LE.js +2 -0
  57. package/dist-cli/chunks/{cpu-profile-WQLZZH22.js → cpu-profile-XYCDA5GM.js} +2 -2
  58. package/dist-cli/chunks/{daemon-D667VAR5.js → daemon-TBN5MRVC.js} +2 -2
  59. package/dist-cli/chunks/{debug-J6KCXN3Y.js → debug-2WAJZ4C7.js} +3 -3
  60. package/dist-cli/chunks/demo-app-registry-JXOXYWFT.js +2 -0
  61. package/dist-cli/chunks/{detox-TVIZT3LO.js → detox-JLJPKRA3.js} +2 -2
  62. package/dist-cli/chunks/{device-BI4WKSGV.js → device-WPWC2KSY.js} +2 -2
  63. package/dist-cli/chunks/{diagnose-ACPZLWXQ.js → diagnose-PYBIEZFD.js} +2 -2
  64. package/dist-cli/chunks/drivers-XPCQOVAR.js +2 -0
  65. package/dist-cli/chunks/{electron-ZD5PU6TI.js → electron-ZW7YMV37.js} +3 -3
  66. package/dist-cli/chunks/flow-SWXVIYST.js +2 -0
  67. package/dist-cli/chunks/help-HAITGXVU.js +2 -0
  68. package/dist-cli/chunks/{hints-2VDMGSC5.js → hints-3YQNXM27.js} +2 -2
  69. package/dist-cli/chunks/{home-paths-VO4BR5BK.js → home-paths-SBGRHOZC.js} +2 -2
  70. package/dist-cli/chunks/{inspect-RM6DGHRB.js → inspect-YXTS4PR6.js} +3 -3
  71. package/dist-cli/chunks/install-VFUIM3QH.js +2 -0
  72. package/dist-cli/chunks/{install-desktop-FRPHDKRC.js → install-desktop-27SPMPUV.js} +3 -3
  73. package/dist-cli/chunks/{keys-WUOPL5VX.js → keys-Y7OJXBGI.js} +2 -2
  74. package/dist-cli/chunks/{launch-SAVHAJ6N.js → launch-OUG2GFLO.js} +3 -3
  75. package/dist-cli/chunks/{login-7MA4OPGV.js → login-XXJQHPWA.js} +4 -4
  76. package/dist-cli/chunks/{logout-YL5XHMYM.js → logout-FHJ26UTW.js} +2 -2
  77. package/dist-cli/chunks/{maestro-LCOVHJ7D.js → maestro-P4ZVR2I4.js} +2 -2
  78. package/dist-cli/chunks/{preview-BIKZNTRD.js → preview-6ONBLQBI.js} +2 -2
  79. package/dist-cli/chunks/{profile-KKIOWCDH.js → profile-LQOEBIPK.js} +2 -2
  80. package/dist-cli/chunks/{react-UJA6V4RC.js → react-R4KJVWDA.js} +2 -2
  81. package/dist-cli/chunks/{record-ACTA66DL.js → record-OBJJDTFN.js} +2 -2
  82. package/dist-cli/chunks/runtime-6JVXVZ4K.js +2 -0
  83. package/dist-cli/chunks/{runtime-delivery-Z7YPY56X.js → runtime-delivery-LEU6ABXJ.js} +2 -2
  84. package/dist-cli/chunks/{screenshot-6CUMBC6A.js → screenshot-AKU27ZTJ.js} +2 -2
  85. package/dist-cli/chunks/{screenshot-mode-YNBFDLFN.js → screenshot-mode-XPJM2SRF.js} +2 -2
  86. package/dist-cli/chunks/{screenshots-QVOIWNG6.js → screenshots-SJY4LH2Q.js} +2 -2
  87. package/dist-cli/chunks/{server-YNEOBB5D.js → server-2SSM3BKA.js} +3 -3
  88. package/dist-cli/chunks/setup-repo-X6WRLPI5.js +2 -0
  89. package/dist-cli/chunks/{skills-CH3QSSBF.js → skills-C7ZVO6AF.js} +2 -2
  90. package/dist-cli/chunks/{start-RYCAWIQ7.js → start-5BFFCFOT.js} +4 -4
  91. package/dist-cli/chunks/store-5FCKCDEL.js +2 -0
  92. package/dist-cli/chunks/telemetry-N6DCFUGB.js +2 -0
  93. package/dist-cli/chunks/{test-37ZDD753.js → test-5YTOB2K7.js} +3 -3
  94. package/dist-cli/chunks/{three-mode-BSY6KVQM.js → three-mode-ZTVDFRRN.js} +2 -2
  95. package/dist-cli/chunks/{timeline-ZD3TGYAF.js → timeline-ZSHW5COY.js} +2 -2
  96. package/dist-cli/chunks/{upgrade-UOAM4Q35.js → upgrade-DU2VLCLD.js} +2 -2
  97. package/dist-cli/chunks/upload-QLV4POAH.js +2 -0
  98. package/dist-cli/chunks/{version-O3YK6QEA.js → version-G7MFHWDO.js} +2 -2
  99. package/dist-cli/chunks/web-66TKNXN5.js +2 -0
  100. package/dist-cli/chunks/{what-happened-OXU5NEZK.js → what-happened-ZYPPAPQM.js} +2 -2
  101. package/dist-cli/chunks/{whoami-3OH4BMEA.js → whoami-U4JDM3X4.js} +2 -2
  102. package/dist-lib/agent-daemon-client.cjs +1 -1
  103. package/dist-lib/agent-events.cjs +1 -1
  104. package/dist-lib/agent-sessions.cjs +1 -1
  105. package/dist-lib/attached-projects.cjs +825 -23
  106. package/dist-lib/auth/shared-session.cjs +1 -1
  107. package/dist-lib/backend-origin.cjs +1 -1
  108. package/dist-lib/beta.cjs +1 -1
  109. package/dist-lib/beta.mjs +1 -1
  110. package/dist-lib/bridge-constants.cjs +1 -1
  111. package/dist-lib/cli-constants.cjs +1 -1
  112. package/dist-lib/config.cjs +1 -1
  113. package/dist-lib/detox/index.cjs +1 -1
  114. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  115. package/dist-lib/home-paths.cjs +1 -1
  116. package/dist-lib/host/bridge-host.cjs +443 -429
  117. package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
  118. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  119. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  120. package/dist-lib/host/websocket-proxy.cjs +1 -1
  121. package/dist-lib/index.cjs +1 -1
  122. package/dist-lib/metro.cjs +1 -1
  123. package/dist-lib/profiles.cjs +1 -1
  124. package/dist-lib/render-mode.cjs +1 -1
  125. package/dist-lib/scripts/demo-app-registry.cjs +1 -1
  126. package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
  127. package/dist-lib/sdk.cjs +1 -1
  128. package/dist-lib/sdk.mjs +1 -1
  129. package/dist-lib/skills.cjs +24 -19
  130. package/dist-lib/vite.cjs +1 -1
  131. package/package.json +1 -1
  132. package/src/attached-projects.ts +1 -1
  133. package/dist-cli/chunks/auto-bootstrap-HVFQYW3W.js +0 -2
  134. package/dist-cli/chunks/beta-DTH53ZBB.js +0 -2
  135. package/dist-cli/chunks/chunk-3RAF5I5P.js +0 -1
  136. package/dist-cli/chunks/chunk-HGKXZJYM.js +0 -67
  137. package/dist-cli/chunks/chunk-LCFEK3M3.js +0 -2
  138. package/dist-cli/chunks/chunk-MAWBNHA7.js +0 -4
  139. package/dist-cli/chunks/chunk-NKLWLNTN.js +0 -2
  140. package/dist-cli/chunks/chunk-QXDMTVKI.js +0 -1
  141. package/dist-cli/chunks/chunk-SN35VFLV.js +0 -1
  142. package/dist-cli/chunks/cli-version-XAA6XJ3E.js +0 -2
  143. package/dist-cli/chunks/control-7D5EKP3M.js +0 -2
  144. package/dist-cli/chunks/drivers-NVAOF3WK.js +0 -2
  145. package/dist-cli/chunks/flow-TL6WIR4C.js +0 -2
  146. package/dist-cli/chunks/help-42HSJPZ5.js +0 -2
  147. package/dist-cli/chunks/install-WEVANG74.js +0 -2
  148. package/dist-cli/chunks/runtime-ZPITJAAY.js +0 -2
  149. package/dist-cli/chunks/setup-repo-HCDKAHBY.js +0 -2
  150. package/dist-cli/chunks/store-32NRKG33.js +0 -2
  151. package/dist-cli/chunks/telemetry-HIY3SXVC.js +0 -2
  152. package/dist-cli/chunks/upload-RVUDLEEB.js +0 -2
  153. package/dist-cli/chunks/web-LAT537VP.js +0 -2
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.131 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.133 | (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;
@@ -7,6 +7,9 @@ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
7
7
  var __getOwnPropNames = Object.getOwnPropertyNames;
8
8
  var __getProtoOf = Object.getPrototypeOf;
9
9
  var __hasOwnProp = Object.prototype.hasOwnProperty;
10
+ var __esm = (fn, res) => function __init() {
11
+ return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
12
+ };
10
13
  var __export = (target, all) => {
11
14
  for (var name in all)
12
15
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -29,6 +32,805 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
29
32
  ));
30
33
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
31
34
 
35
+ // scripts/demo-app-registry.ts
36
+ var demo_app_registry_exports = {};
37
+ __export(demo_app_registry_exports, {
38
+ APPS: () => APPS
39
+ });
40
+ function findWorkspaceRoot(startDir) {
41
+ let dir = startDir;
42
+ while (true) {
43
+ if ((0, import_node_fs.existsSync)((0, import_node_path2.join)(dir, "pnpm-workspace.yaml")) || (0, import_node_fs.existsSync)((0, import_node_path2.join)(dir, "turbo.json")) || (0, import_node_fs.existsSync)((0, import_node_path2.join)(dir, "nx.json")) || (0, import_node_fs.existsSync)((0, import_node_path2.join)(dir, "lerna.json"))) {
44
+ return dir;
45
+ }
46
+ const packageJsonPath = (0, import_node_path2.join)(dir, "package.json");
47
+ if ((0, import_node_fs.existsSync)(packageJsonPath)) {
48
+ try {
49
+ const pkg = JSON.parse((0, import_node_fs.readFileSync)(packageJsonPath, "utf8"));
50
+ if (pkg.workspaces) return dir;
51
+ } catch {
52
+ }
53
+ }
54
+ const parent = (0, import_node_path2.dirname)(dir);
55
+ if (parent === dir) return null;
56
+ dir = parent;
57
+ }
58
+ }
59
+ function resolveWorkspaceScriptPath(workspaceRelativePath, packageRelativePath) {
60
+ const workspaceRoot = findWorkspaceRoot(process.cwd());
61
+ const candidates = [
62
+ workspaceRoot ? (0, import_node_path2.resolve)(workspaceRoot, workspaceRelativePath) : null,
63
+ (0, import_node_path2.resolve)(process.cwd(), workspaceRelativePath),
64
+ (0, import_node_path2.resolve)(process.cwd(), packageRelativePath)
65
+ ].filter((candidate) => Boolean(candidate));
66
+ for (const candidate of candidates) {
67
+ if ((0, import_node_fs.existsSync)(candidate)) return candidate;
68
+ }
69
+ return candidates[0] ?? (0, import_node_path2.resolve)(process.cwd(), workspaceRelativePath);
70
+ }
71
+ function parseEnvFile(filePath) {
72
+ if (!(0, import_node_fs.existsSync)(filePath)) return {};
73
+ const env = {};
74
+ const source = (0, import_node_fs.readFileSync)(filePath, "utf8");
75
+ for (const rawLine of source.split(/\r?\n/)) {
76
+ const line = rawLine.trim();
77
+ if (!line || line.startsWith("#")) continue;
78
+ const match = line.match(/^([A-Za-z_][A-Za-z0-9_]*)\s*=\s*(.*)$/);
79
+ if (!match) continue;
80
+ let value = match[2].trim();
81
+ if (value.startsWith('"') && value.endsWith('"') || value.startsWith("'") && value.endsWith("'")) {
82
+ value = value.slice(1, -1);
83
+ }
84
+ env[match[1]] = value;
85
+ }
86
+ return env;
87
+ }
88
+ function isUsableUniswapEnvValue(value) {
89
+ if (!value) return false;
90
+ const trimmed = value.trim();
91
+ if (!trimmed) return false;
92
+ if (trimmed.includes(UNISWAP_PLACEHOLDER)) return false;
93
+ if (trimmed === "TRADING_API_KEY" || trimmed === "UNISWAP_API_KEY") return false;
94
+ return true;
95
+ }
96
+ function pickEnvValue(sources, keys) {
97
+ for (const source of sources) {
98
+ for (const key of keys) {
99
+ const value = source[key];
100
+ if (isUsableUniswapEnvValue(value)) return value.trim();
101
+ }
102
+ }
103
+ return void 0;
104
+ }
105
+ function resolveUniswapDemoEnv() {
106
+ const localEnv = parseEnvFile(UNISWAP_ENV_LOCAL_FILE);
107
+ const webEnv = parseEnvFile((0, import_node_path2.join)(UNISWAP_REPO_DIR, "apps/web/.env"));
108
+ const sources = [
109
+ process.env,
110
+ localEnv,
111
+ webEnv
112
+ ];
113
+ const env = {};
114
+ const bindings = [
115
+ ["AMPLITUDE_PROXY_URL_OVERRIDE", ["REACT_APP_AMPLITUDE_PROXY_URL"]],
116
+ ["QUICKNODE_ENDPOINT_NAME", ["REACT_APP_QUICKNODE_ENDPOINT_NAME"]],
117
+ ["QUICKNODE_ENDPOINT_TOKEN", ["REACT_APP_QUICKNODE_ENDPOINT_TOKEN"]],
118
+ ["INFURA_KEY", ["REACT_APP_INFURA_KEY"]],
119
+ ["STATSIG_API_KEY", ["REACT_APP_STATSIG_API_KEY"]],
120
+ ["STATSIG_PROXY_URL_OVERRIDE", ["REACT_APP_STATSIG_PROXY_URL"]],
121
+ ["WALLETCONNECT_PROJECT_ID", ["REACT_APP_WALLET_CONNECT_PROJECT_ID"]],
122
+ ["WALLETCONNECT_PROJECT_ID_BETA", ["REACT_APP_WALLET_CONNECT_PROJECT_ID"]],
123
+ ["WALLETCONNECT_PROJECT_ID_DEV", ["REACT_APP_WALLET_CONNECT_PROJECT_ID"]],
124
+ ["TRADING_API_KEY", ["REACT_APP_TRADING_API_KEY"]],
125
+ ["UNISWAP_API_KEY", []]
126
+ ];
127
+ for (const [target, aliases] of bindings) {
128
+ const value = pickEnvValue(sources, [target, ...aliases]);
129
+ if (!value) continue;
130
+ env[target] = value;
131
+ for (const alias of aliases) {
132
+ env[alias] = value;
133
+ }
134
+ }
135
+ const hasPrivateGatewayKeys = isUsableUniswapEnvValue(env.TRADING_API_KEY) && isUsableUniswapEnvValue(env.UNISWAP_API_KEY);
136
+ if (!hasPrivateGatewayKeys) {
137
+ const publicGraphqlUrl = pickEnvValue(sources, ["GRAPHQL_URL_OVERRIDE", "REACT_APP_AWS_API_ENDPOINT"]) || "https://interface.gateway.uniswap.org/v1/graphql";
138
+ env.API_BASE_URL_OVERRIDE = "https://interface.gateway.uniswap.org";
139
+ env.API_BASE_URL_V2_OVERRIDE = "https://interface.gateway.uniswap.org/v2";
140
+ env.GRAPHQL_URL_OVERRIDE = publicGraphqlUrl;
141
+ env.TRADING_API_URL_OVERRIDE = "https://trading-api-labs.interface.gateway.uniswap.org";
142
+ env.FOR_API_URL_OVERRIDE = "https://for.interface.gateway.uniswap.org/v2/FOR.v1.FORService";
143
+ }
144
+ return env;
145
+ }
146
+ function ensureUniswapDemoEnvLocal() {
147
+ const existingSource = (0, import_node_fs.existsSync)(UNISWAP_ENV_LOCAL_FILE) ? (0, import_node_fs.readFileSync)(UNISWAP_ENV_LOCAL_FILE, "utf8") : "";
148
+ if (existingSource && !existingSource.includes(UNISWAP_DEMO_ENV_MARKER)) {
149
+ return;
150
+ }
151
+ const env = resolveUniswapDemoEnv();
152
+ const lines = [UNISWAP_DEMO_ENV_MARKER];
153
+ for (const [key, value] of Object.entries(env).sort(([a], [b]) => a.localeCompare(b))) {
154
+ lines.push(`${key}=${JSON.stringify(value)}`);
155
+ }
156
+ lines.push("");
157
+ (0, import_node_fs.writeFileSync)(UNISWAP_ENV_LOCAL_FILE, `${lines.join("\n")}
158
+ `);
159
+ }
160
+ function ensureUniswapForceUpgradePatched() {
161
+ const hookNeedle = `export function useForceUpgradeStatus(): ForceUpgradeStatus {
162
+ `;
163
+ const hookPatch = ` // sootsim demo: bypass the force-upgrade gate during local engine demos.
164
+ return 'not-required'
165
+
166
+ `;
167
+ const hookLegacyPatch = ` // sootsim demo: bypass the force-upgrade gate during local engine demos.
168
+ if (process.env.${UNISWAP_FORCE_UPGRADE_PATCH_MARKER} === 'true') {
169
+ return 'not-required'
170
+ }
171
+
172
+ `;
173
+ const notificationNeedle = ` const getForceUpgradeStatus = (): ForceUpgradeStatus => {
174
+ `;
175
+ const notificationPatch = ` // sootsim demo: bypass the force-upgrade gate during local engine demos.
176
+ return 'not-required'
177
+
178
+ `;
179
+ const notificationLegacyPatch = ` // sootsim demo: bypass the force-upgrade gate during local engine demos.
180
+ if (process.env.${UNISWAP_FORCE_UPGRADE_PATCH_MARKER} === 'true') {
181
+ return 'not-required'
182
+ }
183
+
184
+ `;
185
+ const patchWithMigration = (filePath, needle, patch, legacyPatch) => {
186
+ const source = (0, import_node_fs.readFileSync)(filePath, "utf8");
187
+ if (source.includes(patch)) return;
188
+ if (source.includes(legacyPatch)) {
189
+ (0, import_node_fs.writeFileSync)(filePath, source.replace(legacyPatch, patch));
190
+ return;
191
+ }
192
+ if (!source.includes(needle)) {
193
+ throw new Error(
194
+ `uniswap demo patch failed: expected snippet not found in ${filePath}`
195
+ );
196
+ }
197
+ (0, import_node_fs.writeFileSync)(filePath, source.replace(needle, `${needle}${patch}`));
198
+ };
199
+ patchWithMigration(
200
+ UNISWAP_FORCE_UPGRADE_HOOK_FILE,
201
+ hookNeedle,
202
+ hookPatch,
203
+ hookLegacyPatch
204
+ );
205
+ patchWithMigration(
206
+ UNISWAP_FORCE_UPGRADE_NOTIFICATION_FILE,
207
+ notificationNeedle,
208
+ notificationPatch,
209
+ notificationLegacyPatch
210
+ );
211
+ }
212
+ function ensureJoplinWatchmanConfigs() {
213
+ if (!(0, import_node_fs.existsSync)(JOPLIN_DIR)) return;
214
+ for (const rel of JOPLIN_WATCH_ROOTS) {
215
+ const dir = (0, import_node_path2.join)(JOPLIN_DIR, rel);
216
+ if (!(0, import_node_fs.existsSync)(dir)) continue;
217
+ const cfg = (0, import_node_path2.join)(dir, ".watchmanconfig");
218
+ if (!(0, import_node_fs.existsSync)(cfg)) (0, import_node_fs.writeFileSync)(cfg, "{}\n");
219
+ }
220
+ }
221
+ function ensureJoplinBuilt() {
222
+ if (!(0, import_node_fs.existsSync)(JOPLIN_DIR)) return;
223
+ const missing = JOPLIN_BUILD_SENTINELS.filter(
224
+ (rel) => !(0, import_node_fs.existsSync)((0, import_node_path2.join)(JOPLIN_DIR, rel))
225
+ );
226
+ if (missing.length === 0) return;
227
+ const { execSync } = require("node:child_process");
228
+ execSync("yarn buildParallel", {
229
+ cwd: JOPLIN_DIR,
230
+ stdio: "inherit",
231
+ env: { ...process.env, NO_FLIPPER: "1", CI: "" }
232
+ });
233
+ const stillMissing = JOPLIN_BUILD_SENTINELS.filter(
234
+ (rel) => !(0, import_node_fs.existsSync)((0, import_node_path2.join)(JOPLIN_DIR, rel))
235
+ );
236
+ if (stillMissing.length > 0) {
237
+ throw new Error(
238
+ `joplin demo: yarn buildParallel did not produce: ${stillMissing.join(", ")}`
239
+ );
240
+ }
241
+ }
242
+ function runRainbowSetupCommand(command, cwd) {
243
+ const { execSync } = require("node:child_process");
244
+ execSync(command, {
245
+ cwd,
246
+ stdio: "inherit",
247
+ env: {
248
+ ...process.env,
249
+ METADATA_BASE_URL: RAINBOW_METADATA_BASE_URL,
250
+ RAINBOW_RELAY_QUOTE_SIGNER: process.env.RAINBOW_RELAY_QUOTE_SIGNER ?? RAINBOW_DEMO_QUOTE_SIGNER
251
+ }
252
+ });
253
+ }
254
+ function ensureRainbowGraphqlConfig() {
255
+ if (!(0, import_node_fs.existsSync)(RAINBOW_GRAPHQL_DIR)) return;
256
+ const source = (0, import_node_fs.existsSync)(RAINBOW_GRAPHQL_CONFIG_FILE) ? (0, import_node_fs.readFileSync)(RAINBOW_GRAPHQL_CONFIG_FILE, "utf8") : "";
257
+ if (source.includes(RAINBOW_PUBLIC_ENS_GRAPHQL_URL) && source.includes(RAINBOW_METADATA_BASE_URL)) {
258
+ return;
259
+ }
260
+ (0, import_node_fs.writeFileSync)(
261
+ RAINBOW_GRAPHQL_CONFIG_FILE,
262
+ `exports.config = {
263
+ ens: {
264
+ __name: 'ens',
265
+ document: './queries/ens.graphql',
266
+ schema: {
267
+ method: 'POST',
268
+ url: '${RAINBOW_PUBLIC_ENS_GRAPHQL_URL}',
269
+ },
270
+ },
271
+ metadata: {
272
+ __name: 'metadata',
273
+ document: './queries/metadata.graphql',
274
+ schema: { method: 'GET', url: '${RAINBOW_METADATA_BASE_URL}/v1/graph' },
275
+ },
276
+ metadataPOST: {
277
+ __name: 'metadataPOST',
278
+ document: './queries/metadata.graphql',
279
+ schema: { method: 'POST', url: '${RAINBOW_METADATA_BASE_URL}/v1/graph' },
280
+ },
281
+ arc: {
282
+ __name: 'arc',
283
+ document: './queries/arc.graphql',
284
+ schema: {
285
+ method: 'GET',
286
+ url: 'https://arc-graphql.rainbow.me/graphql',
287
+ headers: {
288
+ 'x-api-key': 'ARC_GRAPHQL_API_KEY',
289
+ },
290
+ },
291
+ },
292
+ arcDev: {
293
+ __name: 'arcDev',
294
+ document: './queries/arc.graphql',
295
+ schema: {
296
+ method: 'GET',
297
+ url: 'https://arc-graphql.rainbowdotme.workers.dev/graphql',
298
+ headers: {},
299
+ },
300
+ },
301
+ };
302
+ `
303
+ );
304
+ }
305
+ function resolveRainbowDemoEnv() {
306
+ const env = {
307
+ ENABLE_DEV_MODE: "1",
308
+ IS_TESTING: "false",
309
+ METADATA_BASE_URL: process.env.RAINBOW_METADATA_BASE_URL ?? RAINBOW_DEMO_METADATA_BASE_URL,
310
+ ADDYS_API_KEY: process.env.ADDYS_API_KEY ?? RAINBOW_DEMO_SERVICE_API_KEY,
311
+ ADDYS_BASE_URL: process.env.ADDYS_BASE_URL ?? RAINBOW_DEMO_METADATA_BASE_URL,
312
+ PLATFORM_API_KEY: process.env.PLATFORM_API_KEY ?? RAINBOW_DEMO_SERVICE_API_KEY,
313
+ PLATFORM_BASE_URL: process.env.PLATFORM_BASE_URL ?? RAINBOW_DEMO_METADATA_BASE_URL,
314
+ RAINBOW_MASTER_KEY: process.env.RAINBOW_MASTER_KEY ?? RAINBOW_DEMO_MASTER_KEY,
315
+ RAINBOW_RELAY_QUOTE_SIGNER: process.env.RAINBOW_RELAY_QUOTE_SIGNER ?? RAINBOW_DEMO_QUOTE_SIGNER,
316
+ RAINBOW_RELAY_URL: process.env.RAINBOW_RELAY_URL ?? RAINBOW_DEMO_RELAY_URL,
317
+ RPC_PROXY_API_KEY_PROD: RAINBOW_DEMO_RPC_API_KEY,
318
+ 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,
319
+ SECURE_WALLET_HASH_KEY: process.env.SECURE_WALLET_HASH_KEY ?? RAINBOW_DEMO_SECURE_WALLET_HASH_KEY,
320
+ WC_PROJECT_ID: process.env.WC_PROJECT_ID ?? process.env.RAINBOW_WALLETCONNECT_PROJECT_ID ?? RAINBOW_DEMO_WALLETCONNECT_PROJECT_ID
321
+ };
322
+ const optionalEnvVars = [
323
+ "ADDYS_API_KEY",
324
+ "ADDYS_BASE_URL",
325
+ "IMGIX_DOMAIN",
326
+ "IMGIX_TOKEN",
327
+ "PLATFORM_API_KEY",
328
+ "PLATFORM_BASE_URL",
329
+ "RAINBOW_TEST_WALLET",
330
+ "RAINBOW_RELAY_API_KEY",
331
+ "RAINBOW_RELAY_URL",
332
+ "SECURE_WALLET_HASH_KEY",
333
+ "TOKEN_SEARCH_URL"
334
+ ];
335
+ for (const key of optionalEnvVars) {
336
+ const value = process.env[key];
337
+ if (value) env[key] = value;
338
+ }
339
+ return env;
340
+ }
341
+ function ensureRainbowDemoNetworks() {
342
+ if (!(0, import_node_fs.existsSync)(RAINBOW_NETWORKS_FILE)) return;
343
+ const payload = JSON.parse((0, import_node_fs.readFileSync)(RAINBOW_NETWORKS_FILE, "utf8"));
344
+ if (!Array.isArray(payload.networks)) return;
345
+ let changed = false;
346
+ for (const network of payload.networks) {
347
+ const url = network.id ? RAINBOW_DEMO_PUBLIC_RPC_URLS[network.id] : void 0;
348
+ if (!url || !network.defaultRPC) continue;
349
+ if (network.defaultRPC.url === url) continue;
350
+ network.defaultRPC.url = url;
351
+ changed = true;
352
+ }
353
+ if (changed) {
354
+ (0, import_node_fs.writeFileSync)(RAINBOW_NETWORKS_FILE, `${JSON.stringify(payload)}
355
+ `);
356
+ }
357
+ }
358
+ function ensureRainbowSetup() {
359
+ if (!(0, import_node_fs.existsSync)(RAINBOW_DIR)) return;
360
+ ensureRainbowGraphqlConfig();
361
+ if (!(0, import_node_fs.existsSync)((0, import_node_path2.join)(RAINBOW_GRAPHQL_DIR, "node_modules/.bin/graphql-codegen"))) {
362
+ runRainbowSetupCommand("fnm exec --using=22 yarn install", RAINBOW_GRAPHQL_DIR);
363
+ }
364
+ const missingGraphql = RAINBOW_GRAPHQL_SENTINELS.some(
365
+ (rel) => !(0, import_node_fs.existsSync)((0, import_node_path2.join)(RAINBOW_DIR, rel))
366
+ );
367
+ if (missingGraphql) {
368
+ runRainbowSetupCommand("fnm exec --using=22 yarn codegen", RAINBOW_GRAPHQL_DIR);
369
+ }
370
+ if (!(0, import_node_fs.existsSync)(RAINBOW_NETWORKS_FILE)) {
371
+ runRainbowSetupCommand("fnm exec --using=22 yarn fetch:networks", RAINBOW_DIR);
372
+ }
373
+ ensureRainbowDemoNetworks();
374
+ }
375
+ function readArtsyKeysPayload() {
376
+ if (!(0, import_node_fs.existsSync)(ARTSY_KEYS_FILE)) return void 0;
377
+ try {
378
+ const parsed = JSON.parse((0, import_node_fs.readFileSync)(ARTSY_KEYS_FILE, "utf8"));
379
+ if (!parsed || typeof parsed !== "object") return void 0;
380
+ const secure = parsed.secure && typeof parsed.secure === "object" ? parsed.secure : void 0;
381
+ const publicKeys = parsed.public && typeof parsed.public === "object" ? parsed.public : void 0;
382
+ if (!secure && !publicKeys) return void 0;
383
+ return { secure, public: publicKeys };
384
+ } catch {
385
+ return void 0;
386
+ }
387
+ }
388
+ function resolveArtsyRuntimeConfig() {
389
+ const email = process.env.SOOTSIM_ARTSY_EMAIL ?? process.env.MAESTRO_TEST_EMAIL;
390
+ const password = process.env.SOOTSIM_ARTSY_PASSWORD ?? process.env.MAESTRO_TEST_PASSWORD;
391
+ const keys = readArtsyKeysPayload();
392
+ const env = {};
393
+ if (email && password) {
394
+ env.SOOTSIM_LAUNCH_ARGUMENTS = JSON.stringify({
395
+ email,
396
+ password,
397
+ useMaestroInit: true
398
+ });
399
+ }
400
+ if (keys) {
401
+ env.SOOTSIM_REACT_NATIVE_KEYS_JSON = JSON.stringify(keys);
402
+ }
403
+ if (Object.keys(env).length === 0) return void 0;
404
+ return {
405
+ env
406
+ };
407
+ }
408
+ function ensureArtsySetup() {
409
+ if (!(0, import_node_fs.existsSync)(ARTSY_DIR)) return;
410
+ const { execSync } = require("node:child_process");
411
+ const yarnRelease = (0, import_node_path2.join)(ARTSY_DIR, ".yarn/releases/yarn-4.10.3.cjs");
412
+ if ((0, import_node_fs.existsSync)(yarnRelease)) {
413
+ const src = (0, import_node_fs.readFileSync)(yarnRelease, "utf8");
414
+ const needle = '["clone","-c core.autocrlf=false",';
415
+ if (src.includes(needle)) {
416
+ (0, import_node_fs.writeFileSync)(
417
+ yarnRelease,
418
+ src.replace(needle, '["clone","-c","core.autocrlf=false",')
419
+ );
420
+ }
421
+ }
422
+ if (!(0, import_node_fs.existsSync)((0, import_node_path2.join)(ARTSY_DIR, "node_modules/.yarn-state.yml"))) {
423
+ execSync("yarn install", {
424
+ cwd: ARTSY_DIR,
425
+ stdio: "inherit",
426
+ env: { ...process.env, YARN_CHECKSUM_BEHAVIOR: "update" }
427
+ });
428
+ }
429
+ if (!(0, import_node_fs.existsSync)(ARTSY_KEYS_FILE) || !(0, import_node_fs.existsSync)(ARTSY_METAFLAGS_FILE)) {
430
+ try {
431
+ execSync("yarn setup:oss", { cwd: ARTSY_DIR, stdio: "inherit" });
432
+ } catch {
433
+ if (!(0, import_node_fs.existsSync)(ARTSY_KEYS_FILE) || !(0, import_node_fs.existsSync)(ARTSY_METAFLAGS_FILE)) {
434
+ throw new Error("artsy demo: setup:oss did not create keys/metaflags");
435
+ }
436
+ }
437
+ }
438
+ const rnlaPkgJson = (0, import_node_path2.join)(
439
+ ARTSY_DIR,
440
+ "node_modules/react-native-launch-arguments/package.json"
441
+ );
442
+ if ((0, import_node_fs.existsSync)(rnlaPkgJson)) {
443
+ const raw = (0, import_node_fs.readFileSync)(rnlaPkgJson, "utf8");
444
+ if (raw.includes('"dist/index.js"')) {
445
+ (0, import_node_fs.writeFileSync)(rnlaPkgJson, raw.replace('"dist/index.js"', '"src/index.ts"'));
446
+ }
447
+ }
448
+ if (!(0, import_node_fs.existsSync)(ARTSY_RELAY_SENTINEL)) {
449
+ execSync("yarn relay", { cwd: ARTSY_DIR, stdio: "inherit" });
450
+ (0, import_node_fs.writeFileSync)(ARTSY_RELAY_SENTINEL, "");
451
+ }
452
+ }
453
+ var import_node_fs, import_node_os2, import_node_path2, HOME, getExpensifyProxyScript, getRainbowMetadataProxyScript, getMattermostRNUtilsNativeModule, getMattermostKeychainNativeModule, getMattermostNetworkClientNativeModule, getMattermostPreviewServerScript, EXPENSIFY_NATIVE_PROXY_ENV, MATTERMOST_DIR, UNISWAP_REPO_DIR, UNISWAP_APP_DIR, UNISWAP_ENV_LOCAL_FILE, UNISWAP_PLACEHOLDER, UNISWAP_DEMO_ENV_MARKER, UNISWAP_FORCE_UPGRADE_HOOK_FILE, UNISWAP_FORCE_UPGRADE_NOTIFICATION_FILE, UNISWAP_FORCE_UPGRADE_PATCH_MARKER, JOPLIN_DIR, JOPLIN_APP_DIR, JOPLIN_WATCH_ROOTS, JOPLIN_BUILD_SENTINELS, RAINBOW_DIR, RAINBOW_GRAPHQL_DIR, RAINBOW_GRAPHQL_CONFIG_FILE, RAINBOW_NETWORKS_FILE, RAINBOW_METADATA_BASE_URL, RAINBOW_METADATA_PROXY_PORT, RAINBOW_DEMO_METADATA_BASE_URL, RAINBOW_PUBLIC_ENS_GRAPHQL_URL, RAINBOW_DEMO_QUOTE_SIGNER, RAINBOW_DEMO_RELAY_URL, RAINBOW_DEMO_MASTER_KEY, RAINBOW_DEMO_RPC_PROXY_BASE_URL, RAINBOW_DEMO_RPC_API_KEY, RAINBOW_DEMO_PUBLIC_RPC_URLS, RAINBOW_DEMO_SERVICE_API_KEY, RAINBOW_DEMO_SECURE_WALLET_HASH_KEY, RAINBOW_DEMO_WALLETCONNECT_PROJECT_ID, RAINBOW_GRAPHQL_SENTINELS, ARTSY_DIR, ARTSY_KEYS_FILE, ARTSY_METAFLAGS_FILE, ARTSY_RELAY_SENTINEL, APPS;
454
+ var init_demo_app_registry = __esm({
455
+ "scripts/demo-app-registry.ts"() {
456
+ "use strict";
457
+ import_node_fs = require("node:fs");
458
+ import_node_os2 = require("node:os");
459
+ import_node_path2 = require("node:path");
460
+ HOME = (0, import_node_os2.homedir)();
461
+ getExpensifyProxyScript = () => resolveWorkspaceScriptPath(
462
+ "packages/sootsim-engine/scripts/expensify-web-proxy.ts",
463
+ "scripts/expensify-web-proxy.ts"
464
+ );
465
+ getRainbowMetadataProxyScript = () => resolveWorkspaceScriptPath(
466
+ "packages/sootsim-engine/scripts/rainbow-metadata-proxy.ts",
467
+ "scripts/rainbow-metadata-proxy.ts"
468
+ );
469
+ getMattermostRNUtilsNativeModule = () => resolveWorkspaceScriptPath(
470
+ "packages/compat/src/stubs/mattermost-rnutils-native.ts",
471
+ "../compat/src/stubs/mattermost-rnutils-native.ts"
472
+ );
473
+ getMattermostKeychainNativeModule = () => resolveWorkspaceScriptPath(
474
+ "packages/compat/src/stubs/native-seams/react-native-keychain-manager.ts",
475
+ "../compat/src/stubs/native-seams/react-native-keychain-manager.ts"
476
+ );
477
+ getMattermostNetworkClientNativeModule = () => resolveWorkspaceScriptPath(
478
+ "packages/compat/src/stubs/mattermost-network-client-native.ts",
479
+ "../compat/src/stubs/mattermost-network-client-native.ts"
480
+ );
481
+ getMattermostPreviewServerScript = () => resolveWorkspaceScriptPath(
482
+ "packages/sootsim-engine/scripts/mattermost-preview-server.ts",
483
+ "scripts/mattermost-preview-server.ts"
484
+ );
485
+ EXPENSIFY_NATIVE_PROXY_ENV = {
486
+ USE_NGROK: "true",
487
+ NGROK_URL: "http://localhost:9000/",
488
+ SECURE_NGROK_URL: "http://localhost:9000/"
489
+ };
490
+ MATTERMOST_DIR = (0, import_node_path2.join)(HOME, "github/mattermost-mobile");
491
+ UNISWAP_REPO_DIR = (0, import_node_path2.join)(HOME, "github/uniswap-interface");
492
+ UNISWAP_APP_DIR = (0, import_node_path2.join)(UNISWAP_REPO_DIR, "apps/mobile");
493
+ UNISWAP_ENV_LOCAL_FILE = (0, import_node_path2.join)(UNISWAP_REPO_DIR, ".env.defaults.local");
494
+ UNISWAP_PLACEHOLDER = "stored-in-.env.local";
495
+ UNISWAP_DEMO_ENV_MARKER = "# sootsim demo env overrides";
496
+ UNISWAP_FORCE_UPGRADE_HOOK_FILE = (0, import_node_path2.join)(
497
+ UNISWAP_REPO_DIR,
498
+ "packages/uniswap/src/features/forceUpgrade/hooks/useForceUpgradeStatus.ts"
499
+ );
500
+ UNISWAP_FORCE_UPGRADE_NOTIFICATION_FILE = (0, import_node_path2.join)(
501
+ UNISWAP_REPO_DIR,
502
+ "apps/mobile/src/notification-service/data-sources/createForceUpgradeNotificationDataSource.ts"
503
+ );
504
+ UNISWAP_FORCE_UPGRADE_PATCH_MARKER = "SOOTSIM_DEMO_DISABLE_FORCE_UPGRADE";
505
+ JOPLIN_DIR = (0, import_node_path2.join)(HOME, "github/joplin");
506
+ JOPLIN_APP_DIR = (0, import_node_path2.join)(JOPLIN_DIR, "packages/app-mobile");
507
+ JOPLIN_WATCH_ROOTS = [
508
+ "packages/lib",
509
+ "packages/renderer",
510
+ "packages/turndown",
511
+ "packages/turndown-plugin-gfm",
512
+ "packages/editor",
513
+ "packages/tools",
514
+ "packages/utils",
515
+ "packages/fork-htmlparser2",
516
+ "packages/fork-uslug",
517
+ "packages/fork-sax",
518
+ "packages/htmlpack",
519
+ "packages/react-native-saf-x",
520
+ "packages/react-native-alarm-notification"
521
+ ];
522
+ JOPLIN_BUILD_SENTINELS = [
523
+ "packages/lib/models/Setting.js",
524
+ "packages/turndown/lib/turndown.cjs.js",
525
+ "packages/app-mobile/pluginAssets/index.js"
526
+ ];
527
+ RAINBOW_DIR = (0, import_node_path2.join)(HOME, "github/rainbow");
528
+ RAINBOW_GRAPHQL_DIR = (0, import_node_path2.join)(RAINBOW_DIR, "src/graphql");
529
+ RAINBOW_GRAPHQL_CONFIG_FILE = (0, import_node_path2.join)(RAINBOW_GRAPHQL_DIR, "config.js");
530
+ RAINBOW_NETWORKS_FILE = (0, import_node_path2.join)(RAINBOW_DIR, "src/references/networks.json");
531
+ RAINBOW_METADATA_BASE_URL = "https://metadata.p.rainbow.me";
532
+ RAINBOW_METADATA_PROXY_PORT = 9011;
533
+ RAINBOW_DEMO_METADATA_BASE_URL = `http://127.0.0.1:${RAINBOW_METADATA_PROXY_PORT}`;
534
+ RAINBOW_PUBLIC_ENS_GRAPHQL_URL = "https://api.thegraph.com/subgraphs/name/ensdomains/ens";
535
+ RAINBOW_DEMO_QUOTE_SIGNER = "0x0000000000000000000000000000000000000000";
536
+ RAINBOW_DEMO_RELAY_URL = "https://relay.rainbow.me";
537
+ RAINBOW_DEMO_MASTER_KEY = "sootsim-rainbow-demo-master-key-do-not-use-for-real-wallets";
538
+ RAINBOW_DEMO_RPC_PROXY_BASE_URL = "https://rpc.rainbow.me/v1";
539
+ RAINBOW_DEMO_RPC_API_KEY = "";
540
+ RAINBOW_DEMO_PUBLIC_RPC_URLS = {
541
+ "1": "https://ethereum-rpc.publicnode.com"
542
+ };
543
+ RAINBOW_DEMO_SERVICE_API_KEY = "sootsim-rainbow-demo-api-key";
544
+ RAINBOW_DEMO_SECURE_WALLET_HASH_KEY = "0x736f6f7473696d2d7261696e626f772d64656d6f2d686173682d6b6579000000";
545
+ RAINBOW_DEMO_WALLETCONNECT_PROJECT_ID = "00000000000000000000000000000000";
546
+ RAINBOW_GRAPHQL_SENTINELS = [
547
+ "src/graphql/__generated__/ens.ts",
548
+ "src/graphql/__generated__/metadata.ts",
549
+ "src/graphql/__generated__/metadataPOST.ts"
550
+ ];
551
+ ARTSY_DIR = (0, import_node_path2.join)(HOME, "github/eigen");
552
+ ARTSY_KEYS_FILE = (0, import_node_path2.join)(ARTSY_DIR, "keys.shared.json");
553
+ ARTSY_METAFLAGS_FILE = (0, import_node_path2.join)(ARTSY_DIR, "metaflags.json");
554
+ ARTSY_RELAY_SENTINEL = (0, import_node_path2.join)(ARTSY_DIR, "src/__generated__/.relay-complete");
555
+ APPS = [
556
+ {
557
+ name: "bluesky",
558
+ label: "Bluesky",
559
+ dir: (0, import_node_path2.join)(HOME, "github/bluesky"),
560
+ preferredPort: 8082,
561
+ framework: "expo",
562
+ command: (p) => ({ cmd: `npx expo start --port ${p}` }),
563
+ credentials: {
564
+ envVars: ["SOOTSIM_BLUESKY_PASSWORD"],
565
+ known: { HANDLE: "natew.bsky.social" }
566
+ }
567
+ },
568
+ {
569
+ name: "3pc",
570
+ label: "3PunchConvo",
571
+ dir: (0, import_node_path2.join)(HOME, "lightstrike-labs/three-punch-convo-app/apps/one"),
572
+ preferredPort: 8081,
573
+ framework: "one",
574
+ command: (p) => ({ cmd: "npx one dev", env: { ONE_PORT: String(p) } })
575
+ },
576
+ {
577
+ name: "uniswap",
578
+ label: "Uniswap",
579
+ dir: UNISWAP_APP_DIR,
580
+ preferredPort: 8085,
581
+ framework: "expo",
582
+ prepare: () => {
583
+ ensureUniswapDemoEnvLocal();
584
+ ensureUniswapForceUpgradePatched();
585
+ },
586
+ command: (p) => ({
587
+ cmd: `npx expo start --clear --port ${p}`,
588
+ // prefer the real local mobile env when present, otherwise fall back
589
+ // to Uniswap's checked-in public web RPC settings so demo boots cleanly.
590
+ env: resolveUniswapDemoEnv()
591
+ })
592
+ },
593
+ {
594
+ name: "takeout",
595
+ label: "Takeout",
596
+ dir: (0, import_node_path2.join)(HOME, "takeout"),
597
+ preferredPort: 8086,
598
+ framework: "one",
599
+ // takeout needs more than Metro for the demo to actually work: better-auth
600
+ // (login), zero-cache (sync), and a postgres for both. `bun lite` brings
601
+ // up the orez-backed stack (PG + zero + s3 in one binary) plus the One
602
+ // dev server. takeout's env system shifts every port (web, pg, zero,
603
+ // minio) uniformly by PORT_OFFSET, so we derive offset = port - 8081
604
+ // (the base web port) to keep all backend ports clear of the default
605
+ // dev stack while pinning One to the demo slot. OREZ_DATA_DIR is isolated
606
+ // to a per-demo path so we don't fight a soot dev orez that may already
607
+ // be holding pglite locks on ~/takeout/.orez (soot can attach takeout as
608
+ // a project and spin up its own orez against the same data dir).
609
+ readyTimeoutMs: 24e4,
610
+ managedPorts: (p) => {
611
+ const offset = p - 8081;
612
+ return [5433 + offset, 4848 + offset, 9200 + offset];
613
+ },
614
+ command: (p) => ({
615
+ cmd: "bun lite:demo",
616
+ env: {
617
+ TAKEOUT_ENV_MODE: "development",
618
+ PORT_OFFSET: String(p - 8081),
619
+ OREZ_DATA_DIR: `${HOME}/.cache/sootsim-demo/takeout-orez`,
620
+ VITE_DEMO_MODE: "1",
621
+ ZERO_APP_ID: "takeout",
622
+ ZERO_APP_PUBLICATIONS: "zero_takeout",
623
+ ZERO_CVR_MAX_CONNS: "4",
624
+ ZERO_NUM_SYNC_WORKERS: "2",
625
+ ZERO_UPSTREAM_MAX_CONNS: "8"
626
+ }
627
+ })
628
+ },
629
+ {
630
+ name: "expensify",
631
+ label: "Expensify",
632
+ dir: (0, import_node_path2.join)(HOME, "github/expensify"),
633
+ preferredPort: 8087,
634
+ framework: "rock",
635
+ runtimeConfig: {
636
+ env: EXPENSIFY_NATIVE_PROXY_ENV
637
+ },
638
+ sidecars: [
639
+ {
640
+ name: "web-proxy",
641
+ port: 9e3,
642
+ readyPath: "/api/Ping",
643
+ command: () => ({
644
+ cmd: `bun ${JSON.stringify(getExpensifyProxyScript())}`,
645
+ env: EXPENSIFY_NATIVE_PROXY_ENV
646
+ })
647
+ }
648
+ ],
649
+ command: (p) => ({
650
+ cmd: `fnm exec --using=20.20.0 npx rock start --port ${p} --no-interactive`,
651
+ env: EXPENSIFY_NATIVE_PROXY_ENV
652
+ })
653
+ },
654
+ {
655
+ name: "artsy",
656
+ label: "Artsy",
657
+ dir: ARTSY_DIR,
658
+ preferredPort: 8088,
659
+ framework: "expo",
660
+ runtimeConfig: resolveArtsyRuntimeConfig(),
661
+ prepare: () => {
662
+ ensureArtsySetup();
663
+ },
664
+ command: (p) => ({
665
+ // eigen's `yarn start` wraps `react-native start` with a relay watcher
666
+ // via concurrently; for the demo we run relay once in prepare and
667
+ // invoke the metro server directly so --port is respected.
668
+ cmd: `npx react-native start --port ${p}`
669
+ }),
670
+ credentials: {
671
+ envVars: ["SOOTSIM_ARTSY_EMAIL", "SOOTSIM_ARTSY_PASSWORD"],
672
+ note: "auto-login reuses Artsy\u2019s built-in Maestro launch-arguments hook"
673
+ }
674
+ },
675
+ {
676
+ name: "rainbow",
677
+ label: "Rainbow",
678
+ dir: RAINBOW_DIR,
679
+ preferredPort: 8089,
680
+ framework: "rock",
681
+ sidecars: [
682
+ {
683
+ name: "metadata-proxy",
684
+ port: RAINBOW_METADATA_PROXY_PORT,
685
+ readyPath: "/health",
686
+ command: () => ({
687
+ cmd: `bun ${JSON.stringify(getRainbowMetadataProxyScript())}`,
688
+ env: {
689
+ PORT: String(RAINBOW_METADATA_PROXY_PORT),
690
+ RAINBOW_PUBLIC_RPC_URLS: JSON.stringify(RAINBOW_DEMO_PUBLIC_RPC_URLS),
691
+ RAINBOW_UPSTREAM_METADATA_BASE_URL: RAINBOW_METADATA_BASE_URL
692
+ }
693
+ })
694
+ }
695
+ ],
696
+ prepare: () => {
697
+ ensureRainbowSetup();
698
+ },
699
+ command: (p) => ({
700
+ cmd: `fnm exec --using=22 yarn start --port ${p} --reset-cache`,
701
+ env: resolveRainbowDemoEnv()
702
+ }),
703
+ credentials: {
704
+ envVars: ["RAINBOW_TEST_WALLET"],
705
+ optionalEnvVars: [
706
+ "RAINBOW_WALLETCONNECT_PROJECT_ID",
707
+ "WC_PROJECT_ID",
708
+ "IMGIX_DOMAIN",
709
+ "IMGIX_TOKEN"
710
+ ],
711
+ note: "launcher supplies demo encryption, public mainnet RPC, and a placeholder WalletConnect project id; use only a public throwaway mnemonic for RAINBOW_TEST_WALLET"
712
+ }
713
+ },
714
+ {
715
+ name: "rocket-chat",
716
+ label: "Rocket.Chat",
717
+ dir: (0, import_node_path2.join)(HOME, "github/Rocket.Chat.ReactNative"),
718
+ preferredPort: 8093,
719
+ framework: "expo",
720
+ command: (p) => ({
721
+ cmd: `npx react-native start --port ${p}`,
722
+ env: { RUNNING_E2E_TESTS: "true" }
723
+ }),
724
+ credentials: {
725
+ envVars: [
726
+ "ROCKET_CHAT_DEMO_SERVER",
727
+ "ROCKET_CHAT_DEMO_USERNAME",
728
+ "ROCKET_CHAT_DEMO_PASSWORD"
729
+ ],
730
+ known: { SERVER: "https://mobile.qa.rocket.chat" },
731
+ 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"
732
+ }
733
+ },
734
+ {
735
+ name: "mattermost",
736
+ label: "Mattermost",
737
+ dir: MATTERMOST_DIR,
738
+ preferredPort: 8090,
739
+ framework: "expo",
740
+ sidecars: [
741
+ {
742
+ name: "preview-server",
743
+ port: 8065,
744
+ readyPath: "/api/v4/system/ping",
745
+ command: () => ({
746
+ cmd: `bun ${JSON.stringify(getMattermostPreviewServerScript())}`
747
+ })
748
+ }
749
+ ],
750
+ runtimeConfig: {
751
+ modules: {
752
+ // mattermost patches react-native-keychain's JS entry in its own
753
+ // repo; run that package and provide only the native manager seam.
754
+ "react-native-keychain": false,
755
+ "dist/assets/config.json": {
756
+ inline: {
757
+ AuthUrlScheme: "mmauth://",
758
+ AuthUrlSchemeDev: "mmauthbeta://",
759
+ DefaultServerUrl: "http://localhost:8065",
760
+ DefaultServerName: "Mattermost Demo",
761
+ TestServerUrl: "http://localhost:8065",
762
+ AutoSelectServerUrl: true,
763
+ WebsiteURL: "https://mattermost.com",
764
+ ServerNoticeURL: "https://github.com/mattermost/mattermost-server/blob/master/NOTICE.txt",
765
+ MobileNoticeURL: "https://github.com/mattermost/mattermost-mobile/blob/master/NOTICE.txt",
766
+ RudderApiKey: "",
767
+ SentryEnabled: false,
768
+ SentryDsnIos: "",
769
+ SentryDsnAndroid: "",
770
+ SentryOptions: {
771
+ deactivateStacktraceMerging: true,
772
+ autoBreadcrumbs: {
773
+ xhr: false,
774
+ console: true
775
+ },
776
+ severityLevelFilter: ["fatal"]
777
+ },
778
+ ShowReview: false,
779
+ ShowOnboarding: false,
780
+ ExperimentalNormalizeMarkdownLinks: false,
781
+ CustomRequestHeaders: {},
782
+ CollectNetworkMetrics: false
783
+ }
784
+ }
785
+ },
786
+ nativeModules: {
787
+ RNKeychainManager: { file: getMattermostKeychainNativeModule() },
788
+ RNUtils: { file: getMattermostRNUtilsNativeModule() },
789
+ GenericClient: { file: getMattermostNetworkClientNativeModule() },
790
+ ApiClient: { file: getMattermostNetworkClientNativeModule() },
791
+ WebSocketClient: { file: getMattermostNetworkClientNativeModule() }
792
+ }
793
+ },
794
+ command: (p) => ({
795
+ cmd: `npx react-native start --host 127.0.0.1 --port ${p}`
796
+ }),
797
+ credentials: {
798
+ known: {
799
+ SERVER: "http://localhost:8065",
800
+ USERNAME: "demo",
801
+ PASSWORD: "DemoPassword1!"
802
+ },
803
+ note: "local mattermost-preview seeded through the real REST API; no signup or OTP needed"
804
+ }
805
+ },
806
+ {
807
+ name: "joplin",
808
+ label: "Joplin",
809
+ dir: JOPLIN_APP_DIR,
810
+ preferredPort: 8084,
811
+ framework: "expo",
812
+ // joplin is local-first: sync.target defaults to 0 ("None") and the
813
+ // mobile startup runs WelcomeUtils.install() on first launch, which
814
+ // seeds a "Welcome!" folder + welcome notes. no login or external
815
+ // credentials are needed for a usable demo — just boot it. tenant
816
+ // bedrock SQLite (via react-native-sqlite-storage stub) carries the
817
+ // seeded notes across reloads.
818
+ prepare: () => {
819
+ ensureJoplinWatchmanConfigs();
820
+ ensureJoplinBuilt();
821
+ },
822
+ command: (p) => ({
823
+ cmd: `npx expo start --port ${p}`,
824
+ env: { BROWSERSLIST_IGNORE_OLD_DATA: "true" }
825
+ }),
826
+ credentials: {
827
+ note: "no login required \u2014 sync.target=0 (None), seed via WelcomeUtils"
828
+ }
829
+ }
830
+ ];
831
+ }
832
+ });
833
+
32
834
  // src/attached-projects.ts
33
835
  var attached_projects_exports = {};
34
836
  __export(attached_projects_exports, {
@@ -58,8 +860,8 @@ __export(attached_projects_exports, {
58
860
  });
59
861
  module.exports = __toCommonJS(attached_projects_exports);
60
862
  var import_node_crypto = require("node:crypto");
61
- var import_node_fs = __toESM(require("node:fs"), 1);
62
- var import_node_path2 = __toESM(require("node:path"), 1);
863
+ var import_node_fs2 = __toESM(require("node:fs"), 1);
864
+ var import_node_path3 = __toESM(require("node:path"), 1);
63
865
 
64
866
  // src/home-paths.ts
65
867
  var import_node_os = require("node:os");
@@ -94,7 +896,7 @@ function getUserDataDir() {
94
896
  return userDataDir();
95
897
  }
96
898
  function storeFile() {
97
- return import_node_path2.default.join(userDataDir(), "attached-projects.json");
899
+ return import_node_path3.default.join(userDataDir(), "attached-projects.json");
98
900
  }
99
901
  function cloneEmpty() {
100
902
  return {
@@ -108,7 +910,7 @@ function loadStore() {
108
910
  const file = storeFile();
109
911
  let raw;
110
912
  try {
111
- raw = import_node_fs.default.readFileSync(file, "utf8");
913
+ raw = import_node_fs2.default.readFileSync(file, "utf8");
112
914
  } catch (err) {
113
915
  if (err.code === "ENOENT") return cloneEmpty();
114
916
  throw err;
@@ -125,7 +927,7 @@ function loadStore() {
125
927
  } catch (err) {
126
928
  const quarantine = `${file}.corrupt-${Date.now()}`;
127
929
  try {
128
- import_node_fs.default.renameSync(file, quarantine);
930
+ import_node_fs2.default.renameSync(file, quarantine);
129
931
  console.warn(
130
932
  `[sootsim] attached-projects.json was unparseable; quarantined to ${quarantine}. original error: ${err.message}`
131
933
  );
@@ -136,16 +938,16 @@ function loadStore() {
136
938
  }
137
939
  function writeStore(store) {
138
940
  const file = storeFile();
139
- import_node_fs.default.mkdirSync(import_node_path2.default.dirname(file), { recursive: true });
941
+ import_node_fs2.default.mkdirSync(import_node_path3.default.dirname(file), { recursive: true });
140
942
  const tmp = `${file}.tmp-${process.pid}-${Date.now()}`;
141
- const fd = import_node_fs.default.openSync(tmp, "w", 384);
943
+ const fd = import_node_fs2.default.openSync(tmp, "w", 384);
142
944
  try {
143
- import_node_fs.default.writeFileSync(fd, JSON.stringify(store, null, 2));
144
- import_node_fs.default.fsyncSync(fd);
945
+ import_node_fs2.default.writeFileSync(fd, JSON.stringify(store, null, 2));
946
+ import_node_fs2.default.fsyncSync(fd);
145
947
  } finally {
146
- import_node_fs.default.closeSync(fd);
948
+ import_node_fs2.default.closeSync(fd);
147
949
  }
148
- import_node_fs.default.renameSync(tmp, file);
950
+ import_node_fs2.default.renameSync(tmp, file);
149
951
  }
150
952
  function mutateStore(fn) {
151
953
  const store = loadStore();
@@ -154,7 +956,7 @@ function mutateStore(fn) {
154
956
  return store;
155
957
  }
156
958
  function projectIdForCwd(cwd) {
157
- return (0, import_node_crypto.createHash)("sha256").update(import_node_path2.default.resolve(cwd)).digest("hex").slice(0, 16);
959
+ return (0, import_node_crypto.createHash)("sha256").update(import_node_path3.default.resolve(cwd)).digest("hex").slice(0, 16);
158
960
  }
159
961
  function newSessionId() {
160
962
  return `s_${(0, import_node_crypto.randomBytes)(10).toString("hex")}`;
@@ -163,7 +965,7 @@ function newPreviewId() {
163
965
  return `pa_${(0, import_node_crypto.randomBytes)(10).toString("hex")}`;
164
966
  }
165
967
  function upsertProject(input) {
166
- const cwd = import_node_path2.default.resolve(input.cwd);
968
+ const cwd = import_node_path3.default.resolve(input.cwd);
167
969
  const id = projectIdForCwd(cwd);
168
970
  let result;
169
971
  mutateStore((store) => {
@@ -189,7 +991,7 @@ function upsertProject(input) {
189
991
  const now = Date.now();
190
992
  const created = {
191
993
  id,
192
- name: input.name ?? import_node_path2.default.basename(cwd),
994
+ name: input.name ?? import_node_path3.default.basename(cwd),
193
995
  cwd,
194
996
  repoRoot: input.repoRoot,
195
997
  sourceRoots: input.sourceRoots ?? [cwd],
@@ -216,7 +1018,7 @@ function findProjectById(id) {
216
1018
  return loadStore().attachedProjects.find((p) => p.id === id) ?? null;
217
1019
  }
218
1020
  function findProjectByCwd(cwd) {
219
- const resolved = import_node_path2.default.resolve(cwd);
1021
+ const resolved = import_node_path3.default.resolve(cwd);
220
1022
  return loadStore().attachedProjects.find((p) => p.cwd === resolved) ?? null;
221
1023
  }
222
1024
  function findProjectByBundleUrl(bundleUrl) {
@@ -385,10 +1187,10 @@ function deletePreviewAttachment(id) {
385
1187
  async function seedFromDemoAppRegistry() {
386
1188
  const existing = loadStore().attachedProjects;
387
1189
  if (existing.length > 0) return;
388
- let APPS;
1190
+ let APPS2;
389
1191
  try {
390
- const mod = await import("sootsim/scripts/demo-app-registry");
391
- APPS = mod.APPS;
1192
+ const mod = await Promise.resolve().then(() => (init_demo_app_registry(), demo_app_registry_exports));
1193
+ APPS2 = mod.APPS;
392
1194
  } catch (err) {
393
1195
  console.warn(
394
1196
  "[sootsim] seedFromDemoAppRegistry: could not load demo registry:",
@@ -396,12 +1198,12 @@ async function seedFromDemoAppRegistry() {
396
1198
  );
397
1199
  return;
398
1200
  }
399
- if (!Array.isArray(APPS)) return;
400
- const apps = APPS;
1201
+ if (!Array.isArray(APPS2)) return;
1202
+ const apps = APPS2;
401
1203
  mutateStore((store) => {
402
1204
  for (const app of apps) {
403
- if (!import_node_fs.default.existsSync(app.dir)) continue;
404
- const cwd = import_node_path2.default.resolve(app.dir);
1205
+ if (!import_node_fs2.default.existsSync(app.dir)) continue;
1206
+ const cwd = import_node_path3.default.resolve(app.dir);
405
1207
  const id = projectIdForCwd(cwd);
406
1208
  if (store.attachedProjects.some((p) => p.id === id)) continue;
407
1209
  const now = Date.now();