swipium 1.5.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (498) hide show
  1. package/CHANGELOG.md +171 -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,217 +0,0 @@
1
- import { createHash } from 'node:crypto';
2
- import { z } from 'zod';
3
- import { qaError, qaOk } from '../lib/result.js';
4
- import { requireConsent, consumeConsent } from '../consent/consent.js';
5
- import { getDriver } from '../session/attach.js';
6
- import { normalizeCommand } from '../flows/seedExec.js';
7
- import { loadStateProfile, prepareStateProfile, teardownStateProfile, verifyStateProfile, } from '../state/profile.js';
8
- const schema = {
9
- sessionId: z.string(),
10
- profile: z.string().describe('State profile name under .swipium/state/<name>.yaml, or inline YAML.'),
11
- };
12
- const mutatingSchema = {
13
- ...schema,
14
- consentId: z.string().optional(),
15
- approve: z.boolean().optional(),
16
- };
17
- function stable(value) {
18
- if (Array.isArray(value))
19
- return value.map(stable);
20
- if (value && typeof value === 'object') {
21
- return Object.fromEntries(Object.entries(value)
22
- .sort(([a], [b]) => a.localeCompare(b))
23
- .map(([k, v]) => [k, stable(v)]));
24
- }
25
- return value;
26
- }
27
- function hash(value) {
28
- return createHash('sha256')
29
- .update(JSON.stringify(stable(value)))
30
- .digest('hex');
31
- }
32
- function seedActionPreview(seed) {
33
- if (!seed)
34
- return null;
35
- if (seed.type === 'script') {
36
- const normalized = normalizeCommand(seed.command);
37
- return {
38
- type: 'script',
39
- command: normalized.argv,
40
- deprecatedStringCommand: normalized.deprecated || undefined,
41
- parseError: normalized.parseError,
42
- };
43
- }
44
- if (seed.type === 'api')
45
- return {
46
- type: 'api',
47
- method: seed.method ?? 'POST',
48
- url: seed.url ?? null,
49
- bodyHash: seed.body ? hash(seed.body).slice(0, 16) : null,
50
- headerKeys: Object.keys(seed.headers ?? {}).sort(),
51
- };
52
- return { type: 'deeplink', url: seed.url ?? null };
53
- }
54
- function seedPreview(seed) {
55
- const preview = seedActionPreview(seed);
56
- if (!preview)
57
- return null;
58
- return { ...preview, idempotent: seed?.idempotent ?? false, cleanup: seedActionPreview(seed?.cleanup) };
59
- }
60
- function cleanupFixtures(session, profile) {
61
- if (!session)
62
- return [];
63
- return (profile.seed ?? []).map((s) => s.fixture).filter((name) => !!session.fixtures.find((f) => f.name === name)?.seed?.cleanup);
64
- }
65
- export function teardownMutations(profile, session) {
66
- const explicit = (profile.teardown ?? [])
67
- .filter((t) => t === 'networkOnline' || (typeof t === 'object' && t.networkOnline))
68
- .map(() => 'networkOnline');
69
- return [...explicit, ...cleanupFixtures(session, profile).map((name) => `seedCleanup:${name}`)];
70
- }
71
- export function stateProfileAffects(session, action, profile, path) {
72
- const appId = profile.appId ?? session.appId ?? null;
73
- const seedFixtures = (profile.seed ?? []).map((s) => s.fixture);
74
- return {
75
- action,
76
- sessionId: session.id,
77
- profileName: profile.name,
78
- profilePath: path ?? null,
79
- profileHash: hash(profile),
80
- appId,
81
- reset: profile.reset ?? null,
82
- launch: profile.launch ?? null,
83
- seedFixtures,
84
- seedDetails: seedFixtures.map((name) => ({ fixture: name, seed: seedPreview(session.fixtures.find((f) => f.name === name)?.seed) })),
85
- teardownMutations: teardownMutations(profile, session),
86
- };
87
- }
88
- export function hasStateProfileMutation(action, profile, session) {
89
- if (action === 'verify')
90
- return false;
91
- if (action === 'teardown')
92
- return teardownMutations(profile, session).length > 0;
93
- return !!((profile.reset?.android && profile.reset.android !== 'none') ||
94
- (profile.reset?.ios && profile.reset.ios !== 'none') ||
95
- profile.launch ||
96
- (profile.seed?.length ?? 0) > 0);
97
- }
98
- export function stateRisk(action, profile, session) {
99
- if (profile.reset?.android === 'clearData' || profile.reset?.ios === 'reinstallApp' || profile.launch?.clearState)
100
- return 'high';
101
- const seedTypes = (profile.seed ?? []).map((s) => session.fixtures.find((f) => f.name === s.fixture)?.seed?.type);
102
- const cleanupTypes = action === 'teardown' ? (profile.seed ?? []).map((s) => session.fixtures.find((f) => f.name === s.fixture)?.seed?.cleanup?.type) : [];
103
- if (seedTypes.includes('script') || cleanupTypes.includes('script'))
104
- return 'high';
105
- if (seedTypes.includes('api') || cleanupTypes.includes('api') || profile.launch?.permissions || action === 'teardown')
106
- return 'medium';
107
- return 'low';
108
- }
109
- function stateFailureCode(status) {
110
- return status === 'state_refused' ? 'UNSAFE_ACTION_REFUSED' : 'SEED_FAILED';
111
- }
112
- export function registerState(server, sessions) {
113
- const handler = (action) => async ({ sessionId, profile, consentId, approve }) => {
114
- const session = sessions.get(sessionId);
115
- if (!session)
116
- return qaError({
117
- what: `Unknown sessionId ${sessionId}`,
118
- changedState: false,
119
- retrySafe: true,
120
- nextSteps: ['Call qa_start_session first.'],
121
- });
122
- const { driver } = await getDriver(session);
123
- if (!driver)
124
- return qaError({
125
- what: 'No device attached to this session',
126
- changedState: false,
127
- retrySafe: true,
128
- nextSteps: ['Prepare a target first.'],
129
- });
130
- const loaded = loadStateProfile(session.root, profile);
131
- if (!loaded.profile)
132
- return qaError({
133
- what: loaded.error ?? 'Could not load state profile',
134
- changedState: false,
135
- retrySafe: true,
136
- failureCode: 'INVALID_FLOW',
137
- nextSteps: ['Create .swipium/state/<name>.yaml or pass inline YAML.'],
138
- });
139
- const affects = stateProfileAffects(session, action, loaded.profile, loaded.path);
140
- const mutationPayloadHash = hash(affects);
141
- const mutating = hasStateProfileMutation(action, loaded.profile, session);
142
- const risk = stateRisk(action, loaded.profile, session);
143
- if (mutating) {
144
- const gate = consumeConsent(consentId, approve, { action: 'state_profile_mutation', affects });
145
- if (!gate.approved) {
146
- sessions.recordMutation(session, {
147
- tool: `qa_state_${action}`,
148
- action: 'state_profile_mutation',
149
- risk,
150
- target: affects,
151
- consent: { required: true, approved: false, payloadHash: mutationPayloadHash },
152
- status: 'requested',
153
- });
154
- return requireConsent({
155
- action: 'state_profile_mutation',
156
- risk,
157
- exactCommand: `swipium state ${action} ${loaded.profile.name}`,
158
- affects,
159
- explain: `Apply state profile "${loaded.profile.name}" (${action})? This can mutate app/device state through reset, launch, permissions, seed, or teardown operations.`,
160
- });
161
- }
162
- sessions.recordMutation(session, {
163
- tool: `qa_state_${action}`,
164
- action: 'state_profile_mutation',
165
- risk,
166
- target: affects,
167
- consent: { required: true, consentId, approved: true, payloadHash: mutationPayloadHash },
168
- status: 'approved',
169
- });
170
- }
171
- const ledger = action === 'prepare'
172
- ? await prepareStateProfile(sessions, session, driver, loaded.profile)
173
- : action === 'verify'
174
- ? await verifyStateProfile(driver, loaded.profile)
175
- : await teardownStateProfile(sessions, session, driver, loaded.profile);
176
- ledger.mutationPayloadHash = mutationPayloadHash;
177
- const uri = sessions.saveArtifact(session, 'state', `state-${action}-${loaded.profile.name}-${Date.now()}.json`, JSON.stringify(ledger, null, 2), 'application/json', `state ${action} ledger`);
178
- const ok = ledger.status !== 'state_refused' && ledger.status !== 'state_blocked';
179
- if (mutating)
180
- sessions.recordMutation(session, {
181
- tool: `qa_state_${action}`,
182
- action: 'state_profile_mutation',
183
- risk,
184
- target: affects,
185
- consent: { required: true, consentId, approved: true, payloadHash: mutationPayloadHash },
186
- status: ok ? 'executed' : ledger.status === 'state_refused' ? 'refused' : 'blocked',
187
- ledgerUri: uri,
188
- detail: ledger.status,
189
- });
190
- if (!ok) {
191
- return qaError({
192
- what: `state ${action} ${loaded.profile.name}: ${ledger.status}`,
193
- changedState: mutating,
194
- retrySafe: ledger.status !== 'state_refused',
195
- failureCode: stateFailureCode(ledger.status),
196
- nextSteps: ['Open the state ledger artifact, fix the profile/reset/seed/device blocker, then retry.'],
197
- }, { action, profile: loaded.profile.name, path: loaded.path ?? null, ledger, ledgerUri: uri, ok });
198
- }
199
- return qaOk({ action, profile: loaded.profile.name, path: loaded.path ?? null, ledger, ledgerUri: uri, ok }, `state ${action} ${loaded.profile.name}: ${ledger.status}\nledger: ${uri}`);
200
- };
201
- server.registerTool('qa_state_prepare', {
202
- title: 'Prepare a reproducible state profile',
203
- description: 'Apply a .swipium/state/*.yaml profile as one transaction: reset policy, launch, seed fixtures, and ledger artifact. Refuses debug-bundle-loss resets unless explicitly acknowledged.',
204
- inputSchema: mutatingSchema,
205
- }, handler('prepare'));
206
- server.registerTool('qa_state_verify', {
207
- title: 'Verify a state profile',
208
- description: "Check that a state profile's declared checks (e.g. assertVisible) hold on the CURRENT screen — USE WHEN you must confirm a precondition before testing, or re-confirm it after a run, without re-applying the profile. A failed check is a setup/state blocker (failureCode STATE_*), NOT an app test failure — do not report it as an app bug. Preconditions: a session with an attached device, and a .swipium/state/*.yaml profile (by name, path, or inline YAML). Read-only, no consent needed. Returns { action, profile, ledger, ledgerUri, ok } — the ledger lists each check's outcome.",
209
- inputSchema: schema,
210
- }, handler('verify'));
211
- server.registerTool('qa_state_teardown', {
212
- title: 'Teardown a state profile',
213
- description: "Run a state profile's declared teardown steps (e.g. restore networkOnline, fixture cleanup) and write a transaction ledger artifact. USE WHEN a run that used qa_state_prepare (or otherwise mutated declared state) is finished and the device/app must be left clean. Preconditions: a session with an attached device and the same profile that was prepared. Mutating → consent-gated (returns a consent request first; re-call with consentId + approve:true). Returns { action, profile, ledger, ledgerUri, ok }; ok:false carries a failureCode when a step was refused or blocked.",
214
- inputSchema: mutatingSchema,
215
- }, handler('teardown'));
216
- }
217
- //# sourceMappingURL=state.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/tools/state.ts"],"names":[],"mappings":"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"}
@@ -1,106 +0,0 @@
1
- import { z } from 'zod';
2
- import { qaError, qaOk } from '../lib/result.js';
3
- import { requireConsent, consumeConsent } from '../consent/consent.js';
4
- import { sensitiveRefusal } from '../lib/sensitive.js';
5
- import { makeRedactor } from '../lib/redact.js';
6
- import { displayArgv } from '../lib/commandTemplate.js';
7
- import { GitScopeForbiddenError } from '../lib/spawn.js';
8
- import { boundedText, resolveMaskProvider, resolveVisualProvider } from '../visual/provider.js';
9
- import { getDriver } from '../session/attach.js';
10
- import { configuredOcrCommand, findOcrRegion, runOcr } from '../visual/ocr.js';
11
- export function registerVisualText(server, sessions) {
12
- server.registerTool('qa_visual_find_text', {
13
- title: 'Find visible text with OCR',
14
- description: 'Find visible text in a screenshot using a configured OCR provider that returns structured regions. Returns screenshot-pixel bbox, coordinate-space metadata, and tappable device coordinates. Consent-gated because the screenshot is passed to the local OCR command.',
15
- inputSchema: {
16
- sessionId: z.string(),
17
- query: z.string(),
18
- minConfidence: z.number().optional(),
19
- consentId: z.string().optional(),
20
- approve: z.boolean().optional(),
21
- },
22
- }, async ({ sessionId, query, minConfidence, consentId, approve }) => {
23
- const session = sessions.get(sessionId);
24
- const { driver } = session ? await getDriver(session) : { driver: undefined };
25
- if (!session || !driver)
26
- return qaError({
27
- what: 'No device attached to this session',
28
- changedState: false,
29
- retrySafe: true,
30
- nextSteps: ['Prepare a target first.'],
31
- });
32
- if (session.sensitive)
33
- return sensitiveRefusal('OCR visual text search');
34
- const command = configuredOcrCommand(session.root);
35
- if (!command)
36
- return qaError({
37
- what: 'OCR is not configured',
38
- changedState: false,
39
- retrySafe: false,
40
- failureCode: 'VISUAL_ONLY_SCREEN',
41
- nextSteps: [
42
- 'Set ocrCommand in .swipium/config.json as an argv array or SWIPIUM_OCR_CMD. The command should emit JSON regions with text/confidence/bbox.',
43
- ],
44
- });
45
- let preview;
46
- let maskPreview;
47
- try {
48
- preview = resolveVisualProvider(command, { image: '<screenshot>' }, 30000);
49
- maskPreview = resolveMaskProvider(session.root);
50
- }
51
- catch (e) {
52
- return qaError({
53
- what: e instanceof GitScopeForbiddenError ? e.message : `Invalid OCR command template: ${String(e)}`,
54
- changedState: false,
55
- retrySafe: !(e instanceof GitScopeForbiddenError),
56
- failureCode: e instanceof GitScopeForbiddenError ? 'GIT_SCOPE_FORBIDDEN' : 'INVALID_FLOW',
57
- nextSteps: e instanceof GitScopeForbiddenError
58
- ? ['Run Git yourself outside Swipium; configure ocrCommand to use a non-Git executable.']
59
- : ['Use an argv array in .swipium/config.json, e.g. ["node","ocr.js","{image}"].'],
60
- });
61
- }
62
- const maskConfigured = !!maskPreview;
63
- const gate = consumeConsent(consentId, approve, {
64
- action: 'ocr_run',
65
- affects: { argv: preview.argv, io: preview.io, query, maskConfigured },
66
- });
67
- if (!gate.approved) {
68
- return requireConsent({
69
- action: 'ocr_run',
70
- risk: 'medium',
71
- exactCommand: displayArgv(preview.argv),
72
- affects: { argv: preview.argv, io: preview.io, query, maskConfigured },
73
- explain: `Run the configured OCR command on the current screenshot to find "${query}"? If visualMaskCommand is configured, Swipium runs it first and sends the masked image.`,
74
- });
75
- }
76
- const ocr = await runOcr(driver, session.root, command);
77
- const hit = findOcrRegion(ocr, query, minConfidence ?? 0.8);
78
- if (!hit) {
79
- const bounded = boundedText(ocr.text, makeRedactor(session.secrets), 8000);
80
- return qaOk({
81
- found: false,
82
- query,
83
- text: bounded.text,
84
- truncated: bounded.truncated,
85
- regions: ocr.regions,
86
- coordinateSpace: ocr.coordinateSpace,
87
- provider: ocr.provider,
88
- masking: ocr.masking,
89
- evidenceKind: 'ocr_text',
90
- }, `OCR did not find "${query}" at confidence >= ${minConfidence ?? 0.8}.`);
91
- }
92
- return qaOk({
93
- found: true,
94
- query,
95
- region: hit.region,
96
- devicePoint: hit.devicePoint,
97
- coordinateSpace: ocr.coordinateSpace,
98
- method: 'ocr',
99
- locatorStrategy: 'ocr_text',
100
- evidenceKind: 'ocr_text',
101
- provider: ocr.provider,
102
- masking: ocr.masking,
103
- }, `found "${hit.region.text}" (${hit.region.confidence}) → tap device (${hit.devicePoint.x}, ${hit.devicePoint.y})`);
104
- });
105
- }
106
- //# sourceMappingURL=visualText.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"visualText.js","sourceRoot":"","sources":["../../src/tools/visualText.ts"],"names":[],"mappings":"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"}