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,31 +1,59 @@
1
1
  // Cross-restart registry of the long-lived child processes Swipium spawns (Metro bundler,
2
2
  // managed WDA xcodebuild, screen recorders, emulators) in ~/.swipium/processes.json, so a
3
- // crashed server's orphans can be reaped on the next startup (P0 §2 "orphaned processes").
3
+ // crashed server's orphans can be reaped on the next startup.
4
4
  //
5
5
  // Safety rules:
6
6
  // - Every entry records the OWNING server pid. A child whose owner is still a live
7
7
  // node/swipium process belongs to a concurrent server instance and is never touched.
8
- // - Before signalling, the child's command line is re-checked via `ps` so a PID recycled
9
- // by the OS to an unrelated process is never killed.
10
- // - Emulators are ADOPTED, not killed — an orphaned emulator stays booted and remains
8
+ // - Every entry records the child's FINGERPRINT at spawn time: its start time
9
+ // (`ps -o lstart=`, read under LC_ALL=C so the format is locale-independent) and full command
10
+ // line (for WDA that includes the project path and `-destination id=<udid>`). Before
11
+ // signalling (or adopting), both are re-read via `ps`. The START TIME must match exactly (the
12
+ // hard pid-recycling guard: a recycled pid has a different start time). The command must match
13
+ // per kind: for WDA / recordings / emulators the program is compared by BASENAME and the
14
+ // argument tail exactly (Xcode's /usr/bin/xcodebuild and xcrun shims re-exec the real tool
15
+ // under the same pid + start time, so `xcodebuild -project …` later reads
16
+ // `/Applications/Xcode.app/…/usr/bin/xcodebuild -project …`); for Metro (spawned via `npx`, which
17
+ // npm retitles right after spawn: `node …/npx react-native start` > `npm exec react-native
18
+ // start`) the launcher-stripped program+args tail must match. A PID recycled by the OS to
19
+ // an unrelated process (another node, the adb server, the user's own xcodebuild/Appium WDA) is
20
+ // never killed or adopted. Entries without a fingerprint (written by an older build, or when
21
+ // `ps` was unavailable) are unverifiable and are dropped without signalling.
22
+ // - A process GROUP is only signalled when Swipium created the child as a group leader
23
+ // (spawned detached: pgid == pid at registration); otherwise only the pid itself is signalled.
24
+ // - The owning server's start time is recorded too, so a recycled server pid (any node process)
25
+ // is not mistaken for a live concurrent server.
26
+ // - Emulators are ADOPTED, not killed: an orphaned emulator stays booted and remains
11
27
  // usable via adb for the next run.
12
- import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
28
+ // - Managed WDA (xcodebuild test-without-building) is deliberately NOT stopped on a graceful
29
+ // shutdown either (only Metro and screen recorders are; see startServer), so the next server
30
+ // can resume the iOS session on the same WDA. At startup an orphaned WDA entry is ADOPTED when
31
+ // it is younger than WDA_ADOPT_MAX_AGE_MS (12 h) AND its recorded endpoint answers GET /status
32
+ // ready; adoption keeps the entry and re-owns it (serverPid = this server), so `qa_wda stop`
33
+ // can still stop it and a later crash/restart applies the same rule. An older, unhealthy, or
34
+ // endpoint-less WDA entry is reaped like any other orphan.
35
+ import { existsSync, mkdirSync, readFileSync } from 'node:fs';
13
36
  import { join } from 'node:path';
14
37
  import { homedir } from 'node:os';
15
38
  import { spawnSync } from 'node:child_process';
16
- import { withFileLock } from '../lib/lockfile.js';
39
+ import { withFileLock, writeFileAtomicSync } from '../lib/lockfile.js';
17
40
  import { log } from '../lib/logger.js';
41
+ import { checkWda } from '../lib/wda.js';
42
+ /** An orphaned managed WDA older than this is reaped even when healthy (bounded lifetime). */
43
+ export const WDA_ADOPT_MAX_AGE_MS = 12 * 60 * 60 * 1000;
44
+ const WDA_ADOPT_PROBE_TIMEOUT_MS = 1500;
18
45
  const REGISTRY_DIR = join(homedir(), '.swipium');
19
46
  const PROCESSES_FILE = join(REGISTRY_DIR, 'processes.json');
20
47
  const PROCESSES_LOCK = `${PROCESSES_FILE}.lock`;
21
48
  const MAX_ENTRIES = 100;
22
- /** What the child's `ps` command line must look like before we dare signal it. */
49
+ /** Coarse sanity check on top of the exact fingerprint match (defence in depth). */
23
50
  const KIND_COMMAND_RE = {
24
- metro: /metro|expo|react-native|npx|node/i,
51
+ metro: /metro|expo|react-native|npx|npm|node/i,
25
52
  wda: /xcodebuild/i,
26
53
  recording: /screenrecord|recordvideo|simctl|adb/i,
27
54
  emulator: /emulator|qemu/i,
28
55
  };
56
+ const norm = (s) => (s == null ? null : s.trim().replace(/\s+/g, ' ') || null);
29
57
  function pidAlive(pid) {
30
58
  try {
31
59
  process.kill(pid, 0);
@@ -35,10 +63,17 @@ function pidAlive(pid) {
35
63
  return false;
36
64
  }
37
65
  }
38
- /** The live command line for `pid`, or null when it is gone / unreadable (POSIX `ps`). */
39
- function psCommand(pid) {
66
+ /** Environment for every `ps` we parse: the C locale, so `lstart` is always `Mon Sep 28 …`
67
+ * (under e.g. de_DE it would be `Mo. 28 Sep. …` and never match a fingerprint taken elsewhere). */
68
+ export function psEnv(base = process.env) {
69
+ return { ...base, LC_ALL: 'C', LANG: 'C' };
70
+ }
71
+ /** A `ps -o <field>=` value for `pid`, or null when it is gone / unreadable (POSIX `ps`). */
72
+ function psField(pid, field) {
73
+ if (process.platform === 'win32')
74
+ return null;
40
75
  try {
41
- const out = spawnSync('ps', ['-o', 'command=', '-p', String(pid)], { encoding: 'utf8' });
76
+ const out = spawnSync('ps', ['-o', `${field}=`, '-p', String(pid)], { encoding: 'utf8', env: psEnv() });
42
77
  if (out.status !== 0 || !out.stdout?.trim())
43
78
  return null;
44
79
  return out.stdout.trim();
@@ -47,6 +82,12 @@ function psCommand(pid) {
47
82
  return null;
48
83
  }
49
84
  }
85
+ const psCommand = (pid) => psField(pid, 'command');
86
+ const psStartTime = (pid) => norm(psField(pid, 'lstart'));
87
+ function psPgid(pid) {
88
+ const n = Number(psField(pid, 'pgid'));
89
+ return Number.isInteger(n) && n > 0 ? n : null;
90
+ }
50
91
  function readEntries() {
51
92
  try {
52
93
  if (!existsSync(PROCESSES_FILE))
@@ -57,14 +98,12 @@ function readEntries() {
57
98
  return parsed.filter((e) => typeof e?.pid === 'number');
58
99
  }
59
100
  catch (e) {
60
- log('warn', 'managed-process registry unreadable — starting fresh', { file: PROCESSES_FILE, err: String(e) });
101
+ log('warn', 'managed-process registry unreadable, starting fresh', { file: PROCESSES_FILE, err: String(e) });
61
102
  return [];
62
103
  }
63
104
  }
64
105
  function writeEntries(entries) {
65
- const tmp = `${PROCESSES_FILE}.${process.pid}.tmp`;
66
- writeFileSync(tmp, JSON.stringify(entries.slice(-MAX_ENTRIES), null, 2));
67
- renameSync(tmp, PROCESSES_FILE); // atomic on the same filesystem
106
+ writeFileAtomicSync(PROCESSES_FILE, JSON.stringify(entries.slice(-MAX_ENTRIES), null, 2)); // tmp + rename (Windows-retried)
68
107
  }
69
108
  function mutateEntries(fn) {
70
109
  try {
@@ -72,35 +111,59 @@ function mutateEntries(fn) {
72
111
  withFileLock(PROCESSES_LOCK, () => writeEntries(fn(readEntries())));
73
112
  }
74
113
  catch (e) {
75
- log('error', 'failed to update managed-process registry — a crash may leave this child unreaped', {
114
+ log('error', 'failed to update managed-process registry; a crash may leave this child unreaped', {
76
115
  file: PROCESSES_FILE,
77
116
  err: String(e),
78
117
  });
79
118
  }
80
119
  }
81
- /** Record a long-lived child we spawned so a future server instance can reap it if we crash. */
82
- export function registerManagedProcess(pid, kind, sessionId) {
120
+ /** Capture a live child's fingerprint (start time, command, group leadership) + our own start. */
121
+ export function captureFingerprint(pid, ops = REAL_OPS) {
122
+ const procStart = norm(ops.psStartTime(pid));
123
+ const command = norm(ops.psCommand(pid));
124
+ const serverStart = norm(ops.psStartTime(process.pid));
125
+ return {
126
+ ...(procStart ? { procStart } : {}),
127
+ ...(command ? { command } : {}),
128
+ groupLeader: ops.psPgid(pid) === pid,
129
+ ...(serverStart ? { serverStart } : {}),
130
+ };
131
+ }
132
+ /** Record a long-lived child we spawned so a future server instance can reap it if we crash.
133
+ * Must be called right after spawn() returned a pid (the child has exec'd by then), so the
134
+ * recorded fingerprint is the child's own. */
135
+ export function registerManagedProcess(pid, kind, sessionId, extra = {}) {
83
136
  if (!pid || pid <= 0)
84
137
  return;
138
+ const fp = captureFingerprint(pid, extra.ops);
85
139
  mutateEntries((entries) => [
86
140
  ...entries.filter((e) => e.pid !== pid),
87
- { pid, kind, serverPid: process.pid, sessionId, startedAt: Date.now() },
141
+ { pid, kind, serverPid: process.pid, sessionId, startedAt: Date.now(), ...(extra.endpoint ? { endpoint: extra.endpoint } : {}), ...fp },
88
142
  ]);
89
143
  }
144
+ /** A managed WDA this server adopted at startup (or started itself) for `sessionId`, per the
145
+ * registry. Lets `qa_wda stop` stop a WDA started by a previous server run. */
146
+ export function registeredWdaForSession(sessionId) {
147
+ return readEntries()
148
+ .filter((e) => e.kind === 'wda' && e.sessionId === sessionId && e.serverPid === process.pid)
149
+ .pop();
150
+ }
90
151
  /** Remove a child we stopped (or that finished) from the registry. */
91
152
  export function unregisterManagedProcess(pid) {
92
153
  if (!pid || pid <= 0)
93
154
  return;
94
155
  mutateEntries((entries) => entries.filter((e) => e.pid !== pid));
95
156
  }
96
- /** SIGTERM the child's process group (detached children lead their own group), else the pid. */
97
- function killTree(pid) {
98
- try {
99
- process.kill(-pid, 'SIGTERM');
100
- return true;
101
- }
102
- catch {
103
- /* not a group leader, or group already gone — fall back to the pid itself */
157
+ /** SIGTERM the child's process group when Swipium spawned it as a group leader, else the pid. */
158
+ function killTree(pid, group) {
159
+ if (group) {
160
+ try {
161
+ process.kill(-pid, 'SIGTERM');
162
+ return true;
163
+ }
164
+ catch {
165
+ /* group already gone; fall back to the pid itself */
166
+ }
104
167
  }
105
168
  try {
106
169
  process.kill(pid, 'SIGTERM');
@@ -110,43 +173,176 @@ function killTree(pid) {
110
173
  return false;
111
174
  }
112
175
  }
113
- /** True when `serverPid` is a live process that plausibly IS a Swipium/node server. The `ps`
114
- * check guards against an OS-recycled server pid making us "adopt" a real orphan forever. */
115
- function serverStillAlive(serverPid) {
176
+ const REAL_OPS = { pidAlive, psCommand, psStartTime, psPgid, killTree };
177
+ /** True when `serverPid` is a live process that IS the server that registered the entry: its
178
+ * start time must equal the recorded one (any node process could have recycled the pid). Legacy
179
+ * entries without a recorded server start fall back to the old node/swipium command check.
180
+ * That errs toward "alive" (never touch), which is the safe direction. */
181
+ function serverStillAlive(entry, ops = REAL_OPS) {
182
+ const { serverPid } = entry;
116
183
  if (serverPid === process.pid)
117
184
  return false; // our pid at startup = a recycled dead server's
118
- if (!pidAlive(serverPid))
185
+ if (!ops.pidAlive(serverPid))
119
186
  return false;
120
- const cmd = psCommand(serverPid);
187
+ if (entry.serverStart)
188
+ return norm(ops.psStartTime(serverPid)) === entry.serverStart;
189
+ const cmd = ops.psCommand(serverPid);
121
190
  return cmd != null && /node|swipium/i.test(cmd);
122
191
  }
123
192
  /** Is this child pid registered to a DIFFERENT, still-live server instance? (adopt, don't touch) */
124
193
  export function pidOwnedByLiveServer(pid) {
125
194
  const entry = readEntries().find((e) => e.pid === pid);
126
- return !!entry && serverStillAlive(entry.serverPid);
195
+ return !!entry && serverStillAlive(entry);
127
196
  }
128
- /** Verify (via `ps`) that `pid` still runs a command matching `kind`, then kill or adopt it.
129
- * Never signals a pid whose command no longer matches — that pid was recycled by the OS. */
130
- export function reclaimPid(pid, kind) {
131
- if (!pidAlive(pid))
197
+ /** Leading launcher tokens npx/npm put in front of the real program (and the retitle swaps).
198
+ * `env` covers the `#!/usr/bin/env node` shebang: on Linux a process registered right after spawn
199
+ * can still show as `/usr/bin/env node …/npx expo start` before env execs node. */
200
+ const LAUNCHER_TOKEN = /^(?:env|node|nodejs|npx|npm|npx-cli\.js|npm-cli\.js|exec|--)$/i;
201
+ /** A command line with its node/npx/npm launcher prefix stripped: `node /x/bin/npx expo start`
202
+ * and `npm exec expo start` both become `expo start`. Exported for tests. */
203
+ export function commandTail(cmd) {
204
+ const tokens = cmd.trim().split(/\s+/);
205
+ let i = 0;
206
+ while (i < tokens.length && LAUNCHER_TOKEN.test(tokens[i].split('/').pop() ?? ''))
207
+ i++;
208
+ return tokens.slice(i).join(' ');
209
+ }
210
+ /** The real program of each non-metro kind (matched against a token's basename). */
211
+ const KIND_PROGRAM_RE = {
212
+ wda: /^xcodebuild$/i,
213
+ recording: /^(?:simctl|adb)$/i,
214
+ emulator: /^(?:emulator|qemu-system-[\w.-]+)$/i,
215
+ };
216
+ /** Launchers that exec the real program under the same pid (`xcrun simctl …` > `…/simctl …`). */
217
+ const EXEC_LAUNCHER = /^(?:xcrun|env)$/i;
218
+ /** A command line reduced to `<program basename> <args…>`, anchored at the first token whose
219
+ * basename matches `program`. Xcode's `/usr/bin/xcodebuild` (and `xcrun`) shims re-exec the real
220
+ * tool under the SAME pid + start time, so `ps` later shows
221
+ * `/Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild -project …` for a child spawned
222
+ * as `xcodebuild -project …`. Everything before the program must be either a launcher
223
+ * (xcrun/env) or the space-split pieces of the program's own absolute path (`/Applications/Xcode
224
+ * 16.app/…/xcodebuild`), never flags or another program. Null when no such anchor exists.
225
+ * Exported for tests. */
226
+ export function programTail(cmd, program) {
227
+ const tokens = cmd.trim().split(/\s+/);
228
+ const i = tokens.findIndex((t) => program.test(t.split('/').pop() ?? ''));
229
+ if (i < 0)
230
+ return null;
231
+ const prefix = tokens.slice(0, i);
232
+ const launcherOnly = prefix.every((t) => EXEC_LAUNCHER.test(t.split('/').pop() ?? ''));
233
+ // One absolute path split at its spaces: starts with '/', no later piece starts a new path, no
234
+ // piece is a flag / assignment.
235
+ const pathPieces = prefix.length > 0 &&
236
+ prefix[0].startsWith('/') &&
237
+ tokens[i].includes('/') &&
238
+ !tokens[i].startsWith('/') &&
239
+ prefix.slice(1).every((t) => !t.includes('/')) &&
240
+ prefix.every((t) => !t.startsWith('-') && !t.includes('='));
241
+ if (!launcherOnly && !pathPieces)
242
+ return null;
243
+ return [tokens[i].split('/').pop(), ...tokens.slice(i + 1)].join(' ');
244
+ }
245
+ /** `-project` / `-destination` / `-derivedDataPath` values of a managed-WDA xcodebuild command. */
246
+ export function wdaCommandIdentity(cmd) {
247
+ const tokens = cmd.trim().split(/\s+/);
248
+ const valueOf = (flag) => {
249
+ const i = tokens.indexOf(flag);
250
+ return i >= 0 && i + 1 < tokens.length ? tokens[i + 1] : undefined;
251
+ };
252
+ return { project: valueOf('-project'), destination: valueOf('-destination'), derivedDataPath: valueOf('-derivedDataPath') };
253
+ }
254
+ /** Per-kind command identity (on top of the exact start-time match). */
255
+ function commandMatches(kind, recorded, live) {
256
+ if (!KIND_COMMAND_RE[kind].test(live))
257
+ return false;
258
+ if (live === recorded)
259
+ return true;
260
+ if (kind === 'metro') {
261
+ // Metro is launched via `npx`, which npm retitles shortly after spawn. Compare what runs.
262
+ const tail = commandTail(live);
263
+ return tail !== '' && tail === commandTail(recorded);
264
+ }
265
+ // Program path normalised to its basename (shim re-exec); the argument tail must be identical.
266
+ const program = KIND_PROGRAM_RE[kind];
267
+ if (!program)
268
+ return false;
269
+ const liveTail = programTail(live, program);
270
+ const recordedTail = programTail(recorded, program);
271
+ if (!liveTail || liveTail !== recordedTail)
272
+ return false;
273
+ if (kind === 'wda') {
274
+ // Defence in depth: the managed WDA's project + simulator destination must be present.
275
+ const id = wdaCommandIdentity(recordedTail);
276
+ return !!id.project && !!id.destination;
277
+ }
278
+ return true;
279
+ }
280
+ /** Does the live `pid` still carry the fingerprint recorded at spawn? Start time is the hard
281
+ * requirement (exact); the command is compared per kind (see commandMatches). */
282
+ function fingerprintMatches(entry, ops) {
283
+ if (!entry.procStart || !entry.command)
284
+ return false; // unverifiable > never signal/adopt
285
+ const start = norm(ops.psStartTime(entry.pid));
286
+ if (!start || start !== entry.procStart)
287
+ return false;
288
+ const cmd = norm(ops.psCommand(entry.pid));
289
+ return cmd != null && commandMatches(entry.kind, entry.command, cmd);
290
+ }
291
+ /** Verify that `pid` is still the child we registered (exact start time + per-kind command, per
292
+ * the registry entry, or `entry` when given), then kill or adopt it. A pid with no verifiable
293
+ * registry fingerprint, or whose fingerprint differs, is reported 'recycled' and never signalled.
294
+ * Only a child Swipium spawned as a group leader has its process group signalled. */
295
+ export function reclaimPid(pid, kind, ops = REAL_OPS, entry = readEntries().find((e) => e.pid === pid && e.kind === kind)) {
296
+ if (!ops.pidAlive(pid))
132
297
  return 'gone';
133
- const cmd = psCommand(pid);
134
- if (!cmd || !KIND_COMMAND_RE[kind].test(cmd))
298
+ if (!entry || entry.pid !== pid || !fingerprintMatches(entry, ops))
135
299
  return 'recycled';
136
300
  if (kind === 'emulator')
137
- return 'adopted'; // still a real emulator — leave it booted (usable via adb)
138
- return killTree(pid) ? 'killed' : 'gone';
301
+ return 'adopted'; // still a real emulator; leave it booted (usable via adb)
302
+ return ops.killTree(pid, entry.groupLeader === true) ? 'killed' : 'gone';
303
+ }
304
+ async function defaultWdaHealthy(endpoint) {
305
+ return (await checkWda(endpoint, WDA_ADOPT_PROBE_TIMEOUT_MS)).ready;
139
306
  }
140
- /** Startup sweep (called once from startServer): reap children whose owning server died. */
141
- export function reapOrphanedProcesses() {
307
+ /** Orphaned WDA entries eligible for adoption: owner dead, < 12 h old, endpoint recorded, pid
308
+ * still a live xcodebuild (ps-checked), and /status healthy. Probed concurrently, before the lock. */
309
+ async function adoptableWdaPids(entries, opts) {
310
+ const candidates = entries.filter((e) => e.kind === 'wda' &&
311
+ typeof e.endpoint === 'string' &&
312
+ opts.now - e.startedAt < WDA_ADOPT_MAX_AGE_MS &&
313
+ !serverStillAlive(e, opts.ops) &&
314
+ opts.ops.pidAlive(e.pid) &&
315
+ fingerprintMatches(e, opts.ops));
316
+ const healthy = await Promise.all(candidates.map((e) => opts.wdaHealthy(e.endpoint).catch(() => false)));
317
+ return new Set(candidates.filter((_, i) => healthy[i]).map((e) => e.pid));
318
+ }
319
+ /** Startup sweep (called once from startServer): reap children whose owning server died,
320
+ * except a young, healthy managed WDA, which is adopted (see the header comment). */
321
+ export async function reapOrphanedProcesses(options = {}) {
322
+ const opts = {
323
+ ops: options.ops ?? REAL_OPS,
324
+ now: options.now ?? Date.now(),
325
+ wdaHealthy: options.wdaHealthy ?? defaultWdaHealthy,
326
+ };
327
+ const adoptable = await adoptableWdaPids(readEntries(), opts);
142
328
  mutateEntries((entries) => {
143
329
  const keep = [];
144
330
  for (const e of entries) {
145
- if (serverStillAlive(e.serverPid)) {
146
- keep.push(e); // a live concurrent server owns it — not ours to touch
331
+ if (serverStillAlive(e, opts.ops)) {
332
+ keep.push(e); // a live concurrent server owns it, not ours to touch
333
+ continue;
334
+ }
335
+ if (e.kind === 'wda' && adoptable.has(e.pid)) {
336
+ // Re-own it (startedAt kept, so the 12 h cap counts from the WDA's real start).
337
+ keep.push({ ...e, serverPid: process.pid });
338
+ log('info', 'adopted managed WDA from a previous server run (healthy, < 12 h old)', {
339
+ pid: e.pid,
340
+ endpoint: e.endpoint,
341
+ sessionId: e.sessionId,
342
+ });
147
343
  continue;
148
344
  }
149
- const outcome = reclaimPid(e.pid, e.kind);
345
+ const outcome = reclaimPid(e.pid, e.kind, opts.ops, e);
150
346
  if (outcome === 'killed') {
151
347
  log('warn', 'reaped orphaned child process from a previous server run', { pid: e.pid, kind: e.kind, sessionId: e.sessionId });
152
348
  }
@@ -154,11 +350,84 @@ export function reapOrphanedProcesses() {
154
350
  log('info', 'adopted orphaned emulator (left booted; reachable via adb)', { pid: e.pid, sessionId: e.sessionId });
155
351
  }
156
352
  else if (outcome === 'recycled') {
157
- log('info', 'dropped orphan entry: PID was recycled by an unrelated process — not signalled', { pid: e.pid, kind: e.kind });
353
+ log('info', 'dropped orphan entry: PID recycled or fingerprint unverifiable, not signalled', { pid: e.pid, kind: e.kind });
158
354
  }
159
- // In every non-live-owner case the entry is dropped: it has been handled.
355
+ // In every other non-live-owner case the entry is dropped: it has been handled.
160
356
  }
161
357
  return keep;
162
358
  });
163
359
  }
360
+ function lsofListeners(port) {
361
+ if (process.platform === 'win32')
362
+ return [];
363
+ try {
364
+ const out = spawnSync('lsof', ['-nP', `-iTCP:${port}`, '-sTCP:LISTEN', '-Fp'], { encoding: 'utf8', env: psEnv() });
365
+ return (out.stdout ?? '')
366
+ .split('\n')
367
+ .filter((l) => l.startsWith('p'))
368
+ .map((l) => Number(l.slice(1)))
369
+ .filter((n) => Number.isInteger(n) && n > 0);
370
+ }
371
+ catch {
372
+ return [];
373
+ }
374
+ }
375
+ function psAll() {
376
+ if (process.platform === 'win32')
377
+ return [];
378
+ try {
379
+ const out = spawnSync('ps', ['-axo', 'pid=,command='], { encoding: 'utf8', env: psEnv(), maxBuffer: 16 * 1024 * 1024 });
380
+ if (out.status !== 0)
381
+ return [];
382
+ return (out.stdout ?? '')
383
+ .split('\n')
384
+ .map((l) => /^\s*(\d+)\s+(.*)$/.exec(l))
385
+ .filter((m) => !!m)
386
+ .map((m) => ({ pid: Number(m[1]), command: m[2] }));
387
+ }
388
+ catch {
389
+ return [];
390
+ }
391
+ }
392
+ const REAL_WDA_SCAN_OPS = { listeners: lsofListeners, listProcesses: psAll, psCommand };
393
+ /** Does `command` look exactly like the managed WDA runner Swipium starts for `sig`?
394
+ * xcodebuild by basename (shim-proof), `test-without-building`, and the recorded
395
+ * `-project` / `-destination id=<udid>` (/ `-derivedDataPath`) arguments. Exported for tests. */
396
+ export function isManagedWdaCommand(command, sig) {
397
+ const tail = programTail(norm(command) ?? '', /^xcodebuild$/i);
398
+ if (!tail)
399
+ return false;
400
+ const padded = ` ${tail} `;
401
+ return (padded.includes(` -project ${sig.projectPath} `) &&
402
+ padded.includes(` -destination id=${sig.udid} `) &&
403
+ padded.includes(' test-without-building ') &&
404
+ (!sig.derivedDataPath || padded.includes(` -derivedDataPath ${sig.derivedDataPath} `)));
405
+ }
406
+ /** Pids of live managed-WDA xcodebuild processes matching `sig`. Used by `qa_wda stop` when the
407
+ * registry entry for a WDA this session started was lost. The process LISTENing on the managed
408
+ * port is checked first; on a simulator that listener is usually the XCTest runner (not
409
+ * xcodebuild), so every process is then scanned for the exact managed-WDA signature. Only
410
+ * processes whose command matches (see isManagedWdaCommand) are ever returned. */
411
+ export function findManagedWdaProcesses(sig, ops = REAL_WDA_SCAN_OPS) {
412
+ const found = new Set();
413
+ if (sig.port) {
414
+ for (const pid of ops.listeners(sig.port)) {
415
+ const cmd = ops.psCommand(pid);
416
+ if (pid !== process.pid && cmd && isManagedWdaCommand(cmd, sig))
417
+ found.add(pid);
418
+ }
419
+ }
420
+ if (found.size === 0) {
421
+ for (const p of ops.listProcesses()) {
422
+ if (p.pid !== process.pid && isManagedWdaCommand(p.command, sig))
423
+ found.add(p.pid);
424
+ }
425
+ }
426
+ return [...found];
427
+ }
428
+ /** SIGTERM a managed WDA found by signature (its process group when it leads one; `qa_wda
429
+ * start` spawns it detached). Exported so qa_wda can share the real kill primitive. */
430
+ export function killManagedWda(pid, ops = REAL_OPS) {
431
+ return ops.killTree(pid, ops.psPgid(pid) === pid);
432
+ }
164
433
  //# sourceMappingURL=processRegistry.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"processRegistry.js","sourceRoot":"","sources":["../../src/session/processRegistry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"processRegistry.js","sourceRoot":"","sources":["../../src/session/processRegistry.ts"],"names":[],"mappings":"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"}
@@ -51,6 +51,6 @@ export function progressLine(p) {
51
51
  if (!p)
52
52
  return undefined;
53
53
  const sec = Math.round((p.updatedAt - p.startedAt) / 1000);
54
- return (`${p.phase} (${sec}s)${p.userActionRequired ? ' ⚠ needs you' : ''}: ${p.statusText}` + (p.nextExpected ? ` → ${p.nextExpected}` : ''));
54
+ return (`${p.phase} (${sec}s)${p.userActionRequired ? ' ⚠ needs you' : ''}: ${p.statusText}` + (p.nextExpected ? ` > ${p.nextExpected}` : ''));
55
55
  }
56
56
  //# sourceMappingURL=progress.js.map