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_smoke (PHASE3-PLAN §7.2) — server-side smoke orchestration. Runs the whole loop WITHOUT
1
+ // qa_smoke: server-side smoke orchestration. Runs the whole loop WITHOUT
2
2
  // the model mediating each step (the context-efficiency + determinism win): launch the app,
3
3
  // run the deterministic baseline (snapshot quality + Tier-1 health + an evidence screenshot),
4
4
  // then run every saved flow (.swipium/flows/*.yaml). Records a structured qa_note per workflow
@@ -6,38 +6,42 @@
6
6
  //
7
7
  // Scope note: a single honest orchestrator. Generic credential-login / per-screen-visual smokes
8
8
  // are app-specific and fragile to synthesize, so login is handled by authoring a login *flow*
9
- // (run here automatically) rather than a separate qa_login_smoke that guesses.
9
+ // (run here automatically) rather than a separate login-smoke tool that guesses.
10
10
  import { z } from 'zod';
11
- import { qaOk, qaError } from '../lib/result.js';
12
- import { getDriver } from '../session/attach.js';
11
+ import { qaOk, qaError, unknownSessionError } from '../lib/result.js';
12
+ import { blockedDeviceResult, getDriver } from '../session/attach.js';
13
13
  import { runSmoke } from '../services/smoke.js';
14
14
  export function registerSmoke(server, sessions) {
15
15
  server.registerTool('qa_smoke', {
16
16
  title: 'Run a smoke test',
17
- description: 'Run a full smoke server-side (no per-step model round-trips): optionally launch the app, run the deterministic baseline (snapshot quality + Tier-1 health + an evidence screenshot), then run every saved flow under .swipium/flows. Records a qa_note per workflow and tells you to call qa_report. Use `variables` for flow ${VARS} (e.g. TEST_EMAIL). Requires a session with a prepared device.',
17
+ description: 'Server-side smoke: optionally launch, run the baseline (snapshot quality + health + evidence screenshot), then every ' +
18
+ 'saved flow in .swipium/flows. Records a qa_note per workflow; call qa_report after. Needs a prepared device.',
18
19
  inputSchema: {
19
20
  sessionId: z.string(),
20
- launch: z.boolean().optional().describe('Launch the app first (default true if the session has an appId).'),
21
+ launch: z.boolean().optional().describe('Launch first (default true with an appId).'),
21
22
  runFlows: z.boolean().optional().describe('Run saved .swipium/flows (default true).'),
22
- variables: z.record(z.string()).optional().describe('Values for ${VAR} placeholders in flows (merged over process.env).'),
23
+ variables: z.record(z.string()).optional().describe('${VAR} values for flows (over stored inputs, SWIPIUM_* env).'),
23
24
  },
24
25
  }, async ({ sessionId, launch, runFlows, variables }) => {
25
26
  const session = sessions.get(sessionId);
26
- const { driver: d } = session ? await getDriver(session) : { driver: undefined };
27
+ if (!session)
28
+ return unknownSessionError(sessionId);
29
+ const { driver: d, blocked } = await getDriver(session);
27
30
  if (!session || !d) {
28
- return qaError({
29
- what: 'No device attached to this session',
30
- changedState: false,
31
- retrySafe: true,
32
- nextSteps: ['Call qa_prepare_target first, then qa_smoke.'],
33
- });
31
+ return (blockedDeviceResult(blocked) ??
32
+ qaError({
33
+ what: 'No device attached to this session',
34
+ changedState: false,
35
+ retrySafe: true,
36
+ nextSteps: ['Call qa_prepare_target first, then qa_smoke.'],
37
+ }));
34
38
  }
35
39
  const result = await runSmoke(sessions, session, d, { launch, runFlows, variables });
36
40
  const launchOutcome = result.baseline.launch?.outcome ?? 'unknown';
37
- const summary = `qa_smoke done — launch=${launchOutcome}, flows ${result.flowsPassed}/${result.flowsTotal} passed.\n` +
41
+ const summary = `qa_smoke done: launch=${launchOutcome}, flows ${result.flowsPassed}/${result.flowsTotal} passed.\n` +
38
42
  `baseline: ${JSON.stringify(result.baseline.launch)}\n` +
39
43
  (result.flows.length
40
- ? result.flows.map((f) => `${f.passed ? '✓' : '✗'} ${f.name}${f.passed ? '' : ` — ${f.reason}`}`).join('\n')
44
+ ? result.flows.map((f) => `${f.passed ? '✓' : '✗'} ${f.name}${f.passed ? '' : `: ${f.reason}`}`).join('\n')
41
45
  : 'no saved flows (.swipium/flows is empty)') +
42
46
  `\nCall qa_report to summarize.`;
43
47
  return qaOk({
@@ -1 +1 @@
1
- {"version":3,"file":"smoke.js","sourceRoot":"","sources":["../../src/tools/smoke.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"smoke.js","sourceRoot":"","sources":["../../src/tools/smoke.ts"],"names":[],"mappings":"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"}
@@ -1,142 +1,175 @@
1
- // qa_snapshot — the observation layer.
1
+ // qa_snapshot: the observation layer.
2
2
  // Snapshot returns compact @eN refs + a snapshotQuality verdict (+ optional diff).
3
3
  import { z } from 'zod';
4
- import { qaOk, qaError } from '../lib/result.js';
4
+ import { qaOk, qaError, unknownSessionError, cancelledResult } from '../lib/result.js';
5
5
  import { parseSnapshot, signature, renderElements } from '../snapshot/parse.js';
6
6
  import { presentElements } from '../snapshot/present.js';
7
7
  import { makeRedactor, isSecureNode } from '../lib/redact.js';
8
8
  import { detectTreeOverlays, classifyForeground } from '../snapshot/overlays.js';
9
9
  import { detectAuthScreen } from '../oracle/auth.js';
10
- import { getDriver, REHYDRATE_NOTE } from '../session/attach.js';
10
+ import { dumpRootPackage } from '../oracle/health.js';
11
+ import { blockedDeviceResult, getDriver, rehydrateNote } from '../session/attach.js';
12
+ import { isAbortError, runWithSignal } from '../lib/abortScope.js';
13
+ /** The bounded structured-dump probe a visual-fallback session still attempts on each qa_snapshot /
14
+ * qa_act observation: one short try, so a still-busy screen costs seconds, not the full retry ladder. */
15
+ export const VISUAL_FALLBACK_PROBE = { timeoutMs: 6000, attempts: 2 };
11
16
  export function registerSnapshot(server, sessions) {
12
17
  server.registerTool('qa_snapshot', {
13
18
  title: 'Snapshot the screen',
14
- description: 'Capture the current screen as compact, addressable elements (@e1, @e2 …) with a snapshotQuality verdict (good/partial/poor — whether the app is automation-friendly). Defaults to interactive-only and NO screenshot to stay cheap. Very busy screens are capped to the most interaction-relevant elements — pass `filter` to see the rest. Use the @eN refs as targets for qa_act. Re-snapshot after navigation because refs invalidate.',
19
+ description: 'Capture the screen as compact addressable elements (@e1, @e2 …) with a snapshotQuality verdict. Interactive-only and ' +
20
+ 'no screenshot by default; busy screens are capped (use filter for the rest). Use @eN refs with qa_act; re-snapshot ' +
21
+ 'after navigation.',
15
22
  inputSchema: {
16
23
  sessionId: z.string(),
17
- diff: z
18
- .boolean()
19
- .optional()
20
- .describe('Return only what changed vs the previous snapshot (needs a prior snapshot in this session).'),
21
- filter: z
22
- .string()
23
- .optional()
24
- .describe("Case-insensitive substring matched against each element's text/label/id/role; only matching elements are returned. Use when elements were omitted by the presented-element cap."),
24
+ diff: z.boolean().optional().describe('Only what changed since the previous snapshot.'),
25
+ filter: z.string().optional().describe('Substring match on text/label/id/role (finds capped elements).'),
25
26
  },
26
- }, async ({ sessionId, diff, filter }) => {
27
+ }, async ({ sessionId, diff, filter }, extra) => {
27
28
  const session = sessions.get(sessionId);
28
- const { driver, rehydrated } = session ? await getDriver(session) : { driver: undefined, rehydrated: false };
29
- if (!session || !driver) {
30
- return qaError({
31
- what: 'No device attached to this session',
32
- changedState: false,
33
- retrySafe: true,
34
- nextSteps: ['Call qa_prepare_target first.'],
35
- });
36
- }
37
- if (driver.kind === 'simulator') {
38
- return qaError({
39
- what: 'A structured UI tree is not available on the iOS simulator backend',
40
- changedState: false,
41
- retrySafe: false,
42
- failureCode: 'BACKEND_UNSUPPORTED',
43
- nextSteps: ['Attach WebDriverAgent with qa_wda for a structured UI tree. Without WDA, use qa_screenshot + qa_assert_visual.'],
44
- });
29
+ if (!session) {
30
+ return unknownSessionError(sessionId);
45
31
  }
46
- // Already in visual-fallback (uiautomator can't reach idle on this app) → don't keep
47
- // hammering structured dumps; point the agent at the visual tools immediately.
48
- if (session.mode === 'visual-fallback') {
49
- return qaError({
50
- what: 'Session is in visual-fallback mode — structured snapshots are unavailable on this screen.',
51
- changedState: false,
52
- retrySafe: false,
53
- failureCode: 'VISUAL_ONLY_SCREEN',
54
- nextSteps: ['Use qa_screenshot, then qa_act with coordinate targets (durationMs press). qa_check_health still works.'],
55
- });
56
- }
57
- let xml;
58
- try {
59
- xml = await driver.dumpXml();
32
+ const { driver, rehydrated, blocked } = await getDriver(session);
33
+ if (!driver) {
34
+ return (blockedDeviceResult(blocked) ??
35
+ qaError({
36
+ what: 'No device attached to this session',
37
+ changedState: false,
38
+ retrySafe: true,
39
+ failureCode: 'NO_DEVICE',
40
+ nextSteps: ['Call qa_prepare_target first.'],
41
+ }));
60
42
  }
61
- catch (e) {
62
- // Classify repeated idle-state / dump failures and switch to visual fallback.
63
- const msg = String(e);
64
- const idle = /idle|could not get idle|dump/i.test(msg);
65
- sessions.bump(session, 'snapshotFailures');
66
- const failures = session.counters.snapshotFailures;
67
- if (failures >= session.budget.maxSnapshotFailures) {
68
- sessions.setMode(session, 'visual-fallback');
43
+ // Cancellation: this call's signal is scoped to the call (abortScope), so aborting it never
44
+ // touches a concurrently running job's adb/WDA calls (and vice versa).
45
+ return runWithSignal(extra?.signal, async () => {
46
+ if (driver.kind === 'simulator') {
69
47
  return qaError({
70
- what: `Could not produce a UI tree after ${failures} attempts${idle ? ' (never reached idle)' : ''} — likely a looping animation, dev overlay, web view, or canvas.`,
48
+ what: 'A structured UI tree is not available on the iOS simulator backend',
71
49
  changedState: false,
72
50
  retrySafe: false,
73
- failureCode: 'VISUAL_ONLY_SCREEN',
51
+ failureCode: 'BACKEND_UNSUPPORTED',
74
52
  nextSteps: [
75
- 'Switched session to visual-fallback mode.',
76
- 'Use qa_screenshot, then qa_act with coordinate targets (taps default to a short press).',
77
- 'qa_check_health stays available (crash/ANR/foreground).',
53
+ 'Attach WebDriverAgent with qa_wda for a structured UI tree. Without WDA, use qa_screenshot + qa_visual mode:"assert".',
78
54
  ],
79
55
  });
80
56
  }
81
- return qaError({
82
- what: `Snapshot (UI tree dump) failed (${failures}/${session.budget.maxSnapshotFailures})${idle ? ' — never reached idle' : ''}: ${msg}`,
83
- changedState: false,
84
- retrySafe: true,
85
- failureCode: 'SNAPSHOT_FAILED',
86
- nextSteps: [`Retry; after ${session.budget.maxSnapshotFailures} failures Swipium switches to visual-fallback (screenshots).`],
87
- });
88
- }
89
- const parsed = parseSnapshot(xml, { interactiveOnly: true });
90
- const prev = session.lastSnapshot;
91
- const newSigs = new Set(parsed.elements.map(signature));
92
- const redact = makeRedactor(session.secrets);
93
- const f = filter?.trim().toLowerCase();
94
- const pool = f
95
- ? parsed.elements.filter((e) => [e.text, e.label, e.id, e.role].some((v) => v?.toLowerCase().includes(f)))
96
- : parsed.elements;
97
- const { elements: shown, rendered, omitted } = presentElements(pool, redact);
98
- let diffText = '';
99
- let diffPayload;
100
- if (diff && prev) {
101
- const added = parsed.elements.filter((e) => !prev.signatures.has(signature(e)));
102
- const removed = [...prev.signatures].filter((s) => !newSigs.has(s));
103
- const addedShown = presentElements(added, redact).elements;
104
- diffPayload = { added: addedShown.map((e) => e.ref + ' ' + (e.label ?? e.text ?? e.role)), removed };
105
- diffText = `\nDIFF vs previous: +${added.length} / -${removed.length}\n` + renderElements(addedShown);
106
- }
107
- // persist for inspect + next diff (fullByRef keeps raw nodes; masking happens on emit)
108
- session.lastSnapshot = { fullByRef: parsed.fullByRef, signatures: newSigs, allNodes: parsed.allNodes };
109
- // Auth-state awareness (P1.5): note login screens; the FIRST screen seen sets authedAtStart.
110
- const auth = detectAuthScreen(parsed.allNodes);
111
- if (session.auth.authedAtStart === undefined)
112
- sessions.markAuth(session, { authedAtStart: !auth.isLoginScreen });
113
- if (auth.isLoginScreen && !session.auth.loginScreenSeen)
114
- sessions.markAuth(session, { loginScreenSeen: true, loginScreenSeenAt: Date.now() });
115
- // Overlay awareness (CR4): tree overlays (LogBox/dialog/snackbar) + keyboard + foreground class.
116
- const overlays = detectTreeOverlays(parsed.allNodes, parsed.screen);
117
- if (await driver.imeShown())
118
- overlays.push({ type: 'keyboard', detail: 'soft keyboard shown' });
119
- const fgOverlay = classifyForeground(session.appId, await driver.foregroundOwner().catch(() => 'unknown'));
120
- if (fgOverlay)
121
- overlays.push(fgOverlay);
122
- const q = parsed.quality;
123
- const header = (rehydrated ? REHYDRATE_NOTE + '\n' : '') +
124
- `quality=${q.verdict} (${q.reasons.join('; ')})\n` +
125
- `screen=${parsed.screen[0]}x${parsed.screen[1]} elements=${parsed.elements.length}${f ? ` (filter "${filter}" matched ${pool.length})` : ''} totalNodes=${parsed.total}` +
126
- (overlays.length ? `\noverlays: ${overlays.map((o) => o.type).join(', ')} (clear with qa_clear_overlay)` : '');
127
- return qaOk({
128
- quality: q.verdict,
129
- qualityReasons: q.reasons,
130
- qualitySignals: q.signals,
131
- screen: parsed.screen,
132
- elementCount: parsed.elements.length,
133
- ...(f ? { filter, filterMatches: pool.length } : {}),
134
- elementsOmitted: omitted,
135
- totalNodes: parsed.total,
136
- overlays,
137
- elements: shown,
138
- ...(diffPayload ? { diff: diffPayload } : {}),
139
- }, `${header}\n\n${rendered}${diffText}`);
57
+ // visual-fallback is per-SCREEN, never permanent (real-device smoke: one slow screen left
58
+ // the session answering VISUAL_ONLY_SCREEN forever). In visual-fallback we still try ONE
59
+ // bounded structured dump; success switches the session back to 'structured'.
60
+ const inFallback = session.mode === 'visual-fallback';
61
+ let xml;
62
+ try {
63
+ xml = await driver.dumpXml(inFallback ? VISUAL_FALLBACK_PROBE : undefined);
64
+ }
65
+ catch (e) {
66
+ // Cancelled (the MCP request was aborted): not a snapshot failure. No counter, no
67
+ // mode switch, no tool error (the report's tool status is unaffected).
68
+ if (isAbortError(e))
69
+ return cancelledResult('Snapshot cancelled: the call was aborted before the UI tree was captured');
70
+ if (inFallback) {
71
+ return qaError({
72
+ what: 'Session is in visual-fallback mode; a structured UI tree is still unavailable on this screen.',
73
+ changedState: false,
74
+ retrySafe: true,
75
+ failureCode: 'VISUAL_ONLY_SCREEN',
76
+ nextSteps: [
77
+ 'Use qa_screenshot, then qa_act with coordinate targets (durationMs press). qa_check_health still works.',
78
+ 'Each qa_snapshot / qa_act retries a bounded structured dump; the session returns to structured mode as soon as one succeeds.',
79
+ ],
80
+ });
81
+ }
82
+ // Classify repeated idle-state / dump failures and switch to visual fallback.
83
+ const msg = String(e);
84
+ const idle = /idle|could not get idle|dump/i.test(msg);
85
+ sessions.bump(session, 'snapshotFailures');
86
+ const failures = session.counters.snapshotFailures;
87
+ if (failures >= session.budget.maxSnapshotFailures) {
88
+ sessions.setMode(session, 'visual-fallback');
89
+ return qaError({
90
+ what: `Could not produce a UI tree after ${failures} attempts${idle ? ' (never reached idle)' : ''}, likely a looping animation, dev overlay, web view, or canvas.`,
91
+ changedState: false,
92
+ retrySafe: false,
93
+ failureCode: 'VISUAL_ONLY_SCREEN',
94
+ nextSteps: [
95
+ 'Switched session to visual-fallback mode for this screen (qa_snapshot keeps probing and switches back once a dump succeeds).',
96
+ 'Use qa_screenshot, then qa_act with coordinate targets (taps default to a short press).',
97
+ 'qa_check_health stays available (crash/ANR/foreground).',
98
+ ],
99
+ });
100
+ }
101
+ return qaError({
102
+ what: `Snapshot (UI tree dump) failed (${failures}/${session.budget.maxSnapshotFailures})${idle ? ', never reached idle' : ''}: ${msg}`,
103
+ changedState: false,
104
+ retrySafe: true,
105
+ failureCode: 'SNAPSHOT_FAILED',
106
+ nextSteps: [
107
+ `Retry; after ${session.budget.maxSnapshotFailures} consecutive failures Swipium switches to visual-fallback (screenshots).`,
108
+ ],
109
+ });
110
+ }
111
+ const modeRecovered = sessions.noteStructuredDump(session);
112
+ const parsed = parseSnapshot(xml, { interactiveOnly: true });
113
+ const prev = session.lastSnapshot;
114
+ const newSigs = new Set(parsed.elements.map(signature));
115
+ const redact = makeRedactor(session.secrets);
116
+ const f = filter?.trim().toLowerCase();
117
+ const pool = f
118
+ ? parsed.elements.filter((e) => [e.text, e.label, e.id, e.role].some((v) => v?.toLowerCase().includes(f)))
119
+ : parsed.elements;
120
+ const { elements: shown, rendered, omitted } = presentElements(pool, redact);
121
+ let diffText = '';
122
+ let diffPayload;
123
+ if (diff && prev) {
124
+ const added = parsed.elements.filter((e) => !prev.signatures.has(signature(e)));
125
+ const removed = [...prev.signatures].filter((s) => !newSigs.has(s));
126
+ const addedShown = presentElements(added, redact).elements;
127
+ diffPayload = { added: addedShown.map((e) => e.ref + ' ' + (e.label ?? e.text ?? e.role)), removed };
128
+ diffText = `\nDIFF vs previous: +${added.length} / -${removed.length}\n` + renderElements(addedShown);
129
+ }
130
+ // persist for inspect + next diff (fullByRef keeps raw nodes; masking happens on emit)
131
+ session.lastSnapshot = { fullByRef: parsed.fullByRef, signatures: newSigs, allNodes: parsed.allNodes };
132
+ // Auth-state awareness (P1.5): note login screens; the FIRST screen seen sets authedAtStart.
133
+ const auth = detectAuthScreen(parsed.allNodes);
134
+ if (session.auth.authedAtStart === undefined)
135
+ sessions.markAuth(session, { authedAtStart: !auth.isLoginScreen });
136
+ if (auth.isLoginScreen && !session.auth.loginScreenSeen)
137
+ sessions.markAuth(session, { loginScreenSeen: true, loginScreenSeenAt: Date.now() });
138
+ // Overlay awareness (CR4): tree overlays (LogBox/dialog/snackbar) + keyboard + foreground class.
139
+ const overlays = detectTreeOverlays(parsed.allNodes, parsed.screen);
140
+ // IME + foreground in parallel; when the dump's root package IS the app under test, the
141
+ // heavy `dumpsys activity activities` is skipped (classifyForeground returns null for it).
142
+ const rootPkg = dumpRootPackage(parsed.allNodes);
143
+ const [imeUp, foreground] = await Promise.all([
144
+ driver.imeShown().catch(() => false),
145
+ session.appId && rootPkg === session.appId ? Promise.resolve(rootPkg) : driver.foregroundOwner().catch(() => 'unknown'),
146
+ ]);
147
+ if (imeUp)
148
+ overlays.push({ type: 'keyboard', detail: 'soft keyboard shown' });
149
+ const fgOverlay = classifyForeground(session.appId, foreground);
150
+ if (fgOverlay)
151
+ overlays.push(fgOverlay);
152
+ const q = parsed.quality;
153
+ const header = (rehydrated ? rehydrateNote(session) + '\n' : '') +
154
+ (modeRecovered ? 'mode: structured again (a UI tree dump succeeded; visual-fallback cleared)\n' : '') +
155
+ `quality=${q.verdict} (${q.reasons.join('; ')})\n` +
156
+ `screen=${parsed.screen[0]}x${parsed.screen[1]} elements=${parsed.elements.length}${f ? ` (filter "${filter}" matched ${pool.length})` : ''} totalNodes=${parsed.total}` +
157
+ (overlays.length ? `\noverlays: ${overlays.map((o) => o.type).join(', ')} (clear with qa_clear_overlay)` : '');
158
+ return qaOk({
159
+ ...(modeRecovered ? { modeRecovered: true, mode: 'structured' } : {}),
160
+ quality: q.verdict,
161
+ qualityReasons: q.reasons,
162
+ qualitySignals: q.signals,
163
+ screen: parsed.screen,
164
+ elementCount: parsed.elements.length,
165
+ ...(f ? { filter, filterMatches: pool.length } : {}),
166
+ elementsOmitted: omitted,
167
+ totalNodes: parsed.total,
168
+ overlays,
169
+ elements: shown,
170
+ ...(diffPayload ? { diff: diffPayload } : {}),
171
+ }, `${header}\n\n${rendered}${diffText}`, { textOmit: ['elements', 'diff'] });
172
+ });
140
173
  });
141
174
  server.registerTool('qa_inspect', {
142
175
  title: 'Inspect one element',
@@ -144,12 +177,16 @@ export function registerSnapshot(server, sessions) {
144
177
  inputSchema: { sessionId: z.string(), ref: z.string().describe('e.g. "@e3"') },
145
178
  }, async ({ sessionId, ref }) => {
146
179
  const session = sessions.get(sessionId);
147
- const node = session?.lastSnapshot?.fullByRef.get(ref);
148
- if (!session || !node) {
180
+ if (!session) {
181
+ return unknownSessionError(sessionId);
182
+ }
183
+ const node = session.lastSnapshot?.fullByRef.get(ref);
184
+ if (!node) {
149
185
  return qaError({
150
186
  what: `No element ${ref} in the latest snapshot`,
151
187
  changedState: false,
152
188
  retrySafe: true,
189
+ failureCode: 'STALE_REF',
153
190
  nextSteps: ['Run qa_snapshot first; refs invalidate after navigation.'],
154
191
  });
155
192
  }
@@ -1 +1 @@
1
- {"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/tools/snapshot.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/tools/snapshot.ts"],"names":[],"mappings":"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"}