swipium 1.0.0 → 1.1.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 (74) hide show
  1. package/README.md +17 -27
  2. package/dist/appMap/codeIndex.js +37 -5
  3. package/dist/appMap/codeIndex.js.map +1 -1
  4. package/dist/appMap/query.js +22 -4
  5. package/dist/appMap/query.js.map +1 -1
  6. package/dist/build/plan.js +2 -1
  7. package/dist/build/plan.js.map +1 -1
  8. package/dist/drivers/WdaDriver.js +42 -6
  9. package/dist/drivers/WdaDriver.js.map +1 -1
  10. package/dist/explore/candidates.js +17 -0
  11. package/dist/explore/candidates.js.map +1 -1
  12. package/dist/explore/runner.js +29 -2
  13. package/dist/explore/runner.js.map +1 -1
  14. package/dist/lib/wda.js +70 -2
  15. package/dist/lib/wda.js.map +1 -1
  16. package/dist/oracle/failures.js +1 -0
  17. package/dist/oracle/failures.js.map +1 -1
  18. package/dist/orchestration/envelope.js +1 -0
  19. package/dist/orchestration/envelope.js.map +1 -1
  20. package/dist/prompts/index.js +10 -0
  21. package/dist/prompts/index.js.map +1 -1
  22. package/dist/report/export.js +9 -0
  23. package/dist/report/export.js.map +1 -1
  24. package/dist/server.js +29 -2
  25. package/dist/server.js.map +1 -1
  26. package/dist/services/build.js +15 -2
  27. package/dist/services/build.js.map +1 -1
  28. package/dist/services/prepareIos.js +34 -4
  29. package/dist/services/prepareIos.js.map +1 -1
  30. package/dist/services/report.js +47 -5
  31. package/dist/services/report.js.map +1 -1
  32. package/dist/session/store.js.map +1 -1
  33. package/dist/suite/pom.js +24 -9
  34. package/dist/suite/pom.js.map +1 -1
  35. package/dist/tools/act.js +23 -2
  36. package/dist/tools/act.js.map +1 -1
  37. package/dist/tools/appControl.js +176 -0
  38. package/dist/tools/appControl.js.map +1 -0
  39. package/dist/tools/capabilities.js +29 -0
  40. package/dist/tools/capabilities.js.map +1 -1
  41. package/dist/tools/clearOverlay.js +56 -21
  42. package/dist/tools/clearOverlay.js.map +1 -1
  43. package/dist/tools/device.js +151 -0
  44. package/dist/tools/device.js.map +1 -0
  45. package/dist/tools/doctor.js +174 -52
  46. package/dist/tools/doctor.js.map +1 -1
  47. package/dist/tools/history.js +56 -0
  48. package/dist/tools/history.js.map +1 -0
  49. package/dist/tools/metro.js +260 -0
  50. package/dist/tools/metro.js.map +1 -0
  51. package/dist/tools/network.js +97 -5
  52. package/dist/tools/network.js.map +1 -1
  53. package/dist/tools/permissions.js +149 -0
  54. package/dist/tools/permissions.js.map +1 -0
  55. package/dist/tools/screenInfo.js +70 -0
  56. package/dist/tools/screenInfo.js.map +1 -0
  57. package/dist/tools/screenRecord.js +215 -6
  58. package/dist/tools/screenRecord.js.map +1 -1
  59. package/dist/tools/seed.js +101 -0
  60. package/dist/tools/seed.js.map +1 -0
  61. package/dist/tools/state.js +83 -0
  62. package/dist/tools/state.js.map +1 -1
  63. package/dist/tools/testThis.js +55 -6
  64. package/dist/tools/testThis.js.map +1 -1
  65. package/dist/tools/visual.js +139 -0
  66. package/dist/tools/visual.js.map +1 -0
  67. package/dist/tools/visualText.js +61 -0
  68. package/dist/tools/visualText.js.map +1 -0
  69. package/dist/version.js +25 -3
  70. package/dist/version.js.map +1 -1
  71. package/docs/README.md +4 -4
  72. package/docs/mcp-server.md +5 -3
  73. package/docs/tools.md +68 -4
  74. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/tools/doctor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/tools/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import { z } from 'zod';
2
+ import { qaError, qaOk } from '../lib/result.js';
3
+ import { compareReports, trendForRoot } from '../report/history.js';
4
+ export function registerHistory(server, sessions) {
5
+ server.registerTool('qa_report_compare', {
6
+ title: 'Compare Swipium reports',
7
+ description: 'Compare a current Swipium report.json against a baseline report.json. Reports new failures, fixed failures, changed screenshots, outcome changes, runtime regression, and optional flake status from local trend history.',
8
+ inputSchema: {
9
+ current: z.string().describe('Path to current report.json.'),
10
+ baseline: z.string().describe('Path to baseline report.json.'),
11
+ trendRoot: z.string().optional().describe('Optional project root containing .swipium/runs or legacy .swipium/ci history for known-flaky classification.'),
12
+ },
13
+ }, async ({ current, baseline, trendRoot }) => {
14
+ try {
15
+ const cmp = compareReports(current, baseline, { trendRoot });
16
+ return qaOk(cmp, cmp.summary);
17
+ }
18
+ catch (e) {
19
+ return qaError({ what: `Could not compare reports: ${String(e.message ?? e)}`, changedState: false, retrySafe: true, nextSteps: ['Pass readable Swipium report.json files for current and baseline.'] });
20
+ }
21
+ });
22
+ server.registerTool('qa_run_history', {
23
+ title: 'Summarize Swipium run history',
24
+ description: 'Read local .swipium/runs/**/report.json files (and legacy .swipium/ci/**) and summarize pass rate, median runtime, top failures, environment failures, flaky flows, confidence calibration, and slowest runs.',
25
+ inputSchema: {
26
+ sessionId: z.string().optional(),
27
+ projectRoot: z.string().optional().describe('Project root. Defaults to the session root when sessionId is provided.'),
28
+ },
29
+ }, async ({ sessionId, projectRoot }) => {
30
+ const session = sessionId ? sessions.get(sessionId) : undefined;
31
+ if (sessionId && !session)
32
+ return qaError({ what: `Unknown sessionId ${sessionId}`, changedState: false, retrySafe: true, nextSteps: ['Call qa_start_session first, or pass projectRoot.'] });
33
+ const root = projectRoot ?? session?.root;
34
+ if (!root)
35
+ return qaError({ what: 'qa_run_history needs projectRoot or sessionId', changedState: false, retrySafe: true, nextSteps: ['Pass projectRoot, or call qa_start_session first.'] });
36
+ try {
37
+ const trend = trendForRoot(root);
38
+ const calibration = trend.confidenceCalibration;
39
+ const blockers = trend.releaseGateSignals.filter((s) => s.level === 'block').reduce((sum, s) => sum + s.count, 0);
40
+ const warnings = trend.releaseGateSignals.filter((s) => s.level === 'warn').reduce((sum, s) => sum + s.count, 0);
41
+ const locatorTrend = trend.locatorReadinessTrend;
42
+ const summary = `history: ${trend.reports} report(s), median ${trend.medianRuntimeSec ?? 'n/a'}s\n` +
43
+ `timing: avg setup ${trend.averageSetupSec ?? 'n/a'}s, avg active ${trend.averageActiveSec ?? 'n/a'}s\n` +
44
+ (locatorTrend.runsWithReadiness ? `locator readiness: latest durable ${locatorTrend.latestDurablePct ?? 'n/a'}%, average ${locatorTrend.averageDurablePct ?? 'n/a'}%\n` : '') +
45
+ Object.entries(trend.passRate).map(([flow, rate]) => ` ${flow}: ${(rate * 100).toFixed(1)}% pass`).join('\n') +
46
+ `\nrelease gate signals: ${blockers} block, ${warnings} warn` +
47
+ `\ncalibration: ${calibration.status} (${calibration.confidenceSamples}/${calibration.probabilisticEvidence} confidence sample(s), ${calibration.outcomeSamples} outcome sample(s))` +
48
+ (trend.slowestSteps.length ? `\nslowest step: ${trend.slowestSteps[0].workflow}#${trend.slowestSteps[0].index} ${trend.slowestSteps[0].kind} ${trend.slowestSteps[0].durationSec}s` : '');
49
+ return qaOk({ root, ...trend }, summary);
50
+ }
51
+ catch (e) {
52
+ return qaError({ what: `Could not read run history: ${String(e.message ?? e)}`, changedState: false, retrySafe: true, nextSteps: ['Confirm .swipium/runs or .swipium/ci contains report.json files.'] });
53
+ }
54
+ });
55
+ }
56
+ //# sourceMappingURL=history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.js","sourceRoot":"","sources":["../../src/tools/history.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,260 @@
1
+ // qa_metro — own the debug React Native / Expo Metro flow (review §4.2 / Rec 5).
2
+ // A debug RN/Expo APK needs a Metro dev server on :8081 + `adb reverse` to fetch its JS
3
+ // bundle. `status` reports whether that's ready; `start` (consent-gated) sets up the
4
+ // reverse and launches Metro, logging to a session artifact.
5
+ import { z } from 'zod';
6
+ import { openSync, closeSync } from 'node:fs';
7
+ import { join } from 'node:path';
8
+ import { spawn, spawnSync } from 'node:child_process';
9
+ import { qaOk, qaError } from '../lib/result.js';
10
+ import { requireConsent, consumeConsent } from '../consent/consent.js';
11
+ import { run } from '../lib/spawn.js';
12
+ import { detectFramework } from '../context/detect.js';
13
+ import { METRO_PORT, metroReadiness } from '../lib/metroState.js';
14
+ import { parseSnapshot } from '../snapshot/parse.js';
15
+ import { detectRedBox } from '../snapshot/overlays.js';
16
+ import { getDriver, resolveDevice, bindDevice } from '../session/attach.js';
17
+ /** True if `pid` is a live process whose command looks like a Metro/Expo/RN bundler. Guards
18
+ * against killing a recycled PID — e.g. a `metroPid` persisted before a machine or server
19
+ * restart that now belongs to an unrelated process. Best-effort (POSIX `ps`); on any doubt
20
+ * we report "not ours" so we never signal a stranger. */
21
+ function metroProcessLooksAlive(pid) {
22
+ try {
23
+ const out = spawnSync('ps', ['-o', 'command=', '-p', String(pid)], { encoding: 'utf8' });
24
+ if (out.status !== 0 || !out.stdout)
25
+ return false;
26
+ return /metro|expo|react-native|node/i.test(out.stdout);
27
+ }
28
+ catch {
29
+ return false;
30
+ }
31
+ }
32
+ /** Kill a Metro process that was started detached (so it leads its own process group). We signal
33
+ * the whole GROUP (negative pid) so the real `node` bundler holding :8081 dies, not just the
34
+ * `npx` launcher that spawned it. Falls back to signalling the pid directly if it is not a group
35
+ * leader. Returns true if a signal was delivered. */
36
+ function killMetroGroup(pid) {
37
+ try {
38
+ process.kill(-pid, 'SIGTERM');
39
+ return true;
40
+ }
41
+ catch {
42
+ /* not a group leader, or group already gone — fall through */
43
+ }
44
+ try {
45
+ process.kill(pid, 'SIGTERM');
46
+ return true;
47
+ }
48
+ catch {
49
+ return false;
50
+ }
51
+ }
52
+ /** Stop every Metro server Swipium started, on server shutdown / client disconnect, so a
53
+ * budget-stop or crash mid-run doesn't leave a `node` bundler holding :8081. Idempotent. */
54
+ export async function stopAllMetro(sessions) {
55
+ for (const session of sessions.list()) {
56
+ const pid = session.metroPid;
57
+ if (!pid)
58
+ continue;
59
+ if (metroProcessLooksAlive(pid))
60
+ killMetroGroup(pid);
61
+ session.metroPid = undefined;
62
+ try {
63
+ sessions.persist(session);
64
+ }
65
+ catch {
66
+ /* ignore */
67
+ }
68
+ }
69
+ }
70
+ function metroCommand(framework) {
71
+ // Expo dev-client vs bare RN Metro.
72
+ if (framework === 'expo')
73
+ return { cmd: 'npx', args: ['expo', 'start', '--dev-client', '--port', String(METRO_PORT)] };
74
+ return { cmd: 'npx', args: ['react-native', 'start', '--port', String(METRO_PORT)] };
75
+ }
76
+ export function registerMetro(server, sessions) {
77
+ server.registerTool('qa_metro', {
78
+ title: 'Metro dev server (debug RN/Expo)',
79
+ description: 'For debug React Native / Expo builds that need a Metro bundler on :8081. action="status" reports Metro/reverse/serving state; action="diagnose" adds RedBox detection + logcat evidence + a recovery roadmap (incl. whether reinstall/rebuild is required); action="start" (consent-gated) runs `adb reverse tcp:8081 tcp:8081` + launches Metro, logging to a session artifact + tracking its PID; action="stop" kills it + removes the reverse. After start, wait a few seconds then relaunch with qa_prepare_target.',
80
+ inputSchema: {
81
+ sessionId: z.string(),
82
+ action: z.enum(['status', 'diagnose', 'start', 'stop']),
83
+ consentId: z.string().optional(),
84
+ approve: z.boolean().optional(),
85
+ },
86
+ }, async ({ sessionId, action, consentId, approve }) => {
87
+ const session = sessions.get(sessionId);
88
+ if (!session)
89
+ return qaError({ what: `Unknown sessionId ${sessionId}`, changedState: false, retrySafe: true, nextSteps: ['Call qa_start_session first.'] });
90
+ // Centralized device resolution (P0.1/P0.3): use the session device, else the single
91
+ // online one (bind it), else ask / guide — never a circular "no device" dead end.
92
+ const dev = await resolveDevice(session);
93
+ if (dev.needSelection && action !== 'status') {
94
+ return qaError({ what: 'Multiple devices online — choose one', changedState: false, retrySafe: true, nextSteps: [`Re-run qa_prepare_target with device="<serial>". Online: ${dev.available.join(', ')}`] });
95
+ }
96
+ const serial = dev.effective;
97
+ if (serial && !session.device)
98
+ bindDevice(session, serial); // self-bind single online device
99
+ const fw = detectFramework(session.root);
100
+ const rd = await metroReadiness(serial);
101
+ const listening = rd.listening;
102
+ const reverseSet = rd.reverseSet;
103
+ if (action === 'status') {
104
+ const deviceHint = serial ? '' : '\n⚠ No device bound — adb reverse needs one. Call qa_prepare_target first (it binds the device), then qa_metro.';
105
+ return qaOk({ framework: fw, metroListening: listening, reverseSet, serving: rd.serving, ready: rd.ready, port: METRO_PORT, sessionDevice: dev.sessionDevice ?? null, availableDevices: dev.available, device: serial ?? null, metroPid: session.metroPid ?? null, needsDevice: !serial }, `framework=${fw} metro:${METRO_PORT}=${listening ? 'listening' : 'down'} serving=${rd.serving} adb-reverse=${serial ? (reverseSet ? 'set' : 'unset') : 'n/a (no device)'} device=${serial ?? 'none'} online=[${dev.available.join(',')}]${session.metroPid ? ` pid=${session.metroPid}` : ''}` +
106
+ (rd.ready ? '\nReady — debug bundle can load.' : deviceHint || '\nNot fully ready — run qa_metro action="start" (or qa_metro diagnose).'));
107
+ }
108
+ if (action === 'diagnose') {
109
+ const { driver } = await getDriver(session);
110
+ let redbox = { present: false, unableToLoadScript: false };
111
+ let logUri;
112
+ if (driver) {
113
+ try {
114
+ const parsed = parseSnapshot(await driver.dumpXml());
115
+ redbox = detectRedBox(parsed.allNodes);
116
+ }
117
+ catch {
118
+ /* dump may fail on redbox/animation */
119
+ }
120
+ const log = await driver.logcat(200, 'ReactNative|ReactNativeJS|Metro|bundle|Unable to load|loadJSBundle|DevServer');
121
+ if (log)
122
+ logUri = sessions.saveArtifact(session, 'logcat', `logcat-${Date.now()}.txt`, log, 'text/plain', 'metro diagnose');
123
+ }
124
+ const recovery = [];
125
+ let requiresReinstall = false;
126
+ if (!serial)
127
+ recovery.push(dev.needSelection ? `Multiple devices online — re-run qa_prepare_target device="<serial>". Online: ${dev.available.join(', ')}` : 'No device online — boot one via qa_prepare_target (it boots + sets reverse), then retry.');
128
+ if (!listening)
129
+ recovery.push('Start Metro: qa_metro action="start".');
130
+ if (serial && listening && !reverseSet)
131
+ recovery.push('Set reverse: qa_metro action="start" (sets adb reverse).');
132
+ if (listening && !rd.serving)
133
+ recovery.push('Metro is up but not serving the bundle yet — wait ~10s for the first transform, then retry.');
134
+ if (redbox.unableToLoadScript) {
135
+ requiresReinstall = true;
136
+ recovery.push('RedBox is "Unable to load script": the installed build cannot fetch the JS bundle. If Metro+reverse are ready and it still fails, the APK is bundle-less/asset-only — RECOVERY REQUIRES REINSTALL/REBUILD of a working debug or release APK (a data wipe alone will not fix it).');
137
+ }
138
+ else if (redbox.present) {
139
+ recovery.push('RedBox present (not load-script): tap RELOAD via qa_act, or fix the JS error shown.');
140
+ }
141
+ if (rd.ready && !redbox.present)
142
+ recovery.push('Metro ready and no RedBox — the bundle should load.');
143
+ return qaOk({ framework: fw, ...rd, sessionDevice: dev.sessionDevice ?? null, availableDevices: dev.available, device: serial ?? null, redBox: redbox, requiresReinstall, logcatUri: logUri ?? null, recovery }, `framework=${fw} | metro listening=${rd.listening} serving=${rd.serving} reverse=${reverseSet} ready=${rd.ready}\n` +
144
+ `redbox=${redbox.present ? (redbox.unableToLoadScript ? 'UNABLE-TO-LOAD-SCRIPT' : 'present') : 'none'}${requiresReinstall ? ' ⚠ requires reinstall/rebuild' : ''}\n` +
145
+ `recovery:\n - ${recovery.join('\n - ') || '(none — looks healthy)'}` +
146
+ (logUri ? `\nlogcat evidence: ${logUri}` : ''));
147
+ }
148
+ if (action === 'stop') {
149
+ let killed = false;
150
+ if (session.metroPid) {
151
+ // Only signal a PID we can still confirm is a Metro/node bundler (guards against a
152
+ // persisted PID that was recycled across a restart), and kill the whole process group
153
+ // so the real bundler dies, not just the npx launcher.
154
+ if (metroProcessLooksAlive(session.metroPid)) {
155
+ killed = killMetroGroup(session.metroPid);
156
+ }
157
+ }
158
+ if (serial) {
159
+ try {
160
+ await run('adb', ['-s', serial, 'reverse', '--remove', `tcp:${METRO_PORT}`], { timeoutMs: 5000 });
161
+ }
162
+ catch {
163
+ /* ignore */
164
+ }
165
+ }
166
+ const had = session.metroPid;
167
+ session.metroPid = undefined;
168
+ sessions.persist(session);
169
+ sessions.recordMutation(session, {
170
+ tool: 'qa_metro',
171
+ action: 'stop_metro',
172
+ risk: 'low',
173
+ target: { device: serial ?? null, port: METRO_PORT, pid: had ?? null, killed, reverseRemoved: !!serial },
174
+ consent: { required: false, approved: true },
175
+ status: 'restored',
176
+ });
177
+ return qaOk({ stopped: killed, pid: had ?? null, reverseRemoved: !!serial }, had ? `Stopped Metro pid ${had}${killed ? '' : ' (was already gone)'}; removed adb reverse.` : 'No Swipium-started Metro to stop (it may have been started externally).');
178
+ }
179
+ // action === 'start' — `serial` is the single online device (auto-bound) or a session
180
+ // device. If none online, guide to prepare_target to BOOT (terminal, non-circular).
181
+ if (!serial) {
182
+ return qaError({
183
+ what: dev.needSelection ? 'Multiple devices online — choose one' : 'No device online — Metro reverse needs a running device',
184
+ changedState: false,
185
+ retrySafe: true,
186
+ nextSteps: dev.needSelection
187
+ ? [`Re-run qa_prepare_target device="<serial>". Online: ${dev.available.join(', ')}`]
188
+ : ['Boot a device first: qa_prepare_target { bindOnly:true } (boots an AVD + sets reverse), then qa_metro start.'],
189
+ });
190
+ }
191
+ if (listening && reverseSet) {
192
+ return qaOk({ framework: fw, metroListening: true, reverseSet: true, alreadyRunning: true }, 'Metro already listening and adb reverse already set — nothing to do.');
193
+ }
194
+ const { cmd, args } = metroCommand(fw);
195
+ const cmdStr = `adb -s ${serial} reverse tcp:${METRO_PORT} tcp:${METRO_PORT} && (cd ${session.root} && ${cmd} ${args.join(' ')})`;
196
+ const gate = consumeConsent(consentId, approve, { action: 'start_metro', affects: { port: METRO_PORT, framework: fw } });
197
+ if (!gate.approved) {
198
+ sessions.recordMutation(session, {
199
+ tool: 'qa_metro',
200
+ action: 'start_metro',
201
+ risk: 'low',
202
+ target: { device: serial, port: METRO_PORT, framework: fw },
203
+ consent: { required: true, approved: false },
204
+ status: 'requested',
205
+ });
206
+ return requireConsent({
207
+ action: 'start_metro',
208
+ risk: 'low',
209
+ exactCommand: cmdStr,
210
+ affects: { port: METRO_PORT, framework: fw },
211
+ explain: `This looks like a debug ${fw} build needing Metro on :${METRO_PORT}. Set adb reverse and start Metro?`,
212
+ });
213
+ }
214
+ sessions.recordMutation(session, {
215
+ tool: 'qa_metro',
216
+ action: 'start_metro',
217
+ risk: 'low',
218
+ target: { device: serial, port: METRO_PORT, framework: fw },
219
+ consent: { required: true, consentId, approved: true },
220
+ status: 'approved',
221
+ });
222
+ // adb reverse, then spawn Metro detached with output to a session log artifact.
223
+ try {
224
+ await run('adb', ['-s', serial, 'reverse', `tcp:${METRO_PORT}`, `tcp:${METRO_PORT}`], { timeoutMs: 8000, rejectOnNonZero: true });
225
+ }
226
+ catch (e) {
227
+ sessions.recordMutation(session, {
228
+ tool: 'qa_metro',
229
+ action: 'start_metro',
230
+ risk: 'low',
231
+ target: { device: serial, port: METRO_PORT, framework: fw },
232
+ consent: { required: true, consentId, approved: true },
233
+ status: 'blocked',
234
+ detail: String(e),
235
+ });
236
+ return qaError({ what: `adb reverse failed: ${String(e)}`, commandAttempted: `adb -s ${serial} reverse tcp:${METRO_PORT} tcp:${METRO_PORT}`, changedState: true, retrySafe: true, nextSteps: ['Check the device is online.'] });
237
+ }
238
+ // Register the artifact (creates the empty file) BEFORE opening the append fd, so we
239
+ // don't truncate a live log. saveArtifact writes to <dir>/metro/metro.log.
240
+ const logUri = sessions.saveArtifact(session, 'metro', 'metro.log', '', 'text/plain');
241
+ const logPath = join(session.dir, 'metro', 'metro.log');
242
+ const fd = openSync(logPath, 'a');
243
+ const child = spawn(cmd, args, { cwd: session.root, detached: true, stdio: ['ignore', fd, fd] });
244
+ child.unref();
245
+ closeSync(fd); // child inherited the fd; the parent must not keep it open (review #2)
246
+ session.metroPid = child.pid;
247
+ sessions.persist(session);
248
+ sessions.recordMutation(session, {
249
+ tool: 'qa_metro',
250
+ action: 'start_metro',
251
+ risk: 'low',
252
+ target: { device: serial, port: METRO_PORT, framework: fw, pid: child.pid ?? null },
253
+ consent: { required: true, consentId, approved: true },
254
+ status: 'executed',
255
+ ledgerUri: logUri,
256
+ });
257
+ return qaOk({ framework: fw, started: true, port: METRO_PORT, reverseSet: true, pid: child.pid, logUri, logPath }, `Started Metro (${fw}) on :${METRO_PORT} + adb reverse set. Log → ${logUri}\nWait ~5–10s for "Metro waiting", then relaunch the app with qa_prepare_target.`);
258
+ });
259
+ }
260
+ //# sourceMappingURL=metro.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metro.js","sourceRoot":"","sources":["../../src/tools/metro.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,wFAAwF;AACxF,qFAAqF;AACrF,6DAA6D;AAE7D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAG5E;;;yDAGyD;AACzD,SAAS,sBAAsB,CAAC,GAAW;IACzC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;QACzF,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAClD,OAAO,+BAA+B,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;qDAGqD;AACrD,SAAS,cAAc,CAAC,GAAW;IACjC,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,8DAA8D;IAChE,CAAC;IACD,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;4FAC4F;AAC5F,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAsB;IACvD,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;QACtC,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC;QAC7B,IAAI,CAAC,GAAG;YAAE,SAAS;QACnB,IAAI,sBAAsB,CAAC,GAAG,CAAC;YAAE,cAAc,CAAC,GAAG,CAAC,CAAC;QACrD,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC7B,IAAI,CAAC;YACH,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,YAAY;QACd,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,SAAiB;IACrC,oCAAoC;IACpC,IAAI,SAAS,KAAK,MAAM;QAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;IACvH,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,cAAc,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;AACvF,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAiB,EAAE,QAAsB;IACrE,MAAM,CAAC,YAAY,CACjB,UAAU,EACV;QACE,KAAK,EAAE,kCAAkC;QACzC,WAAW,EACT,yfAAyf;QAC3f,WAAW,EAAE;YACX,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;YACrB,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;YACvD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAChC,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;SAChC;KACF,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE;QAClD,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACxC,IAAI,CAAC,OAAO;YAAE,OAAO,OAAO,CAAC,EAAE,IAAI,EAAE,qBAAqB,SAAS,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,8BAA8B,CAAC,EAAE,CAAC,CAAC;QAC5J,qFAAqF;QACrF,kFAAkF;QAClF,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC;QACzC,IAAI,GAAG,CAAC,aAAa,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC7C,OAAO,OAAO,CAAC,EAAE,IAAI,EAAE,sCAAsC,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,4DAA4D,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9M,CAAC;QACD,MAAM,MAAM,GAAG,GAAG,CAAC,SAAS,CAAC;QAC7B,IAAI,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM;YAAE,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,iCAAiC;QAC7F,MAAM,EAAE,GAAG,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAEzC,MAAM,EAAE,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,CAAC;QACxC,MAAM,SAAS,GAAG,EAAE,CAAC,SAAS,CAAC;QAC/B,MAAM,UAAU,GAAG,EAAE,CAAC,UAAU,CAAC;QAEjC,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;YACxB,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,iHAAiH,CAAC;YACnJ,OAAO,IAAI,CACT,EAAE,SAAS,EAAE,EAAE,EAAE,cAAc,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,aAAa,EAAE,GAAG,CAAC,aAAa,IAAI,IAAI,EAAE,gBAAgB,EAAE,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,IAAI,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,IAAI,EAAE,WAAW,EAAE,CAAC,MAAM,EAAE,EAC7Q,aAAa,EAAE,UAAU,UAAU,IAAI,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,YAAY,EAAE,CAAC,OAAO,gBAAgB,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,iBAAiB,WAAW,MAAM,IAAI,MAAM,YAAY,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;gBAC5R,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,kCAAkC,CAAC,CAAC,CAAC,UAAU,IAAI,yEAAyE,CAAC,CAC5I,CAAC;QACJ,CAAC;QAED,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;YAC1B,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;YAC5C,IAAI,MAAM,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,CAAC;YAC3D,IAAI,MAA0B,CAAC;YAC/B,IAAI,MAAM,EAAE,CAAC;gBACX,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;oBACrD,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACzC,CAAC;gBAAC,MAAM,CAAC;oBACP,uCAAuC;gBACzC,CAAC;gBACD,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,8EAA8E,CAAC,CAAC;gBACrH,IAAI,GAAG;oBAAE,MAAM,GAAG,QAAQ,CAAC,YAAY,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,EAAE,gBAAgB,CAAC,CAAC;YAC9H,CAAC;YACD,MAAM,QAAQ,GAAa,EAAE,CAAC;YAC9B,IAAI,iBAAiB,GAAG,KAAK,CAAC;YAC9B,IAAI,CAAC,MAAM;gBAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,iFAAiF,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,0FAA0F,CAAC,CAAC;YACzP,IAAI,CAAC,SAAS;gBAAE,QAAQ,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;YACvE,IAAI,MAAM,IAAI,SAAS,IAAI,CAAC,UAAU;gBAAE,QAAQ,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC;YAClH,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC,OAAO;gBAAE,QAAQ,CAAC,IAAI,CAAC,6FAA6F,CAAC,CAAC;YAC3I,IAAI,MAAM,CAAC,kBAAkB,EAAE,CAAC;gBAC9B,iBAAiB,GAAG,IAAI,CAAC;gBACzB,QAAQ,CAAC,IAAI,CACX,kRAAkR,CACnR,CAAC;YACJ,CAAC;iBAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBAC1B,QAAQ,CAAC,IAAI,CAAC,qFAAqF,CAAC,CAAC;YACvG,CAAC;YACD,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,OAAO;gBAAE,QAAQ,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;YAEtG,OAAO,IAAI,CACT,EAAE,SAAS,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,aAAa,EAAE,GAAG,CAAC,aAAa,IAAI,IAAI,EAAE,gBAAgB,EAAE,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,IAAI,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,IAAI,IAAI,EAAE,QAAQ,EAAE,EACnM,aAAa,EAAE,sBAAsB,EAAE,CAAC,SAAS,YAAY,EAAE,CAAC,OAAO,YAAY,UAAU,UAAU,EAAE,CAAC,KAAK,IAAI;gBACjH,UAAU,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,iBAAiB,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC,CAAC,EAAE,IAAI;gBACpK,iBAAiB,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,wBAAwB,EAAE;gBACrE,CAAC,MAAM,CAAC,CAAC,CAAC,sBAAsB,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CACjD,CAAC;QACJ,CAAC;QAED,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YACtB,IAAI,MAAM,GAAG,KAAK,CAAC;YACnB,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;gBACrB,mFAAmF;gBACnF,sFAAsF;gBACtF,uDAAuD;gBACvD,IAAI,sBAAsB,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC7C,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAC5C,CAAC;YACH,CAAC;YACD,IAAI,MAAM,EAAE,CAAC;gBACX,IAAI,CAAC;oBACH,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,UAAU,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBACpG,CAAC;gBAAC,MAAM,CAAC;oBACP,YAAY;gBACd,CAAC;YACH,CAAC;YACD,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC;YAC7B,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC;YAC7B,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC1B,QAAQ,CAAC,cAAc,CAAC,OAAO,EAAE;gBAC/B,IAAI,EAAE,UAAU;gBAChB,MAAM,EAAE,YAAY;gBACpB,IAAI,EAAE,KAAK;gBACX,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,IAAI,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,GAAG,IAAI,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE;gBACxG,OAAO,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE;gBAC5C,MAAM,EAAE,UAAU;aACnB,CAAC,CAAC;YACH,OAAO,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,qBAAqB,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,qBAAqB,wBAAwB,CAAC,CAAC,CAAC,yEAAyE,CAAC,CAAC;QACzP,CAAC;QAED,sFAAsF;QACtF,oFAAoF;QACpF,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,OAAO,CAAC;gBACb,IAAI,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,sCAAsC,CAAC,CAAC,CAAC,yDAAyD;gBAC5H,YAAY,EAAE,KAAK;gBACnB,SAAS,EAAE,IAAI;gBACf,SAAS,EAAE,GAAG,CAAC,aAAa;oBAC1B,CAAC,CAAC,CAAC,uDAAuD,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBACrF,CAAC,CAAC,CAAC,8GAA8G,CAAC;aACrH,CAAC,CAAC;QACL,CAAC;QACD,IAAI,SAAS,IAAI,UAAU,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,EAAE,sEAAsE,CAAC,CAAC;QACvK,CAAC;QACD,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,UAAU,MAAM,gBAAgB,UAAU,QAAQ,UAAU,WAAW,OAAO,CAAC,IAAI,OAAO,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;QAClI,MAAM,IAAI,GAAG,cAAc,CAAC,SAAS,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QACzH,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,QAAQ,CAAC,cAAc,CAAC,OAAO,EAAE;gBAC/B,IAAI,EAAE,UAAU;gBAChB,MAAM,EAAE,aAAa;gBACrB,IAAI,EAAE,KAAK;gBACX,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE;gBAC3D,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE;gBAC5C,MAAM,EAAE,WAAW;aACpB,CAAC,CAAC;YACH,OAAO,cAAc,CAAC;gBACpB,MAAM,EAAE,aAAa;gBACrB,IAAI,EAAE,KAAK;gBACX,YAAY,EAAE,MAAM;gBACpB,OAAO,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE;gBAC5C,OAAO,EAAE,2BAA2B,EAAE,4BAA4B,UAAU,oCAAoC;aACjH,CAAC,CAAC;QACL,CAAC;QACD,QAAQ,CAAC,cAAc,CAAC,OAAO,EAAE;YAC/B,IAAI,EAAE,UAAU;YAChB,MAAM,EAAE,aAAa;YACrB,IAAI,EAAE,KAAK;YACX,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE;YAC3D,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE;YACtD,MAAM,EAAE,UAAU;SACnB,CAAC,CAAC;QAEH,gFAAgF;QAChF,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,UAAU,EAAE,EAAE,OAAO,UAAU,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC;QACpI,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,QAAQ,CAAC,cAAc,CAAC,OAAO,EAAE;gBAC/B,IAAI,EAAE,UAAU;gBAChB,MAAM,EAAE,aAAa;gBACrB,IAAI,EAAE,KAAK;gBACX,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE;gBAC3D,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE;gBACtD,MAAM,EAAE,SAAS;gBACjB,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;aAClB,CAAC,CAAC;YACH,OAAO,OAAO,CAAC,EAAE,IAAI,EAAE,uBAAuB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,gBAAgB,EAAE,UAAU,MAAM,gBAAgB,UAAU,QAAQ,UAAU,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,6BAA6B,CAAC,EAAE,CAAC,CAAC;QAClO,CAAC;QACD,qFAAqF;QACrF,2EAA2E;QAC3E,MAAM,MAAM,GAAG,QAAQ,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,YAAY,CAAC,CAAC;QACtF,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;QACxD,MAAM,EAAE,GAAG,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAClC,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;QACjG,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,uEAAuE;QACtF,OAAO,CAAC,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC;QAC7B,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC1B,QAAQ,CAAC,cAAc,CAAC,OAAO,EAAE;YAC/B,IAAI,EAAE,UAAU;YAChB,MAAM,EAAE,aAAa;YACrB,IAAI,EAAE,KAAK;YACX,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,IAAI,IAAI,EAAE;YACnF,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE;YACtD,MAAM,EAAE,UAAU;YAClB,SAAS,EAAE,MAAM;SAClB,CAAC,CAAC;QAEH,OAAO,IAAI,CACT,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,EACrG,kBAAkB,EAAE,SAAS,UAAU,6BAA6B,MAAM,kFAAkF,CAC7J,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -1,13 +1,19 @@
1
- // Network restore helpers retained for flows that temporarily change device connectivity.
1
+ // qa_network — safe offline/online testing without raw adb (Phase 2 CR2).
2
+ // Uses `cmd connectivity airplane-mode` (API 30+). Records the original state on first
3
+ // change so it can be restored; report + session-end restore use session.network.
4
+ import { z } from 'zod';
5
+ import { qaOk, qaError } from '../lib/result.js';
6
+ import { requireConsent, consumeConsent } from '../consent/consent.js';
7
+ import { getDriver } from '../session/attach.js';
2
8
  /** Restore network to the recorded original state. Exported for report/session-end use. */
3
9
  export async function restoreNetwork(sessions, session, d) {
4
10
  if (!session.network?.changed)
5
11
  return null;
6
12
  const original = session.network.originalAirplane;
7
- await d.setAirplane(original);
13
+ await d.setAirplane(original); // original airplane flag
8
14
  sessions.addEnvChange(session, `network restored (airplane=${original})`);
9
15
  sessions.recordMutation(session, {
10
- tool: 'qa_report',
16
+ tool: 'qa_network',
11
17
  action: 'network_restore',
12
18
  risk: 'low',
13
19
  target: { toAirplane: original },
@@ -19,7 +25,7 @@ export async function restoreNetwork(sessions, session, d) {
19
25
  sessions.persist(session);
20
26
  return `restored (airplane=${original})`;
21
27
  }
22
- /** Best-effort restore of every session that changed the network, for server shutdown. */
28
+ /** Best-effort restore of EVERY session that changed the network — for server shutdown. */
23
29
  export async function restoreAllNetwork(sessions) {
24
30
  const { DirectDriver } = await import('../drivers/DirectDriver.js');
25
31
  for (const s of sessions.list()) {
@@ -31,7 +37,7 @@ export async function restoreAllNetwork(sessions) {
31
37
  try {
32
38
  await d.setAirplane(s.network.originalAirplane);
33
39
  sessions.recordMutation(s, {
34
- tool: 'swipium_shutdown',
40
+ tool: 'qa_network',
35
41
  action: 'network_restore',
36
42
  risk: 'low',
37
43
  target: { toAirplane: s.network.originalAirplane, shutdown: true },
@@ -47,4 +53,90 @@ export async function restoreAllNetwork(sessions) {
47
53
  }
48
54
  }
49
55
  }
56
+ export function registerNetwork(server, sessions) {
57
+ server.registerTool('qa_network', {
58
+ title: 'Network state control',
59
+ description: 'Offline/online testing via airplane mode (no raw adb; needs Android 11+ `cmd connectivity`). Actions: status, offline, online, restore. Swipium records the original airplane state on the first change and restores it on qa_report, on explicit `restore`, and best-effort on server shutdown (SIGINT/SIGTERM/transport close). offline/online require consent.',
60
+ inputSchema: {
61
+ sessionId: z.string(),
62
+ action: z.enum(['status', 'offline', 'online', 'restore']),
63
+ consentId: z.string().optional(),
64
+ approve: z.boolean().optional(),
65
+ },
66
+ }, async ({ sessionId, action, consentId, approve }) => {
67
+ const session = sessions.get(sessionId);
68
+ const { driver: d } = session ? await getDriver(session) : { driver: undefined };
69
+ if (!session || !d) {
70
+ return qaError({ what: 'No device attached', changedState: false, retrySafe: true, nextSteps: ['Call qa_prepare_target first.'] });
71
+ }
72
+ const airplane = await d.airplaneOn();
73
+ if (action === 'status') {
74
+ return qaOk({ network: airplane ? 'offline' : 'online', airplaneOn: airplane, changedBySwipium: !!session.network?.changed, restoreAvailable: !!session.network?.changed }, `network=${airplane ? 'offline (airplane on)' : 'online'}${session.network?.changed ? ' (changed by Swipium — will restore)' : ''}`);
75
+ }
76
+ if (action === 'restore') {
77
+ const msg = await restoreNetwork(sessions, session, d);
78
+ return qaOk({ network: (await d.airplaneOn()) ? 'offline' : 'online', restored: !!msg }, msg ? `network ${msg}` : 'nothing to restore (Swipium did not change the network)');
79
+ }
80
+ // offline / online — consent-gated, records original on first change.
81
+ const wantAirplane = action === 'offline';
82
+ const gate = consumeConsent(consentId, approve, { action: 'network_change', affects: { to: action } });
83
+ if (!gate.approved) {
84
+ sessions.recordMutation(session, {
85
+ tool: 'qa_network',
86
+ action: 'network_change',
87
+ risk: 'medium',
88
+ target: { to: action, airplane: wantAirplane },
89
+ consent: { required: true, approved: false, payloadHash: action },
90
+ status: 'requested',
91
+ });
92
+ return requireConsent({
93
+ action: 'network_change',
94
+ risk: 'medium',
95
+ exactCommand: `adb shell cmd connectivity airplane-mode ${wantAirplane ? 'enable' : 'disable'}`,
96
+ affects: { to: action },
97
+ explain: `Set the device ${action} (airplane mode ${wantAirplane ? 'ON' : 'OFF'})? Swipium will restore the original state on qa_report / session end.`,
98
+ });
99
+ }
100
+ sessions.recordMutation(session, {
101
+ tool: 'qa_network',
102
+ action: 'network_change',
103
+ risk: 'medium',
104
+ target: { to: action, airplane: wantAirplane },
105
+ consent: { required: true, consentId, approved: true, payloadHash: action },
106
+ status: 'approved',
107
+ });
108
+ if (!session.network?.changed) {
109
+ session.network = { changed: true, originalAirplane: airplane };
110
+ }
111
+ sessions.persist(session);
112
+ try {
113
+ await d.setAirplane(wantAirplane);
114
+ }
115
+ catch (e) {
116
+ // Older images / no `cmd connectivity airplane-mode` (pre-Android 11).
117
+ if (!session.network.changed)
118
+ session.network = undefined;
119
+ sessions.persist(session);
120
+ return qaError({
121
+ what: `Network control unsupported on this device: ${String(e)}`,
122
+ changedState: false,
123
+ retrySafe: false,
124
+ nextSteps: ['Needs Android 11+ (`cmd connectivity airplane-mode`). Use a newer emulator image, or toggle network manually.'],
125
+ });
126
+ }
127
+ sessions.addEnvChange(session, `network → ${action} (airplane=${wantAirplane})`);
128
+ await new Promise((r) => setTimeout(r, 1200)); // settle
129
+ const now = await d.airplaneOn();
130
+ sessions.recordMutation(session, {
131
+ tool: 'qa_network',
132
+ action: 'network_change',
133
+ risk: 'medium',
134
+ target: { to: action, airplane: wantAirplane },
135
+ consent: { required: true, approved: true, payloadHash: action },
136
+ status: 'executed',
137
+ detail: `network=${now ? 'offline' : 'online'}`,
138
+ });
139
+ return qaOk({ network: now ? 'offline' : 'online', previousStateRecorded: true, restoreAvailable: true }, `network → ${now ? 'offline' : 'online'}. Original recorded; restore on qa_report / qa_network restore.`);
140
+ });
141
+ }
50
142
  //# sourceMappingURL=network.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"network.js","sourceRoot":"","sources":["../../src/tools/network.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAK1F,2FAA2F;AAC3F,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAsB,EAAE,OAAgB,EAAE,CAAS;IACtF,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO;QAAE,OAAO,IAAI,CAAC;IAC3C,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC;IAClD,MAAM,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC9B,QAAQ,CAAC,YAAY,CAAC,OAAO,EAAE,8BAA8B,QAAQ,GAAG,CAAC,CAAC;IAC1E,QAAQ,CAAC,cAAc,CAAC,OAAO,EAAE;QAC/B,IAAI,EAAE,WAAW;QACjB,MAAM,EAAE,iBAAiB;QACzB,IAAI,EAAE,KAAK;QACX,MAAM,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE;QAChC,OAAO,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE;QAC5C,MAAM,EAAE,UAAU;QAClB,MAAM,EAAE,qBAAqB,QAAQ,EAAE;KACxC,CAAC,CAAC;IACH,OAAO,CAAC,OAAO,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,CAAC;IACjE,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1B,OAAO,sBAAsB,QAAQ,GAAG,CAAC;AAC3C,CAAC;AAED,0FAA0F;AAC1F,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,QAAsB;IAC5D,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,4BAA4B,CAAC,CAAC;IACpE,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;QAChC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,OAAO;YAAE,SAAS;QAClC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAC1E,IAAI,CAAC,CAAC;YAAE,SAAS;QACjB,IAAI,CAAC;YACH,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAChD,QAAQ,CAAC,cAAc,CAAC,CAAC,EAAE;gBACzB,IAAI,EAAE,kBAAkB;gBACxB,MAAM,EAAE,iBAAiB;gBACzB,IAAI,EAAE,KAAK;gBACX,MAAM,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,gBAAgB,EAAE,QAAQ,EAAE,IAAI,EAAE;gBAClE,OAAO,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE;gBAC5C,MAAM,EAAE,UAAU;gBAClB,MAAM,EAAE,iCAAiC;aAC1C,CAAC,CAAC;YACH,CAAC,CAAC,OAAO,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC;YAC7E,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACtB,CAAC;QAAC,MAAM,CAAC;YACP,6BAA6B;QAC/B,CAAC;IACH,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"network.js","sourceRoot":"","sources":["../../src/tools/network.ts"],"names":[],"mappings":"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"}