swipium 1.5.0 → 2.0.1

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 (498) hide show
  1. package/CHANGELOG.md +183 -0
  2. package/README.md +173 -280
  3. package/THREAT_MODEL.md +223 -47
  4. package/dist/appMap/automationLink.js +30 -27
  5. package/dist/appMap/automationLink.js.map +1 -1
  6. package/dist/appMap/build.js +47 -21
  7. package/dist/appMap/build.js.map +1 -1
  8. package/dist/appMap/codeIndex.js +2 -2
  9. package/dist/appMap/codeIndex.js.map +1 -1
  10. package/dist/appMap/featureIndex.js +3 -3
  11. package/dist/appMap/featureIndex.js.map +1 -1
  12. package/dist/appMap/featureModel.js +2 -2
  13. package/dist/appMap/featureModel.js.map +1 -1
  14. package/dist/appMap/firstRunApply.js +2 -2
  15. package/dist/appMap/firstRunApply.js.map +1 -1
  16. package/dist/appMap/issues.js +10 -10
  17. package/dist/appMap/issues.js.map +1 -1
  18. package/dist/appMap/migrations.js +5 -5
  19. package/dist/appMap/migrations.js.map +1 -1
  20. package/dist/appMap/prelaunch.js +2 -2
  21. package/dist/appMap/prelaunch.js.map +1 -1
  22. package/dist/appMap/projectRegistry.js +77 -11
  23. package/dist/appMap/projectRegistry.js.map +1 -1
  24. package/dist/appMap/provenance.js +2 -2
  25. package/dist/appMap/provenance.js.map +1 -1
  26. package/dist/appMap/query.js +2 -2
  27. package/dist/appMap/query.js.map +1 -1
  28. package/dist/appMap/runtimeMerge.js +3 -3
  29. package/dist/appMap/runtimeMerge.js.map +1 -1
  30. package/dist/appMap/schema.js +1 -1
  31. package/dist/appMap/schema.js.map +1 -1
  32. package/dist/appMap/screenMatch.js +1 -1
  33. package/dist/appMap/screenMatch.js.map +1 -1
  34. package/dist/appMap/staticScan.js +17 -17
  35. package/dist/appMap/staticScan.js.map +1 -1
  36. package/dist/appMap/store.js +55 -7
  37. package/dist/appMap/store.js.map +1 -1
  38. package/dist/appMap/tsAstScan.js +3 -3
  39. package/dist/appMap/tsAstScan.js.map +1 -1
  40. package/dist/artifacts/bundletool.js +5 -5
  41. package/dist/artifacts/bundletool.js.map +1 -1
  42. package/dist/artifacts/resolve.js +10 -10
  43. package/dist/artifacts/resolve.js.map +1 -1
  44. package/dist/automation/capabilities.js +3 -3
  45. package/dist/automation/capabilities.js.map +1 -1
  46. package/dist/automation/gestures.js +1 -1
  47. package/dist/automation/gestures.js.map +1 -1
  48. package/dist/automation/plan.js +7 -7
  49. package/dist/automation/plan.js.map +1 -1
  50. package/dist/automation/report.js +3 -3
  51. package/dist/automation/report.js.map +1 -1
  52. package/dist/automation/selectors.js +14 -25
  53. package/dist/automation/selectors.js.map +1 -1
  54. package/dist/automation/types.js +1 -1
  55. package/dist/automation/types.js.map +1 -1
  56. package/dist/automation/waits.js +5 -5
  57. package/dist/automation/waits.js.map +1 -1
  58. package/dist/automation/webview.js +2 -2
  59. package/dist/automation/webview.js.map +1 -1
  60. package/dist/automationGen/appiumModel.js +13 -7
  61. package/dist/automationGen/appiumModel.js.map +1 -1
  62. package/dist/automationGen/ciEmitter.js +5 -5
  63. package/dist/automationGen/ciEmitter.js.map +1 -1
  64. package/dist/automationGen/identifiers.js +224 -0
  65. package/dist/automationGen/identifiers.js.map +1 -0
  66. package/dist/automationGen/jsEmitter.js +265 -106
  67. package/dist/automationGen/jsEmitter.js.map +1 -1
  68. package/dist/automationGen/packagePatch.js +2 -2
  69. package/dist/automationGen/packagePatch.js.map +1 -1
  70. package/dist/automationGen/platformResolve.js +36 -0
  71. package/dist/automationGen/platformResolve.js.map +1 -0
  72. package/dist/automationGen/projectProfile.js +71 -26
  73. package/dist/automationGen/projectProfile.js.map +1 -1
  74. package/dist/automationGen/pythonEmitter.js +276 -105
  75. package/dist/automationGen/pythonEmitter.js.map +1 -1
  76. package/dist/automationGen/readmeEmitter.js +7 -6
  77. package/dist/automationGen/readmeEmitter.js.map +1 -1
  78. package/dist/{tools/automationGenerate.js → automationGen/run.js} +72 -113
  79. package/dist/automationGen/run.js.map +1 -0
  80. package/dist/automationGen/suitePlan.js +6 -4
  81. package/dist/automationGen/suitePlan.js.map +1 -1
  82. package/dist/automationGen/validation.js +20 -8
  83. package/dist/automationGen/validation.js.map +1 -1
  84. package/dist/build/parseBuildLog.js +2 -2
  85. package/dist/build/parseBuildLog.js.map +1 -1
  86. package/dist/build/plan.js +7 -7
  87. package/dist/build/plan.js.map +1 -1
  88. package/dist/ci/preflight.js +13 -4
  89. package/dist/ci/preflight.js.map +1 -1
  90. package/dist/cli/gc.js +74 -0
  91. package/dist/cli/gc.js.map +1 -0
  92. package/dist/cli/init.js +217 -26
  93. package/dist/cli/init.js.map +1 -1
  94. package/dist/cli/main.js +50 -0
  95. package/dist/cli/main.js.map +1 -0
  96. package/dist/cli/report.js +218 -0
  97. package/dist/cli/report.js.map +1 -0
  98. package/dist/cli/scan.js +35 -14
  99. package/dist/cli/scan.js.map +1 -1
  100. package/dist/cli/suite.js +6 -6
  101. package/dist/cli/suite.js.map +1 -1
  102. package/dist/cli/verify.js +7 -7
  103. package/dist/cli/verify.js.map +1 -1
  104. package/dist/consent/consent.js +162 -5
  105. package/dist/consent/consent.js.map +1 -1
  106. package/dist/context/detect.js +45 -14
  107. package/dist/context/detect.js.map +1 -1
  108. package/dist/context/findApps.js +6 -6
  109. package/dist/context/findApps.js.map +1 -1
  110. package/dist/context/projectRoot.js +174 -19
  111. package/dist/context/projectRoot.js.map +1 -1
  112. package/dist/context/scan.js +1 -1
  113. package/dist/context/scan.js.map +1 -1
  114. package/dist/core/capabilityGroups.js +90 -0
  115. package/dist/core/capabilityGroups.js.map +1 -0
  116. package/dist/core/target.js +3 -3
  117. package/dist/core/target.js.map +1 -1
  118. package/dist/core/targetPlan.js +65 -62
  119. package/dist/core/targetPlan.js.map +1 -1
  120. package/dist/drivers/DirectDriver.js +300 -36
  121. package/dist/drivers/DirectDriver.js.map +1 -1
  122. package/dist/drivers/SimctlDriver.js +120 -7
  123. package/dist/drivers/SimctlDriver.js.map +1 -1
  124. package/dist/drivers/WdaDriver.js +350 -50
  125. package/dist/drivers/WdaDriver.js.map +1 -1
  126. package/dist/explore/candidates.js +2 -2
  127. package/dist/explore/candidates.js.map +1 -1
  128. package/dist/explore/graph.js +5 -5
  129. package/dist/explore/graph.js.map +1 -1
  130. package/dist/explore/policy.js +5 -5
  131. package/dist/explore/policy.js.map +1 -1
  132. package/dist/explore/runner.js +301 -284
  133. package/dist/explore/runner.js.map +1 -1
  134. package/dist/explore/signatures.js +1 -1
  135. package/dist/featureTesting/executionBootstrap.js +29 -30
  136. package/dist/featureTesting/executionBootstrap.js.map +1 -1
  137. package/dist/featureTesting/featureMap.js +2 -2
  138. package/dist/featureTesting/featureMap.js.map +1 -1
  139. package/dist/featureTesting/featureScope.js +12 -12
  140. package/dist/featureTesting/featureScope.js.map +1 -1
  141. package/dist/featureTesting/mapFeatureScope.js +7 -7
  142. package/dist/featureTesting/mapFeatureScope.js.map +1 -1
  143. package/dist/featureTesting/objectiveModel.js +10 -10
  144. package/dist/featureTesting/objectiveModel.js.map +1 -1
  145. package/dist/featureTesting/resultMerge.js +6 -6
  146. package/dist/featureTesting/resultMerge.js.map +1 -1
  147. package/dist/featureTesting/sources.js +4 -4
  148. package/dist/featureTesting/sources.js.map +1 -1
  149. package/dist/featureTesting/suiteBridge.js +1 -1
  150. package/dist/featureTesting/suiteBridge.js.map +1 -1
  151. package/dist/featureTesting/synonyms.js +1 -1
  152. package/dist/featureTesting/synonyms.js.map +1 -1
  153. package/dist/featureTesting/testCaseFactory.js +11 -11
  154. package/dist/featureTesting/testCaseFactory.js.map +1 -1
  155. package/dist/featureTesting/testPlan.js +3 -3
  156. package/dist/featureTesting/testPlan.js.map +1 -1
  157. package/dist/firstRun/authStateMachine.js +1 -1
  158. package/dist/firstRun/authStateMachine.js.map +1 -1
  159. package/dist/firstRun/classifyScreen.js +5 -5
  160. package/dist/firstRun/classifyScreen.js.map +1 -1
  161. package/dist/firstRun/firstRunPlanner.js +11 -11
  162. package/dist/firstRun/firstRunPlanner.js.map +1 -1
  163. package/dist/firstRun/firstRunRunner.js +8 -8
  164. package/dist/firstRun/firstRunRunner.js.map +1 -1
  165. package/dist/firstRun/generatedDataPolicy.js +9 -9
  166. package/dist/firstRun/generatedDataPolicy.js.map +1 -1
  167. package/dist/firstRun/inputPlanner.js +5 -5
  168. package/dist/firstRun/inputPlanner.js.map +1 -1
  169. package/dist/firstRun/onboardingStateMachine.js +1 -1
  170. package/dist/firstRun/onboardingStateMachine.js.map +1 -1
  171. package/dist/firstRun/paywallPolicy.js +3 -3
  172. package/dist/firstRun/paywallPolicy.js.map +1 -1
  173. package/dist/firstRun/types.js +1 -1
  174. package/dist/firstRun/types.js.map +1 -1
  175. package/dist/fixtures/catalog.js +33 -3
  176. package/dist/fixtures/catalog.js.map +1 -1
  177. package/dist/fixtures/load.js +50 -0
  178. package/dist/fixtures/load.js.map +1 -0
  179. package/dist/flows/discover.js +2 -2
  180. package/dist/flows/discover.js.map +1 -1
  181. package/dist/flows/generate.js +20 -10
  182. package/dist/flows/generate.js.map +1 -1
  183. package/dist/flows/pack.js +3 -3
  184. package/dist/flows/pack.js.map +1 -1
  185. package/dist/flows/paths.js +57 -0
  186. package/dist/flows/paths.js.map +1 -0
  187. package/dist/flows/repair.js +111 -23
  188. package/dist/flows/repair.js.map +1 -1
  189. package/dist/flows/run.js +153 -57
  190. package/dist/flows/run.js.map +1 -1
  191. package/dist/flows/schema.js +50 -5
  192. package/dist/flows/schema.js.map +1 -1
  193. package/dist/flows/seedExec.js +4 -4
  194. package/dist/flows/seedExec.js.map +1 -1
  195. package/dist/flows/templates.js +5 -5
  196. package/dist/index.js +50 -8
  197. package/dist/index.js.map +1 -1
  198. package/dist/issues/classify.js +16 -16
  199. package/dist/issues/classify.js.map +1 -1
  200. package/dist/issues/fingerprint.js +24 -4
  201. package/dist/issues/fingerprint.js.map +1 -1
  202. package/dist/issues/index.js +94 -31
  203. package/dist/issues/index.js.map +1 -1
  204. package/dist/issues/metrics.js +4 -4
  205. package/dist/issues/metrics.js.map +1 -1
  206. package/dist/issues/recurrence.js +35 -8
  207. package/dist/issues/recurrence.js.map +1 -1
  208. package/dist/issues/report.js +4 -4
  209. package/dist/issues/report.js.map +1 -1
  210. package/dist/issues/reportBridge.js +4 -4
  211. package/dist/issues/reportBridge.js.map +1 -1
  212. package/dist/issues/schema.js +2 -2
  213. package/dist/issues/schema.js.map +1 -1
  214. package/dist/issues/sourceRevision.js +2 -2
  215. package/dist/issues/sourceRevision.js.map +1 -1
  216. package/dist/issues/store.js +110 -32
  217. package/dist/issues/store.js.map +1 -1
  218. package/dist/lib/abortScope.js +48 -0
  219. package/dist/lib/abortScope.js.map +1 -0
  220. package/dist/lib/android.js +75 -7
  221. package/dist/lib/android.js.map +1 -1
  222. package/dist/lib/coordSpace.js +1 -1
  223. package/dist/lib/coordSpace.js.map +1 -1
  224. package/dist/lib/device.js +32 -7
  225. package/dist/lib/device.js.map +1 -1
  226. package/dist/lib/gestures.js +141 -0
  227. package/dist/lib/gestures.js.map +1 -0
  228. package/dist/lib/gitignore.js +4 -3
  229. package/dist/lib/gitignore.js.map +1 -1
  230. package/dist/lib/image.js +1 -1
  231. package/dist/lib/image.js.map +1 -1
  232. package/dist/lib/lockfile.js +370 -31
  233. package/dist/lib/lockfile.js.map +1 -1
  234. package/dist/lib/needsInput.js +3 -3
  235. package/dist/lib/needsInput.js.map +1 -1
  236. package/dist/lib/png.js +2 -2
  237. package/dist/lib/png.js.map +1 -1
  238. package/dist/lib/redact.js +170 -9
  239. package/dist/lib/redact.js.map +1 -1
  240. package/dist/lib/result.js +79 -10
  241. package/dist/lib/result.js.map +1 -1
  242. package/dist/lib/schemaHash.js +3 -3
  243. package/dist/lib/schemaHash.js.map +1 -1
  244. package/dist/lib/sensitive.js +3 -2
  245. package/dist/lib/sensitive.js.map +1 -1
  246. package/dist/lib/simctl.js +3 -3
  247. package/dist/lib/simctl.js.map +1 -1
  248. package/dist/lib/spawn.js +52 -10
  249. package/dist/lib/spawn.js.map +1 -1
  250. package/dist/lib/toolAnnotations.js +114 -0
  251. package/dist/lib/toolAnnotations.js.map +1 -0
  252. package/dist/lib/wda.js +294 -15
  253. package/dist/lib/wda.js.map +1 -1
  254. package/dist/mobileAudit/checks.js +12 -12
  255. package/dist/mobileAudit/checks.js.map +1 -1
  256. package/dist/mobileAudit/evidence.js +4 -4
  257. package/dist/mobileAudit/evidence.js.map +1 -1
  258. package/dist/mobileAudit/profiles.js +1 -1
  259. package/dist/mobileAudit/profiles.js.map +1 -1
  260. package/dist/mobileAudit/results.js +3 -3
  261. package/dist/mobileAudit/results.js.map +1 -1
  262. package/dist/mobileAudit/runner.js +72 -18
  263. package/dist/mobileAudit/runner.js.map +1 -1
  264. package/dist/oracle/auth.js +1 -1
  265. package/dist/oracle/auth.js.map +1 -1
  266. package/dist/oracle/failures.js +219 -36
  267. package/dist/oracle/failures.js.map +1 -1
  268. package/dist/oracle/health.js +63 -17
  269. package/dist/oracle/health.js.map +1 -1
  270. package/dist/oracle/locator.js +13 -13
  271. package/dist/oracle/locator.js.map +1 -1
  272. package/dist/oracle/record.js +3 -3
  273. package/dist/oracle/record.js.map +1 -1
  274. package/dist/orchestration/envelope.js +2 -2
  275. package/dist/orchestration/envelope.js.map +1 -1
  276. package/dist/orchestration/goal.js +4 -4
  277. package/dist/orchestration/goal.js.map +1 -1
  278. package/dist/orchestration/testThis/execute.js +62 -21
  279. package/dist/orchestration/testThis/execute.js.map +1 -1
  280. package/dist/orchestration/testThis/pipeline.js +119 -30
  281. package/dist/orchestration/testThis/pipeline.js.map +1 -1
  282. package/dist/orchestration/testThis/plan.js +162 -73
  283. package/dist/orchestration/testThis/plan.js.map +1 -1
  284. package/dist/orchestration/testThis/sessionIntent.js +72 -0
  285. package/dist/orchestration/testThis/sessionIntent.js.map +1 -0
  286. package/dist/orchestration/testThis/terminal.js +34 -16
  287. package/dist/orchestration/testThis/terminal.js.map +1 -1
  288. package/dist/orchestration/testThis/types.js +1 -1
  289. package/dist/orchestration/testThis/types.js.map +1 -1
  290. package/dist/plan/plan.js +9 -9
  291. package/dist/plan/plan.js.map +1 -1
  292. package/dist/prompts/index.js +22 -22
  293. package/dist/prompts/index.js.map +1 -1
  294. package/dist/report/export.js +392 -37
  295. package/dist/report/export.js.map +1 -1
  296. package/dist/report/findingsDedupe.js +41 -0
  297. package/dist/report/findingsDedupe.js.map +1 -0
  298. package/dist/report/policy.js +7 -4
  299. package/dist/report/policy.js.map +1 -1
  300. package/dist/report/qaLevel.js +8 -8
  301. package/dist/report/qaLevel.js.map +1 -1
  302. package/dist/report/sarifSources.js +160 -0
  303. package/dist/report/sarifSources.js.map +1 -0
  304. package/dist/report/summary.js +2 -2
  305. package/dist/report/summary.js.map +1 -1
  306. package/dist/report/testCatalog.js +4 -4
  307. package/dist/report/testCatalog.js.map +1 -1
  308. package/dist/report/toolHealth.js +124 -0
  309. package/dist/report/toolHealth.js.map +1 -0
  310. package/dist/server.js +472 -45
  311. package/dist/server.js.map +1 -1
  312. package/dist/services/automationGenerate.js +8 -2
  313. package/dist/services/automationGenerate.js.map +1 -1
  314. package/dist/services/build.js +2 -2
  315. package/dist/services/build.js.map +1 -1
  316. package/dist/{tools → services}/flowGenerate.js +29 -13
  317. package/dist/services/flowGenerate.js.map +1 -0
  318. package/dist/services/preflight.js +4 -4
  319. package/dist/services/preflight.js.map +1 -1
  320. package/dist/services/prepareAndroid.js +46 -8
  321. package/dist/services/prepareAndroid.js.map +1 -1
  322. package/dist/services/prepareIos.js +24 -9
  323. package/dist/services/prepareIos.js.map +1 -1
  324. package/dist/services/report.js +100 -45
  325. package/dist/services/report.js.map +1 -1
  326. package/dist/services/smoke.js +32 -16
  327. package/dist/services/smoke.js.map +1 -1
  328. package/dist/services/suiteGenerate.js +28 -3
  329. package/dist/services/suiteGenerate.js.map +1 -1
  330. package/dist/services/testSuiteKnowledge.js +40 -27
  331. package/dist/services/testSuiteKnowledge.js.map +1 -1
  332. package/dist/session/attach.js +270 -6
  333. package/dist/session/attach.js.map +1 -1
  334. package/dist/session/processRegistry.js +317 -48
  335. package/dist/session/processRegistry.js.map +1 -1
  336. package/dist/session/progress.js +1 -1
  337. package/dist/session/retention.js +201 -0
  338. package/dist/session/retention.js.map +1 -0
  339. package/dist/session/store.js +275 -48
  340. package/dist/session/store.js.map +1 -1
  341. package/dist/snapshot/overlays.js +53 -8
  342. package/dist/snapshot/overlays.js.map +1 -1
  343. package/dist/snapshot/parse.js +28 -4
  344. package/dist/snapshot/parse.js.map +1 -1
  345. package/dist/snapshot/present.js +11 -5
  346. package/dist/snapshot/present.js.map +1 -1
  347. package/dist/snapshot/settle.js +39 -9
  348. package/dist/snapshot/settle.js.map +1 -1
  349. package/dist/state/consent.js +99 -0
  350. package/dist/state/consent.js.map +1 -0
  351. package/dist/state/profile.js +46 -2
  352. package/dist/state/profile.js.map +1 -1
  353. package/dist/suite/compile.js +9 -5
  354. package/dist/suite/compile.js.map +1 -1
  355. package/dist/suite/lint.js +4 -4
  356. package/dist/suite/lint.js.map +1 -1
  357. package/dist/suite/pom.js +50 -41
  358. package/dist/suite/pom.js.map +1 -1
  359. package/dist/suite/secretGuard.js +266 -0
  360. package/dist/suite/secretGuard.js.map +1 -0
  361. package/dist/suite/testcase.js +9 -7
  362. package/dist/suite/testcase.js.map +1 -1
  363. package/dist/testSuite/exporter.js +4 -4
  364. package/dist/testSuite/exporter.js.map +1 -1
  365. package/dist/testSuite/generator.js +13 -9
  366. package/dist/testSuite/generator.js.map +1 -1
  367. package/dist/testSuite/history.js +1 -1
  368. package/dist/testSuite/history.js.map +1 -1
  369. package/dist/testSuite/issueLinks.js +3 -3
  370. package/dist/testSuite/issueLinks.js.map +1 -1
  371. package/dist/testSuite/lint.js +4 -4
  372. package/dist/testSuite/lint.js.map +1 -1
  373. package/dist/testSuite/merge.js +5 -5
  374. package/dist/testSuite/merge.js.map +1 -1
  375. package/dist/testSuite/schema.js +5 -5
  376. package/dist/testSuite/schema.js.map +1 -1
  377. package/dist/testSuite/store.js +3 -3
  378. package/dist/testSuite/store.js.map +1 -1
  379. package/dist/testSuite/traceability.js +2 -2
  380. package/dist/testSuite/traceability.js.map +1 -1
  381. package/dist/tools/act.js +794 -164
  382. package/dist/tools/act.js.map +1 -1
  383. package/dist/tools/agent.js +451 -128
  384. package/dist/tools/agent.js.map +1 -1
  385. package/dist/tools/appControl.js +69 -19
  386. package/dist/tools/appControl.js.map +1 -1
  387. package/dist/tools/appMap.js +188 -130
  388. package/dist/tools/appMap.js.map +1 -1
  389. package/dist/tools/build.js +32 -42
  390. package/dist/tools/build.js.map +1 -1
  391. package/dist/tools/bundletool.js +21 -31
  392. package/dist/tools/bundletool.js.map +1 -1
  393. package/dist/tools/clearOverlay.js +55 -12
  394. package/dist/tools/clearOverlay.js.map +1 -1
  395. package/dist/tools/device.js +76 -24
  396. package/dist/tools/device.js.map +1 -1
  397. package/dist/tools/doctor.js +68 -28
  398. package/dist/tools/doctor.js.map +1 -1
  399. package/dist/tools/explore.js +41 -47
  400. package/dist/tools/explore.js.map +1 -1
  401. package/dist/tools/featureTesting.js +31 -48
  402. package/dist/tools/featureTesting.js.map +1 -1
  403. package/dist/tools/firstRun.js +34 -41
  404. package/dist/tools/firstRun.js.map +1 -1
  405. package/dist/tools/flow.js +183 -103
  406. package/dist/tools/flow.js.map +1 -1
  407. package/dist/tools/flowRepair.js +25 -13
  408. package/dist/tools/flowRepair.js.map +1 -1
  409. package/dist/tools/generate.js +52 -89
  410. package/dist/tools/generate.js.map +1 -1
  411. package/dist/tools/getArtifact.js +16 -5
  412. package/dist/tools/getArtifact.js.map +1 -1
  413. package/dist/tools/health.js +15 -12
  414. package/dist/tools/health.js.map +1 -1
  415. package/dist/tools/ios.js +45 -223
  416. package/dist/tools/ios.js.map +1 -1
  417. package/dist/tools/issues.js +251 -35
  418. package/dist/tools/issues.js.map +1 -1
  419. package/dist/tools/jobs.js +41 -16
  420. package/dist/tools/jobs.js.map +1 -1
  421. package/dist/tools/metro.js +36 -35
  422. package/dist/tools/metro.js.map +1 -1
  423. package/dist/tools/mobileAudit.js +50 -45
  424. package/dist/tools/mobileAudit.js.map +1 -1
  425. package/dist/tools/network.js +31 -14
  426. package/dist/tools/network.js.map +1 -1
  427. package/dist/tools/note.js +26 -26
  428. package/dist/tools/note.js.map +1 -1
  429. package/dist/tools/prepareIosTarget.js +10 -16
  430. package/dist/tools/prepareIosTarget.js.map +1 -1
  431. package/dist/tools/prepareTarget.js +117 -50
  432. package/dist/tools/prepareTarget.js.map +1 -1
  433. package/dist/tools/report.js +11 -22
  434. package/dist/tools/report.js.map +1 -1
  435. package/dist/tools/resolveArtifact.js +11 -15
  436. package/dist/tools/resolveArtifact.js.map +1 -1
  437. package/dist/tools/resolveTarget.js +78 -24
  438. package/dist/tools/resolveTarget.js.map +1 -1
  439. package/dist/tools/screenRecord.js +23 -21
  440. package/dist/tools/screenRecord.js.map +1 -1
  441. package/dist/tools/screenshot.js +23 -16
  442. package/dist/tools/screenshot.js.map +1 -1
  443. package/dist/tools/smoke.js +20 -16
  444. package/dist/tools/smoke.js.map +1 -1
  445. package/dist/tools/snapshot.js +155 -118
  446. package/dist/tools/snapshot.js.map +1 -1
  447. package/dist/tools/startSession.js +104 -116
  448. package/dist/tools/startSession.js.map +1 -1
  449. package/dist/tools/suite.js +72 -43
  450. package/dist/tools/suite.js.map +1 -1
  451. package/dist/tools/testSuite.js +30 -20
  452. package/dist/tools/testSuite.js.map +1 -1
  453. package/dist/tools/testThis.js +24 -28
  454. package/dist/tools/testThis.js.map +1 -1
  455. package/dist/tools/visual.js +686 -210
  456. package/dist/tools/visual.js.map +1 -1
  457. package/dist/tools/wait.js +9 -38
  458. package/dist/tools/wait.js.map +1 -1
  459. package/dist/tools/wda.js +187 -57
  460. package/dist/tools/wda.js.map +1 -1
  461. package/dist/version.js +31 -22
  462. package/dist/version.js.map +1 -1
  463. package/dist/visual/ocr.js +53 -6
  464. package/dist/visual/ocr.js.map +1 -1
  465. package/dist/visual/provider.js +80 -12
  466. package/dist/visual/provider.js.map +1 -1
  467. package/docs/README.md +24 -10
  468. package/docs/ci-reports.md +328 -0
  469. package/docs/concepts.md +227 -0
  470. package/docs/flows.md +153 -0
  471. package/docs/mcp-server.md +194 -128
  472. package/docs/physical-devices.md +84 -0
  473. package/docs/tools.md +812 -152
  474. package/package.json +3 -2
  475. package/dist/tools/assertVisual.js +0 -84
  476. package/dist/tools/assertVisual.js.map +0 -1
  477. package/dist/tools/automationGenerate.js.map +0 -1
  478. package/dist/tools/capabilities.js +0 -179
  479. package/dist/tools/capabilities.js.map +0 -1
  480. package/dist/tools/detectContext.js +0 -41
  481. package/dist/tools/detectContext.js.map +0 -1
  482. package/dist/tools/flowGenerate.js.map +0 -1
  483. package/dist/tools/history.js +0 -86
  484. package/dist/tools/history.js.map +0 -1
  485. package/dist/tools/locator.js +0 -85
  486. package/dist/tools/locator.js.map +0 -1
  487. package/dist/tools/permissions.js +0 -174
  488. package/dist/tools/permissions.js.map +0 -1
  489. package/dist/tools/plan.js +0 -52
  490. package/dist/tools/plan.js.map +0 -1
  491. package/dist/tools/screenInfo.js +0 -76
  492. package/dist/tools/screenInfo.js.map +0 -1
  493. package/dist/tools/seed.js +0 -133
  494. package/dist/tools/seed.js.map +0 -1
  495. package/dist/tools/state.js +0 -217
  496. package/dist/tools/state.js.map +0 -1
  497. package/dist/tools/visualText.js +0 -106
  498. package/dist/tools/visualText.js.map +0 -1
@@ -1,4 +1,4 @@
1
- // qa_metro — own the debug React Native / Expo Metro flow (review §4.2 / Rec 5).
1
+ // qa_metro: own the debug React Native / Expo Metro flow (review §4.2 / Rec 5).
2
2
  // A debug RN/Expo APK needs a Metro dev server on :8081 + `adb reverse` to fetch its JS
3
3
  // bundle. `status` reports whether that's ready; `start` (consent-gated) sets up the
4
4
  // reverse and launches Metro, logging to a session artifact.
@@ -6,7 +6,7 @@ import { z } from 'zod';
6
6
  import { openSync, closeSync } from 'node:fs';
7
7
  import { join } from 'node:path';
8
8
  import { spawn, spawnSync } from 'node:child_process';
9
- import { qaOk, qaError } from '../lib/result.js';
9
+ import { qaOk, qaError, unknownSessionError } from '../lib/result.js';
10
10
  import { requireConsent, consumeConsent } from '../consent/consent.js';
11
11
  import { run } from '../lib/spawn.js';
12
12
  import { detectFramework } from '../context/detect.js';
@@ -14,17 +14,18 @@ import { METRO_PORT, metroReadiness } from '../lib/metroState.js';
14
14
  import { parseSnapshot } from '../snapshot/parse.js';
15
15
  import { detectRedBox } from '../snapshot/overlays.js';
16
16
  import { getDriver, resolveDevice, bindDevice } from '../session/attach.js';
17
- import { registerManagedProcess, unregisterManagedProcess } from '../session/processRegistry.js';
17
+ import { psEnv, registerManagedProcess, unregisterManagedProcess } from '../session/processRegistry.js';
18
18
  /** True if `pid` is a live process whose command looks like a Metro/Expo/RN bundler. Guards
19
- * against killing a recycled PID — e.g. a `metroPid` persisted before a machine or server
20
- * restart that now belongs to an unrelated process. Best-effort (POSIX `ps`); on any doubt
19
+ * against killing a recycled PID (e.g. a `metroPid` persisted before a machine or server
20
+ * restart that now belongs to an unrelated process). Best-effort (POSIX `ps`); on any doubt
21
21
  * we report "not ours" so we never signal a stranger. */
22
22
  function metroProcessLooksAlive(pid) {
23
23
  try {
24
- const out = spawnSync('ps', ['-o', 'command=', '-p', String(pid)], { encoding: 'utf8' });
24
+ const out = spawnSync('ps', ['-o', 'command=', '-p', String(pid)], { encoding: 'utf8', env: psEnv() });
25
25
  if (out.status !== 0 || !out.stdout)
26
26
  return false;
27
- return /metro|expo|react-native|node/i.test(out.stdout);
27
+ // `npm exec …`: npx retitles itself after spawn (the launcher we recorded as metroPid).
28
+ return /metro|expo|react-native|node|npm exec/i.test(out.stdout);
28
29
  }
29
30
  catch {
30
31
  return false;
@@ -40,7 +41,7 @@ function killMetroGroup(pid) {
40
41
  return true;
41
42
  }
42
43
  catch {
43
- /* not a group leader, or group already gone — fall through */
44
+ /* not a group leader, or group already gone, fall through */
44
45
  }
45
46
  try {
46
47
  process.kill(pid, 'SIGTERM');
@@ -73,7 +74,9 @@ function metroCommand(framework) {
73
74
  export function registerMetro(server, sessions) {
74
75
  server.registerTool('qa_metro', {
75
76
  title: 'Metro dev server (debug RN/Expo)',
76
- 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.',
77
+ description: 'Metro bundler for debug React Native / Expo builds (:8081). status: Metro/reverse/serving state; diagnose: + RedBox ' +
78
+ 'detection, logcat evidence, and recovery steps; start (consent-gated): adb reverse + launch Metro with a log artifact; ' +
79
+ 'stop: kill it + remove the reverse. After start, relaunch with qa_prepare_target.',
77
80
  inputSchema: {
78
81
  sessionId: z.string(),
79
82
  action: z.enum(['status', 'diagnose', 'start', 'stop']),
@@ -83,20 +86,16 @@ export function registerMetro(server, sessions) {
83
86
  }, async ({ sessionId, action, consentId, approve }) => {
84
87
  const session = sessions.get(sessionId);
85
88
  if (!session)
86
- return qaError({
87
- what: `Unknown sessionId ${sessionId}`,
88
- changedState: false,
89
- retrySafe: true,
90
- nextSteps: ['Call qa_start_session first.'],
91
- });
89
+ return unknownSessionError(sessionId);
92
90
  // Centralized device resolution (P0.1/P0.3): use the session device, else the single
93
- // online one (bind it), else ask / guide — never a circular "no device" dead end.
91
+ // online one (bind it), else ask / guide. Never a circular "no device" dead end.
94
92
  const dev = await resolveDevice(session);
95
93
  if (dev.needSelection && action !== 'status') {
96
94
  return qaError({
97
- what: 'Multiple devices online — choose one',
95
+ what: 'Multiple devices online, choose one',
98
96
  changedState: false,
99
97
  retrySafe: true,
98
+ failureCode: 'MULTIPLE_DEVICES',
100
99
  nextSteps: [`Re-run qa_prepare_target with device="<serial>". Online: ${dev.available.join(', ')}`],
101
100
  });
102
101
  }
@@ -110,7 +109,7 @@ export function registerMetro(server, sessions) {
110
109
  if (action === 'status') {
111
110
  const deviceHint = serial
112
111
  ? ''
113
- : '\n⚠ No device bound — adb reverse needs one. Call qa_prepare_target first (it binds the device), then qa_metro.';
112
+ : '\n⚠ No device bound; adb reverse needs one. Call qa_prepare_target first (it binds the device), then qa_metro.';
114
113
  return qaOk({
115
114
  framework: fw,
116
115
  metroListening: listening,
@@ -125,8 +124,8 @@ export function registerMetro(server, sessions) {
125
124
  needsDevice: !serial,
126
125
  }, `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}` : ''}` +
127
126
  (rd.ready
128
- ? '\nReady — debug bundle can load.'
129
- : deviceHint || '\nNot fully ready — run qa_metro action="start" (or qa_metro diagnose).'));
127
+ ? '\nReady: debug bundle can load.'
128
+ : deviceHint || '\nNot fully ready. Run qa_metro action="start" (or qa_metro diagnose).'));
130
129
  }
131
130
  if (action === 'diagnose') {
132
131
  const { driver } = await getDriver(session);
@@ -148,23 +147,23 @@ export function registerMetro(server, sessions) {
148
147
  let requiresReinstall = false;
149
148
  if (!serial)
150
149
  recovery.push(dev.needSelection
151
- ? `Multiple devices online — re-run qa_prepare_target device="<serial>". Online: ${dev.available.join(', ')}`
152
- : 'No device online — boot one via qa_prepare_target (it boots + sets reverse), then retry.');
150
+ ? `Multiple devices online. Re-run qa_prepare_target device="<serial>". Online: ${dev.available.join(', ')}`
151
+ : 'No device online. Boot one via qa_prepare_target (it boots + sets reverse), then retry.');
153
152
  if (!listening)
154
153
  recovery.push('Start Metro: qa_metro action="start".');
155
154
  if (serial && listening && !reverseSet)
156
155
  recovery.push('Set reverse: qa_metro action="start" (sets adb reverse).');
157
156
  if (listening && !rd.serving)
158
- recovery.push('Metro is up but not serving the bundle yet — wait ~10s for the first transform, then retry.');
157
+ recovery.push('Metro is up but not serving the bundle yet. Wait ~10s for the first transform, then retry.');
159
158
  if (redbox.unableToLoadScript) {
160
159
  requiresReinstall = true;
161
- 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).');
160
+ 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).');
162
161
  }
163
162
  else if (redbox.present) {
164
163
  recovery.push('RedBox present (not load-script): tap RELOAD via qa_act, or fix the JS error shown.');
165
164
  }
166
165
  if (rd.ready && !redbox.present)
167
- recovery.push('Metro ready and no RedBox — the bundle should load.');
166
+ recovery.push('Metro ready and no RedBox. The bundle should load.');
168
167
  return qaOk({
169
168
  framework: fw,
170
169
  ...rd,
@@ -177,7 +176,7 @@ export function registerMetro(server, sessions) {
177
176
  recovery,
178
177
  }, `framework=${fw} | metro listening=${rd.listening} serving=${rd.serving} reverse=${reverseSet} ready=${rd.ready}\n` +
179
178
  `redbox=${redbox.present ? (redbox.unableToLoadScript ? 'UNABLE-TO-LOAD-SCRIPT' : 'present') : 'none'}${requiresReinstall ? ' ⚠ requires reinstall/rebuild' : ''}\n` +
180
- `recovery:\n - ${recovery.join('\n - ') || '(none — looks healthy)'}` +
179
+ `recovery:\n - ${recovery.join('\n - ') || '(none, looks healthy)'}` +
181
180
  (logUri ? `\nlogcat evidence: ${logUri}` : ''));
182
181
  }
183
182
  if (action === 'stop') {
@@ -214,20 +213,21 @@ export function registerMetro(server, sessions) {
214
213
  ? `Stopped Metro pid ${had}${killed ? '' : ' (was already gone)'}; removed adb reverse.`
215
214
  : 'No Swipium-started Metro to stop (it may have been started externally).');
216
215
  }
217
- // action === 'start' — `serial` is the single online device (auto-bound) or a session
216
+ // action === 'start': `serial` is the single online device (auto-bound) or a session
218
217
  // device. If none online, guide to prepare_target to BOOT (terminal, non-circular).
219
218
  if (!serial) {
220
219
  return qaError({
221
- what: dev.needSelection ? 'Multiple devices online — choose one' : 'No device online — Metro reverse needs a running device',
220
+ what: dev.needSelection ? 'Multiple devices online, choose one' : 'No device online. Metro reverse needs a running device',
222
221
  changedState: false,
223
222
  retrySafe: true,
223
+ failureCode: dev.needSelection ? 'MULTIPLE_DEVICES' : 'NO_DEVICE',
224
224
  nextSteps: dev.needSelection
225
225
  ? [`Re-run qa_prepare_target device="<serial>". Online: ${dev.available.join(', ')}`]
226
226
  : ['Boot a device first: qa_prepare_target { bindOnly:true } (boots an AVD + sets reverse), then qa_metro start.'],
227
227
  });
228
228
  }
229
229
  if (listening && reverseSet) {
230
- return qaOk({ framework: fw, metroListening: true, reverseSet: true, alreadyRunning: true }, 'Metro already listening and adb reverse already set — nothing to do.');
230
+ return qaOk({ framework: fw, metroListening: true, reverseSet: true, alreadyRunning: true }, 'Metro already listening and adb reverse already set, nothing to do.');
231
231
  }
232
232
  const { cmd, args } = metroCommand(fw);
233
233
  const cmdStr = `adb -s ${serial} reverse tcp:${METRO_PORT} tcp:${METRO_PORT} && (cd ${session.root} && ${cmd} ${args.join(' ')})`;
@@ -236,14 +236,14 @@ export function registerMetro(server, sessions) {
236
236
  sessions.recordMutation(session, {
237
237
  tool: 'qa_metro',
238
238
  action: 'start_metro',
239
- risk: 'low',
239
+ risk: 'medium',
240
240
  target: { device: serial, port: METRO_PORT, framework: fw },
241
241
  consent: { required: true, approved: false },
242
242
  status: 'requested',
243
243
  });
244
244
  return requireConsent({
245
245
  action: 'start_metro',
246
- risk: 'low',
246
+ risk: 'medium',
247
247
  exactCommand: cmdStr,
248
248
  affects: { port: METRO_PORT, framework: fw },
249
249
  explain: `This looks like a debug ${fw} build needing Metro on :${METRO_PORT}. Set adb reverse and start Metro?`,
@@ -252,7 +252,7 @@ export function registerMetro(server, sessions) {
252
252
  sessions.recordMutation(session, {
253
253
  tool: 'qa_metro',
254
254
  action: 'start_metro',
255
- risk: 'low',
255
+ risk: 'medium',
256
256
  target: { device: serial, port: METRO_PORT, framework: fw },
257
257
  consent: { required: true, consentId, approved: true },
258
258
  status: 'approved',
@@ -265,7 +265,7 @@ export function registerMetro(server, sessions) {
265
265
  sessions.recordMutation(session, {
266
266
  tool: 'qa_metro',
267
267
  action: 'start_metro',
268
- risk: 'low',
268
+ risk: 'medium',
269
269
  target: { device: serial, port: METRO_PORT, framework: fw },
270
270
  consent: { required: true, consentId, approved: true },
271
271
  status: 'blocked',
@@ -276,6 +276,7 @@ export function registerMetro(server, sessions) {
276
276
  commandAttempted: `adb -s ${serial} reverse tcp:${METRO_PORT} tcp:${METRO_PORT}`,
277
277
  changedState: true,
278
278
  retrySafe: true,
279
+ failureCode: 'METRO_FAILED',
279
280
  nextSteps: ['Check the device is online.'],
280
281
  });
281
282
  }
@@ -293,13 +294,13 @@ export function registerMetro(server, sessions) {
293
294
  sessions.recordMutation(session, {
294
295
  tool: 'qa_metro',
295
296
  action: 'start_metro',
296
- risk: 'low',
297
+ risk: 'medium',
297
298
  target: { device: serial, port: METRO_PORT, framework: fw, pid: child.pid ?? null },
298
299
  consent: { required: true, consentId, approved: true },
299
300
  status: 'executed',
300
301
  ledgerUri: logUri,
301
302
  });
302
- 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.`);
303
+ 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.`);
303
304
  });
304
305
  }
305
306
  //# sourceMappingURL=metro.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"metro.js","sourceRoot":"","sources":["../../src/tools/metro.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"metro.js","sourceRoot":"","sources":["../../src/tools/metro.ts"],"names":[],"mappings":"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"}
@@ -1,18 +1,18 @@
1
- // SWIPIUM Mobile QA Toolkit MCP tool (SWIPIUM-REQ-07). qa_mobile_audit turns a named profile
1
+ // SWIPIUM Mobile QA Toolkit MCP tool. qa_mobile_audit turns a named profile
2
2
  // (smoke | account_cycle | store_compliance | resilience | release_gate) into an ordered, classified
3
3
  // checklist plus the account-cycle safety contract the agent executes with the existing driver tools.
4
4
  // It also surfaces the issue-ledger recurrence state so a release gate sees regressions. Thin wrapper
5
5
  // over src/mobileAudit/* and src/issues/*.
6
6
  import { z } from 'zod';
7
- import { qaOk, qaError } from '../lib/result.js';
8
- import { resolveProjectRoot } from '../context/projectRoot.js';
9
- import { getDriver } from '../session/attach.js';
7
+ import { qaOk, qaError, unknownSessionError } from '../lib/result.js';
8
+ import { resolveProjectRoot, unresolvedProjectRootError } from '../context/projectRoot.js';
9
+ import { blockedDeviceResult, getDriver } from '../session/attach.js';
10
10
  import { accountCycleSafety, checksForProfile, ALL_PROFILES } from '../mobileAudit/profiles.js';
11
- import { runMobileAudit } from '../mobileAudit/runner.js';
11
+ import { auditChangesNetwork, auditNetworkConsentRequest, runMobileAudit } from '../mobileAudit/runner.js';
12
+ import { consumeConsent, requireConsent } from '../consent/consent.js';
12
13
  import { auditRunToMarkdown } from '../mobileAudit/results.js';
13
14
  import { generateSessionReport } from '../services/report.js';
14
15
  import { queryIssues } from '../issues/index.js';
15
- import { issuesResourceUri } from '../issues/store.js';
16
16
  import { resolveSourceRevision } from '../issues/sourceRevision.js';
17
17
  import { loadPolicy } from '../issues/store.js';
18
18
  function nowIso() {
@@ -22,7 +22,7 @@ async function rootFor(server, sessions, args) {
22
22
  if (args.sessionId) {
23
23
  const s = sessions.get(args.sessionId);
24
24
  if (!s)
25
- return { hint: `Unknown sessionId ${args.sessionId}` };
25
+ return { error: unknownSessionError(args.sessionId) };
26
26
  return { root: s.root };
27
27
  }
28
28
  const resolved = await resolveProjectRoot(server, args.projectRoot);
@@ -33,45 +33,31 @@ async function rootFor(server, sessions, args) {
33
33
  export function registerMobileAudit(server, sessions) {
34
34
  server.registerTool('qa_mobile_audit', {
35
35
  title: 'Mobile QA release audit',
36
- description: 'USE WHEN asked for a release-readiness, store-compliance, or account-lifecycle audit: plan or execute a named mobile-QA audit profile. mode:"plan" (default) returns the ordered checklist + safety contract WITHOUT driving the device; mode:"execute" requires a sessionId with a prepared device, drives every check, records issue-ledger entries with evidence for fail/blocked checks, and returns per-check results + a release-impact decision (+ best-effort report URI). Profile meanings and the safety contract are documented on the `profile` and `allowGeneratedData` params. A check never reports pass without observed evidence.',
36
+ description: 'Plan or execute a release audit. profile: smoke, account_cycle (create > logout > login > forgot-password on a ' +
37
+ 'DISPOSABLE generated account), store_compliance (privacy/terms/account deletion/subscription/paywall), resilience ' +
38
+ '(offline/relaunch/rotation; airplane toggle is consent-gated, original network restored), release_gate (all + locator readiness + issue recurrence). mode:"plan" ' +
39
+ '(default) returns the checklist + safety contract without the device; "execute" (prepared session) runs every check, ' +
40
+ 'logs fail/blocked checks to the issue ledger with evidence, and returns release impact. No check passes without ' +
41
+ 'evidence.',
37
42
  inputSchema: {
38
43
  projectRoot: z.string().optional(),
39
44
  sessionId: z.string().optional(),
40
- profile: z
41
- .enum(ALL_PROFILES)
42
- .describe('Audit profile: smoke (launch/health/nav) · account_cycle (create → logout → login-again → forgot-password on a DISPOSABLE generated account; needs allowGeneratedData) · store_compliance (privacy/terms/account-deletion/subscription/paywall) · resilience (offline/restore/relaunch/rotation — network is always restored) · release_gate (all profiles + locator readiness + issue-ledger recurrence).'),
43
- mode: z
44
- .enum(['plan', 'execute'])
45
- .optional()
46
- .describe('plan (default): return the ordered checklist (expected behavior + report classification), the account-cycle safety contract, and an `executor` handoff — no device is touched. execute: drive the audit against the attached device, record issues + evidence, and return per-check MobileAuditCheckResults + release impact.'),
47
- allowGeneratedData: z
48
- .boolean()
49
- .optional()
50
- .describe('Permit safe generated disposable-account data (test/staging only). Safety contract: logout is permitted only inside the controlled account-cycle workflow on the disposable account; delete/pay/send stay refused; a real account is never deleted; OTP/MFA returns needs_input.'),
51
- allowTestAccountDeletion: z
52
- .boolean()
53
- .optional()
54
- .describe('Permit destructive cleanup of disposable test accounts only (never a real account).'),
45
+ profile: z.enum(ALL_PROFILES),
46
+ mode: z.enum(['plan', 'execute']).optional(),
47
+ allowGeneratedData: z.boolean().optional().describe('Permit generated disposable test data (required for account_cycle).'),
48
+ allowTestAccountDeletion: z.boolean().optional().describe('Permit deleting disposable test accounts (never a real account).'),
55
49
  offlineMode: z.boolean().optional().describe('Hint that resilience checks should drive offline state.'),
56
50
  sourceRevision: z
57
51
  .object({ commit: z.string().optional(), buildVersion: z.string().optional(), branch: z.string().optional() })
58
52
  .optional(),
59
53
  targetApp: z.string().optional(),
60
- waitForCompletion: z
61
- .boolean()
62
- .optional()
63
- .describe('Reserved; execute currently always runs to completion and returns the full result.'),
54
+ consentId: z.string().optional().describe('execute: consent for the resilience airplane-mode toggle (network_change).'),
55
+ approve: z.boolean().optional(),
64
56
  },
65
- }, async ({ projectRoot, sessionId, profile, mode, allowGeneratedData, allowTestAccountDeletion, offlineMode, sourceRevision, targetApp, }) => {
66
- const { root, hint } = await rootFor(server, sessions, { projectRoot, sessionId });
57
+ }, async ({ projectRoot, sessionId, profile, mode, allowGeneratedData, allowTestAccountDeletion, offlineMode, sourceRevision, targetApp, consentId, approve, }) => {
58
+ const { root, hint, error } = await rootFor(server, sessions, { projectRoot, sessionId });
67
59
  if (!root)
68
- return qaError({
69
- what: 'Could not resolve a project root',
70
- changedState: false,
71
- retrySafe: true,
72
- nextSteps: ['Pass projectRoot or sessionId.'],
73
- clientHint: hint,
74
- });
60
+ return error ?? unresolvedProjectRootError({ source: 'none', hint });
75
61
  const prof = profile;
76
62
  const policyForRev = loadPolicy(root);
77
63
  const revisionResolved = resolveSourceRevision({
@@ -90,16 +76,36 @@ export function registerMobileAudit(server, sessions) {
90
76
  retrySafe: true,
91
77
  nextSteps: ['Call qa_start_session + qa_prepare_target (or qa_test_this), then qa_mobile_audit { mode:"execute" }.'],
92
78
  });
93
- const { driver } = await getDriver(session);
79
+ const { driver, blocked } = await getDriver(session);
94
80
  if (!driver)
95
- return qaError({
96
- what: 'No device attached to this session',
97
- changedState: false,
98
- retrySafe: true,
99
- nextSteps: ['Prepare a device first (qa_test_this / qa_prepare_target), then re-run.'],
100
- });
81
+ return (blockedDeviceResult(blocked) ??
82
+ qaError({
83
+ what: 'No device attached to this session',
84
+ changedState: false,
85
+ retrySafe: true,
86
+ nextSteps: ['Prepare a device first (qa_test_this / qa_prepare_target), then re-run.'],
87
+ }));
88
+ // resilience / release_gate toggle airplane mode: same network_change gate as qa_network.
89
+ let networkChangeApproved = false;
90
+ if (auditChangesNetwork(prof)) {
91
+ const req = auditNetworkConsentRequest(prof);
92
+ const gate = consumeConsent(consentId, approve, { action: req.action, affects: req.affects });
93
+ if (!gate.approved) {
94
+ sessions.recordMutation(session, {
95
+ tool: 'qa_mobile_audit',
96
+ action: req.action,
97
+ risk: req.risk,
98
+ target: req.affects,
99
+ consent: { required: true, approved: false },
100
+ status: 'requested',
101
+ });
102
+ return requireConsent(req);
103
+ }
104
+ networkChangeApproved = true;
105
+ }
101
106
  try {
102
107
  const run = await runMobileAudit(sessions, session, driver, {
108
+ networkChangeApproved,
103
109
  profile: prof,
104
110
  allowGeneratedData,
105
111
  allowTestAccountDeletion,
@@ -117,7 +123,7 @@ export function registerMobileAudit(server, sessions) {
117
123
  /* report is best-effort */
118
124
  }
119
125
  const passed = run.checks.filter((c) => c.status === 'pass').length;
120
- return qaOk({ ...run, markdown: auditRunToMarkdown(run), resourceUri: issuesResourceUri(root) }, `🔍 mobile audit ${prof}: ${run.state}, release=${run.releaseImpact} — ${passed}/${run.checks.length} pass, ${run.issueIds.length} issue(s)${run.recurrenceWarnings.length ? `, ${run.recurrenceWarnings.length} recurrence` : ''}`);
126
+ return qaOk({ ...run, markdown: auditRunToMarkdown(run) }, `🔍 mobile audit ${prof}: ${run.state}, release=${run.releaseImpact}, ${passed}/${run.checks.length} pass, ${run.issueIds.length} issue(s)${run.recurrenceWarnings.length ? `, ${run.recurrenceWarnings.length} recurrence` : ''}`);
121
127
  }
122
128
  catch (e) {
123
129
  return qaError({
@@ -160,7 +166,6 @@ export function registerMobileAudit(server, sessions) {
160
166
  blockedChecks,
161
167
  recurrenceWarnings: recurrence,
162
168
  sourceRevision: revisionResolved,
163
- resourceUri: issuesResourceUri(root),
164
169
  }, summary);
165
170
  });
166
171
  }
@@ -1 +1 @@
1
- {"version":3,"file":"mobileAudit.js","sourceRoot":"","sources":["../../src/tools/mobileAudit.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mobileAudit.js","sourceRoot":"","sources":["../../src/tools/mobileAudit.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,10 @@
1
- // qa_network — safe offline/online testing without raw adb (Phase 2 CR2).
1
+ // qa_network: safe offline/online testing without raw adb (Phase 2 CR2).
2
2
  // Uses `cmd connectivity airplane-mode` (API 30+). Records the original state on first
3
3
  // change so it can be restored; report + session-end restore use session.network.
4
4
  import { z } from 'zod';
5
- import { qaOk, qaError } from '../lib/result.js';
5
+ import { qaOk, qaError, unknownSessionError } from '../lib/result.js';
6
6
  import { requireConsent, consumeConsent } from '../consent/consent.js';
7
- import { getDriver } from '../session/attach.js';
7
+ import { blockedDeviceResult, getDriver } from '../session/attach.js';
8
8
  /** Restore network to the recorded original state. Exported for report/session-end use. */
9
9
  export async function restoreNetwork(sessions, session, d) {
10
10
  if (!session.network?.changed)
@@ -25,7 +25,7 @@ export async function restoreNetwork(sessions, session, d) {
25
25
  sessions.persist(session);
26
26
  return `restored (airplane=${original})`;
27
27
  }
28
- /** 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. */
29
29
  export async function restoreAllNetwork(sessions) {
30
30
  const { DirectDriver } = await import('../drivers/DirectDriver.js');
31
31
  for (const s of sessions.list()) {
@@ -56,7 +56,8 @@ export async function restoreAllNetwork(sessions) {
56
56
  export function registerNetwork(server, sessions) {
57
57
  server.registerTool('qa_network', {
58
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.',
59
+ description: 'Offline/online testing via airplane mode (Android 11+). action: status, offline/online (consent-gated), restore. The ' +
60
+ 'original state is restored on qa_report, on restore, and on server shutdown.',
60
61
  inputSchema: {
61
62
  sessionId: z.string(),
62
63
  action: z.enum(['status', 'offline', 'online', 'restore']),
@@ -65,9 +66,23 @@ export function registerNetwork(server, sessions) {
65
66
  },
66
67
  }, async ({ sessionId, action, consentId, approve }) => {
67
68
  const session = sessions.get(sessionId);
68
- const { driver: d } = session ? await getDriver(session) : { driver: undefined };
69
+ if (!session)
70
+ return unknownSessionError(sessionId);
71
+ const { driver: d, blocked } = await getDriver(session);
69
72
  if (!session || !d) {
70
- return qaError({ what: 'No device attached', changedState: false, retrySafe: true, nextSteps: ['Call qa_prepare_target first.'] });
73
+ return (blockedDeviceResult(blocked) ??
74
+ qaError({ what: 'No device attached', changedState: false, retrySafe: true, nextSteps: ['Call qa_prepare_target first.'] }));
75
+ }
76
+ // Airplane-mode control is an Android emulator feature (`cmd connectivity airplane-mode`); iOS
77
+ // simulators have no equivalent, so answer with a typed refusal instead of a raw driver error.
78
+ if (d.kind !== 'direct') {
79
+ return qaError({
80
+ what: 'qa_network is supported on Android emulators only (iOS simulators have no airplane-mode control)',
81
+ changedState: false,
82
+ retrySafe: false,
83
+ failureCode: 'BACKEND_UNSUPPORTED',
84
+ nextSteps: ['On iOS, test offline behavior by disconnecting the Mac from the network or with a network link conditioner.'],
85
+ });
71
86
  }
72
87
  const airplane = await d.airplaneOn();
73
88
  if (action === 'status') {
@@ -76,13 +91,13 @@ export function registerNetwork(server, sessions) {
76
91
  airplaneOn: airplane,
77
92
  changedBySwipium: !!session.network?.changed,
78
93
  restoreAvailable: !!session.network?.changed,
79
- }, `network=${airplane ? 'offline (airplane on)' : 'online'}${session.network?.changed ? ' (changed by Swipium — will restore)' : ''}`);
94
+ }, `network=${airplane ? 'offline (airplane on)' : 'online'}${session.network?.changed ? ' (changed by Swipium, will restore)' : ''}`);
80
95
  }
81
96
  if (action === 'restore') {
82
97
  const msg = await restoreNetwork(sessions, session, d);
83
98
  return qaOk({ network: (await d.airplaneOn()) ? 'offline' : 'online', restored: !!msg }, msg ? `network ${msg}` : 'nothing to restore (Swipium did not change the network)');
84
99
  }
85
- // offline / online — consent-gated, records original on first change.
100
+ // offline / online: consent-gated, records original on first change.
86
101
  const wantAirplane = action === 'offline';
87
102
  const gate = consumeConsent(consentId, approve, { action: 'network_change', affects: { to: action } });
88
103
  if (!gate.approved) {
@@ -110,7 +125,8 @@ export function registerNetwork(server, sessions) {
110
125
  consent: { required: true, consentId, approved: true, payloadHash: action },
111
126
  status: 'approved',
112
127
  });
113
- if (!session.network?.changed) {
128
+ const firstChange = !session.network?.changed;
129
+ if (firstChange) {
114
130
  session.network = { changed: true, originalAirplane: airplane };
115
131
  }
116
132
  sessions.persist(session);
@@ -118,8 +134,9 @@ export function registerNetwork(server, sessions) {
118
134
  await d.setAirplane(wantAirplane);
119
135
  }
120
136
  catch (e) {
121
- // Older images / no `cmd connectivity airplane-mode` (pre-Android 11).
122
- if (!session.network.changed)
137
+ // Older images / no `cmd connectivity airplane-mode` (pre-Android 11). Nothing changed, so
138
+ // drop the restore record this call just created (an earlier change's record is kept).
139
+ if (firstChange)
123
140
  session.network = undefined;
124
141
  sessions.persist(session);
125
142
  return qaError({
@@ -129,7 +146,7 @@ export function registerNetwork(server, sessions) {
129
146
  nextSteps: ['Needs Android 11+ (`cmd connectivity airplane-mode`). Use a newer emulator image, or toggle network manually.'],
130
147
  });
131
148
  }
132
- sessions.addEnvChange(session, `network → ${action} (airplane=${wantAirplane})`);
149
+ sessions.addEnvChange(session, `network > ${action} (airplane=${wantAirplane})`);
133
150
  await new Promise((r) => setTimeout(r, 1200)); // settle
134
151
  const now = await d.airplaneOn();
135
152
  sessions.recordMutation(session, {
@@ -141,7 +158,7 @@ export function registerNetwork(server, sessions) {
141
158
  status: 'executed',
142
159
  detail: `network=${now ? 'offline' : 'online'}`,
143
160
  });
144
- return qaOk({ network: now ? 'offline' : 'online', previousStateRecorded: true, restoreAvailable: true }, `network → ${now ? 'offline' : 'online'}. Original recorded; restore on qa_report / qa_network restore.`);
161
+ return qaOk({ network: now ? 'offline' : 'online', previousStateRecorded: true, restoreAvailable: true }, `network > ${now ? 'offline' : 'online'}. Original recorded; restore on qa_report / qa_network restore.`);
145
162
  });
146
163
  }
147
164
  //# sourceMappingURL=network.js.map