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.
- package/CHANGELOG.md +313 -0
- package/README.md +175 -219
- package/THREAT_MODEL.md +223 -47
- package/dist/appMap/automationLink.js +39 -26
- package/dist/appMap/automationLink.js.map +1 -1
- package/dist/appMap/build.js +68 -20
- package/dist/appMap/build.js.map +1 -1
- package/dist/appMap/codeIndex.js +31 -5
- package/dist/appMap/codeIndex.js.map +1 -1
- package/dist/appMap/featureIndex.js +23 -5
- package/dist/appMap/featureIndex.js.map +1 -1
- package/dist/appMap/featureModel.js +44 -8
- package/dist/appMap/featureModel.js.map +1 -1
- package/dist/appMap/firstRunApply.js +24 -6
- package/dist/appMap/firstRunApply.js.map +1 -1
- package/dist/appMap/fsWalk.js +19 -2
- package/dist/appMap/fsWalk.js.map +1 -1
- package/dist/appMap/issues.js +10 -30
- package/dist/appMap/issues.js.map +1 -1
- package/dist/appMap/migrations.js +6 -6
- package/dist/appMap/migrations.js.map +1 -1
- package/dist/appMap/prelaunch.js +2 -2
- package/dist/appMap/prelaunch.js.map +1 -1
- package/dist/appMap/projectRegistry.js +83 -11
- package/dist/appMap/projectRegistry.js.map +1 -1
- package/dist/appMap/provenance.js +2 -2
- package/dist/appMap/provenance.js.map +1 -1
- package/dist/appMap/query.js +21 -5
- package/dist/appMap/query.js.map +1 -1
- package/dist/appMap/runtimeMerge.js +12 -5
- package/dist/appMap/runtimeMerge.js.map +1 -1
- package/dist/appMap/schema.js +1 -1
- package/dist/appMap/schema.js.map +1 -1
- package/dist/appMap/screenMatch.js +6 -2
- package/dist/appMap/screenMatch.js.map +1 -1
- package/dist/appMap/staticScan.js +151 -39
- package/dist/appMap/staticScan.js.map +1 -1
- package/dist/appMap/store.js +58 -85
- package/dist/appMap/store.js.map +1 -1
- package/dist/appMap/tsAstScan.js +34 -12
- package/dist/appMap/tsAstScan.js.map +1 -1
- package/dist/artifacts/bundletool.js +49 -12
- package/dist/artifacts/bundletool.js.map +1 -1
- package/dist/artifacts/resolve.js +41 -14
- package/dist/artifacts/resolve.js.map +1 -1
- package/dist/automation/capabilities.js +112 -30
- package/dist/automation/capabilities.js.map +1 -1
- package/dist/automation/gestures.js +6 -2
- package/dist/automation/gestures.js.map +1 -1
- package/dist/automation/plan.js +71 -23
- package/dist/automation/plan.js.map +1 -1
- package/dist/automation/report.js +15 -5
- package/dist/automation/report.js.map +1 -1
- package/dist/automation/selectors.js +22 -28
- package/dist/automation/selectors.js.map +1 -1
- package/dist/automation/types.js +1 -1
- package/dist/automation/types.js.map +1 -1
- package/dist/automation/waits.js +14 -8
- package/dist/automation/waits.js.map +1 -1
- package/dist/automation/webview.js +9 -3
- package/dist/automation/webview.js.map +1 -1
- package/dist/automationGen/appiumModel.js +16 -8
- package/dist/automationGen/appiumModel.js.map +1 -1
- package/dist/automationGen/ciEmitter.js +6 -6
- package/dist/automationGen/ciEmitter.js.map +1 -1
- package/dist/automationGen/identifiers.js +224 -0
- package/dist/automationGen/identifiers.js.map +1 -0
- package/dist/automationGen/jsEmitter.js +288 -121
- package/dist/automationGen/jsEmitter.js.map +1 -1
- package/dist/automationGen/packagePatch.js +2 -2
- package/dist/automationGen/packagePatch.js.map +1 -1
- package/dist/automationGen/platformResolve.js +36 -0
- package/dist/automationGen/platformResolve.js.map +1 -0
- package/dist/automationGen/projectProfile.js +76 -27
- package/dist/automationGen/projectProfile.js.map +1 -1
- package/dist/automationGen/pythonEmitter.js +278 -107
- package/dist/automationGen/pythonEmitter.js.map +1 -1
- package/dist/automationGen/readmeEmitter.js +7 -6
- package/dist/automationGen/readmeEmitter.js.map +1 -1
- package/dist/automationGen/run.js +388 -0
- package/dist/automationGen/run.js.map +1 -0
- package/dist/automationGen/suitePlan.js +17 -10
- package/dist/automationGen/suitePlan.js.map +1 -1
- package/dist/automationGen/validation.js +52 -12
- package/dist/automationGen/validation.js.map +1 -1
- package/dist/build/parseBuildLog.js +235 -31
- package/dist/build/parseBuildLog.js.map +1 -1
- package/dist/build/plan.js +39 -18
- package/dist/build/plan.js.map +1 -1
- package/dist/ci/preflight.js +13 -4
- package/dist/ci/preflight.js.map +1 -1
- package/dist/cli/gc.js +74 -0
- package/dist/cli/gc.js.map +1 -0
- package/dist/cli/init.js +217 -26
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/main.js +50 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/report.js +218 -0
- package/dist/cli/report.js.map +1 -0
- package/dist/cli/scan.js +36 -15
- package/dist/cli/scan.js.map +1 -1
- package/dist/cli/suite.js +7 -7
- package/dist/cli/suite.js.map +1 -1
- package/dist/cli/verify.js +7 -7
- package/dist/cli/verify.js.map +1 -1
- package/dist/consent/consent.js +162 -5
- package/dist/consent/consent.js.map +1 -1
- package/dist/context/detect.js +55 -18
- package/dist/context/detect.js.map +1 -1
- package/dist/context/findApps.js +22 -8
- package/dist/context/findApps.js.map +1 -1
- package/dist/context/projectRoot.js +174 -19
- package/dist/context/projectRoot.js.map +1 -1
- package/dist/context/scan.js +1 -1
- package/dist/context/scan.js.map +1 -1
- package/dist/core/capabilityGroups.js +90 -0
- package/dist/core/capabilityGroups.js.map +1 -0
- package/dist/core/target.js +10 -8
- package/dist/core/target.js.map +1 -1
- package/dist/core/targetPlan.js +160 -39
- package/dist/core/targetPlan.js.map +1 -1
- package/dist/drivers/DirectDriver.js +317 -43
- package/dist/drivers/DirectDriver.js.map +1 -1
- package/dist/drivers/SimctlDriver.js +124 -8
- package/dist/drivers/SimctlDriver.js.map +1 -1
- package/dist/drivers/WdaDriver.js +365 -55
- package/dist/drivers/WdaDriver.js.map +1 -1
- package/dist/explore/candidates.js +7 -3
- package/dist/explore/candidates.js.map +1 -1
- package/dist/explore/graph.js +15 -6
- package/dist/explore/graph.js.map +1 -1
- package/dist/explore/memory.js +4 -1
- package/dist/explore/memory.js.map +1 -1
- package/dist/explore/planner.js +54 -9
- package/dist/explore/planner.js.map +1 -1
- package/dist/explore/policy.js +11 -6
- package/dist/explore/policy.js.map +1 -1
- package/dist/explore/runner.js +363 -190
- package/dist/explore/runner.js.map +1 -1
- package/dist/explore/signatures.js +4 -2
- package/dist/explore/signatures.js.map +1 -1
- package/dist/explore/suite.js +3 -1
- package/dist/explore/suite.js.map +1 -1
- package/dist/featureTesting/executionBootstrap.js +137 -29
- package/dist/featureTesting/executionBootstrap.js.map +1 -1
- package/dist/featureTesting/featureMap.js +6 -3
- package/dist/featureTesting/featureMap.js.map +1 -1
- package/dist/featureTesting/featureScope.js +101 -20
- package/dist/featureTesting/featureScope.js.map +1 -1
- package/dist/featureTesting/mapFeatureScope.js +44 -15
- package/dist/featureTesting/mapFeatureScope.js.map +1 -1
- package/dist/featureTesting/objectiveModel.js +15 -11
- package/dist/featureTesting/objectiveModel.js.map +1 -1
- package/dist/featureTesting/resultMerge.js +16 -8
- package/dist/featureTesting/resultMerge.js.map +1 -1
- package/dist/featureTesting/sources.js +8 -5
- package/dist/featureTesting/sources.js.map +1 -1
- package/dist/featureTesting/suiteBridge.js +8 -2
- package/dist/featureTesting/suiteBridge.js.map +1 -1
- package/dist/featureTesting/synonyms.js +32 -4
- package/dist/featureTesting/synonyms.js.map +1 -1
- package/dist/featureTesting/testCaseFactory.js +27 -15
- package/dist/featureTesting/testCaseFactory.js.map +1 -1
- package/dist/featureTesting/testPlan.js +34 -12
- package/dist/featureTesting/testPlan.js.map +1 -1
- package/dist/firstRun/authStateMachine.js +1 -1
- package/dist/firstRun/authStateMachine.js.map +1 -1
- package/dist/firstRun/classifyScreen.js +9 -6
- package/dist/firstRun/classifyScreen.js.map +1 -1
- package/dist/firstRun/firstRunPlanner.js +16 -13
- package/dist/firstRun/firstRunPlanner.js.map +1 -1
- package/dist/firstRun/firstRunRunner.js +92 -31
- package/dist/firstRun/firstRunRunner.js.map +1 -1
- package/dist/firstRun/generatedDataPolicy.js +25 -15
- package/dist/firstRun/generatedDataPolicy.js.map +1 -1
- package/dist/firstRun/inputPlanner.js +45 -11
- package/dist/firstRun/inputPlanner.js.map +1 -1
- package/dist/firstRun/onboardingStateMachine.js +1 -1
- package/dist/firstRun/onboardingStateMachine.js.map +1 -1
- package/dist/firstRun/paywallPolicy.js +3 -3
- package/dist/firstRun/paywallPolicy.js.map +1 -1
- package/dist/firstRun/types.js +1 -1
- package/dist/firstRun/types.js.map +1 -1
- package/dist/fixtures/catalog.js +72 -9
- package/dist/fixtures/catalog.js.map +1 -1
- package/dist/fixtures/load.js +50 -0
- package/dist/fixtures/load.js.map +1 -0
- package/dist/flows/discover.js +2 -2
- package/dist/flows/discover.js.map +1 -1
- package/dist/flows/generate.js +68 -17
- package/dist/flows/generate.js.map +1 -1
- package/dist/flows/lint.js +88 -14
- package/dist/flows/lint.js.map +1 -1
- package/dist/flows/pack.js +21 -5
- package/dist/flows/pack.js.map +1 -1
- package/dist/flows/paths.js +57 -0
- package/dist/flows/paths.js.map +1 -0
- package/dist/flows/repair.js +176 -37
- package/dist/flows/repair.js.map +1 -1
- package/dist/flows/run.js +308 -99
- package/dist/flows/run.js.map +1 -1
- package/dist/flows/schema.js +107 -25
- package/dist/flows/schema.js.map +1 -1
- package/dist/flows/seedExec.js +8 -4
- package/dist/flows/seedExec.js.map +1 -1
- package/dist/flows/templates.js +5 -5
- package/dist/index.js +50 -8
- package/dist/index.js.map +1 -1
- package/dist/ios/signing.js +32 -3
- package/dist/ios/signing.js.map +1 -1
- package/dist/issues/classify.js +28 -20
- package/dist/issues/classify.js.map +1 -1
- package/dist/issues/fingerprint.js +35 -9
- package/dist/issues/fingerprint.js.map +1 -1
- package/dist/issues/index.js +93 -46
- package/dist/issues/index.js.map +1 -1
- package/dist/issues/metrics.js +6 -5
- package/dist/issues/metrics.js.map +1 -1
- package/dist/issues/recurrence.js +35 -8
- package/dist/issues/recurrence.js.map +1 -1
- package/dist/issues/report.js +12 -8
- package/dist/issues/report.js.map +1 -1
- package/dist/issues/reportBridge.js +40 -9
- package/dist/issues/reportBridge.js.map +1 -1
- package/dist/issues/schema.js +2 -2
- package/dist/issues/schema.js.map +1 -1
- package/dist/issues/sourceRevision.js +2 -2
- package/dist/issues/sourceRevision.js.map +1 -1
- package/dist/issues/store.js +110 -32
- package/dist/issues/store.js.map +1 -1
- package/dist/lib/abortScope.js +48 -0
- package/dist/lib/abortScope.js.map +1 -0
- package/dist/lib/android.js +84 -8
- package/dist/lib/android.js.map +1 -1
- package/dist/lib/coordSpace.js +1 -1
- package/dist/lib/coordSpace.js.map +1 -1
- package/dist/lib/device.js +53 -12
- package/dist/lib/device.js.map +1 -1
- package/dist/lib/gestures.js +141 -0
- package/dist/lib/gestures.js.map +1 -0
- package/dist/lib/gitignore.js +4 -3
- package/dist/lib/gitignore.js.map +1 -1
- package/dist/lib/image.js +12 -3
- package/dist/lib/image.js.map +1 -1
- package/dist/lib/lockfile.js +399 -0
- package/dist/lib/lockfile.js.map +1 -0
- package/dist/lib/needsInput.js +9 -6
- package/dist/lib/needsInput.js.map +1 -1
- package/dist/lib/png.js +4 -3
- package/dist/lib/png.js.map +1 -1
- package/dist/lib/redact.js +170 -9
- package/dist/lib/redact.js.map +1 -1
- package/dist/lib/result.js +94 -10
- package/dist/lib/result.js.map +1 -1
- package/dist/lib/schemaHash.js +7 -5
- package/dist/lib/schemaHash.js.map +1 -1
- package/dist/lib/sensitive.js +6 -3
- package/dist/lib/sensitive.js.map +1 -1
- package/dist/lib/simctl.js +3 -3
- package/dist/lib/simctl.js.map +1 -1
- package/dist/lib/spawn.js +78 -17
- package/dist/lib/spawn.js.map +1 -1
- package/dist/lib/toolAnnotations.js +114 -0
- package/dist/lib/toolAnnotations.js.map +1 -0
- package/dist/lib/wda.js +321 -25
- package/dist/lib/wda.js.map +1 -1
- package/dist/lib/wdaConfig.js +12 -5
- package/dist/lib/wdaConfig.js.map +1 -1
- package/dist/lib/wdaTune.js +52 -23
- package/dist/lib/wdaTune.js.map +1 -1
- package/dist/mobileAudit/checks.js +150 -28
- package/dist/mobileAudit/checks.js.map +1 -1
- package/dist/mobileAudit/evidence.js +4 -4
- package/dist/mobileAudit/evidence.js.map +1 -1
- package/dist/mobileAudit/profiles.js +121 -20
- package/dist/mobileAudit/profiles.js.map +1 -1
- package/dist/mobileAudit/results.js +9 -4
- package/dist/mobileAudit/results.js.map +1 -1
- package/dist/mobileAudit/runner.js +214 -35
- package/dist/mobileAudit/runner.js.map +1 -1
- package/dist/oracle/auth.js +1 -1
- package/dist/oracle/auth.js.map +1 -1
- package/dist/oracle/failures.js +1085 -145
- package/dist/oracle/failures.js.map +1 -1
- package/dist/oracle/health.js +148 -26
- package/dist/oracle/health.js.map +1 -1
- package/dist/oracle/locator.js +148 -19
- package/dist/oracle/locator.js.map +1 -1
- package/dist/oracle/record.js +3 -3
- package/dist/oracle/record.js.map +1 -1
- package/dist/orchestration/envelope.js +2 -2
- package/dist/orchestration/envelope.js.map +1 -1
- package/dist/orchestration/goal.js +7 -13
- package/dist/orchestration/goal.js.map +1 -1
- package/dist/orchestration/testThis/execute.js +167 -0
- package/dist/orchestration/testThis/execute.js.map +1 -0
- package/dist/orchestration/testThis/pipeline.js +413 -0
- package/dist/orchestration/testThis/pipeline.js.map +1 -0
- package/dist/orchestration/testThis/plan.js +519 -0
- package/dist/orchestration/testThis/plan.js.map +1 -0
- package/dist/orchestration/testThis/sessionIntent.js +72 -0
- package/dist/orchestration/testThis/sessionIntent.js.map +1 -0
- package/dist/orchestration/testThis/terminal.js +136 -0
- package/dist/orchestration/testThis/terminal.js.map +1 -0
- package/dist/orchestration/testThis/types.js +12 -0
- package/dist/orchestration/testThis/types.js.map +1 -0
- package/dist/plan/plan.js +9 -9
- package/dist/plan/plan.js.map +1 -1
- package/dist/prompts/index.js +24 -24
- package/dist/prompts/index.js.map +1 -1
- package/dist/report/coverage.js +0 -1
- package/dist/report/coverage.js.map +1 -1
- package/dist/report/evidence.js.map +1 -1
- package/dist/report/export.js +449 -72
- package/dist/report/export.js.map +1 -1
- package/dist/report/findingsDedupe.js +41 -0
- package/dist/report/findingsDedupe.js.map +1 -0
- package/dist/report/flake.js +13 -14
- package/dist/report/flake.js.map +1 -1
- package/dist/report/history.js +72 -38
- package/dist/report/history.js.map +1 -1
- package/dist/report/policy.js +18 -7
- package/dist/report/policy.js.map +1 -1
- package/dist/report/qaLevel.js +10 -16
- package/dist/report/qaLevel.js.map +1 -1
- package/dist/report/readiness.js +42 -12
- package/dist/report/readiness.js.map +1 -1
- package/dist/report/sarifSources.js +160 -0
- package/dist/report/sarifSources.js.map +1 -0
- package/dist/report/summary.js +2 -2
- package/dist/report/summary.js.map +1 -1
- package/dist/report/testCatalog.js +4 -4
- package/dist/report/testCatalog.js.map +1 -1
- package/dist/report/timing.js +23 -23
- package/dist/report/timing.js.map +1 -1
- package/dist/report/toolHealth.js +124 -0
- package/dist/report/toolHealth.js.map +1 -0
- package/dist/server.js +501 -69
- package/dist/server.js.map +1 -1
- package/dist/services/automationGenerate.js +8 -2
- package/dist/services/automationGenerate.js.map +1 -1
- package/dist/services/build.js +10 -4
- package/dist/services/build.js.map +1 -1
- package/dist/services/flowGenerate.js +75 -0
- package/dist/services/flowGenerate.js.map +1 -0
- package/dist/services/preflight.js +40 -8
- package/dist/services/preflight.js.map +1 -1
- package/dist/services/prepareAndroid.js +92 -18
- package/dist/services/prepareAndroid.js.map +1 -1
- package/dist/services/prepareIos.js +94 -17
- package/dist/services/prepareIos.js.map +1 -1
- package/dist/services/report.js +271 -80
- package/dist/services/report.js.map +1 -1
- package/dist/services/smoke.js +68 -22
- package/dist/services/smoke.js.map +1 -1
- package/dist/services/suiteGenerate.js +43 -6
- package/dist/services/suiteGenerate.js.map +1 -1
- package/dist/services/testSuiteKnowledge.js +78 -33
- package/dist/services/testSuiteKnowledge.js.map +1 -1
- package/dist/session/attach.js +284 -4
- package/dist/session/attach.js.map +1 -1
- package/dist/session/processRegistry.js +433 -0
- package/dist/session/processRegistry.js.map +1 -0
- package/dist/session/progress.js +1 -1
- package/dist/session/progress.js.map +1 -1
- package/dist/session/retention.js +201 -0
- package/dist/session/retention.js.map +1 -0
- package/dist/session/store.js +459 -59
- package/dist/session/store.js.map +1 -1
- package/dist/snapshot/overlays.js +60 -10
- package/dist/snapshot/overlays.js.map +1 -1
- package/dist/snapshot/parse.js +30 -12
- package/dist/snapshot/parse.js.map +1 -1
- package/dist/snapshot/present.js +36 -6
- package/dist/snapshot/present.js.map +1 -1
- package/dist/snapshot/settle.js +39 -9
- package/dist/snapshot/settle.js.map +1 -1
- package/dist/state/consent.js +99 -0
- package/dist/state/consent.js.map +1 -0
- package/dist/state/profile.js +82 -11
- package/dist/state/profile.js.map +1 -1
- package/dist/suite/compile.js +15 -6
- package/dist/suite/compile.js.map +1 -1
- package/dist/suite/lint.js +22 -4
- package/dist/suite/lint.js.map +1 -1
- package/dist/suite/pom.js +75 -44
- package/dist/suite/pom.js.map +1 -1
- package/dist/suite/secretGuard.js +266 -0
- package/dist/suite/secretGuard.js.map +1 -0
- package/dist/suite/testcase.js +15 -11
- package/dist/suite/testcase.js.map +1 -1
- package/dist/testSuite/exporter.js +7 -3
- package/dist/testSuite/exporter.js.map +1 -1
- package/dist/testSuite/generator.js +43 -14
- package/dist/testSuite/generator.js.map +1 -1
- package/dist/testSuite/history.js +1 -1
- package/dist/testSuite/history.js.map +1 -1
- package/dist/testSuite/issueLinks.js +3 -3
- package/dist/testSuite/issueLinks.js.map +1 -1
- package/dist/testSuite/lint.js +4 -4
- package/dist/testSuite/lint.js.map +1 -1
- package/dist/testSuite/merge.js +13 -7
- package/dist/testSuite/merge.js.map +1 -1
- package/dist/testSuite/schema.js +21 -16
- package/dist/testSuite/schema.js.map +1 -1
- package/dist/testSuite/store.js +12 -4
- package/dist/testSuite/store.js.map +1 -1
- package/dist/testSuite/traceability.js +2 -2
- package/dist/testSuite/traceability.js.map +1 -1
- package/dist/tools/act.js +868 -174
- package/dist/tools/act.js.map +1 -1
- package/dist/tools/agent.js +521 -112
- package/dist/tools/agent.js.map +1 -1
- package/dist/tools/appControl.js +82 -19
- package/dist/tools/appControl.js.map +1 -1
- package/dist/tools/appMap.js +393 -189
- package/dist/tools/appMap.js.map +1 -1
- package/dist/tools/build.js +92 -51
- package/dist/tools/build.js.map +1 -1
- package/dist/tools/bundletool.js +141 -40
- package/dist/tools/bundletool.js.map +1 -1
- package/dist/tools/clearOverlay.js +98 -18
- package/dist/tools/clearOverlay.js.map +1 -1
- package/dist/tools/device.js +108 -19
- package/dist/tools/device.js.map +1 -1
- package/dist/tools/doctor.js +98 -35
- package/dist/tools/doctor.js.map +1 -1
- package/dist/tools/explore.js +110 -42
- package/dist/tools/explore.js.map +1 -1
- package/dist/tools/featureTesting.js +152 -130
- package/dist/tools/featureTesting.js.map +1 -1
- package/dist/tools/firstRun.js +94 -66
- package/dist/tools/firstRun.js.map +1 -1
- package/dist/tools/flow.js +347 -132
- package/dist/tools/flow.js.map +1 -1
- package/dist/tools/flowRepair.js +42 -10
- package/dist/tools/flowRepair.js.map +1 -1
- package/dist/tools/generate.js +199 -0
- package/dist/tools/generate.js.map +1 -0
- package/dist/tools/getArtifact.js +37 -8
- package/dist/tools/getArtifact.js.map +1 -1
- package/dist/tools/health.js +17 -12
- package/dist/tools/health.js.map +1 -1
- package/dist/tools/ios.js +148 -194
- package/dist/tools/ios.js.map +1 -1
- package/dist/tools/issues.js +256 -171
- package/dist/tools/issues.js.map +1 -1
- package/dist/tools/jobs.js +55 -11
- package/dist/tools/jobs.js.map +1 -1
- package/dist/tools/metro.js +84 -38
- package/dist/tools/metro.js.map +1 -1
- package/dist/tools/mobileAudit.js +83 -26
- package/dist/tools/mobileAudit.js.map +1 -1
- package/dist/tools/network.js +36 -14
- package/dist/tools/network.js.map +1 -1
- package/dist/tools/note.js +31 -17
- package/dist/tools/note.js.map +1 -1
- package/dist/tools/prepareIosTarget.js +31 -14
- package/dist/tools/prepareIosTarget.js.map +1 -1
- package/dist/tools/prepareTarget.js +193 -47
- package/dist/tools/prepareTarget.js.map +1 -1
- package/dist/tools/report.js +16 -8
- package/dist/tools/report.js.map +1 -1
- package/dist/tools/resolveArtifact.js +12 -12
- package/dist/tools/resolveArtifact.js.map +1 -1
- package/dist/tools/resolveTarget.js +81 -18
- package/dist/tools/resolveTarget.js.map +1 -1
- package/dist/tools/screenRecord.js +85 -20
- package/dist/tools/screenRecord.js.map +1 -1
- package/dist/tools/screenshot.js +42 -18
- package/dist/tools/screenshot.js.map +1 -1
- package/dist/tools/smoke.js +29 -12
- package/dist/tools/smoke.js.map +1 -1
- package/dist/tools/snapshot.js +157 -107
- package/dist/tools/snapshot.js.map +1 -1
- package/dist/tools/startSession.js +117 -84
- package/dist/tools/startSession.js.map +1 -1
- package/dist/tools/suite.js +391 -310
- package/dist/tools/suite.js.map +1 -1
- package/dist/tools/testSuite.js +112 -36
- package/dist/tools/testSuite.js.map +1 -1
- package/dist/tools/testThis.js +35 -802
- package/dist/tools/testThis.js.map +1 -1
- package/dist/tools/visual.js +698 -116
- package/dist/tools/visual.js.map +1 -1
- package/dist/tools/wait.js +9 -23
- package/dist/tools/wait.js.map +1 -1
- package/dist/tools/wda.js +312 -54
- package/dist/tools/wda.js.map +1 -1
- package/dist/version.js +37 -64
- package/dist/version.js.map +1 -1
- package/dist/visual/ocr.js +65 -8
- package/dist/visual/ocr.js.map +1 -1
- package/dist/visual/provider.js +87 -15
- package/dist/visual/provider.js.map +1 -1
- package/docs/README.md +24 -10
- package/docs/ci-reports.md +328 -0
- package/docs/concepts.md +227 -0
- package/docs/flows.md +153 -0
- package/docs/mcp-server.md +210 -104
- package/docs/physical-devices.md +84 -0
- package/docs/tools.md +808 -217
- package/package.json +16 -6
- package/dist/appMap/diff.js +0 -60
- package/dist/appMap/diff.js.map +0 -1
- package/dist/automation/maestroIr.js +0 -282
- package/dist/automation/maestroIr.js.map +0 -1
- package/dist/interop/maestro.js +0 -151
- package/dist/interop/maestro.js.map +0 -1
- package/dist/tools/assertVisual.js +0 -74
- package/dist/tools/assertVisual.js.map +0 -1
- package/dist/tools/automationGenerate.js +0 -394
- package/dist/tools/automationGenerate.js.map +0 -1
- package/dist/tools/capabilities.js +0 -209
- package/dist/tools/capabilities.js.map +0 -1
- package/dist/tools/detectContext.js +0 -41
- package/dist/tools/detectContext.js.map +0 -1
- package/dist/tools/flowGenerate.js +0 -55
- package/dist/tools/flowGenerate.js.map +0 -1
- package/dist/tools/history.js +0 -56
- package/dist/tools/history.js.map +0 -1
- package/dist/tools/idling.js +0 -104
- package/dist/tools/idling.js.map +0 -1
- package/dist/tools/inputCapabilities.js +0 -30
- package/dist/tools/inputCapabilities.js.map +0 -1
- package/dist/tools/locator.js +0 -57
- package/dist/tools/locator.js.map +0 -1
- package/dist/tools/maestro.js +0 -78
- package/dist/tools/maestro.js.map +0 -1
- package/dist/tools/permissions.js +0 -149
- package/dist/tools/permissions.js.map +0 -1
- package/dist/tools/plan.js +0 -49
- package/dist/tools/plan.js.map +0 -1
- package/dist/tools/screenInfo.js +0 -70
- package/dist/tools/screenInfo.js.map +0 -1
- package/dist/tools/seed.js +0 -101
- package/dist/tools/seed.js.map +0 -1
- package/dist/tools/state.js +0 -170
- package/dist/tools/state.js.map +0 -1
- package/dist/tools/visualText.js +0 -61
- package/dist/tools/visualText.js.map +0 -1
|
@@ -1,56 +1,78 @@
|
|
|
1
|
-
// Vision Gap Fix 9
|
|
1
|
+
// Vision Gap Fix 9: the single "suite knowledge merge" service. The vision requires the persistent
|
|
2
2
|
// suite (.swipium/test-suite.json) to stay current after EVERY flow that observes or creates QA
|
|
3
|
-
// knowledge
|
|
3
|
+
// knowledge (exploration, automation generation, and report) without depending on
|
|
4
4
|
// a later qa_report or a manual suite generation. Each flow funnels its cases through here so stable
|
|
5
5
|
// ids, dedup, provenance, and the run ledger are enforced in ONE place (store.applyMerge), and a merge
|
|
6
6
|
// failure is returned as a WARNING (best-effort) rather than failing an otherwise-valid QA run.
|
|
7
7
|
import { applyMerge, suiteDelta, suiteResourceUri, suiteJsonPath, loadSuite } from '../testSuite/store.js';
|
|
8
|
-
import { loadAppMap, saveAppMap } from '../appMap/store.js';
|
|
8
|
+
import { loadAppMap, saveAppMap, withAppMapLock } from '../appMap/store.js';
|
|
9
9
|
import { detectFramework } from '../context/detect.js';
|
|
10
10
|
import { casesFromExploration, caseFromPom } from '../testSuite/generator.js';
|
|
11
11
|
import { pomForSession } from './suiteGenerate.js';
|
|
12
12
|
import { join } from 'node:path';
|
|
13
13
|
import { log } from '../lib/logger.js';
|
|
14
|
+
import { redactDeep } from '../lib/redact.js';
|
|
15
|
+
import { generatedOutputRedactor, structuralLiterals } from '../suite/secretGuard.js';
|
|
14
16
|
const EMPTY = { ok: true, created: [], updated: [], deprecated: [], written: [], caseIds: [] };
|
|
15
17
|
function fallbackProject(root) {
|
|
16
18
|
const fw = detectFramework(root);
|
|
17
|
-
return {
|
|
19
|
+
return {
|
|
20
|
+
root,
|
|
21
|
+
gitRemote: null,
|
|
22
|
+
packageName: null,
|
|
23
|
+
workspaceTarget: null,
|
|
24
|
+
framework: fw,
|
|
25
|
+
platforms: fw === 'native-android' ? ['android'] : fw === 'native-ios' ? ['ios'] : ['android', 'ios'],
|
|
26
|
+
};
|
|
18
27
|
}
|
|
19
28
|
/**
|
|
20
29
|
* Mirror a COMPACT index of the persistent suite into the app map's testSuite section so the durable
|
|
21
|
-
* map (and qa_app_map_query / feature scoping) reflect the growing suite
|
|
30
|
+
* map (and qa_app_map_query / feature scoping) reflect the growing suite: the "map + suite as one
|
|
22
31
|
* growing QA business context" loop the vision requires. Best-effort: no map yet ⇒ no-op.
|
|
23
32
|
*/
|
|
24
33
|
function mirrorSuiteIndexToMap(root, now) {
|
|
25
34
|
try {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
35
|
+
// Synchronous load > mutate > save cycle, held under the cross-process app-map lock (see store.ts).
|
|
36
|
+
withAppMapLock(root, () => {
|
|
37
|
+
const loaded = loadAppMap(root, fallbackProject(root), now);
|
|
38
|
+
if (!loaded.map)
|
|
39
|
+
return; // no durable map yet, feature scope still reads the suite directly
|
|
40
|
+
const suite = loadSuite(root);
|
|
41
|
+
const refs = suite.cases.map((c) => ({
|
|
42
|
+
id: c.id,
|
|
43
|
+
title: c.title,
|
|
44
|
+
featureId: c.featureId,
|
|
45
|
+
status: c.actualResult.status,
|
|
46
|
+
source: 'test-suite',
|
|
47
|
+
lastRun: c.actualResult.lastRunAt,
|
|
48
|
+
stale: c.status === 'deprecated',
|
|
49
|
+
}));
|
|
50
|
+
loaded.map.testSuite = { cases: refs };
|
|
51
|
+
loaded.map.coverage.staleTests = refs.filter((r) => r.stale).length;
|
|
52
|
+
loaded.map.updatedAt = now;
|
|
53
|
+
saveAppMap(root, loaded.map);
|
|
54
|
+
});
|
|
43
55
|
}
|
|
44
56
|
catch {
|
|
45
57
|
/* best-effort: a mirror failure never fails the suite merge */
|
|
46
58
|
}
|
|
47
59
|
}
|
|
48
|
-
/** Core: merge already-canonical cases into the suite. Best-effort
|
|
60
|
+
/** Core: merge already-canonical cases into the suite. Best-effort, never throws. */
|
|
49
61
|
export function mergeCanonical(root, cases, ctx) {
|
|
50
62
|
if (!cases.length)
|
|
51
63
|
return EMPTY;
|
|
64
|
+
// Defense in depth: no registered secret value may reach the persistent suite files.
|
|
65
|
+
if (ctx.secrets)
|
|
66
|
+
cases = redactDeep(cases, generatedOutputRedactor(ctx.secrets, ctx.structural));
|
|
52
67
|
try {
|
|
53
|
-
const applied = applyMerge(root, cases, {
|
|
68
|
+
const applied = applyMerge(root, cases, {
|
|
69
|
+
source: ctx.source,
|
|
70
|
+
mode: ctx.mode ?? 'update',
|
|
71
|
+
now: ctx.now,
|
|
72
|
+
runId: ctx.runId,
|
|
73
|
+
sourceUri: ctx.sourceUri,
|
|
74
|
+
liveFeatureIds: ctx.liveFeatureIds,
|
|
75
|
+
}, ctx.appId);
|
|
54
76
|
const delta = suiteDelta(applied.result.suite, applied.result);
|
|
55
77
|
const caseIds = [...applied.result.created, ...applied.result.updated];
|
|
56
78
|
// Keep the durable app map's suite index in sync with the persistent suite (Fix #3).
|
|
@@ -80,7 +102,7 @@ export function mergeFromExploration(root, exploration, ctx) {
|
|
|
80
102
|
cases = casesFromExploration({ exploration, source: 'exploration', now: ctx.now, appId: ctx.appId });
|
|
81
103
|
}
|
|
82
104
|
catch (e) {
|
|
83
|
-
return { ...EMPTY, ok: false, warning: `exploration
|
|
105
|
+
return { ...EMPTY, ok: false, warning: `exploration > canonical conversion failed: ${String(e)}` };
|
|
84
106
|
}
|
|
85
107
|
return mergeCanonical(root, cases, { ...ctx, source: 'exploration' });
|
|
86
108
|
}
|
|
@@ -94,10 +116,10 @@ function readinessGrade(brittlePct) {
|
|
|
94
116
|
return 'D';
|
|
95
117
|
}
|
|
96
118
|
/**
|
|
97
|
-
* Fix 7
|
|
119
|
+
* Fix 7: merge automation metadata into the persistent suite. Converts the generated POM smoke flow
|
|
98
120
|
* into a canonical case carrying the real page-object/test-file paths, framework, locator readiness and
|
|
99
121
|
* automation status, AND (Fix #4) upgrades the automation link of EXISTING suite cases whose app-map
|
|
100
|
-
* feature/screen links overlap the generated suite
|
|
122
|
+
* feature/screen links overlap the generated suite, so a prior feature case is marked automated
|
|
101
123
|
* instead of a parallel POM-only case silently superseding it.
|
|
102
124
|
*/
|
|
103
125
|
export function mergeFromAutomation(root, session, input, ctx) {
|
|
@@ -108,10 +130,26 @@ export function mergeFromAutomation(root, session, input, ctx) {
|
|
|
108
130
|
const pageObjects = assembled.files.filter((f) => /page|screen|pages\//i.test(f.path)).map((f) => join(assembled.outputDir, f.path));
|
|
109
131
|
const testFiles = assembled.files.filter((f) => /test|spec|smoke|\.e2e\./i.test(f.path)).map((f) => join(assembled.outputDir, f.path));
|
|
110
132
|
const status = !input.validationOk ? 'partial' : assembled.model.audit.brittle > 0 ? 'partial' : 'automated';
|
|
111
|
-
const automation = {
|
|
133
|
+
const automation = {
|
|
134
|
+
status,
|
|
135
|
+
framework,
|
|
136
|
+
pageObjects,
|
|
137
|
+
testFiles,
|
|
138
|
+
locatorReadiness: readinessGrade(assembled.model.audit.brittlePct),
|
|
139
|
+
replayStatus: 'not_replayed',
|
|
140
|
+
};
|
|
112
141
|
const { pom } = pomForSession(session);
|
|
113
|
-
const platforms = [
|
|
114
|
-
|
|
142
|
+
const platforms = [
|
|
143
|
+
assembled.profile.platforms.android.level !== 'none' ? 'android' : null,
|
|
144
|
+
assembled.profile.platforms.ios.level !== 'none' ? 'ios' : null,
|
|
145
|
+
].filter(Boolean);
|
|
146
|
+
const base = caseFromPom({
|
|
147
|
+
pom,
|
|
148
|
+
appId: session.appId,
|
|
149
|
+
source: 'generate',
|
|
150
|
+
now: ctx.now,
|
|
151
|
+
platforms: platforms.length ? platforms : ['android'],
|
|
152
|
+
});
|
|
115
153
|
if (!base)
|
|
116
154
|
return EMPTY;
|
|
117
155
|
// Group the POM case under the linked map feature so it doesn't fork from existing feature cases.
|
|
@@ -135,7 +173,9 @@ export function mergeFromAutomation(root, session, input, ctx) {
|
|
|
135
173
|
for (const c of suite.cases) {
|
|
136
174
|
if (c.status === 'deprecated' || c.id === base.id)
|
|
137
175
|
continue;
|
|
138
|
-
const overlaps = feat.has(c.featureId) ||
|
|
176
|
+
const overlaps = feat.has(c.featureId) ||
|
|
177
|
+
c.mapLinks.some((l) => (l.kind === 'feature' && feat.has(l.id)) ||
|
|
178
|
+
((l.kind === 'screen' || l.kind === 'static_screen' || l.kind === 'runtime_screen') && scr.has(l.id)));
|
|
139
179
|
if (!overlaps)
|
|
140
180
|
continue;
|
|
141
181
|
cases.push({ ...c, automation, provenance: [] });
|
|
@@ -143,8 +183,13 @@ export function mergeFromAutomation(root, session, input, ctx) {
|
|
|
143
183
|
}
|
|
144
184
|
}
|
|
145
185
|
catch (e) {
|
|
146
|
-
return { ...EMPTY, ok: false, warning: `automation
|
|
186
|
+
return { ...EMPTY, ok: false, warning: `automation > canonical conversion failed: ${String(e)}` };
|
|
147
187
|
}
|
|
148
|
-
return mergeCanonical(root, cases, {
|
|
188
|
+
return mergeCanonical(root, cases, {
|
|
189
|
+
...ctx,
|
|
190
|
+
source: 'generate',
|
|
191
|
+
secrets: ctx.secrets ?? session.secrets,
|
|
192
|
+
structural: ctx.structural ?? structuralLiterals(session.recordedActions),
|
|
193
|
+
});
|
|
149
194
|
}
|
|
150
195
|
//# sourceMappingURL=testSuiteKnowledge.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testSuiteKnowledge.js","sourceRoot":"","sources":["../../src/services/testSuiteKnowledge.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"testSuiteKnowledge.js","sourceRoot":"","sources":["../../src/services/testSuiteKnowledge.ts"],"names":[],"mappings":"AAAA,mGAAmG;AACnG,gGAAgG;AAChG,kFAAkF;AAClF,qGAAqG;AACrG,uGAAuG;AACvG,gGAAgG;AAEhG,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,gBAAgB,EAAE,aAAa,EAAE,SAAS,EAAmB,MAAM,uBAAuB,CAAC;AAC5H,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAIvD,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC9E,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAInD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAgBtF,MAAM,KAAK,GAAqB,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;AAEjH,SAAS,eAAe,CAAC,IAAY;IACnC,MAAM,EAAE,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACjC,OAAO;QACL,IAAI;QACJ,SAAS,EAAE,IAAI;QACf,WAAW,EAAE,IAAI;QACjB,eAAe,EAAE,IAAI;QACrB,SAAS,EAAE,EAAE;QACb,SAAS,EAAE,EAAE,KAAK,gBAAgB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC;KACtG,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAS,qBAAqB,CAAC,IAAY,EAAE,GAAW;IACtD,IAAI,CAAC;QACH,oGAAoG;QACpG,cAAc,CAAC,IAAI,EAAE,GAAG,EAAE;YACxB,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,EAAE,eAAe,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;YAC5D,IAAI,CAAC,MAAM,CAAC,GAAG;gBAAE,OAAO,CAAC,mEAAmE;YAC5F,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;YAC9B,MAAM,IAAI,GAAkB,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAClD,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,SAAS,EAAE,CAAC,CAAC,SAAS;gBACtB,MAAM,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM;gBAC7B,MAAM,EAAE,YAAY;gBACpB,OAAO,EAAE,CAAC,CAAC,YAAY,CAAC,SAAS;gBACjC,KAAK,EAAE,CAAC,CAAC,MAAM,KAAK,YAAY;aACjC,CAAC,CAAC,CAAC;YACJ,MAAM,CAAC,GAAG,CAAC,SAAS,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;YACvC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;YACpE,MAAM,CAAC,GAAG,CAAC,SAAS,GAAG,GAAG,CAAC;YAC3B,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,+DAA+D;IACjE,CAAC;AACH,CAAC;AAoBD,qFAAqF;AACrF,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,KAA0B,EAAE,GAAiB;IACxF,IAAI,CAAC,KAAK,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAChC,qFAAqF;IACrF,IAAI,GAAG,CAAC,OAAO;QAAE,KAAK,GAAG,UAAU,CAAC,KAAK,EAAE,uBAAuB,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;IACjG,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,UAAU,CACxB,IAAI,EACJ,KAAK,EACL;YACE,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,QAAQ;YAC1B,GAAG,EAAE,GAAG,CAAC,GAAG;YACZ,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,cAAc,EAAE,GAAG,CAAC,cAAc;SACnC,EACD,GAAG,CAAC,KAAK,CACV,CAAC;QACF,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAC/D,MAAM,OAAO,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACvE,qFAAqF;QACrF,qBAAqB,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;QACrC,OAAO;YACL,EAAE,EAAE,IAAI;YACR,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO;YAC/B,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO;YAC/B,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU;YACrC,KAAK;YACL,QAAQ,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,UAAU,aAAa,CAAC,IAAI,CAAC,EAAE;YAC3F,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,OAAO;SACR,CAAC;IACJ,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,GAAG,CAAC,MAAM,EAAE,8BAA8B,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACpF,OAAO,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,uBAAuB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IAC9E,CAAC;AACH,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,oBAAoB,CAAC,IAAY,EAAE,WAA0C,EAAE,GAAiB;IAC9G,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,eAAe;QAAE,OAAO,KAAK,CAAC;IACzD,IAAI,KAA0B,CAAC;IAC/B,IAAI,CAAC;QACH,KAAK,GAAG,oBAAoB,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;IACvG,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,8CAA8C,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IACrG,CAAC;IACD,OAAO,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,GAAG,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;AACxE,CAAC;AAED,SAAS,cAAc,CAAC,UAAkB;IACxC,IAAI,UAAU,IAAI,CAAC;QAAE,OAAO,GAAG,CAAC;IAChC,IAAI,UAAU,GAAG,EAAE;QAAE,OAAO,GAAG,CAAC;IAChC,IAAI,UAAU,GAAG,EAAE;QAAE,OAAO,GAAG,CAAC;IAChC,OAAO,GAAG,CAAC;AACb,CAAC;AAWD;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAY,EAAE,OAAgB,EAAE,KAA2B,EAAE,GAAiB;IAChH,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;IACnC,IAAI,KAA0B,CAAC;IAC/B,IAAI,CAAC;QACH,MAAM,SAAS,GAAwB,SAAS,CAAC,OAAO,CAAC,kBAAkB,KAAK,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,WAAW,CAAC;QACzH,MAAM,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACrI,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,0BAA0B,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACvI,MAAM,MAAM,GAAqB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC;QAC/H,MAAM,UAAU,GAAG;YACjB,MAAM;YACN,SAAS;YACT,WAAW;YACX,SAAS;YACT,gBAAgB,EAAE,cAAc,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC;YAClE,YAAY,EAAE,cAAuB;SACtC,CAAC;QAEF,MAAM,EAAE,GAAG,EAAE,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;QACvC,MAAM,SAAS,GAAG;YAChB,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI;YACvE,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;SAChE,CAAC,MAAM,CAAC,OAAO,CAA6B,CAAC;QAC9C,MAAM,IAAI,GAAG,WAAW,CAAC;YACvB,GAAG;YACH,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,UAAU;YAClB,GAAG,EAAE,GAAG,CAAC,GAAG;YACZ,SAAS,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;SACtD,CAAC,CAAC;QACH,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QACxB,kGAAkG;QAClG,IAAI,KAAK,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC;YAC7B,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YACrC,IAAI,CAAC,QAAQ,GAAG;gBACd,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,SAAkB,EAAE,EAAE,EAAE,CAAC,CAAC;gBACnE,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,QAAiB,EAAE,EAAE,EAAE,CAAC,CAAC;gBACjE,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC;aACrD,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC;QAEf,gGAAgG;QAChG,mGAAmG;QACnG,gFAAgF;QAChF,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YACjE,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YACvC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YACrC,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;YACzC,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;gBAC5B,IAAI,CAAC,CAAC,MAAM,KAAK,YAAY,IAAI,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE;oBAAE,SAAS;gBAC5D,MAAM,QAAQ,GACZ,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;oBACrB,CAAC,CAAC,QAAQ,CAAC,IAAI,CACb,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;wBACxC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,KAAK,eAAe,IAAI,CAAC,CAAC,IAAI,KAAK,gBAAgB,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CACxG,CAAC;gBACJ,IAAI,CAAC,QAAQ;oBAAE,SAAS;gBACxB,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;YACnD,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,6CAA6C,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IACpG,CAAC;IACD,OAAO,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE;QACjC,GAAG,GAAG;QACN,MAAM,EAAE,UAAU;QAClB,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO;QACvC,UAAU,EAAE,GAAG,CAAC,UAAU,IAAI,kBAAkB,CAAC,OAAO,CAAC,eAAe,CAAC;KAC1E,CAAC,CAAC;AACL,CAAC"}
|
package/dist/session/attach.js
CHANGED
|
@@ -2,9 +2,115 @@
|
|
|
2
2
|
// "which device" so qa_doctor / qa_prepare_target / UI tools
|
|
3
3
|
// all agree: a session-bound device, the single online device, or "needs selection".
|
|
4
4
|
import { adbDevices } from '../lib/android.js';
|
|
5
|
+
import { run } from '../lib/spawn.js';
|
|
5
6
|
import { DirectDriver } from '../drivers/DirectDriver.js';
|
|
7
|
+
import { SimctlDriver } from '../drivers/SimctlDriver.js';
|
|
8
|
+
import { WdaDriver } from '../drivers/WdaDriver.js';
|
|
9
|
+
import { listSimulators } from '../lib/simctl.js';
|
|
10
|
+
import { checkWda } from '../lib/wda.js';
|
|
11
|
+
import { loadWdaConfig } from '../lib/wdaConfig.js';
|
|
12
|
+
import { isEmulatorSerial } from '../core/targetPlan.js';
|
|
13
|
+
import { qaError } from '../lib/result.js';
|
|
14
|
+
/** PURE: parse `adb shell getprop` output (`[key]: [value]` lines). */
|
|
15
|
+
export function parseGetprop(stdout) {
|
|
16
|
+
const out = {};
|
|
17
|
+
for (const m of stdout.matchAll(/^\[([^\]]+)\]:\s*\[([^\]]*)\]/gm))
|
|
18
|
+
out[m[1]] = m[2];
|
|
19
|
+
return out;
|
|
20
|
+
}
|
|
21
|
+
/** PURE: emulator/boot verdict from a serial + its properties. Emulator = the adb serial
|
|
22
|
+
* pattern OR the qemu flags (`localhost:5555`, `127.0.0.1:NNNN` emulators) OR Genymotion. */
|
|
23
|
+
export function classifyAndroidProps(serial, props) {
|
|
24
|
+
const emulator = isEmulatorSerial(serial) ||
|
|
25
|
+
props['ro.kernel.qemu'] === '1' ||
|
|
26
|
+
props['ro.boot.qemu'] === '1' ||
|
|
27
|
+
/^(goldfish|ranchu)$/.test(props['ro.hardware'] ?? '') ||
|
|
28
|
+
!!props['ro.genymotion.version'] ||
|
|
29
|
+
/^genymotion$/i.test(props['ro.product.manufacturer'] ?? '');
|
|
30
|
+
return { emulator, booted: props['sys.boot_completed'] === '1' };
|
|
31
|
+
}
|
|
32
|
+
/** One `getprop` call > emulator + boot state. */
|
|
33
|
+
export async function probeAndroidDevice(serial) {
|
|
34
|
+
try {
|
|
35
|
+
const r = await run('adb', ['-s', serial, 'shell', 'getprop'], { timeoutMs: 8000 });
|
|
36
|
+
const props = parseGetprop(r.stdout);
|
|
37
|
+
if (r.code !== 0 || Object.keys(props).length === 0) {
|
|
38
|
+
return { serial, propsRead: false, emulator: isEmulatorSerial(serial), booted: false };
|
|
39
|
+
}
|
|
40
|
+
return { serial, propsRead: true, ...classifyAndroidProps(serial, props) };
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return { serial, propsRead: false, emulator: isEmulatorSerial(serial), booted: false };
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/** Split online serials by policy. Callers of planTarget pass `emulators` as
|
|
47
|
+
* TargetInputs.android.emulators so non-`emulator-N` emulators are not refused as physical. */
|
|
48
|
+
export async function classifyAndroidSerials(serials) {
|
|
49
|
+
const probes = await Promise.all(serials.map(probeAndroidDevice));
|
|
50
|
+
return {
|
|
51
|
+
emulators: probes.filter((p) => p.emulator).map((p) => p.serial),
|
|
52
|
+
physical: probes.filter((p) => p.propsRead && !p.emulator).map((p) => p.serial),
|
|
53
|
+
booting: probes.filter((p) => p.propsRead && p.emulator && !p.booted).map((p) => p.serial),
|
|
54
|
+
unknown: probes.filter((p) => !p.propsRead).map((p) => p.serial),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
/** Emulator serials among `online`: `emulator-N` directly, any other serial via one getprop
|
|
58
|
+
* probe (ro.kernel.qemu / ro.boot.qemu / Genymotion). Feed to TargetInputs.android.emulators. */
|
|
59
|
+
export async function verifiedEmulatorSerials(online) {
|
|
60
|
+
const verdicts = await Promise.all(online.map(async (s) => isEmulatorSerial(s) || (await probeAndroidDevice(s)).emulator));
|
|
61
|
+
return online.filter((_, i) => verdicts[i]);
|
|
62
|
+
}
|
|
63
|
+
/** Shared "why is there no driver" answer for tools: the typed refusal when getDriver saw an
|
|
64
|
+
* online device it may not bind (physical / still booting), else undefined so the caller's
|
|
65
|
+
* generic "No device attached" stands. Usage: `return blockedDeviceResult(blocked) ?? qaError(…)`. */
|
|
66
|
+
export function blockedDeviceResult(blocked) {
|
|
67
|
+
if (!blocked)
|
|
68
|
+
return undefined;
|
|
69
|
+
const notReady = blocked.failureCode === 'DEVICE_NOT_READY';
|
|
70
|
+
return qaError({
|
|
71
|
+
what: blocked.detail,
|
|
72
|
+
changedState: false,
|
|
73
|
+
retrySafe: notReady,
|
|
74
|
+
failureCode: blocked.failureCode,
|
|
75
|
+
nextSteps: blocked.nextSteps?.length
|
|
76
|
+
? blocked.nextSteps
|
|
77
|
+
: notReady
|
|
78
|
+
? ['Wait for the emulator to finish booting, then retry.']
|
|
79
|
+
: ['Start an Android emulator (qa_prepare_target boots one), then retry.'],
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
/** PURE: the typed refusal for a probed device, or null when it may be bound. Same policy
|
|
83
|
+
* as core/targetPlan (PHYSICAL_DEVICE_UNSUPPORTED) plus a boot-completed gate. */
|
|
84
|
+
export function attachBlocker(p) {
|
|
85
|
+
if (!p.propsRead) {
|
|
86
|
+
return {
|
|
87
|
+
failureCode: 'DEVICE_NOT_READY',
|
|
88
|
+
detail: `Could not read device properties from ${p.serial} (offline, unauthorized, or still starting). Wait for it to come online, then retry.`,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
if (!p.emulator) {
|
|
92
|
+
return {
|
|
93
|
+
failureCode: 'PHYSICAL_DEVICE_UNSUPPORTED',
|
|
94
|
+
detail: `Physical device ${p.serial} is online but refused: Swipium is simulator/emulator-only by policy (docs/physical-devices.md). Use an emulator.`,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
if (!p.booted) {
|
|
98
|
+
return {
|
|
99
|
+
failureCode: 'DEVICE_NOT_READY',
|
|
100
|
+
detail: `Emulator ${p.serial} is still booting (sys.boot_completed != 1). Wait for boot to finish, then retry.`,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
/** TEST SEAM (P1 §6). When set, getDriver() binds the driver this factory returns instead of
|
|
106
|
+
* discovering a real device, so handler-level tests can drive tools with a fake driver and no
|
|
107
|
+
* adb. Never set in production code paths; a no-op unless a test installs it. */
|
|
108
|
+
let testDriverFactory;
|
|
109
|
+
export function setDriverFactoryForTests(factory) {
|
|
110
|
+
testDriverFactory = factory;
|
|
111
|
+
}
|
|
6
112
|
export async function resolveDevice(session, prefer) {
|
|
7
|
-
// Test-isolation hook
|
|
113
|
+
// Test-isolation hook: when set, device auto-discovery is
|
|
8
114
|
// disabled so "no device" tests assert no-device behavior even on a machine with a live emulator.
|
|
9
115
|
if (process.env.SWIPIUM_DISABLE_DEVICE_DISCOVERY) {
|
|
10
116
|
return { sessionDevice: undefined, available: [], effective: undefined, needSelection: false, source: 'none' };
|
|
@@ -32,16 +138,190 @@ export function bindDevice(session, serial) {
|
|
|
32
138
|
return driver;
|
|
33
139
|
}
|
|
34
140
|
export async function getDriver(session) {
|
|
35
|
-
if (session.driver)
|
|
141
|
+
if (session.driver) {
|
|
142
|
+
// A rehydrated WDA session running on the simctl fallback retries WDA (throttled). A brief
|
|
143
|
+
// outage during rehydrate must not leave the session downgraded for its whole life.
|
|
144
|
+
if (session.transportFallback && session.driver.kind !== 'simulator')
|
|
145
|
+
session.transportFallback = undefined; // re-attached explicitly
|
|
146
|
+
if (session.transportFallback) {
|
|
147
|
+
const upgraded = await retryWdaTransport(session);
|
|
148
|
+
if (upgraded)
|
|
149
|
+
return { driver: upgraded, rehydrated: true, note: WDA_RESTORED_NOTE };
|
|
150
|
+
}
|
|
36
151
|
return { driver: session.driver, rehydrated: false };
|
|
152
|
+
}
|
|
153
|
+
if (testDriverFactory) {
|
|
154
|
+
// Tests own device resolution entirely. Never fall through to real adb discovery.
|
|
155
|
+
const driver = testDriverFactory(session);
|
|
156
|
+
if (!driver)
|
|
157
|
+
return { driver: undefined, rehydrated: false, needSelection: false };
|
|
158
|
+
session.driver = driver;
|
|
159
|
+
session.device = session.device ?? driver.currentDevice() ?? 'test-device';
|
|
160
|
+
return { driver, rehydrated: false };
|
|
161
|
+
}
|
|
162
|
+
// A session that already has a device is only ever re-bound to THAT device (and platform):
|
|
163
|
+
// an iOS simulator UDID never falls through to adb discovery (which would bind a lone Android
|
|
164
|
+
// emulator and overwrite session.device), and an offline Android serial never silently
|
|
165
|
+
// becomes a different online one.
|
|
166
|
+
// The persisted transport (state.json driverKind) is authoritative; the UDID shape is the fallback
|
|
167
|
+
// for sessions persisted before driverKind existed.
|
|
168
|
+
const persistedIos = session.driverKind === 'wda' || session.driverKind === 'simulator';
|
|
169
|
+
const persistedAndroid = session.driverKind === 'direct';
|
|
170
|
+
if (session.device && (persistedIos || (!persistedAndroid && isSimulatorUdid(session.device))))
|
|
171
|
+
return rebindIosSimulator(session, session.device);
|
|
37
172
|
const res = await resolveDevice(session);
|
|
173
|
+
if (session.device && res.effective && res.effective !== session.device) {
|
|
174
|
+
return {
|
|
175
|
+
driver: undefined,
|
|
176
|
+
rehydrated: false,
|
|
177
|
+
needSelection: false,
|
|
178
|
+
blocked: {
|
|
179
|
+
failureCode: 'DEVICE_NOT_READY',
|
|
180
|
+
detail: `This session's device ${session.device} is not online. It was NOT re-bound to ${res.effective} (a different device).`,
|
|
181
|
+
nextSteps: [
|
|
182
|
+
`Bring ${session.device} back online, or switch deliberately with qa_prepare_target device="${res.effective}" (or start a new session).`,
|
|
183
|
+
],
|
|
184
|
+
},
|
|
185
|
+
};
|
|
186
|
+
}
|
|
38
187
|
if (res.effective) {
|
|
188
|
+
// H6: never auto-bind a physical phone or a still-booting emulator (same policy as
|
|
189
|
+
// planTarget, enforced here too because this path bypasses the target planner).
|
|
190
|
+
const blocked = attachBlocker(await probeAndroidDevice(res.effective));
|
|
191
|
+
if (blocked)
|
|
192
|
+
return { driver: undefined, rehydrated: false, needSelection: false, blocked };
|
|
39
193
|
bindDevice(session, res.effective);
|
|
40
194
|
session.lastSnapshot = undefined; // refs invalid after (re)bind
|
|
41
195
|
return { driver: session.driver, rehydrated: true };
|
|
42
196
|
}
|
|
43
197
|
return { driver: undefined, rehydrated: false, needSelection: res.needSelection };
|
|
44
198
|
}
|
|
45
|
-
|
|
46
|
-
|
|
199
|
+
const SIMULATOR_UDID_RE = /^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i;
|
|
200
|
+
/** iOS simulator UDIDs are UUIDs; adb serials never are. */
|
|
201
|
+
export function isSimulatorUdid(device) {
|
|
202
|
+
return !!device && SIMULATOR_UDID_RE.test(device);
|
|
203
|
+
}
|
|
204
|
+
/** Test seams for the iOS rebind (listSimulators / WDA reachability). */
|
|
205
|
+
let iosProbe = {
|
|
206
|
+
listSimulators,
|
|
207
|
+
wdaReachable: async (url) => !!(await checkWda(url, 1500).catch(() => ({ reachable: false }))).reachable,
|
|
208
|
+
};
|
|
209
|
+
export function setIosProbeForTests(probe) {
|
|
210
|
+
iosProbe = {
|
|
211
|
+
listSimulators: probe?.listSimulators ?? listSimulators,
|
|
212
|
+
wdaReachable: probe?.wdaReachable ?? (async (url) => !!(await checkWda(url, 1500).catch(() => ({ reachable: false }))).reachable),
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
/** The WDA URL this session last attached successfully for `udid` (persisted mutation ledger). */
|
|
216
|
+
function lastWdaUrlFor(session, udid) {
|
|
217
|
+
for (let i = session.mutations.length - 1; i >= 0; i--) {
|
|
218
|
+
const m = session.mutations[i];
|
|
219
|
+
if (m.action !== 'wda_attach' || m.status !== 'executed')
|
|
220
|
+
continue;
|
|
221
|
+
const t = (m.target ?? {});
|
|
222
|
+
if (typeof t.webDriverAgentUrl !== 'string')
|
|
223
|
+
continue;
|
|
224
|
+
if (t.udid != null && t.udid !== udid)
|
|
225
|
+
continue;
|
|
226
|
+
return t.webDriverAgentUrl;
|
|
227
|
+
}
|
|
228
|
+
return undefined;
|
|
229
|
+
}
|
|
230
|
+
/** Re-bind a rehydrated iOS session to ITS simulator: WDA (structured) when the session had
|
|
231
|
+
* attached WDA and that endpoint is reachable again, else SimctlDriver (visual/lifecycle). A
|
|
232
|
+
* simulator that is not booted is a typed DEVICE_NOT_READY, never a fallback to another device. */
|
|
233
|
+
async function rebindIosSimulator(session, udid) {
|
|
234
|
+
const sims = await iosProbe.listSimulators().catch(() => []);
|
|
235
|
+
const sim = sims.find((x) => x.udid.toUpperCase() === udid.toUpperCase());
|
|
236
|
+
if (!sim || !/^booted$/i.test(sim.state)) {
|
|
237
|
+
return {
|
|
238
|
+
driver: undefined,
|
|
239
|
+
rehydrated: false,
|
|
240
|
+
needSelection: false,
|
|
241
|
+
blocked: {
|
|
242
|
+
failureCode: 'DEVICE_NOT_READY',
|
|
243
|
+
detail: sim
|
|
244
|
+
? `iOS simulator ${sim.name} (${udid}) is not booted (state: ${sim.state}). This session stays bound to it; nothing else was attached.`
|
|
245
|
+
: `iOS simulator ${udid} was not found among available simulators. This session stays bound to it; nothing else was attached.`,
|
|
246
|
+
nextSteps: [`Boot it with qa_ios action:"boot" device:"${udid}" (or qa_prepare_ios_target), then retry.`],
|
|
247
|
+
},
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
// Persisted transport first: a session that ran on WDA re-binds to ITS persisted WDA URL; one that
|
|
251
|
+
// ran on simctl stays on simctl. Only a legacy state.json (no driverKind) falls back to the ledger.
|
|
252
|
+
const wdaUrl = session.driverKind === 'wda'
|
|
253
|
+
? (session.wdaUrl ?? lastWdaUrlFor(session, udid))
|
|
254
|
+
: session.driverKind === 'simulator'
|
|
255
|
+
? undefined
|
|
256
|
+
: lastWdaUrlFor(session, udid);
|
|
257
|
+
let driver;
|
|
258
|
+
let note;
|
|
259
|
+
if (wdaUrl && (await iosProbe.wdaReachable(wdaUrl))) {
|
|
260
|
+
driver = wdaDriverFor(session, wdaUrl, udid);
|
|
261
|
+
session.transportFallback = undefined;
|
|
262
|
+
}
|
|
263
|
+
else {
|
|
264
|
+
driver = new SimctlDriver(udid);
|
|
265
|
+
if (session.driverKind === 'wda' && wdaUrl) {
|
|
266
|
+
// Persisted transport is WDA but it is unreachable right now: run on simctl for the moment,
|
|
267
|
+
// but keep driverKind/wdaUrl as persisted (store.writeState skips the sync while this is
|
|
268
|
+
// set) and retry WDA on the next getDriver calls.
|
|
269
|
+
const now = Date.now();
|
|
270
|
+
session.transportFallback = { wanted: 'wda', wdaUrl, since: now, lastProbeAt: now };
|
|
271
|
+
note = wdaFallbackNote(wdaUrl);
|
|
272
|
+
if (!session.workarounds.includes(note))
|
|
273
|
+
session.workarounds.push(note);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
session.driver = driver;
|
|
277
|
+
session.lastSnapshot = undefined; // refs invalid after (re)bind
|
|
278
|
+
return { driver, rehydrated: true, ...(note ? { note } : {}) };
|
|
279
|
+
}
|
|
280
|
+
// reuseRunningApp > forceAppLaunch:false + shouldTerminateApp:false: a rehydrate must never
|
|
281
|
+
// terminate + relaunch the app under test (see createWdaSession).
|
|
282
|
+
function wdaDriverFor(session, wdaUrl, udid) {
|
|
283
|
+
const cfg = loadWdaConfig(session.root);
|
|
284
|
+
return new WdaDriver(wdaUrl, {
|
|
285
|
+
udid,
|
|
286
|
+
bundleId: session.appId,
|
|
287
|
+
capabilities: cfg?.capabilities,
|
|
288
|
+
settings: cfg?.settings,
|
|
289
|
+
reuseRunningApp: true,
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
/** Minimum gap between WDA re-probes while a session runs on the simctl fallback. */
|
|
293
|
+
export const WDA_RETRY_INTERVAL_MS = 10_000;
|
|
294
|
+
const wdaFallbackNote = (wdaUrl) => `WDA at ${wdaUrl} was unreachable when this iOS session was re-attached; running on the simctl fallback ` +
|
|
295
|
+
`(visual/lifecycle only; no structured snapshot). The session stays a WDA session and WDA is retried ` +
|
|
296
|
+
`automatically; or re-attach with qa_wda.`;
|
|
297
|
+
export const WDA_RESTORED_NOTE = 'WDA is reachable again. This session is back on its WDA transport (previous @eN refs are invalid).';
|
|
298
|
+
/** Re-probe the persisted WDA endpoint of a fallback session (throttled); rebind on success. */
|
|
299
|
+
async function retryWdaTransport(session) {
|
|
300
|
+
const fb = session.transportFallback;
|
|
301
|
+
if (!fb || !session.device)
|
|
302
|
+
return undefined;
|
|
303
|
+
const now = Date.now();
|
|
304
|
+
if (now - fb.lastProbeAt < WDA_RETRY_INTERVAL_MS)
|
|
305
|
+
return undefined;
|
|
306
|
+
fb.lastProbeAt = now;
|
|
307
|
+
if (!(await iosProbe.wdaReachable(fb.wdaUrl).catch(() => false)))
|
|
308
|
+
return undefined;
|
|
309
|
+
const driver = wdaDriverFor(session, fb.wdaUrl, session.device);
|
|
310
|
+
session.driver = driver;
|
|
311
|
+
session.transportFallback = undefined;
|
|
312
|
+
session.lastSnapshot = undefined;
|
|
313
|
+
return driver;
|
|
314
|
+
}
|
|
315
|
+
/** Post-restart reattach note, platform-aware: iOS sessions relaunch via qa_prepare_ios_target
|
|
316
|
+
* (qa_prepare_target is the Android/Expo path). iOS = an iOS driver (simctl / WDA) or a
|
|
317
|
+
* simulator-UDID device. */
|
|
318
|
+
export function rehydrateNote(session) {
|
|
319
|
+
const driver = session?.driver;
|
|
320
|
+
const ios = driver instanceof SimctlDriver || driver instanceof WdaDriver || isSimulatorUdid(session?.device);
|
|
321
|
+
return ('Note: reattached the device transport after a restart. The app may not be in the ' +
|
|
322
|
+
`foreground (relaunch with ${ios ? 'qa_prepare_ios_target' : 'qa_prepare_target'}) and previous @eN refs are invalid (re-run qa_snapshot).`);
|
|
323
|
+
}
|
|
324
|
+
/** Platform-neutral form for callers without the session at hand (prefer rehydrateNote(session)). */
|
|
325
|
+
export const REHYDRATE_NOTE = 'Note: reattached the device transport after a restart. The app may not be in the ' +
|
|
326
|
+
'foreground (relaunch with qa_prepare_target on Android, qa_prepare_ios_target on iOS) and previous @eN refs are invalid (re-run qa_snapshot).';
|
|
47
327
|
//# sourceMappingURL=attach.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attach.js","sourceRoot":"","sources":["../../src/session/attach.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"attach.js","sourceRoot":"","sources":["../../src/session/attach.ts"],"names":[],"mappings":"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"}
|