swipium 1.4.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 (541) hide show
  1. package/CHANGELOG.md +313 -0
  2. package/README.md +175 -219
  3. package/THREAT_MODEL.md +223 -47
  4. package/dist/appMap/automationLink.js +39 -26
  5. package/dist/appMap/automationLink.js.map +1 -1
  6. package/dist/appMap/build.js +68 -20
  7. package/dist/appMap/build.js.map +1 -1
  8. package/dist/appMap/codeIndex.js +31 -5
  9. package/dist/appMap/codeIndex.js.map +1 -1
  10. package/dist/appMap/featureIndex.js +23 -5
  11. package/dist/appMap/featureIndex.js.map +1 -1
  12. package/dist/appMap/featureModel.js +44 -8
  13. package/dist/appMap/featureModel.js.map +1 -1
  14. package/dist/appMap/firstRunApply.js +24 -6
  15. package/dist/appMap/firstRunApply.js.map +1 -1
  16. package/dist/appMap/fsWalk.js +19 -2
  17. package/dist/appMap/fsWalk.js.map +1 -1
  18. package/dist/appMap/issues.js +10 -30
  19. package/dist/appMap/issues.js.map +1 -1
  20. package/dist/appMap/migrations.js +6 -6
  21. package/dist/appMap/migrations.js.map +1 -1
  22. package/dist/appMap/prelaunch.js +2 -2
  23. package/dist/appMap/prelaunch.js.map +1 -1
  24. package/dist/appMap/projectRegistry.js +83 -11
  25. package/dist/appMap/projectRegistry.js.map +1 -1
  26. package/dist/appMap/provenance.js +2 -2
  27. package/dist/appMap/provenance.js.map +1 -1
  28. package/dist/appMap/query.js +21 -5
  29. package/dist/appMap/query.js.map +1 -1
  30. package/dist/appMap/runtimeMerge.js +12 -5
  31. package/dist/appMap/runtimeMerge.js.map +1 -1
  32. package/dist/appMap/schema.js +1 -1
  33. package/dist/appMap/schema.js.map +1 -1
  34. package/dist/appMap/screenMatch.js +6 -2
  35. package/dist/appMap/screenMatch.js.map +1 -1
  36. package/dist/appMap/staticScan.js +151 -39
  37. package/dist/appMap/staticScan.js.map +1 -1
  38. package/dist/appMap/store.js +58 -85
  39. package/dist/appMap/store.js.map +1 -1
  40. package/dist/appMap/tsAstScan.js +34 -12
  41. package/dist/appMap/tsAstScan.js.map +1 -1
  42. package/dist/artifacts/bundletool.js +49 -12
  43. package/dist/artifacts/bundletool.js.map +1 -1
  44. package/dist/artifacts/resolve.js +41 -14
  45. package/dist/artifacts/resolve.js.map +1 -1
  46. package/dist/automation/capabilities.js +112 -30
  47. package/dist/automation/capabilities.js.map +1 -1
  48. package/dist/automation/gestures.js +6 -2
  49. package/dist/automation/gestures.js.map +1 -1
  50. package/dist/automation/plan.js +71 -23
  51. package/dist/automation/plan.js.map +1 -1
  52. package/dist/automation/report.js +15 -5
  53. package/dist/automation/report.js.map +1 -1
  54. package/dist/automation/selectors.js +22 -28
  55. package/dist/automation/selectors.js.map +1 -1
  56. package/dist/automation/types.js +1 -1
  57. package/dist/automation/types.js.map +1 -1
  58. package/dist/automation/waits.js +14 -8
  59. package/dist/automation/waits.js.map +1 -1
  60. package/dist/automation/webview.js +9 -3
  61. package/dist/automation/webview.js.map +1 -1
  62. package/dist/automationGen/appiumModel.js +16 -8
  63. package/dist/automationGen/appiumModel.js.map +1 -1
  64. package/dist/automationGen/ciEmitter.js +6 -6
  65. package/dist/automationGen/ciEmitter.js.map +1 -1
  66. package/dist/automationGen/identifiers.js +224 -0
  67. package/dist/automationGen/identifiers.js.map +1 -0
  68. package/dist/automationGen/jsEmitter.js +288 -121
  69. package/dist/automationGen/jsEmitter.js.map +1 -1
  70. package/dist/automationGen/packagePatch.js +2 -2
  71. package/dist/automationGen/packagePatch.js.map +1 -1
  72. package/dist/automationGen/platformResolve.js +36 -0
  73. package/dist/automationGen/platformResolve.js.map +1 -0
  74. package/dist/automationGen/projectProfile.js +76 -27
  75. package/dist/automationGen/projectProfile.js.map +1 -1
  76. package/dist/automationGen/pythonEmitter.js +278 -107
  77. package/dist/automationGen/pythonEmitter.js.map +1 -1
  78. package/dist/automationGen/readmeEmitter.js +7 -6
  79. package/dist/automationGen/readmeEmitter.js.map +1 -1
  80. package/dist/automationGen/run.js +388 -0
  81. package/dist/automationGen/run.js.map +1 -0
  82. package/dist/automationGen/suitePlan.js +17 -10
  83. package/dist/automationGen/suitePlan.js.map +1 -1
  84. package/dist/automationGen/validation.js +52 -12
  85. package/dist/automationGen/validation.js.map +1 -1
  86. package/dist/build/parseBuildLog.js +235 -31
  87. package/dist/build/parseBuildLog.js.map +1 -1
  88. package/dist/build/plan.js +39 -18
  89. package/dist/build/plan.js.map +1 -1
  90. package/dist/ci/preflight.js +13 -4
  91. package/dist/ci/preflight.js.map +1 -1
  92. package/dist/cli/gc.js +74 -0
  93. package/dist/cli/gc.js.map +1 -0
  94. package/dist/cli/init.js +217 -26
  95. package/dist/cli/init.js.map +1 -1
  96. package/dist/cli/main.js +50 -0
  97. package/dist/cli/main.js.map +1 -0
  98. package/dist/cli/report.js +218 -0
  99. package/dist/cli/report.js.map +1 -0
  100. package/dist/cli/scan.js +36 -15
  101. package/dist/cli/scan.js.map +1 -1
  102. package/dist/cli/suite.js +7 -7
  103. package/dist/cli/suite.js.map +1 -1
  104. package/dist/cli/verify.js +7 -7
  105. package/dist/cli/verify.js.map +1 -1
  106. package/dist/consent/consent.js +162 -5
  107. package/dist/consent/consent.js.map +1 -1
  108. package/dist/context/detect.js +55 -18
  109. package/dist/context/detect.js.map +1 -1
  110. package/dist/context/findApps.js +22 -8
  111. package/dist/context/findApps.js.map +1 -1
  112. package/dist/context/projectRoot.js +174 -19
  113. package/dist/context/projectRoot.js.map +1 -1
  114. package/dist/context/scan.js +1 -1
  115. package/dist/context/scan.js.map +1 -1
  116. package/dist/core/capabilityGroups.js +90 -0
  117. package/dist/core/capabilityGroups.js.map +1 -0
  118. package/dist/core/target.js +10 -8
  119. package/dist/core/target.js.map +1 -1
  120. package/dist/core/targetPlan.js +160 -39
  121. package/dist/core/targetPlan.js.map +1 -1
  122. package/dist/drivers/DirectDriver.js +317 -43
  123. package/dist/drivers/DirectDriver.js.map +1 -1
  124. package/dist/drivers/SimctlDriver.js +124 -8
  125. package/dist/drivers/SimctlDriver.js.map +1 -1
  126. package/dist/drivers/WdaDriver.js +365 -55
  127. package/dist/drivers/WdaDriver.js.map +1 -1
  128. package/dist/explore/candidates.js +7 -3
  129. package/dist/explore/candidates.js.map +1 -1
  130. package/dist/explore/graph.js +15 -6
  131. package/dist/explore/graph.js.map +1 -1
  132. package/dist/explore/memory.js +4 -1
  133. package/dist/explore/memory.js.map +1 -1
  134. package/dist/explore/planner.js +54 -9
  135. package/dist/explore/planner.js.map +1 -1
  136. package/dist/explore/policy.js +11 -6
  137. package/dist/explore/policy.js.map +1 -1
  138. package/dist/explore/runner.js +363 -190
  139. package/dist/explore/runner.js.map +1 -1
  140. package/dist/explore/signatures.js +4 -2
  141. package/dist/explore/signatures.js.map +1 -1
  142. package/dist/explore/suite.js +3 -1
  143. package/dist/explore/suite.js.map +1 -1
  144. package/dist/featureTesting/executionBootstrap.js +137 -29
  145. package/dist/featureTesting/executionBootstrap.js.map +1 -1
  146. package/dist/featureTesting/featureMap.js +6 -3
  147. package/dist/featureTesting/featureMap.js.map +1 -1
  148. package/dist/featureTesting/featureScope.js +101 -20
  149. package/dist/featureTesting/featureScope.js.map +1 -1
  150. package/dist/featureTesting/mapFeatureScope.js +44 -15
  151. package/dist/featureTesting/mapFeatureScope.js.map +1 -1
  152. package/dist/featureTesting/objectiveModel.js +15 -11
  153. package/dist/featureTesting/objectiveModel.js.map +1 -1
  154. package/dist/featureTesting/resultMerge.js +16 -8
  155. package/dist/featureTesting/resultMerge.js.map +1 -1
  156. package/dist/featureTesting/sources.js +8 -5
  157. package/dist/featureTesting/sources.js.map +1 -1
  158. package/dist/featureTesting/suiteBridge.js +8 -2
  159. package/dist/featureTesting/suiteBridge.js.map +1 -1
  160. package/dist/featureTesting/synonyms.js +32 -4
  161. package/dist/featureTesting/synonyms.js.map +1 -1
  162. package/dist/featureTesting/testCaseFactory.js +27 -15
  163. package/dist/featureTesting/testCaseFactory.js.map +1 -1
  164. package/dist/featureTesting/testPlan.js +34 -12
  165. package/dist/featureTesting/testPlan.js.map +1 -1
  166. package/dist/firstRun/authStateMachine.js +1 -1
  167. package/dist/firstRun/authStateMachine.js.map +1 -1
  168. package/dist/firstRun/classifyScreen.js +9 -6
  169. package/dist/firstRun/classifyScreen.js.map +1 -1
  170. package/dist/firstRun/firstRunPlanner.js +16 -13
  171. package/dist/firstRun/firstRunPlanner.js.map +1 -1
  172. package/dist/firstRun/firstRunRunner.js +92 -31
  173. package/dist/firstRun/firstRunRunner.js.map +1 -1
  174. package/dist/firstRun/generatedDataPolicy.js +25 -15
  175. package/dist/firstRun/generatedDataPolicy.js.map +1 -1
  176. package/dist/firstRun/inputPlanner.js +45 -11
  177. package/dist/firstRun/inputPlanner.js.map +1 -1
  178. package/dist/firstRun/onboardingStateMachine.js +1 -1
  179. package/dist/firstRun/onboardingStateMachine.js.map +1 -1
  180. package/dist/firstRun/paywallPolicy.js +3 -3
  181. package/dist/firstRun/paywallPolicy.js.map +1 -1
  182. package/dist/firstRun/types.js +1 -1
  183. package/dist/firstRun/types.js.map +1 -1
  184. package/dist/fixtures/catalog.js +72 -9
  185. package/dist/fixtures/catalog.js.map +1 -1
  186. package/dist/fixtures/load.js +50 -0
  187. package/dist/fixtures/load.js.map +1 -0
  188. package/dist/flows/discover.js +2 -2
  189. package/dist/flows/discover.js.map +1 -1
  190. package/dist/flows/generate.js +68 -17
  191. package/dist/flows/generate.js.map +1 -1
  192. package/dist/flows/lint.js +88 -14
  193. package/dist/flows/lint.js.map +1 -1
  194. package/dist/flows/pack.js +21 -5
  195. package/dist/flows/pack.js.map +1 -1
  196. package/dist/flows/paths.js +57 -0
  197. package/dist/flows/paths.js.map +1 -0
  198. package/dist/flows/repair.js +176 -37
  199. package/dist/flows/repair.js.map +1 -1
  200. package/dist/flows/run.js +308 -99
  201. package/dist/flows/run.js.map +1 -1
  202. package/dist/flows/schema.js +107 -25
  203. package/dist/flows/schema.js.map +1 -1
  204. package/dist/flows/seedExec.js +8 -4
  205. package/dist/flows/seedExec.js.map +1 -1
  206. package/dist/flows/templates.js +5 -5
  207. package/dist/index.js +50 -8
  208. package/dist/index.js.map +1 -1
  209. package/dist/ios/signing.js +32 -3
  210. package/dist/ios/signing.js.map +1 -1
  211. package/dist/issues/classify.js +28 -20
  212. package/dist/issues/classify.js.map +1 -1
  213. package/dist/issues/fingerprint.js +35 -9
  214. package/dist/issues/fingerprint.js.map +1 -1
  215. package/dist/issues/index.js +93 -46
  216. package/dist/issues/index.js.map +1 -1
  217. package/dist/issues/metrics.js +6 -5
  218. package/dist/issues/metrics.js.map +1 -1
  219. package/dist/issues/recurrence.js +35 -8
  220. package/dist/issues/recurrence.js.map +1 -1
  221. package/dist/issues/report.js +12 -8
  222. package/dist/issues/report.js.map +1 -1
  223. package/dist/issues/reportBridge.js +40 -9
  224. package/dist/issues/reportBridge.js.map +1 -1
  225. package/dist/issues/schema.js +2 -2
  226. package/dist/issues/schema.js.map +1 -1
  227. package/dist/issues/sourceRevision.js +2 -2
  228. package/dist/issues/sourceRevision.js.map +1 -1
  229. package/dist/issues/store.js +110 -32
  230. package/dist/issues/store.js.map +1 -1
  231. package/dist/lib/abortScope.js +48 -0
  232. package/dist/lib/abortScope.js.map +1 -0
  233. package/dist/lib/android.js +84 -8
  234. package/dist/lib/android.js.map +1 -1
  235. package/dist/lib/coordSpace.js +1 -1
  236. package/dist/lib/coordSpace.js.map +1 -1
  237. package/dist/lib/device.js +53 -12
  238. package/dist/lib/device.js.map +1 -1
  239. package/dist/lib/gestures.js +141 -0
  240. package/dist/lib/gestures.js.map +1 -0
  241. package/dist/lib/gitignore.js +4 -3
  242. package/dist/lib/gitignore.js.map +1 -1
  243. package/dist/lib/image.js +12 -3
  244. package/dist/lib/image.js.map +1 -1
  245. package/dist/lib/lockfile.js +399 -0
  246. package/dist/lib/lockfile.js.map +1 -0
  247. package/dist/lib/needsInput.js +9 -6
  248. package/dist/lib/needsInput.js.map +1 -1
  249. package/dist/lib/png.js +4 -3
  250. package/dist/lib/png.js.map +1 -1
  251. package/dist/lib/redact.js +170 -9
  252. package/dist/lib/redact.js.map +1 -1
  253. package/dist/lib/result.js +94 -10
  254. package/dist/lib/result.js.map +1 -1
  255. package/dist/lib/schemaHash.js +7 -5
  256. package/dist/lib/schemaHash.js.map +1 -1
  257. package/dist/lib/sensitive.js +6 -3
  258. package/dist/lib/sensitive.js.map +1 -1
  259. package/dist/lib/simctl.js +3 -3
  260. package/dist/lib/simctl.js.map +1 -1
  261. package/dist/lib/spawn.js +78 -17
  262. package/dist/lib/spawn.js.map +1 -1
  263. package/dist/lib/toolAnnotations.js +114 -0
  264. package/dist/lib/toolAnnotations.js.map +1 -0
  265. package/dist/lib/wda.js +321 -25
  266. package/dist/lib/wda.js.map +1 -1
  267. package/dist/lib/wdaConfig.js +12 -5
  268. package/dist/lib/wdaConfig.js.map +1 -1
  269. package/dist/lib/wdaTune.js +52 -23
  270. package/dist/lib/wdaTune.js.map +1 -1
  271. package/dist/mobileAudit/checks.js +150 -28
  272. package/dist/mobileAudit/checks.js.map +1 -1
  273. package/dist/mobileAudit/evidence.js +4 -4
  274. package/dist/mobileAudit/evidence.js.map +1 -1
  275. package/dist/mobileAudit/profiles.js +121 -20
  276. package/dist/mobileAudit/profiles.js.map +1 -1
  277. package/dist/mobileAudit/results.js +9 -4
  278. package/dist/mobileAudit/results.js.map +1 -1
  279. package/dist/mobileAudit/runner.js +214 -35
  280. package/dist/mobileAudit/runner.js.map +1 -1
  281. package/dist/oracle/auth.js +1 -1
  282. package/dist/oracle/auth.js.map +1 -1
  283. package/dist/oracle/failures.js +1085 -145
  284. package/dist/oracle/failures.js.map +1 -1
  285. package/dist/oracle/health.js +148 -26
  286. package/dist/oracle/health.js.map +1 -1
  287. package/dist/oracle/locator.js +148 -19
  288. package/dist/oracle/locator.js.map +1 -1
  289. package/dist/oracle/record.js +3 -3
  290. package/dist/oracle/record.js.map +1 -1
  291. package/dist/orchestration/envelope.js +2 -2
  292. package/dist/orchestration/envelope.js.map +1 -1
  293. package/dist/orchestration/goal.js +7 -13
  294. package/dist/orchestration/goal.js.map +1 -1
  295. package/dist/orchestration/testThis/execute.js +167 -0
  296. package/dist/orchestration/testThis/execute.js.map +1 -0
  297. package/dist/orchestration/testThis/pipeline.js +413 -0
  298. package/dist/orchestration/testThis/pipeline.js.map +1 -0
  299. package/dist/orchestration/testThis/plan.js +519 -0
  300. package/dist/orchestration/testThis/plan.js.map +1 -0
  301. package/dist/orchestration/testThis/sessionIntent.js +72 -0
  302. package/dist/orchestration/testThis/sessionIntent.js.map +1 -0
  303. package/dist/orchestration/testThis/terminal.js +136 -0
  304. package/dist/orchestration/testThis/terminal.js.map +1 -0
  305. package/dist/orchestration/testThis/types.js +12 -0
  306. package/dist/orchestration/testThis/types.js.map +1 -0
  307. package/dist/plan/plan.js +9 -9
  308. package/dist/plan/plan.js.map +1 -1
  309. package/dist/prompts/index.js +24 -24
  310. package/dist/prompts/index.js.map +1 -1
  311. package/dist/report/coverage.js +0 -1
  312. package/dist/report/coverage.js.map +1 -1
  313. package/dist/report/evidence.js.map +1 -1
  314. package/dist/report/export.js +449 -72
  315. package/dist/report/export.js.map +1 -1
  316. package/dist/report/findingsDedupe.js +41 -0
  317. package/dist/report/findingsDedupe.js.map +1 -0
  318. package/dist/report/flake.js +13 -14
  319. package/dist/report/flake.js.map +1 -1
  320. package/dist/report/history.js +72 -38
  321. package/dist/report/history.js.map +1 -1
  322. package/dist/report/policy.js +18 -7
  323. package/dist/report/policy.js.map +1 -1
  324. package/dist/report/qaLevel.js +10 -16
  325. package/dist/report/qaLevel.js.map +1 -1
  326. package/dist/report/readiness.js +42 -12
  327. package/dist/report/readiness.js.map +1 -1
  328. package/dist/report/sarifSources.js +160 -0
  329. package/dist/report/sarifSources.js.map +1 -0
  330. package/dist/report/summary.js +2 -2
  331. package/dist/report/summary.js.map +1 -1
  332. package/dist/report/testCatalog.js +4 -4
  333. package/dist/report/testCatalog.js.map +1 -1
  334. package/dist/report/timing.js +23 -23
  335. package/dist/report/timing.js.map +1 -1
  336. package/dist/report/toolHealth.js +124 -0
  337. package/dist/report/toolHealth.js.map +1 -0
  338. package/dist/server.js +501 -69
  339. package/dist/server.js.map +1 -1
  340. package/dist/services/automationGenerate.js +8 -2
  341. package/dist/services/automationGenerate.js.map +1 -1
  342. package/dist/services/build.js +10 -4
  343. package/dist/services/build.js.map +1 -1
  344. package/dist/services/flowGenerate.js +75 -0
  345. package/dist/services/flowGenerate.js.map +1 -0
  346. package/dist/services/preflight.js +40 -8
  347. package/dist/services/preflight.js.map +1 -1
  348. package/dist/services/prepareAndroid.js +92 -18
  349. package/dist/services/prepareAndroid.js.map +1 -1
  350. package/dist/services/prepareIos.js +94 -17
  351. package/dist/services/prepareIos.js.map +1 -1
  352. package/dist/services/report.js +271 -80
  353. package/dist/services/report.js.map +1 -1
  354. package/dist/services/smoke.js +68 -22
  355. package/dist/services/smoke.js.map +1 -1
  356. package/dist/services/suiteGenerate.js +43 -6
  357. package/dist/services/suiteGenerate.js.map +1 -1
  358. package/dist/services/testSuiteKnowledge.js +78 -33
  359. package/dist/services/testSuiteKnowledge.js.map +1 -1
  360. package/dist/session/attach.js +284 -4
  361. package/dist/session/attach.js.map +1 -1
  362. package/dist/session/processRegistry.js +433 -0
  363. package/dist/session/processRegistry.js.map +1 -0
  364. package/dist/session/progress.js +1 -1
  365. package/dist/session/progress.js.map +1 -1
  366. package/dist/session/retention.js +201 -0
  367. package/dist/session/retention.js.map +1 -0
  368. package/dist/session/store.js +459 -59
  369. package/dist/session/store.js.map +1 -1
  370. package/dist/snapshot/overlays.js +60 -10
  371. package/dist/snapshot/overlays.js.map +1 -1
  372. package/dist/snapshot/parse.js +30 -12
  373. package/dist/snapshot/parse.js.map +1 -1
  374. package/dist/snapshot/present.js +36 -6
  375. package/dist/snapshot/present.js.map +1 -1
  376. package/dist/snapshot/settle.js +39 -9
  377. package/dist/snapshot/settle.js.map +1 -1
  378. package/dist/state/consent.js +99 -0
  379. package/dist/state/consent.js.map +1 -0
  380. package/dist/state/profile.js +82 -11
  381. package/dist/state/profile.js.map +1 -1
  382. package/dist/suite/compile.js +15 -6
  383. package/dist/suite/compile.js.map +1 -1
  384. package/dist/suite/lint.js +22 -4
  385. package/dist/suite/lint.js.map +1 -1
  386. package/dist/suite/pom.js +75 -44
  387. package/dist/suite/pom.js.map +1 -1
  388. package/dist/suite/secretGuard.js +266 -0
  389. package/dist/suite/secretGuard.js.map +1 -0
  390. package/dist/suite/testcase.js +15 -11
  391. package/dist/suite/testcase.js.map +1 -1
  392. package/dist/testSuite/exporter.js +7 -3
  393. package/dist/testSuite/exporter.js.map +1 -1
  394. package/dist/testSuite/generator.js +43 -14
  395. package/dist/testSuite/generator.js.map +1 -1
  396. package/dist/testSuite/history.js +1 -1
  397. package/dist/testSuite/history.js.map +1 -1
  398. package/dist/testSuite/issueLinks.js +3 -3
  399. package/dist/testSuite/issueLinks.js.map +1 -1
  400. package/dist/testSuite/lint.js +4 -4
  401. package/dist/testSuite/lint.js.map +1 -1
  402. package/dist/testSuite/merge.js +13 -7
  403. package/dist/testSuite/merge.js.map +1 -1
  404. package/dist/testSuite/schema.js +21 -16
  405. package/dist/testSuite/schema.js.map +1 -1
  406. package/dist/testSuite/store.js +12 -4
  407. package/dist/testSuite/store.js.map +1 -1
  408. package/dist/testSuite/traceability.js +2 -2
  409. package/dist/testSuite/traceability.js.map +1 -1
  410. package/dist/tools/act.js +868 -174
  411. package/dist/tools/act.js.map +1 -1
  412. package/dist/tools/agent.js +521 -112
  413. package/dist/tools/agent.js.map +1 -1
  414. package/dist/tools/appControl.js +82 -19
  415. package/dist/tools/appControl.js.map +1 -1
  416. package/dist/tools/appMap.js +393 -189
  417. package/dist/tools/appMap.js.map +1 -1
  418. package/dist/tools/build.js +92 -51
  419. package/dist/tools/build.js.map +1 -1
  420. package/dist/tools/bundletool.js +141 -40
  421. package/dist/tools/bundletool.js.map +1 -1
  422. package/dist/tools/clearOverlay.js +98 -18
  423. package/dist/tools/clearOverlay.js.map +1 -1
  424. package/dist/tools/device.js +108 -19
  425. package/dist/tools/device.js.map +1 -1
  426. package/dist/tools/doctor.js +98 -35
  427. package/dist/tools/doctor.js.map +1 -1
  428. package/dist/tools/explore.js +110 -42
  429. package/dist/tools/explore.js.map +1 -1
  430. package/dist/tools/featureTesting.js +152 -130
  431. package/dist/tools/featureTesting.js.map +1 -1
  432. package/dist/tools/firstRun.js +94 -66
  433. package/dist/tools/firstRun.js.map +1 -1
  434. package/dist/tools/flow.js +347 -132
  435. package/dist/tools/flow.js.map +1 -1
  436. package/dist/tools/flowRepair.js +42 -10
  437. package/dist/tools/flowRepair.js.map +1 -1
  438. package/dist/tools/generate.js +199 -0
  439. package/dist/tools/generate.js.map +1 -0
  440. package/dist/tools/getArtifact.js +37 -8
  441. package/dist/tools/getArtifact.js.map +1 -1
  442. package/dist/tools/health.js +17 -12
  443. package/dist/tools/health.js.map +1 -1
  444. package/dist/tools/ios.js +148 -194
  445. package/dist/tools/ios.js.map +1 -1
  446. package/dist/tools/issues.js +256 -171
  447. package/dist/tools/issues.js.map +1 -1
  448. package/dist/tools/jobs.js +55 -11
  449. package/dist/tools/jobs.js.map +1 -1
  450. package/dist/tools/metro.js +84 -38
  451. package/dist/tools/metro.js.map +1 -1
  452. package/dist/tools/mobileAudit.js +83 -26
  453. package/dist/tools/mobileAudit.js.map +1 -1
  454. package/dist/tools/network.js +36 -14
  455. package/dist/tools/network.js.map +1 -1
  456. package/dist/tools/note.js +31 -17
  457. package/dist/tools/note.js.map +1 -1
  458. package/dist/tools/prepareIosTarget.js +31 -14
  459. package/dist/tools/prepareIosTarget.js.map +1 -1
  460. package/dist/tools/prepareTarget.js +193 -47
  461. package/dist/tools/prepareTarget.js.map +1 -1
  462. package/dist/tools/report.js +16 -8
  463. package/dist/tools/report.js.map +1 -1
  464. package/dist/tools/resolveArtifact.js +12 -12
  465. package/dist/tools/resolveArtifact.js.map +1 -1
  466. package/dist/tools/resolveTarget.js +81 -18
  467. package/dist/tools/resolveTarget.js.map +1 -1
  468. package/dist/tools/screenRecord.js +85 -20
  469. package/dist/tools/screenRecord.js.map +1 -1
  470. package/dist/tools/screenshot.js +42 -18
  471. package/dist/tools/screenshot.js.map +1 -1
  472. package/dist/tools/smoke.js +29 -12
  473. package/dist/tools/smoke.js.map +1 -1
  474. package/dist/tools/snapshot.js +157 -107
  475. package/dist/tools/snapshot.js.map +1 -1
  476. package/dist/tools/startSession.js +117 -84
  477. package/dist/tools/startSession.js.map +1 -1
  478. package/dist/tools/suite.js +391 -310
  479. package/dist/tools/suite.js.map +1 -1
  480. package/dist/tools/testSuite.js +112 -36
  481. package/dist/tools/testSuite.js.map +1 -1
  482. package/dist/tools/testThis.js +35 -802
  483. package/dist/tools/testThis.js.map +1 -1
  484. package/dist/tools/visual.js +698 -116
  485. package/dist/tools/visual.js.map +1 -1
  486. package/dist/tools/wait.js +9 -23
  487. package/dist/tools/wait.js.map +1 -1
  488. package/dist/tools/wda.js +312 -54
  489. package/dist/tools/wda.js.map +1 -1
  490. package/dist/version.js +37 -64
  491. package/dist/version.js.map +1 -1
  492. package/dist/visual/ocr.js +65 -8
  493. package/dist/visual/ocr.js.map +1 -1
  494. package/dist/visual/provider.js +87 -15
  495. package/dist/visual/provider.js.map +1 -1
  496. package/docs/README.md +24 -10
  497. package/docs/ci-reports.md +328 -0
  498. package/docs/concepts.md +227 -0
  499. package/docs/flows.md +153 -0
  500. package/docs/mcp-server.md +210 -104
  501. package/docs/physical-devices.md +84 -0
  502. package/docs/tools.md +808 -217
  503. package/package.json +16 -6
  504. package/dist/appMap/diff.js +0 -60
  505. package/dist/appMap/diff.js.map +0 -1
  506. package/dist/automation/maestroIr.js +0 -282
  507. package/dist/automation/maestroIr.js.map +0 -1
  508. package/dist/interop/maestro.js +0 -151
  509. package/dist/interop/maestro.js.map +0 -1
  510. package/dist/tools/assertVisual.js +0 -74
  511. package/dist/tools/assertVisual.js.map +0 -1
  512. package/dist/tools/automationGenerate.js +0 -394
  513. package/dist/tools/automationGenerate.js.map +0 -1
  514. package/dist/tools/capabilities.js +0 -209
  515. package/dist/tools/capabilities.js.map +0 -1
  516. package/dist/tools/detectContext.js +0 -41
  517. package/dist/tools/detectContext.js.map +0 -1
  518. package/dist/tools/flowGenerate.js +0 -55
  519. package/dist/tools/flowGenerate.js.map +0 -1
  520. package/dist/tools/history.js +0 -56
  521. package/dist/tools/history.js.map +0 -1
  522. package/dist/tools/idling.js +0 -104
  523. package/dist/tools/idling.js.map +0 -1
  524. package/dist/tools/inputCapabilities.js +0 -30
  525. package/dist/tools/inputCapabilities.js.map +0 -1
  526. package/dist/tools/locator.js +0 -57
  527. package/dist/tools/locator.js.map +0 -1
  528. package/dist/tools/maestro.js +0 -78
  529. package/dist/tools/maestro.js.map +0 -1
  530. package/dist/tools/permissions.js +0 -149
  531. package/dist/tools/permissions.js.map +0 -1
  532. package/dist/tools/plan.js +0 -49
  533. package/dist/tools/plan.js.map +0 -1
  534. package/dist/tools/screenInfo.js +0 -70
  535. package/dist/tools/screenInfo.js.map +0 -1
  536. package/dist/tools/seed.js +0 -101
  537. package/dist/tools/seed.js.map +0 -1
  538. package/dist/tools/state.js +0 -170
  539. package/dist/tools/state.js.map +0 -1
  540. package/dist/tools/visualText.js +0 -61
  541. package/dist/tools/visualText.js.map +0 -1
@@ -0,0 +1,519 @@
1
+ // qa_test_this plan-phase resolution: the cheap, side-effect-free half of the
2
+ // orchestration state machine. Resolves the session/project, finds (or plans a build for) an
3
+ // artifact, picks a target, and returns an ordered plan with the EXACT next tool call to make,
4
+ // or a typed blocker / one concise NeedsInput question. Execute/interactive modes are dispatched
5
+ // to runExecuteMode (./execute.js).
6
+ import { qaOk, unknownSessionError } from '../../lib/result.js';
7
+ import { qaFail } from '../../oracle/failures.js';
8
+ import { qaNeedsInput, NeedsInput } from '../../lib/needsInput.js';
9
+ import { scanProject } from '../../context/scan.js';
10
+ import { findMobileApps, classifyDiscovery } from '../../context/findApps.js';
11
+ import { resolveGoalFlags } from '../goal.js';
12
+ import { resolveArtifact } from '../../artifacts/resolve.js';
13
+ import { buildPlan } from '../../build/plan.js';
14
+ import { adbDevices, listAvds, which } from '../../lib/android.js';
15
+ import { simctlAvailable, listSimulators } from '../../lib/simctl.js';
16
+ import { checkWda } from '../../lib/wda.js';
17
+ import { loadWdaConfig } from '../../lib/wdaConfig.js';
18
+ import { planTarget } from '../../core/targetPlan.js';
19
+ import { verifiedEmulatorSerials } from '../../session/attach.js';
20
+ import { universalApkCachePath } from '../../artifacts/bundletool.js';
21
+ import { ensurePrelaunchAppMap } from '../../appMap/prelaunch.js';
22
+ import { log } from '../../lib/logger.js';
23
+ import { selToPlatform } from './types.js';
24
+ import { runExecuteMode } from './execute.js';
25
+ import { rememberTestThisIntent } from './sessionIntent.js';
26
+ export async function handleTestThis(server, sessions, input) {
27
+ const { sessionId, projectRoot, mode, goal, goalText, fastSmoke, platform, device, preferRealDevice, allowOutsideRoot, buildIfNeeded, generateSuite, explore, stopOnNeedsInput, waitForCompletion, timeoutMs, consentId, approve, responseMode, } = input;
28
+ // Goal routing (Milestone C): the goal sets orchestration FLAGS only; explicit booleans win.
29
+ // Default policy = "leave behind automation when possible" (fastSmoke opts out).
30
+ const goalFlags = resolveGoalFlags(goal, { explore, generateSuite, stopOnNeedsInput }, { fastSmoke });
31
+ // ---- resolve / create session ----
32
+ let session = sessionId ? sessions.get(sessionId) : undefined;
33
+ if (sessionId && !session) {
34
+ return unknownSessionError(sessionId, ['Omit sessionId to create one, or pass a valid session.']);
35
+ }
36
+ if (!session) {
37
+ const { resolveProjectRoot, unresolvedProjectRootError } = await import('../../context/projectRoot.js');
38
+ const resolved = await resolveProjectRoot(server, projectRoot);
39
+ if (!resolved.root)
40
+ return unresolvedProjectRootError(resolved);
41
+ session = sessions.create(resolved.root, undefined, responseMode ? { responseMode } : {});
42
+ // An explicit projectRoot IS the user's target choice. Never re-ask the monorepo question for it.
43
+ if (projectRoot)
44
+ session.chosenTarget = resolved.root;
45
+ }
46
+ else if (responseMode && session.responseMode !== responseMode) {
47
+ session.responseMode = responseMode;
48
+ sessions.persist(session);
49
+ }
50
+ // Remember the user's intent (goal/goalText/flags) so a blocker resume replays it.
51
+ rememberTestThisIntent(sessions, session, input);
52
+ // The EXACT re-invocation for plan steps that route back through qa_test_this: execute mode plus
53
+ // the caller's original goal/flags. A bare {sessionId} would just re-plan forever.
54
+ const reinvokeArgs = { sessionId: session.id, mode: 'execute' };
55
+ for (const [k, v] of Object.entries({
56
+ goal,
57
+ goalText,
58
+ fastSmoke,
59
+ platform,
60
+ device,
61
+ explore,
62
+ generateSuite,
63
+ stopOnNeedsInput,
64
+ buildIfNeeded,
65
+ allowOutsideRoot,
66
+ }))
67
+ if (v !== undefined)
68
+ reinvokeArgs[k] = v;
69
+ let root = session.root;
70
+ const wa = (note) => sessions.addWorkaround(session, note);
71
+ // ---- 1. project scan ----
72
+ let scan = await scanProject(root);
73
+ // What Swipium has actually tried before any pre-execute question/blocker (review item 5):
74
+ // concrete steps, not just the workaround log. Grows as resolution proceeds.
75
+ const preAttempted = [`scanned project root (framework=${scan.framework})`];
76
+ // ---- 1b. low-context app discovery (§3.1/§3.7): the root may be a monorepo or a parent
77
+ // directory rather than the app itself. Discover candidates and either adopt the one
78
+ // strong candidate (recording a workaround) or ask ONE disambiguation question. ----
79
+ if (scan.framework === 'unknown') {
80
+ const disc = findMobileApps(root);
81
+ preAttempted.push(`ran low-context app discovery (searched ${disc.searchedLocations.length} location(s), found ${disc.candidates.length} candidate(s))`);
82
+ const cls = classifyDiscovery(disc);
83
+ if (cls.decision === 'adopt' && cls.chosen) {
84
+ wa(`root is not itself a mobile app; discovered one candidate (${cls.chosen.framework}) at ${cls.chosen.rel}; proceeding with it`);
85
+ root = cls.chosen.path;
86
+ session.root = root; // adopt the app subdir as the effective project root
87
+ sessions.persist(session);
88
+ scan = await scanProject(root);
89
+ }
90
+ else if (cls.decision === 'disambiguate') {
91
+ return qaNeedsInput(NeedsInput.monorepoTarget(cls.choices.map((c) => c.path)), {
92
+ sessionId: session.id,
93
+ state: 'needs_input',
94
+ attempted: [...preAttempted, `identified ${cls.choices.length} plausible app targets, cannot pick safely`],
95
+ candidates: cls.choices
96
+ .slice(0, 6)
97
+ .map((c) => ({ path: c.path, rel: c.rel, framework: c.framework, score: c.score, reasons: c.reasons })),
98
+ });
99
+ }
100
+ else {
101
+ const empty = scan.readiness === 'blocked' && scan.missing.some((m) => /empty/i.test(m));
102
+ return qaFail(empty ? 'PROJECT_ROOT_EMPTY' : 'NOT_MOBILE_PROJECT', {
103
+ what: `No supported mobile project at ${root}`,
104
+ nextSteps: [
105
+ `Searched: ${disc.searchedLocations.slice(0, 8).join('; ') || '(root only)'}`,
106
+ 'Pass projectRoot="/abs/path/to/app" pointing at the app directory.',
107
+ ],
108
+ extra: { sessionId: session.id, scan, searchedLocations: disc.searchedLocations, state: 'blocked' },
109
+ });
110
+ }
111
+ }
112
+ else if (scan.monorepo && session.chosenTarget === root) {
113
+ // The user already chose this root (monorepo_target resume / explicit projectRoot): asking again
114
+ // would loop forever when the chosen app IS the monorepo root.
115
+ preAttempted.push('monorepo detected, using the explicitly chosen target');
116
+ }
117
+ else if (scan.monorepo) {
118
+ // The root is itself an app but also a monorepo: surface other sibling apps for disambiguation
119
+ // only when there are genuinely multiple recognized targets to choose between.
120
+ const disc = findMobileApps(root);
121
+ preAttempted.push(`detected a monorepo at the root; ran app discovery (${disc.candidates.length} candidate(s))`);
122
+ const others = disc.candidates.filter((c) => c.path !== root);
123
+ if (others.length >= 1) {
124
+ return qaNeedsInput(NeedsInput.monorepoTarget([root, ...others.map((c) => c.path)]), {
125
+ sessionId: session.id,
126
+ state: 'needs_input',
127
+ attempted: [...preAttempted, `the root app plus ${others.length} sibling app(s) are all plausible targets`],
128
+ candidates: disc.candidates
129
+ .slice(0, 6)
130
+ .map((c) => ({ path: c.path, rel: c.rel, framework: c.framework, score: c.score, reasons: c.reasons })),
131
+ });
132
+ }
133
+ wa('monorepo detected, proceeding with the resolved root; pass projectRoot/target to disambiguate if the wrong app is chosen');
134
+ }
135
+ // ---- 1c. pre-launch app map (Vision Gap Fix 1): load or build the durable STATIC app map
136
+ // BEFORE prepare/smoke so first-run decisions, exploration seeding, automation readiness,
137
+ // and the report are informed by the map at the time they are made, and so the map still
138
+ // exists when no device/artifact is available (every blocker below carries appMapUri). ----
139
+ let prelaunchMap;
140
+ let appMapUri;
141
+ try {
142
+ const at = new Date().toISOString();
143
+ const pre = ensurePrelaunchAppMap(root, {
144
+ at,
145
+ appIdentityHints: {
146
+ androidPackage: scan.framework === 'native-android' || scan.framework === 'expo' || scan.framework === 'bare-react-native' ? scan.appId : null,
147
+ iosBundleId: scan.framework === 'native-ios' ? scan.appId : null,
148
+ },
149
+ });
150
+ prelaunchMap = pre.map;
151
+ appMapUri = pre.appMapUri;
152
+ preAttempted.push(`${pre.rescanned ? 'built' : 'loaded'} static app map (${pre.reason}; ${pre.map.staticTopology.screens.length} static screen(s)) > ${pre.appMapUri}`);
153
+ if (pre.rescanned)
154
+ wa(`built static app map before launch (${pre.map.staticTopology.screens.length} screen(s)); durable map drives first-run/exploration/report`);
155
+ }
156
+ catch (e) {
157
+ log('warn', 'test_this pre-launch app map failed', { err: String(e) });
158
+ }
159
+ const buildPref = buildIfNeeded !== false;
160
+ const steps = [];
161
+ // ---- 2. artifact ----
162
+ const art = await resolveArtifact({ projectRoot: root, platform: platform ?? 'any', allowOutsideRoot });
163
+ let artifactPlatform = art.best?.platform;
164
+ let needBuild = false;
165
+ if (art.failureCode === 'ARTIFACT_OUTSIDE_ROOT_REQUIRES_APPROVAL') {
166
+ const outside = art.candidates.find((c) => c.outsideRoot);
167
+ return qaNeedsInput(NeedsInput.artifactOutsideRoot(outside?.path ?? '(outside root)'), {
168
+ sessionId: session.id,
169
+ state: 'needs_input',
170
+ attempted: [...preAttempted, 'resolved candidate artifacts, but the best one is outside the project root'],
171
+ candidates: art.candidates.slice(0, 3),
172
+ });
173
+ }
174
+ const isAab = art.best?.type === 'aab';
175
+ if (art.best) {
176
+ steps.push({ tool: '(resolved)', why: `Using ${art.best.type.toUpperCase()} ${art.best.path}`, status: 'satisfied' });
177
+ if (isAab) {
178
+ // Honest (P0.2): an .aab is not installable; it must be converted first.
179
+ wa('only a .aab is present; qa_test_this will convert it to an installable universal APK with bundletool');
180
+ steps.push({
181
+ tool: 'qa_test_this',
182
+ why: 'Convert the .aab to an installable universal APK before install (execute mode runs the conversion)',
183
+ args: { ...reinvokeArgs },
184
+ status: 'pending',
185
+ });
186
+ }
187
+ }
188
+ else {
189
+ // No artifact. Build from source if possible (effective-before-exhaustive, §2.1).
190
+ const targetPlatform = (platform ??
191
+ artifactPlatform ??
192
+ (scan.framework === 'native-ios' ? 'ios' : 'android'));
193
+ if (buildPref) {
194
+ const bp = await buildPlan({ projectRoot: root, platform: targetPlatform });
195
+ if (!bp.failureCode && bp.build && bp.toolchainOk) {
196
+ needBuild = true;
197
+ artifactPlatform = targetPlatform;
198
+ const expoAndroidLocalRun = scan.framework === 'expo' && targetPlatform === 'android';
199
+ wa(expoAndroidLocalRun
200
+ ? `no prebuilt APK - Expo Android local run selected (${bp.build.command}); first run can take several minutes, later JS/TS-only work should reuse Metro/dev-build caches`
201
+ : `no prebuilt artifact - will build ${targetPlatform} from source (${bp.build.command})`);
202
+ steps.push({
203
+ tool: 'qa_test_this',
204
+ why: expoAndroidLocalRun
205
+ ? 'No reusable APK/dev build found; run Expo Android local build/install/Metro path'
206
+ : `No artifact found; build ${targetPlatform} from source before install`,
207
+ args: { ...reinvokeArgs },
208
+ status: 'pending',
209
+ produces: ['artifact.path', 'artifact.appId'],
210
+ });
211
+ }
212
+ else {
213
+ return qaFail(bp.failureCode ?? 'NO_BUILD_ARTIFACT', {
214
+ what: `No artifact found under ${root}, and a build is not currently possible`,
215
+ nextSteps: [
216
+ ...(bp.missingToolchain.length ? [`Install: ${bp.missingToolchain.join(', ')}`] : []),
217
+ ...bp.notes,
218
+ `Searched: ${art.searchedLocations.slice(0, 6).join('; ')}`,
219
+ ...(appMapUri ? [`Static app map is still available: qa_app_map_read { projectRoot:"${root}" }`] : []),
220
+ ],
221
+ extra: { sessionId: session.id, buildPlan: bp, searchedLocations: art.searchedLocations, appMapUri, state: 'blocked' },
222
+ });
223
+ }
224
+ }
225
+ else {
226
+ return qaFail('NO_BUILD_ARTIFACT', {
227
+ what: `No artifact found under ${root}`,
228
+ nextSteps: [
229
+ 'Build the app with your normal build command, or pass an explicit artifact path.',
230
+ `Searched: ${art.searchedLocations.slice(0, 6).join('; ')}`,
231
+ ...(appMapUri ? [`Static app map is still available: qa_app_map_read { projectRoot:"${root}" }`] : []),
232
+ ],
233
+ extra: { sessionId: session.id, searchedLocations: art.searchedLocations, appMapUri, state: 'blocked' },
234
+ });
235
+ }
236
+ }
237
+ // ---- 3. target ----
238
+ // Public v1 is simulator-only. Real-device-only artifacts and explicit real-device requests
239
+ // are blocked instead of silently routing to non-v1 behavior.
240
+ const iosArtifactRealOnly = !!art.best &&
241
+ art.best.platform === 'ios' &&
242
+ Array.isArray(art.best.installableOn) &&
243
+ art.best.installableOn.length > 0 &&
244
+ art.best.installableOn.every((t) => t === 'ios-real');
245
+ if (preferRealDevice || iosArtifactRealOnly) {
246
+ return qaFail('PHYSICAL_DEVICE_UNSUPPORTED', {
247
+ what: 'Swipium supports Android Emulator and iOS Simulator targets only (see docs/physical-devices.md).',
248
+ nextSteps: [
249
+ 'Use an Android emulator build or an iOS Simulator .app.',
250
+ 'Real-device workflows are out of scope until their threat model lands.',
251
+ ],
252
+ extra: { sessionId: session.id, appMapUri, state: 'blocked' },
253
+ });
254
+ }
255
+ const [adbPresent, simPresent] = await Promise.all([which('adb'), simctlAvailable()]);
256
+ const [onlineAll, avds, sims] = await Promise.all([
257
+ adbPresent ? adbDevices() : Promise.resolve([]),
258
+ adbPresent ? listAvds() : Promise.resolve([]),
259
+ simPresent ? listSimulators() : Promise.resolve([]),
260
+ ]);
261
+ // H6: pattern OR property-verified emulators (localhost:5555, Genymotion), same as getDriver.
262
+ // ALL online serials go to the planner (it refuses physical ones with PHYSICAL_DEVICE_UNSUPPORTED
263
+ // when nothing else is viable). Pre-filtering to emulators hid that and reported NO_DEVICE.
264
+ const emulators = await verifiedEmulatorSerials(onlineAll);
265
+ if (device && onlineAll.includes(device) && !emulators.includes(device)) {
266
+ return qaFail('PHYSICAL_DEVICE_UNSUPPORTED', {
267
+ what: `Android target "${device}" appears to be a physical device. Swipium supports the Android Emulator only.`,
268
+ nextSteps: ['Start or create an Android Emulator, then retry without a real-device serial.'],
269
+ extra: { sessionId: session.id, appMapUri, state: 'blocked' },
270
+ });
271
+ }
272
+ const tInputs = {
273
+ requestedPlatform: platform,
274
+ requestedDevice: device,
275
+ preferRealDevice: false,
276
+ artifactPlatform,
277
+ artifactInstallTargets: art.best?.installableOn,
278
+ android: { online: onlineAll, avds, emulators },
279
+ ios: {
280
+ bootedSimulators: sims.filter((s) => s.state === 'Booted').map((s) => ({ udid: s.udid, name: s.name })),
281
+ availableSimulators: sims.filter((s) => s.state !== 'Booted').map((s) => ({ udid: s.udid, name: s.name })),
282
+ realDevices: [],
283
+ },
284
+ };
285
+ const target = planTarget(tInputs);
286
+ if (target.blocked) {
287
+ const androidWanted = platform === 'android' || artifactPlatform === 'android' || /android/i.test(target.blocked.detail);
288
+ const blockedExtra = {
289
+ sessionId: session.id,
290
+ targetPlan: target,
291
+ workaroundsAttempted: session.workarounds,
292
+ appMapUri,
293
+ state: 'blocked',
294
+ };
295
+ const avdSteps = [
296
+ 'Create an Android Virtual Device: Android Studio > Device Manager > Create device, or ' +
297
+ '`avdmanager create avd -n Pixel_7 -k "system-images;android-34;google_apis;arm64-v8a" -d pixel_7` (install the image with sdkmanager first).',
298
+ `Then re-run qa_test_this ${JSON.stringify(reinvokeArgs)}. Swipium boots the AVD itself (one consent).`,
299
+ ];
300
+ if (target.blocked.failureCode === 'NO_DEVICE' && androidWanted && !adbPresent) {
301
+ return qaFail('ADB_NOT_FOUND', {
302
+ what: 'adb (Android platform-tools) is not on PATH, so Swipium cannot see or boot any Android emulator.',
303
+ nextSteps: [
304
+ 'Install Android platform-tools (Android Studio > SDK Manager, or `sdkmanager "platform-tools" "emulator"`) and put $ANDROID_HOME/platform-tools and $ANDROID_HOME/emulator on PATH (or set ANDROID_HOME).',
305
+ ...avdSteps,
306
+ ...(simPresent ? ['Or test on iOS: qa_test_this {"mode":"execute","platform":"ios"}.'] : []),
307
+ ],
308
+ extra: blockedExtra,
309
+ });
310
+ }
311
+ return qaFail(target.blocked.failureCode, {
312
+ ...(target.blocked.failureCode === 'NO_DEVICE' && androidWanted
313
+ ? { what: 'No Android emulator is online and no AVD exists to boot.', nextSteps: avdSteps }
314
+ : target.blocked.failureCode === 'PHYSICAL_DEVICE_UNSUPPORTED'
315
+ ? {
316
+ what: target.blocked.detail,
317
+ nextSteps: ['Physical devices are out of scope (docs/physical-devices.md). Use an emulator instead.', ...avdSteps],
318
+ }
319
+ : { what: target.blocked.detail }),
320
+ extra: blockedExtra,
321
+ });
322
+ }
323
+ if (target.willBoot)
324
+ wa(`no online ${selToPlatform[target.selected]} target, will boot ${target.bootTarget}`);
325
+ const isAndroid = selToPlatform[target.selected] === 'android';
326
+ const isIosReal = false;
327
+ // Effective flags: iOS without WebDriverAgent can still launch + smoke visually, so the DEFAULT
328
+ // suite generation / goal-implied exploration degrade (recorded as a workaround) instead of
329
+ // blocking. Only work the caller explicitly asked for that truly needs WDA blocks.
330
+ let effExplore = goalFlags.explore;
331
+ let effGenerateSuite = goalFlags.generateSuite;
332
+ let effRequiredOutputs = goalFlags.requiredOutputs;
333
+ const structuredNeeds = [];
334
+ if (!isAndroid && !isIosReal) {
335
+ if (effGenerateSuite)
336
+ structuredNeeds.push('suite generation');
337
+ if (effExplore)
338
+ structuredNeeds.push('guided exploration');
339
+ if (goalFlags.goal === 'test_login')
340
+ structuredNeeds.push('driving the login form');
341
+ }
342
+ if (structuredNeeds.length) {
343
+ const wdaConfig = loadWdaConfig(root);
344
+ const wda = await checkWda(wdaConfig.url, 1500);
345
+ if (!wda.reachable || !wda.ready) {
346
+ // Hard requirement = something the caller explicitly asked for (flag or a WDA-only goal).
347
+ const hard = [];
348
+ if (generateSuite === true || goalFlags.goal === 'create_automation_suite')
349
+ hard.push('suite generation');
350
+ if (explore === true || goalFlags.goal === 'explore' || goalFlags.goal === 'reproduce_bug')
351
+ hard.push('guided exploration');
352
+ if (goalFlags.goal === 'test_login')
353
+ hard.push('driving the login form');
354
+ if (hard.length) {
355
+ const visualSmoke = { ...reinvokeArgs, platform: 'ios', goal: 'smoke' };
356
+ delete visualSmoke.explore;
357
+ delete visualSmoke.generateSuite;
358
+ delete visualSmoke.goalText;
359
+ return qaFail('WDA_UNREACHABLE', {
360
+ what: `iOS ${hard.join(' + ')} (requested via ${goal ? `goal "${goalFlags.goal}"` : 'explicit flags'}) needs the structured ` +
361
+ `WebDriverAgent backend, and WDA is not ready at ${wdaConfig.url}. A visual-only smoke (launch + screenshots + health) does not need WDA.`,
362
+ nextSteps: [
363
+ `Visual-only alternative now: qa_test_this ${JSON.stringify(visualSmoke)}`,
364
+ 'Or set up WDA: qa_wda { action:"doctor" } > qa_wda { action:"build" } > qa_wda { action:"start" } (or attach an external WDA URL), then re-run the same qa_test_this call.',
365
+ ...(appMapUri ? [`Static app map is still available: qa_app_map_read { projectRoot:"${root}" }`] : []),
366
+ ],
367
+ extra: {
368
+ sessionId: session.id,
369
+ state: 'blocked',
370
+ goal: goalFlags.goal,
371
+ requiresWdaFor: hard,
372
+ target,
373
+ wda: { config: { url: wdaConfig.url, mode: wdaConfig.mode, derivedDataPath: wdaConfig.derivedDataPath }, status: wda },
374
+ appMapUri,
375
+ },
376
+ });
377
+ }
378
+ effExplore = false;
379
+ effGenerateSuite = false;
380
+ effRequiredOutputs = effRequiredOutputs.filter((o) => o !== 'suite' && o !== 'exploration');
381
+ wa(`WebDriverAgent not ready at ${wdaConfig.url}, skipping ${structuredNeeds.join(' + ')}; running a visual-only iOS smoke (set up WDA via qa_wda to enable them)`);
382
+ preAttempted.push(`checked WebDriverAgent at ${wdaConfig.url}: not ready; degraded to visual-only`);
383
+ }
384
+ }
385
+ // ---- 4. auth (be effective: proceed pre-login; surface the question as optional) ----
386
+ let optionalQuestion;
387
+ if (scan.likelyAuth) {
388
+ wa('app likely has a login: will test pre-login coverage; authenticated flows are blocked until credentials are provided');
389
+ optionalQuestion = NeedsInput.credentials('Authenticated workflows need a test account.');
390
+ }
391
+ // ---- 5. assemble the ordered plan ----
392
+ // Effective installable artifact path: a converted universal APK for an .aab, else the artifact.
393
+ const effectiveApk = art.best ? (isAab ? universalApkCachePath(root, art.best.path) : art.best.path) : undefined;
394
+ // Milestone E: when a build is pending, the artifact does not exist yet, so use SYMBOLIC refs
395
+ // (${artifact.path}/${artifact.appId}) and mark the dependency, never `undefined` args.
396
+ const prepArgs = { sessionId: session.id };
397
+ if (isAndroid) {
398
+ prepArgs.apk = needBuild ? '${artifact.path}' : effectiveApk;
399
+ if (target.device)
400
+ prepArgs.device = target.device;
401
+ if (target.willBoot && target.bootTarget)
402
+ prepArgs.avd = target.bootTarget;
403
+ }
404
+ else {
405
+ prepArgs.app = needBuild ? '${artifact.path}' : art.best?.path;
406
+ prepArgs.bundleId = needBuild ? '${artifact.appId}' : (art.best?.appId ?? undefined);
407
+ prepArgs.simulator = target.device;
408
+ prepArgs.attachWda = 'auto';
409
+ if (target.device)
410
+ prepArgs.device = target.device;
411
+ }
412
+ if (isAndroid && scan.metroNeed === 'likely')
413
+ wa('debug RN/Expo build likely needs Metro/dev server serving before launch');
414
+ steps.push({
415
+ tool: isAndroid ? 'qa_prepare_target' : 'qa_prepare_ios_target',
416
+ why: `Install + launch on ${target.selected}`,
417
+ args: prepArgs,
418
+ status: 'pending',
419
+ ...(needBuild ? { requires: ['artifact.path', 'artifact.appId'] } : {}),
420
+ });
421
+ steps.push({
422
+ tool: 'qa_smoke',
423
+ why: 'Run a guardrail/smoke pass and capture evidence',
424
+ args: { sessionId: session.id, profile: scan.recommendedProfile },
425
+ status: 'pending',
426
+ });
427
+ steps.push({
428
+ tool: 'qa_report',
429
+ why: 'Summarize what was tested/blocked with evidence',
430
+ args: { sessionId: session.id },
431
+ status: 'pending',
432
+ });
433
+ steps.push({
434
+ tool: 'qa_generate',
435
+ why: 'Optional: turn this run into a durable POM suite',
436
+ args: { sessionId: session.id, target: 'suite' },
437
+ status: 'pending',
438
+ });
439
+ const nextAction = steps.find((s) => s.status === 'pending') ?? null;
440
+ const state = 'ready';
441
+ // Choice explanations for the uniform envelope (Dev 2 owns the source data; Dev 1 the shape).
442
+ const artifactChoice = art.best
443
+ ? {
444
+ path: art.best.path,
445
+ why: `${art.best.type.toUpperCase()} selected${art.best.buildType ? ` (${art.best.buildType})` : ''}`,
446
+ alternatives: art.candidates
447
+ .filter((c) => c.path !== art.best.path)
448
+ .slice(0, 4)
449
+ .map((c) => c.path),
450
+ }
451
+ : needBuild
452
+ ? { why: 'No prebuilt artifact, building from source', alternatives: [] }
453
+ : null;
454
+ const targetChoice = target.selected
455
+ ? { target: `${target.selected}${target.device ? ` (${target.device})` : ''}`, why: target.reason, alternatives: [] }
456
+ : null;
457
+ // ---- EXECUTE / INTERACTIVE modes (P0.1): actually run the path as a job ----
458
+ if (mode === 'execute' || mode === 'interactive') {
459
+ return runExecuteMode(server, sessions, session, {
460
+ mode,
461
+ scan,
462
+ art,
463
+ target,
464
+ isAndroid,
465
+ isIosReal,
466
+ isAab,
467
+ needBuild,
468
+ effectiveApk,
469
+ platform,
470
+ goal: goalFlags.goal,
471
+ goalText,
472
+ releaseGate: goalFlags.releaseGate,
473
+ requiredOutputs: effRequiredOutputs,
474
+ generateSuite: effGenerateSuite,
475
+ explore: effExplore,
476
+ stopOnNeedsInput: goalFlags.stopOnNeedsInput,
477
+ artifactChoice,
478
+ targetChoice,
479
+ waitForCompletion: !!waitForCompletion,
480
+ timeoutMs,
481
+ consentId,
482
+ approve,
483
+ optionalQuestion,
484
+ workaroundLog: () => session.workarounds,
485
+ prelaunchMap,
486
+ appMapUri,
487
+ });
488
+ }
489
+ const summary = `🚀 test-this plan for ${root} (framework=${scan.framework}, session ${session.id})\n` +
490
+ `target: ${target.selected}${target.device ? ` (${target.device})` : ''}: ${target.reason}\n` +
491
+ (art.best
492
+ ? `artifact: ${art.best.type.toUpperCase()} ${art.best.path}`
493
+ : `artifact: none (${needBuild ? 'will build from source' : 'blocked'})`) +
494
+ '\n' +
495
+ `plan:\n${steps.map((s, i) => ` ${i + 1}. [${s.status === 'satisfied' ? '✓' : ' '}] ${s.tool}: ${s.why}`).join('\n')}\n` +
496
+ (nextAction ? `next: call ${nextAction.tool} ${JSON.stringify(nextAction.args ?? {})}\n` : '') +
497
+ (session.workarounds.length ? `workarounds: ${session.workarounds.length} (see workaroundsAttempted)\n` : '') +
498
+ (optionalQuestion ? `note: ${optionalQuestion.question}` : '');
499
+ return qaOk({
500
+ sessionId: session.id,
501
+ state,
502
+ goal: goalFlags.goal,
503
+ framework: scan.framework,
504
+ appMapUri,
505
+ appIdentity: prelaunchMap?.appIdentity,
506
+ target,
507
+ targetChoice,
508
+ artifact: art.best ?? null,
509
+ artifactChoice,
510
+ needBuild,
511
+ recommendedProfile: scan.recommendedProfile,
512
+ plan: steps,
513
+ nextAction,
514
+ workaroundsAttempted: session.workarounds,
515
+ optionalQuestion: optionalQuestion ?? null,
516
+ searchedLocations: art.best ? undefined : art.searchedLocations,
517
+ }, summary);
518
+ }
519
+ //# sourceMappingURL=plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../../src/orchestration/testThis/plan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ // Durable qa_test_this intent per session: the goal/flags a user asked for, so a resume
2
+ // (qa_continue_from_blocker > qa_test_this) replays them instead of silently falling back to the
3
+ // default goal, plus the "login declined" choice from a credentials question.
4
+ //
5
+ // Storage, in lookup order (tolerant of each being absent):
6
+ // 1. `session.lastTestThisArgs` ({goal, goalText, flags}), persisted + rehydrated by the store;
7
+ // 2. a module-level map keyed by sessionId (same server process), the fallback when the field is absent.
8
+ // The login-declined flag rides on the generic persisted `milestones` record.
9
+ /** qa_test_this inputs that express the user's INTENT (never device/consent/one-shot plumbing). */
10
+ export const TEST_THIS_INTENT_KEYS = [
11
+ 'goal',
12
+ 'goalText',
13
+ 'fastSmoke',
14
+ 'explore',
15
+ 'generateSuite',
16
+ 'stopOnNeedsInput',
17
+ 'platform',
18
+ 'buildIfNeeded',
19
+ ];
20
+ const memory = new Map();
21
+ function pickIntent(input) {
22
+ const out = {};
23
+ for (const k of TEST_THIS_INTENT_KEYS)
24
+ if (input[k] !== undefined)
25
+ out[k] = input[k];
26
+ return out;
27
+ }
28
+ /** Remember the intent keys of a qa_test_this call (merged over any earlier call's). */
29
+ export function rememberTestThisIntent(sessions, session, input) {
30
+ const current = pickIntent(input);
31
+ const merged = { ...recallTestThisIntent(session), ...current };
32
+ memory.set(session.id, merged);
33
+ const { goal, goalText, ...flags } = merged;
34
+ const record = { goal, goalText, flags: flags };
35
+ // Tolerate a store without the typed setter (older build): fall back to the plain field.
36
+ const store = sessions;
37
+ if (typeof store.setLastTestThisArgs === 'function')
38
+ store.setLastTestThisArgs(session, record);
39
+ else
40
+ session.lastTestThisArgs = record;
41
+ return merged;
42
+ }
43
+ /** The remembered intent for a session ({} when none). */
44
+ export function recallTestThisIntent(session) {
45
+ const field = session.lastTestThisArgs;
46
+ if (field && typeof field === 'object') {
47
+ const flags = field.flags && typeof field.flags === 'object' ? field.flags : {};
48
+ return pickIntent({ ...flags, goal: field.goal, goalText: field.goalText });
49
+ }
50
+ const mem = memory.get(session.id);
51
+ if (mem)
52
+ return { ...mem };
53
+ return {};
54
+ }
55
+ const LOGIN_DECLINED = 'login_declined';
56
+ /** Record that the user chose "test pre-login only": login is out of scope for this session. */
57
+ export function markLoginDeclined(sessions, session) {
58
+ sessions.milestone(session, LOGIN_DECLINED);
59
+ }
60
+ export function isLoginDeclined(session) {
61
+ return session.milestones?.[LOGIN_DECLINED] != null;
62
+ }
63
+ /** Login credentials usable RIGHT NOW: metadata alone is not enough. Raw values live only in
64
+ * memory and are gone after a server restart, so the question must be asked again. */
65
+ export function hasUsableCredentials(session) {
66
+ return session.inputs.some((i) => /EMAIL|PASSWORD/.test(i.varName) && session.inputValues.has(i.varName));
67
+ }
68
+ /** Credentials whose metadata survived a restart but whose values did not. */
69
+ export function credentialsLostOnRestart(session) {
70
+ return session.inputs.some((i) => /EMAIL|PASSWORD/.test(i.varName)) && !hasUsableCredentials(session);
71
+ }
72
+ //# sourceMappingURL=sessionIntent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessionIntent.js","sourceRoot":"","sources":["../../../src/orchestration/testThis/sessionIntent.ts"],"names":[],"mappings":"AAAA,wFAAwF;AACxF,iGAAiG;AACjG,8EAA8E;AAC9E,EAAE;AACF,4DAA4D;AAC5D,kGAAkG;AAClG,2GAA2G;AAC3G,8EAA8E;AAK9E,mGAAmG;AACnG,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,MAAM;IACN,UAAU;IACV,WAAW;IACX,SAAS;IACT,eAAe;IACf,kBAAkB;IAClB,UAAU;IACV,eAAe;CACP,CAAC;AAIX,MAAM,MAAM,GAAG,IAAI,GAAG,EAA0B,CAAC;AAEjD,SAAS,UAAU,CAAC,KAA8B;IAChD,MAAM,GAAG,GAA4B,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,IAAI,qBAAqB;QAAE,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS;YAAE,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACrF,OAAO,GAAqB,CAAC;AAC/B,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,sBAAsB,CAAC,QAAsB,EAAE,OAAgB,EAAE,KAAoB;IACnG,MAAM,OAAO,GAAG,UAAU,CAAC,KAAgC,CAAC,CAAC;IAC7D,MAAM,MAAM,GAAmB,EAAE,GAAG,oBAAoB,CAAC,OAAO,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC;IAChF,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IAC/B,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,GAAG,MAAM,CAAC;IAC5C,MAAM,MAAM,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAgC,EAAE,CAAC;IAC3E,yFAAyF;IACzF,MAAM,KAAK,GAAG,QAA2F,CAAC;IAC1G,IAAI,OAAO,KAAK,CAAC,mBAAmB,KAAK,UAAU;QAAE,KAAK,CAAC,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;;QAC1F,OAAqD,CAAC,gBAAgB,GAAG,MAAM,CAAC;IACtF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,oBAAoB,CAAC,OAAoC;IACvE,MAAM,KAAK,GAAI,OAA0C,CAAC,gBACW,CAAC;IACtE,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAE,KAAK,CAAC,KAAiC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7G,OAAO,UAAU,CAAC,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC9E,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACnC,IAAI,GAAG;QAAE,OAAO,EAAE,GAAG,GAAG,EAAE,CAAC;IAC3B,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,cAAc,GAAG,gBAAgB,CAAC;AAExC,gGAAgG;AAChG,MAAM,UAAU,iBAAiB,CAAC,QAAsB,EAAE,OAAgB;IACxE,QAAQ,CAAC,SAAS,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAoC;IAClE,OAAO,OAAO,CAAC,UAAU,EAAE,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC;AACtD,CAAC;AAED;uFACuF;AACvF,MAAM,UAAU,oBAAoB,CAAC,OAAgD;IACnF,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AAC5G,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,wBAAwB,CAAC,OAAgD;IACvF,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;AACxG,CAAC"}