@deeeed/metamask-harness 0.79.0 → 0.81.0

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 (252) hide show
  1. package/CHANGELOG.md +73 -0
  2. package/README.md +1 -1
  3. package/adapters/extension/ensure-browser.sh +2 -2
  4. package/adapters/extension/inject.mjs +0 -1
  5. package/adapters/extension/launch-browser.cjs +39 -613
  6. package/adapters/extension/readiness.mjs +2 -5
  7. package/adapters/extension/reattach.sh +2 -2
  8. package/adapters/extension/stamp-runtime-title.cjs +1 -1
  9. package/adapters/manifest.json +16 -64
  10. package/adapters/mobile/bridge-runtime/cdp-bridge.cjs +57 -1358
  11. package/adapters/mobile/bridge-runtime/teaching.cjs +20 -0
  12. package/adapters/mobile/inject.sh +16 -0
  13. package/adapters/mobile/launch-console-forwarder.cjs +1 -2
  14. package/adapters/mobile/open-device.sh +2 -2
  15. package/adapters/mobile/reload-app.mjs +4 -4
  16. package/adapters/mobile/reset-app-data.sh +1 -1
  17. package/adapters/mobile/start-console-forwarder.sh +3 -2
  18. package/adapters/mobile/start-metro.sh +17 -12
  19. package/adapters/mobile/wait-for-bridge.cjs +2 -2
  20. package/adapters/shared/harness-source-fingerprint.mjs +13 -8
  21. package/adapters/shared/open-debug.mjs +2 -2
  22. package/adapters/shared/sync-wallet-fixture.sh +8 -5
  23. package/adapters/terminal/cleanup.mjs +2 -1
  24. package/adapters/terminal/inject.mjs +2 -1
  25. package/adapters/terminal/launch.mjs +17 -13
  26. package/adapters/terminal/lib/mainnet-guard.mjs +9 -0
  27. package/adapters/terminal/lib/readiness.mjs +20 -12
  28. package/adapters/terminal/policy.mjs +35 -0
  29. package/adapters/terminal/verify.mjs +10 -3
  30. package/adapters/terminal/wallet-host.mjs +43 -225
  31. package/bin/mm-harness +9 -28
  32. package/dist/adapters/checkout-files.js +16 -0
  33. package/dist/adapters/console-capture.js +14 -1
  34. package/dist/adapters/core/actions.js +8 -4
  35. package/dist/adapters/core/overlay.js +1 -1
  36. package/dist/adapters/core/readiness.js +28 -1
  37. package/dist/adapters/core/run.js +2 -2
  38. package/dist/adapters/core/surface.js +16 -1
  39. package/dist/adapters/extension/actions.js +6 -2
  40. package/dist/adapters/extension/browser-pid.js +56 -0
  41. package/dist/adapters/extension/console-capture.js +1 -1
  42. package/dist/adapters/extension/doctor-checks.js +1 -1
  43. package/dist/adapters/extension/ensure-ready.js +5 -4
  44. package/dist/adapters/extension/extension-id.js +1 -1
  45. package/dist/adapters/extension/feature-flags.js +1 -1
  46. package/dist/adapters/extension/fixtures.js +1 -2
  47. package/dist/adapters/extension/launch.js +4 -5
  48. package/dist/adapters/extension/launched-browser.js +1 -2
  49. package/dist/adapters/extension/network-observer.js +14 -1
  50. package/dist/adapters/extension/overlay.js +1 -1
  51. package/dist/adapters/extension/product-config.js +1 -1
  52. package/dist/adapters/extension/readiness.js +1 -1
  53. package/dist/adapters/extension/reload.js +1 -1
  54. package/dist/adapters/extension/run.js +135 -14
  55. package/dist/adapters/extension/runtime-decision.js +2 -1
  56. package/dist/adapters/extension/runtime.js +9 -5
  57. package/dist/adapters/extension/surface.js +15 -2
  58. package/dist/adapters/extension/verify.js +2 -2
  59. package/dist/adapters/harness-freshness.js +2 -1
  60. package/dist/adapters/mobile/actions.js +4 -1
  61. package/dist/adapters/mobile/android-gfxinfo-performance.js +1 -3
  62. package/dist/adapters/mobile/app-identity.js +10 -0
  63. package/dist/adapters/mobile/doctor-checks.js +1 -1
  64. package/dist/adapters/mobile/fixtures.js +1 -1
  65. package/dist/adapters/mobile/launch.js +27 -28
  66. package/dist/adapters/mobile/lifecycle.js +1 -1
  67. package/dist/adapters/mobile/metro-env.js +9 -59
  68. package/dist/adapters/mobile/network-observer.js +68 -0
  69. package/dist/adapters/mobile/performance-observer.js +2 -4
  70. package/dist/adapters/mobile/prepare-target.js +1 -1
  71. package/dist/adapters/mobile/prepare.js +3 -4
  72. package/dist/adapters/mobile/provision.js +1 -1
  73. package/dist/adapters/mobile/readiness.js +1 -1
  74. package/dist/adapters/mobile/recording-target.js +15 -0
  75. package/dist/adapters/mobile/release-artifact-state.js +1 -1
  76. package/dist/adapters/mobile/reload.js +1 -1
  77. package/dist/adapters/mobile/run.js +39 -15
  78. package/dist/adapters/mobile/runtime-decision.js +2 -4
  79. package/dist/adapters/mobile/source-freshness.js +22 -126
  80. package/dist/adapters/mobile/surface.js +26 -3
  81. package/dist/adapters/mobile/ui.js +16 -5
  82. package/dist/adapters/mobile/verify.js +2 -3
  83. package/dist/adapters/performance/cdp-trace.js +1 -1
  84. package/dist/adapters/performance/device-platform.js +1 -1
  85. package/dist/adapters/perps-order-inputs.js +36 -0
  86. package/dist/adapters/proof-failure.js +11 -0
  87. package/dist/adapters/slot-ports.js +1 -1
  88. package/dist/adapters/surface.js +1 -0
  89. package/dist/adapters/terminal/actions.js +4 -1
  90. package/dist/adapters/terminal/console-capture.js +1 -1
  91. package/dist/adapters/terminal/doctor-checks.js +2 -0
  92. package/dist/adapters/terminal/launch.js +4 -1
  93. package/dist/adapters/terminal/overlay.js +8 -1
  94. package/dist/adapters/terminal/run.js +33 -5
  95. package/dist/adapters/terminal/surface.js +9 -1
  96. package/dist/adapters.js +27 -7
  97. package/dist/advisor-policy.js +1 -1
  98. package/dist/checkout-view.js +1 -2
  99. package/dist/cli.js +59 -21
  100. package/dist/command-contract.js +1 -26
  101. package/dist/commands/check.js +33 -10
  102. package/dist/commands/checklist.js +1 -1
  103. package/dist/commands/completion-candidates.js +6 -14
  104. package/dist/commands/config.js +2 -2
  105. package/dist/commands/core-readiness.js +12 -7
  106. package/dist/commands/debug.js +3 -3
  107. package/dist/commands/device-target.js +5 -5
  108. package/dist/commands/doctor.js +2 -14
  109. package/dist/commands/domain.js +2 -2
  110. package/dist/commands/ensure-ready.js +1 -7
  111. package/dist/commands/fixtures.js +5 -6
  112. package/dist/commands/help.js +3 -4
  113. package/dist/commands/launch/device.js +10 -17
  114. package/dist/commands/launch/extension.js +2 -8
  115. package/dist/commands/launch/mobile.js +1 -1
  116. package/dist/commands/logs.js +3 -3
  117. package/dist/commands/mobile-device-view.js +4 -2
  118. package/dist/commands/overlay.js +110 -0
  119. package/dist/commands/pin.js +1 -1
  120. package/dist/commands/pr-body.js +2 -2
  121. package/dist/commands/prepare.js +4 -9
  122. package/dist/commands/provision.js +3 -12
  123. package/dist/commands/recipe-advice.js +1 -2
  124. package/dist/commands/recipe-quality.js +2 -3
  125. package/dist/commands/resolve-extension.js +1 -7
  126. package/dist/commands/review.js +4 -4
  127. package/dist/commands/runtime-decision.js +1 -6
  128. package/dist/commands/runtime-health.js +1 -7
  129. package/dist/commands/runtime-launch.js +1 -13
  130. package/dist/commands/self-test.js +5 -8
  131. package/dist/commands/status-watch.js +1 -2
  132. package/dist/commands/status.js +2 -5
  133. package/dist/commands/task-init.js +2 -3
  134. package/dist/commands/tutorial.js +2 -2
  135. package/dist/commands/update.js +1 -1
  136. package/dist/completions-cache.js +1 -1
  137. package/dist/console-classifier.js +19 -0
  138. package/dist/doctor.js +2 -3
  139. package/dist/engine.js +57 -0
  140. package/dist/funding-execution-context.js +96 -1
  141. package/dist/host.js +32 -0
  142. package/dist/index.js +1 -6
  143. package/dist/live-tsx.js +49 -0
  144. package/dist/mm-harness-cli.js +4 -6
  145. package/dist/paths.js +34 -64
  146. package/dist/performance-observation.js +3 -5
  147. package/dist/progress.js +1 -1
  148. package/dist/recipe-assistance-context.js +6 -9
  149. package/dist/recipe-security.js +2 -59
  150. package/dist/review/knowledge.js +2 -2
  151. package/dist/runner.js +7 -4
  152. package/dist/runtime-context.js +1 -1
  153. package/dist/task-view.js +2 -3
  154. package/docs/CONTRIBUTING.md +5 -3
  155. package/docs/RECIPES.md +31 -3
  156. package/docs/cli-contract.md +2 -2
  157. package/docs/feature-guard.md +90 -0
  158. package/library/README.md +3 -1
  159. package/library/actions/core/perps/_controller.mjs +153 -134
  160. package/library/actions/core/perps/_rewards.mjs +186 -0
  161. package/library/actions/core/perps/close_positions.mjs +1 -1
  162. package/library/actions/core/perps/place_order.mjs +167 -45
  163. package/library/actions/core/perps/quote_fees.mjs +61 -0
  164. package/library/actions/core/wallet/list_accounts.mjs +14 -57
  165. package/library/actions/extension/feature_flags/state.mjs +1 -1
  166. package/library/actions/extension/perps/close_visible_position.mjs +5 -0
  167. package/library/actions/extension/perps/edit_margin.mjs +4 -0
  168. package/library/actions/extension/perps/mutation-receipt.mjs +95 -3
  169. package/library/actions/extension/perps/perps.mjs +320 -3
  170. package/library/actions/extension/perps/place_order.mjs +3 -1
  171. package/library/actions/extension/perps/update_position_tpsl.mjs +4 -0
  172. package/library/actions/extension/platform/cdp.mjs +73 -11
  173. package/library/actions/harness-exports.mjs +1 -6
  174. package/library/actions/mobile/app/network-control.mjs +6 -8
  175. package/library/actions/mobile/perps/perps.mjs +216 -11
  176. package/library/actions/mobile/perps/place_order.mjs +3 -1
  177. package/library/actions/mobile/perps/prepare_local_snapshot_endpoint.mjs +1 -1
  178. package/library/actions/mobile/platform/bridge.mjs +8 -8
  179. package/library/actions/mobile/platform/native-session-name.mjs +21 -1
  180. package/library/actions/mobile/platform/native-session.mjs +3 -4
  181. package/library/actions/mobile/platform/observe-ui.mjs +12 -6
  182. package/library/actions/mobile/ui/native-navigation.mjs +4 -3
  183. package/library/actions/mobile/wallet/native-ui.mjs +3 -2
  184. package/library/actions/shared/analytics/_adapter.mjs +1 -1
  185. package/library/actions/shared/console-findings.mjs +1 -1
  186. package/library/actions/shared/perps/order-policy.mjs +177 -0
  187. package/library/actions/shared/wallet/fixture-accounts.mjs +84 -0
  188. package/library/actions/terminal/app/launch.mjs +3 -2
  189. package/library/actions/terminal/platform/hud.mjs +2 -1
  190. package/library/actions/terminal/platform/page.mjs +2 -1
  191. package/library/actions/terminal/platform/runtime.mjs +2 -1
  192. package/library/actions/terminal/wallet/_signature-log.mjs +40 -161
  193. package/library/actions/terminal/wallet/assert_signatures.mjs +6 -12
  194. package/library/actions/terminal/wallet/read_signatures.mjs +10 -9
  195. package/library/manifests/core.action-manifest.json +87 -13
  196. package/library/manifests/extension.action-manifest.json +4 -0
  197. package/library/manifests/mobile.action-manifest.json +12 -0
  198. package/package.json +8 -9
  199. package/site/assets/help-recipes.json +1 -0
  200. package/adapters/extension/lib/slot-title.cjs +0 -292
  201. package/adapters/mobile/bridge-runtime/console-forwarder.cjs +0 -472
  202. package/adapters/mobile/bridge-runtime/lib/bridge-errors.cjs +0 -125
  203. package/adapters/mobile/bridge-runtime/lib/cdp-broker.cjs +0 -1055
  204. package/adapters/mobile/bridge-runtime/lib/cdp-eval.cjs +0 -110
  205. package/adapters/mobile/bridge-runtime/lib/config.cjs +0 -61
  206. package/adapters/mobile/bridge-runtime/lib/console-format.cjs +0 -53
  207. package/adapters/mobile/bridge-runtime/lib/devtools-proxy.cjs +0 -177
  208. package/adapters/mobile/bridge-runtime/lib/issue-capture.cjs +0 -446
  209. package/adapters/mobile/bridge-runtime/lib/match-bridge-target.cjs +0 -84
  210. package/adapters/mobile/bridge-runtime/lib/target-discovery.cjs +0 -403
  211. package/adapters/mobile/bridge-runtime/lib/ws-client.cjs +0 -116
  212. package/adapters/mobile/coalesce-metro-log.cjs +0 -24
  213. package/adapters/mobile/launch-metro.cjs +0 -77
  214. package/adapters/mobile/metro-config.cjs +0 -98
  215. package/adapters/mobile/metro-log-generation.cjs +0 -106
  216. package/adapters/terminal/lib/origin.mjs +0 -30
  217. package/adapters/terminal/lib/page-script.mjs +0 -246
  218. package/adapters/terminal/lib/strict-wallet.mjs +0 -138
  219. package/dist/adapters/mobile/frame-metrics.js +0 -118
  220. package/dist/adapters/mobile/video-recorder.js +0 -289
  221. package/dist/artifact-files.js +0 -92
  222. package/dist/checkout-lock.js +0 -149
  223. package/dist/cli-color.js +0 -98
  224. package/dist/command-journal.js +0 -308
  225. package/dist/commands/call.js +0 -685
  226. package/dist/commands/last.js +0 -60
  227. package/dist/commands/launch/index.js +0 -109
  228. package/dist/commands/list-executables.js +0 -247
  229. package/dist/commands/manifest.js +0 -488
  230. package/dist/commands/parse-args.js +0 -279
  231. package/dist/commands/reload.js +0 -41
  232. package/dist/commands/run-engine.js +0 -1340
  233. package/dist/commands/run-report.js +0 -241
  234. package/dist/commands/run.js +0 -751
  235. package/dist/commands/shared.js +0 -323
  236. package/dist/commands/stop.js +0 -60
  237. package/dist/devices.js +0 -100
  238. package/dist/discovery.js +0 -15
  239. package/dist/execution-provenance.js +0 -332
  240. package/dist/harness.js +0 -451
  241. package/dist/heal-bounds.js +0 -137
  242. package/dist/json-stream.js +0 -60
  243. package/dist/leaf-invoke.js +0 -19
  244. package/dist/library-provenance.js +0 -33
  245. package/dist/live-adapter-contract.js +0 -380
  246. package/dist/metamask-action-validation.js +0 -68
  247. package/dist/network-observation.js +0 -290
  248. package/dist/recording-target.js +0 -120
  249. package/dist/run-diagnostics.js +0 -364
  250. package/dist/run-recording.js +0 -481
  251. package/dist/runtime-proof.js +0 -90
  252. package/library/actions/mobile/platform/tool-paths.mjs +0 -123
@@ -1,290 +0,0 @@
1
- import path from "node:path";
2
- import brokerModule from "../adapters/mobile/bridge-runtime/lib/cdp-broker.cjs";
3
- import configModule from "../adapters/mobile/bridge-runtime/lib/config.cjs";
4
- import {
5
- createExtensionNetworkObserver
6
- } from "./adapters/extension/network-observer.js";
7
- import { getAdapterSurface } from "./adapters/surface.js";
8
- import {
9
- indexArtifactManifest,
10
- writeContainedArtifact
11
- } from "./artifact-files.js";
12
- const AUTO_CAPTURE_ID = "run-network";
13
- const AUTO_ARTIFACT_PATH = "network/run-summary.json";
14
- const { brokerSocketPath, createBrokerClient } = brokerModule;
15
- const { resolvePort } = configModule;
16
- const sessions = /* @__PURE__ */ new Map();
17
- async function startRunNetworkObservation(adapter, target, artifactsDir, env, ports = {}) {
18
- const network = getAdapterSurface(adapter).observation?.network;
19
- if (!network) return void 0;
20
- const runtimeEnv = {
21
- ...env,
22
- ...ports.cdpPort ? { CDP_PORT: ports.cdpPort, RECIPE_CDP_PORT: ports.cdpPort } : {},
23
- ...ports.watcherPort ? { WATCHER_PORT: ports.watcherPort } : {}
24
- };
25
- const key = path.resolve(artifactsDir);
26
- const session = {
27
- artifactsDir: key,
28
- autoStarted: false,
29
- autoStartedAt: Date.now(),
30
- nodeEvents: []
31
- };
32
- sessions.set(key, session);
33
- try {
34
- session.backend = await network.backend(target, runtimeEnv, key);
35
- } catch (error) {
36
- session.setupError = boundedError(error);
37
- }
38
- if (runtimeEnv.MM_HARNESS_AUTO_NETWORK_CAPTURE !== "0") {
39
- session.autoStartedAt = Date.now();
40
- if (session.backend) {
41
- try {
42
- await session.backend.start({
43
- id: AUTO_CAPTURE_ID,
44
- bodyJsonFields: ["type"],
45
- maxDurationMs: 60 * 60 * 1e3,
46
- maxRequests: 1e4,
47
- methods: [],
48
- urlIncludes: []
49
- });
50
- session.autoStarted = true;
51
- } catch (error) {
52
- session.setupError = boundedError(error);
53
- }
54
- }
55
- }
56
- return {
57
- onActionEvent(event) {
58
- session.nodeEvents.push({ ...event, epochMs: Date.now() });
59
- },
60
- async finalize(artifactManifestPath) {
61
- try {
62
- if (runtimeEnv.MM_HARNESS_AUTO_NETWORK_CAPTURE !== "0") {
63
- const summary = await automaticSummary(session);
64
- await writeSummary(key, AUTO_ARTIFACT_PATH, summary);
65
- if (artifactManifestPath) {
66
- await indexArtifact(
67
- artifactManifestPath,
68
- AUTO_ARTIFACT_PATH,
69
- "Automatic network observation"
70
- );
71
- }
72
- }
73
- } finally {
74
- sessions.delete(key);
75
- await session.backend?.close();
76
- }
77
- }
78
- };
79
- }
80
- async function handleRunNetworkAction(platform, action, node, context) {
81
- if (!getAdapterSurface(platform).observation?.network?.actions) return null;
82
- if (action === "app.network_assert") {
83
- const assertion = await import("../library/actions/shared/app/network-assert.mjs");
84
- return {
85
- output: await assertion.assertNetwork({ action, node, context })
86
- };
87
- }
88
- if (action !== "app.network_capture") return null;
89
- const phase = String(node.phase ?? "").toLowerCase();
90
- const id = String(node.id ?? "").trim();
91
- if (!["start", "end"].includes(phase) || !id) {
92
- throw new Error(
93
- "app.network_capture requires phase=start|end and a non-empty id."
94
- );
95
- }
96
- const session = sessions.get(path.resolve(context.artifactsDir));
97
- if (!session?.backend) {
98
- throw new Error(
99
- `Extension network observation is unavailable: ${session?.setupError ?? "run observer was not started"}.`
100
- );
101
- }
102
- if (phase === "start") {
103
- const result = await session.backend.start(captureParams(id, node));
104
- return {
105
- output: {
106
- action,
107
- phase,
108
- ...asRecord(result)
109
- }
110
- };
111
- }
112
- const artifactPath = String(
113
- node.artifact_path ?? `network/${id}-summary.json`
114
- );
115
- const summary = await session.backend.end(id);
116
- await writeSummary(context.artifactsDir, artifactPath, summary);
117
- return {
118
- output: {
119
- action,
120
- phase,
121
- ...summary
122
- },
123
- artifacts: [
124
- {
125
- path: artifactPath,
126
- type: "report",
127
- nodeId: context.nodeId
128
- }
129
- ]
130
- };
131
- }
132
- async function createMobileNetworkBackend(target, env) {
133
- const { client } = await connectMobileBroker(target, env);
134
- return {
135
- start(params) {
136
- return client.control("capture-start", params, 1e4);
137
- },
138
- async end(id) {
139
- return asRecord(await client.control("capture-end", { id }, 1e4));
140
- },
141
- async close() {
142
- client.close();
143
- }
144
- };
145
- }
146
- async function connectMobileBroker(target, env) {
147
- const runtimeDir = env.RECIPE_RUNTIME_DIR ? path.resolve(target, env.RECIPE_RUNTIME_DIR) : path.join(target, "temp", "recipe", "runtime");
148
- const socketPath = brokerSocketPath(
149
- runtimeDir,
150
- resolvePort(env, target)
151
- );
152
- const discoveryClient = await createBrokerClient(socketPath, "", 1e4);
153
- let targets;
154
- try {
155
- targets = await discoveryClient.control(
156
- "resolve-targets",
157
- { nameIncludes: mobileTargetPin(env) },
158
- 1e4
159
- );
160
- } finally {
161
- discoveryClient.close();
162
- }
163
- const deviceId = selectMobileBrokerTarget(targets, env);
164
- const client = await createBrokerClient(socketPath, deviceId, 1e4);
165
- return { client, deviceId };
166
- }
167
- function selectMobileBrokerTarget(value, env) {
168
- const targets = Array.isArray(value) ? value.map(asRecord).filter((target) => target.deviceId) : [];
169
- const pin = mobileTargetPin(env);
170
- const candidates = pin ? targets.filter(
171
- (target) => String(target.name ?? "").toLowerCase().includes(pin.toLowerCase())
172
- ) : targets;
173
- if (candidates.length !== 1) {
174
- throw new Error(
175
- `Mobile network observation requires one broker target; found ${candidates.length}.`
176
- );
177
- }
178
- return String(candidates[0].deviceId);
179
- }
180
- function mobileTargetPin(env) {
181
- const platform = String(
182
- env.MM_HARNESS_EXPLICIT_PLATFORM ?? env.RECIPE_HARNESS_PLATFORM ?? ""
183
- ).toLowerCase();
184
- return String(
185
- platform === "android" ? env.ANDROID_TARGET_DEVICE_NAME ?? env.ANDROID_DEVICE ?? "" : platform === "ios" ? env.IOS_SIMULATOR ?? "" : env.IOS_SIMULATOR ?? env.ANDROID_TARGET_DEVICE_NAME ?? env.ANDROID_DEVICE ?? ""
186
- ).trim();
187
- }
188
- async function automaticSummary(session) {
189
- let summary;
190
- if (session.autoStarted && session.backend) {
191
- try {
192
- summary = await session.backend.end(AUTO_CAPTURE_ID);
193
- } catch (error) {
194
- summary = unavailableSummary(session.autoStartedAt, boundedError(error));
195
- }
196
- } else {
197
- summary = unavailableSummary(
198
- session.autoStartedAt,
199
- session.setupError ?? "Network observer did not start."
200
- );
201
- }
202
- const startedAt = Number(summary.startedAtEpochMs ?? session.autoStartedAt);
203
- return {
204
- ...summary,
205
- nodeEvents: session.nodeEvents.map((event) => ({
206
- action: event.action,
207
- elapsedMs: Math.max(0, event.epochMs - startedAt),
208
- nodeId: event.nodeId,
209
- status: event.status
210
- }))
211
- };
212
- }
213
- function unavailableSummary(startedAtEpochMs, reason) {
214
- return {
215
- schemaVersion: 1,
216
- id: AUTO_CAPTURE_ID,
217
- status: "unavailable",
218
- startedAtEpochMs,
219
- endedAtEpochMs: Date.now(),
220
- maxDurationMs: 60 * 60 * 1e3,
221
- reconnects: 0,
222
- droppedRequests: 0,
223
- unavailableReasons: [reason],
224
- coverageGapReasons: [],
225
- uninspectableBodyRequests: 0,
226
- projectedBodyFields: ["type"],
227
- totalRequests: 0,
228
- requestsByMethod: {},
229
- requestsByHost: {},
230
- requestsByType: {},
231
- requests: []
232
- };
233
- }
234
- function captureParams(id, node) {
235
- return {
236
- id,
237
- urlIncludes: node.url_includes ?? [],
238
- methods: node.methods ?? [],
239
- bodyJsonFields: node.body_json_fields ?? [],
240
- maxRequests: node.max_requests,
241
- maxDurationMs: node.max_duration_ms
242
- };
243
- }
244
- async function writeSummary(artifactsDir, relativePath, summary) {
245
- await writeContainedArtifact(
246
- artifactsDir,
247
- relativePath,
248
- `${JSON.stringify(summary, null, 2)}
249
- `,
250
- "Network artifact"
251
- );
252
- }
253
- async function indexArtifact(artifactManifestPath, relativePath, label) {
254
- await indexArtifactManifest(
255
- artifactManifestPath,
256
- [
257
- {
258
- path: relativePath,
259
- type: "report",
260
- label,
261
- category: "diagnostic"
262
- }
263
- ]
264
- );
265
- }
266
- async function createExtensionNetworkBackend(env, artifactsDir) {
267
- return createExtensionNetworkObserver(extensionCdpPort(env), artifactsDir);
268
- }
269
- function extensionCdpPort(env) {
270
- const port = Number(
271
- env.CDP_PORT ?? env.RECIPE_CDP_PORT ?? process.env.CDP_PORT
272
- );
273
- if (!Number.isInteger(port) || port <= 0) {
274
- throw new Error("Extension network observation requires CDP_PORT.");
275
- }
276
- return port;
277
- }
278
- function boundedError(error) {
279
- return String(error instanceof Error ? error.message : error).slice(0, 256);
280
- }
281
- function asRecord(value) {
282
- return value && typeof value === "object" && !Array.isArray(value) ? value : {};
283
- }
284
- export {
285
- connectMobileBroker,
286
- createExtensionNetworkBackend,
287
- createMobileNetworkBackend,
288
- handleRunNetworkAction,
289
- startRunNetworkObservation
290
- };
@@ -1,120 +0,0 @@
1
- import { spawnSync } from "node:child_process";
2
- import fs from "node:fs";
3
- import path from "node:path";
4
- const ANDROID_RECORDING_TARGET_PREFIX = "android-device:";
5
- const IOS_SIMULATOR_RECORDING_TARGET_PREFIX = "ios-simulator:";
6
- function createMetaMaskRecordingTargetProvider(adapter) {
7
- return {
8
- async resolveRecordingTarget(context) {
9
- const { getAdapterSurface } = await import("./adapters/surface.js");
10
- const recording = getAdapterSurface(adapter).recording;
11
- if (!recording) throw new Error(`--record-video is not implemented for the ${adapter} adapter.`);
12
- return recording.target(context);
13
- }
14
- };
15
- }
16
- function resolveAndroidDeviceSerial(env = process.env) {
17
- return env.ADB_SERIAL?.trim() || process.env.ADB_SERIAL?.trim() || void 0;
18
- }
19
- function captureHelperSupportsRecordSessionSnapshots(projectRoot) {
20
- return captureHelperSupportsCapability(projectRoot, "record_session_snapshot");
21
- }
22
- function captureHelperSupportsCapability(projectRoot, capability) {
23
- const result = spawnSync(captureHelperPath(), ["version", "--json"], {
24
- cwd: projectRoot,
25
- encoding: "utf8"
26
- });
27
- if (result.status !== 0) return false;
28
- try {
29
- const parsed = JSON.parse(result.stdout);
30
- return Array.isArray(parsed.capabilities) && parsed.capabilities.includes(capability);
31
- } catch {
32
- return false;
33
- }
34
- }
35
- function resolveMobileIosSimulatorName(env = process.env) {
36
- const explicit = env.IOS_SIMULATOR?.trim() || env.SIM_UDID?.trim();
37
- if (explicit) return explicit;
38
- const slot = env.FARMSLOT_SLOT_ID?.trim() || env.SLOT_ID?.trim();
39
- if (!slot) return void 0;
40
- const suffix = slot.includes("-") ? slot.slice(slot.lastIndexOf("-") + 1) : slot;
41
- return suffix || void 0;
42
- }
43
- function resolveMobileIosSimulatorPid(simulator) {
44
- const result = spawnSync(
45
- captureHelperPath(),
46
- ["resolve", "--app-name", "Simulator", "--window-name", simulator, "--json"],
47
- { encoding: "utf8" }
48
- );
49
- if (result.status !== 0) return null;
50
- try {
51
- const parsed = JSON.parse(result.stdout);
52
- return parsePositivePid(parsed.selected?.pid);
53
- } catch {
54
- return null;
55
- }
56
- }
57
- function resolveExtensionBrowserPid(projectRoot, artifactsDir, cdpPort) {
58
- const explicit = parsePositivePid(process.env.METAMASK_RECIPE_EXTENSION_BROWSER_PID);
59
- if (explicit) return explicit;
60
- if (cdpPort) {
61
- const lsof = spawnSync("lsof", ["-nP", `-iTCP:${cdpPort}`, "-sTCP:LISTEN", "-t"], {
62
- cwd: projectRoot,
63
- encoding: "utf8"
64
- });
65
- if (lsof.status === 0) {
66
- const pid = parsePositivePid(String(lsof.stdout).split(/\s+/u).find(Boolean));
67
- if (pid) return pid;
68
- }
69
- }
70
- for (const file of [
71
- path.join(artifactsDir, "extension-runtime/runtime.json"),
72
- path.join(projectRoot, "temp/recipe/runtime/runtime.json")
73
- ]) {
74
- const pid = parsePositivePid(readJsonFile(file)?.pid);
75
- if (pid) return pid;
76
- }
77
- for (const file of [
78
- path.join(projectRoot, "temp/recipe/runtime/chromium.pid"),
79
- path.join(projectRoot, "temp/recipe/runtime/browser.pid")
80
- ]) {
81
- const pid = parsePositivePid(readTextFile(file));
82
- if (pid) return pid;
83
- }
84
- return null;
85
- }
86
- function captureHelperPath() {
87
- return process.env.CAPTURE_HELPER_PATH || "capture-helper";
88
- }
89
- function parsePositivePid(value) {
90
- const pid = Number(String(value ?? "").trim());
91
- return Number.isInteger(pid) && pid > 0 ? pid : null;
92
- }
93
- function readJsonFile(file) {
94
- if (!fs.existsSync(file)) return null;
95
- try {
96
- const parsed = JSON.parse(fs.readFileSync(file, "utf8"));
97
- return parsed && typeof parsed === "object" && !Array.isArray(parsed) ? parsed : null;
98
- } catch {
99
- return null;
100
- }
101
- }
102
- function readTextFile(file) {
103
- if (!fs.existsSync(file)) return "";
104
- try {
105
- return fs.readFileSync(file, "utf8");
106
- } catch {
107
- return "";
108
- }
109
- }
110
- export {
111
- ANDROID_RECORDING_TARGET_PREFIX,
112
- IOS_SIMULATOR_RECORDING_TARGET_PREFIX,
113
- captureHelperSupportsCapability,
114
- captureHelperSupportsRecordSessionSnapshots,
115
- createMetaMaskRecordingTargetProvider,
116
- resolveAndroidDeviceSerial,
117
- resolveExtensionBrowserPid,
118
- resolveMobileIosSimulatorName,
119
- resolveMobileIosSimulatorPid
120
- };