swipium 1.5.0 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +183 -0
- package/README.md +173 -280
- package/THREAT_MODEL.md +223 -47
- package/dist/appMap/automationLink.js +30 -27
- package/dist/appMap/automationLink.js.map +1 -1
- package/dist/appMap/build.js +47 -21
- package/dist/appMap/build.js.map +1 -1
- package/dist/appMap/codeIndex.js +2 -2
- package/dist/appMap/codeIndex.js.map +1 -1
- package/dist/appMap/featureIndex.js +3 -3
- package/dist/appMap/featureIndex.js.map +1 -1
- package/dist/appMap/featureModel.js +2 -2
- package/dist/appMap/featureModel.js.map +1 -1
- package/dist/appMap/firstRunApply.js +2 -2
- package/dist/appMap/firstRunApply.js.map +1 -1
- package/dist/appMap/issues.js +10 -10
- package/dist/appMap/issues.js.map +1 -1
- package/dist/appMap/migrations.js +5 -5
- 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 +77 -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 +2 -2
- package/dist/appMap/query.js.map +1 -1
- package/dist/appMap/runtimeMerge.js +3 -3
- 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 +1 -1
- package/dist/appMap/screenMatch.js.map +1 -1
- package/dist/appMap/staticScan.js +17 -17
- package/dist/appMap/staticScan.js.map +1 -1
- package/dist/appMap/store.js +55 -7
- package/dist/appMap/store.js.map +1 -1
- package/dist/appMap/tsAstScan.js +3 -3
- package/dist/appMap/tsAstScan.js.map +1 -1
- package/dist/artifacts/bundletool.js +5 -5
- package/dist/artifacts/bundletool.js.map +1 -1
- package/dist/artifacts/resolve.js +10 -10
- package/dist/artifacts/resolve.js.map +1 -1
- package/dist/automation/capabilities.js +3 -3
- package/dist/automation/capabilities.js.map +1 -1
- package/dist/automation/gestures.js +1 -1
- package/dist/automation/gestures.js.map +1 -1
- package/dist/automation/plan.js +7 -7
- package/dist/automation/plan.js.map +1 -1
- package/dist/automation/report.js +3 -3
- package/dist/automation/report.js.map +1 -1
- package/dist/automation/selectors.js +14 -25
- 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 +5 -5
- package/dist/automation/waits.js.map +1 -1
- package/dist/automation/webview.js +2 -2
- package/dist/automation/webview.js.map +1 -1
- package/dist/automationGen/appiumModel.js +13 -7
- package/dist/automationGen/appiumModel.js.map +1 -1
- package/dist/automationGen/ciEmitter.js +5 -5
- 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 +265 -106
- 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 +71 -26
- package/dist/automationGen/projectProfile.js.map +1 -1
- package/dist/automationGen/pythonEmitter.js +276 -105
- 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/{tools/automationGenerate.js → automationGen/run.js} +72 -113
- package/dist/automationGen/run.js.map +1 -0
- package/dist/automationGen/suitePlan.js +6 -4
- package/dist/automationGen/suitePlan.js.map +1 -1
- package/dist/automationGen/validation.js +20 -8
- package/dist/automationGen/validation.js.map +1 -1
- package/dist/build/parseBuildLog.js +2 -2
- package/dist/build/parseBuildLog.js.map +1 -1
- package/dist/build/plan.js +7 -7
- 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 +35 -14
- package/dist/cli/scan.js.map +1 -1
- package/dist/cli/suite.js +6 -6
- 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 +45 -14
- package/dist/context/detect.js.map +1 -1
- package/dist/context/findApps.js +6 -6
- 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 +3 -3
- package/dist/core/target.js.map +1 -1
- package/dist/core/targetPlan.js +65 -62
- package/dist/core/targetPlan.js.map +1 -1
- package/dist/drivers/DirectDriver.js +300 -36
- package/dist/drivers/DirectDriver.js.map +1 -1
- package/dist/drivers/SimctlDriver.js +120 -7
- package/dist/drivers/SimctlDriver.js.map +1 -1
- package/dist/drivers/WdaDriver.js +350 -50
- package/dist/drivers/WdaDriver.js.map +1 -1
- package/dist/explore/candidates.js +2 -2
- package/dist/explore/candidates.js.map +1 -1
- package/dist/explore/graph.js +5 -5
- package/dist/explore/graph.js.map +1 -1
- package/dist/explore/policy.js +5 -5
- package/dist/explore/policy.js.map +1 -1
- package/dist/explore/runner.js +301 -284
- package/dist/explore/runner.js.map +1 -1
- package/dist/explore/signatures.js +1 -1
- package/dist/featureTesting/executionBootstrap.js +29 -30
- package/dist/featureTesting/executionBootstrap.js.map +1 -1
- package/dist/featureTesting/featureMap.js +2 -2
- package/dist/featureTesting/featureMap.js.map +1 -1
- package/dist/featureTesting/featureScope.js +12 -12
- package/dist/featureTesting/featureScope.js.map +1 -1
- package/dist/featureTesting/mapFeatureScope.js +7 -7
- package/dist/featureTesting/mapFeatureScope.js.map +1 -1
- package/dist/featureTesting/objectiveModel.js +10 -10
- package/dist/featureTesting/objectiveModel.js.map +1 -1
- package/dist/featureTesting/resultMerge.js +6 -6
- package/dist/featureTesting/resultMerge.js.map +1 -1
- package/dist/featureTesting/sources.js +4 -4
- package/dist/featureTesting/sources.js.map +1 -1
- package/dist/featureTesting/suiteBridge.js +1 -1
- package/dist/featureTesting/suiteBridge.js.map +1 -1
- package/dist/featureTesting/synonyms.js +1 -1
- package/dist/featureTesting/synonyms.js.map +1 -1
- package/dist/featureTesting/testCaseFactory.js +11 -11
- package/dist/featureTesting/testCaseFactory.js.map +1 -1
- package/dist/featureTesting/testPlan.js +3 -3
- 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 +5 -5
- package/dist/firstRun/classifyScreen.js.map +1 -1
- package/dist/firstRun/firstRunPlanner.js +11 -11
- package/dist/firstRun/firstRunPlanner.js.map +1 -1
- package/dist/firstRun/firstRunRunner.js +8 -8
- package/dist/firstRun/firstRunRunner.js.map +1 -1
- package/dist/firstRun/generatedDataPolicy.js +9 -9
- package/dist/firstRun/generatedDataPolicy.js.map +1 -1
- package/dist/firstRun/inputPlanner.js +5 -5
- 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 +33 -3
- 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 +20 -10
- package/dist/flows/generate.js.map +1 -1
- package/dist/flows/pack.js +3 -3
- 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 +111 -23
- package/dist/flows/repair.js.map +1 -1
- package/dist/flows/run.js +153 -57
- package/dist/flows/run.js.map +1 -1
- package/dist/flows/schema.js +50 -5
- package/dist/flows/schema.js.map +1 -1
- package/dist/flows/seedExec.js +4 -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/issues/classify.js +16 -16
- package/dist/issues/classify.js.map +1 -1
- package/dist/issues/fingerprint.js +24 -4
- package/dist/issues/fingerprint.js.map +1 -1
- package/dist/issues/index.js +94 -31
- package/dist/issues/index.js.map +1 -1
- package/dist/issues/metrics.js +4 -4
- 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 +4 -4
- package/dist/issues/report.js.map +1 -1
- package/dist/issues/reportBridge.js +4 -4
- 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 +75 -7
- 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 +32 -7
- 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 +1 -1
- package/dist/lib/image.js.map +1 -1
- package/dist/lib/lockfile.js +370 -31
- package/dist/lib/lockfile.js.map +1 -1
- package/dist/lib/needsInput.js +3 -3
- package/dist/lib/needsInput.js.map +1 -1
- package/dist/lib/png.js +2 -2
- 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 +79 -10
- package/dist/lib/result.js.map +1 -1
- package/dist/lib/schemaHash.js +3 -3
- package/dist/lib/schemaHash.js.map +1 -1
- package/dist/lib/sensitive.js +3 -2
- 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 +52 -10
- 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 +294 -15
- package/dist/lib/wda.js.map +1 -1
- package/dist/mobileAudit/checks.js +12 -12
- 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 +1 -1
- package/dist/mobileAudit/profiles.js.map +1 -1
- package/dist/mobileAudit/results.js +3 -3
- package/dist/mobileAudit/results.js.map +1 -1
- package/dist/mobileAudit/runner.js +72 -18
- 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 +219 -36
- package/dist/oracle/failures.js.map +1 -1
- package/dist/oracle/health.js +63 -17
- package/dist/oracle/health.js.map +1 -1
- package/dist/oracle/locator.js +13 -13
- 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 +4 -4
- package/dist/orchestration/goal.js.map +1 -1
- package/dist/orchestration/testThis/execute.js +62 -21
- package/dist/orchestration/testThis/execute.js.map +1 -1
- package/dist/orchestration/testThis/pipeline.js +119 -30
- package/dist/orchestration/testThis/pipeline.js.map +1 -1
- package/dist/orchestration/testThis/plan.js +162 -73
- package/dist/orchestration/testThis/plan.js.map +1 -1
- package/dist/orchestration/testThis/sessionIntent.js +72 -0
- package/dist/orchestration/testThis/sessionIntent.js.map +1 -0
- package/dist/orchestration/testThis/terminal.js +34 -16
- package/dist/orchestration/testThis/terminal.js.map +1 -1
- package/dist/orchestration/testThis/types.js +1 -1
- package/dist/orchestration/testThis/types.js.map +1 -1
- package/dist/plan/plan.js +9 -9
- package/dist/plan/plan.js.map +1 -1
- package/dist/prompts/index.js +22 -22
- package/dist/prompts/index.js.map +1 -1
- package/dist/report/export.js +392 -37
- 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/policy.js +7 -4
- package/dist/report/policy.js.map +1 -1
- package/dist/report/qaLevel.js +8 -8
- package/dist/report/qaLevel.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/toolHealth.js +124 -0
- package/dist/report/toolHealth.js.map +1 -0
- package/dist/server.js +472 -45
- 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 +2 -2
- package/dist/services/build.js.map +1 -1
- package/dist/{tools → services}/flowGenerate.js +29 -13
- package/dist/services/flowGenerate.js.map +1 -0
- package/dist/services/preflight.js +4 -4
- package/dist/services/preflight.js.map +1 -1
- package/dist/services/prepareAndroid.js +46 -8
- package/dist/services/prepareAndroid.js.map +1 -1
- package/dist/services/prepareIos.js +24 -9
- package/dist/services/prepareIos.js.map +1 -1
- package/dist/services/report.js +100 -45
- package/dist/services/report.js.map +1 -1
- package/dist/services/smoke.js +32 -16
- package/dist/services/smoke.js.map +1 -1
- package/dist/services/suiteGenerate.js +28 -3
- package/dist/services/suiteGenerate.js.map +1 -1
- package/dist/services/testSuiteKnowledge.js +40 -27
- package/dist/services/testSuiteKnowledge.js.map +1 -1
- package/dist/session/attach.js +270 -6
- package/dist/session/attach.js.map +1 -1
- package/dist/session/processRegistry.js +317 -48
- package/dist/session/processRegistry.js.map +1 -1
- package/dist/session/progress.js +1 -1
- package/dist/session/retention.js +201 -0
- package/dist/session/retention.js.map +1 -0
- package/dist/session/store.js +275 -48
- package/dist/session/store.js.map +1 -1
- package/dist/snapshot/overlays.js +53 -8
- package/dist/snapshot/overlays.js.map +1 -1
- package/dist/snapshot/parse.js +28 -4
- package/dist/snapshot/parse.js.map +1 -1
- package/dist/snapshot/present.js +11 -5
- 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 +46 -2
- package/dist/state/profile.js.map +1 -1
- package/dist/suite/compile.js +9 -5
- package/dist/suite/compile.js.map +1 -1
- package/dist/suite/lint.js +4 -4
- package/dist/suite/lint.js.map +1 -1
- package/dist/suite/pom.js +50 -41
- 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 +9 -7
- package/dist/suite/testcase.js.map +1 -1
- package/dist/testSuite/exporter.js +4 -4
- package/dist/testSuite/exporter.js.map +1 -1
- package/dist/testSuite/generator.js +13 -9
- 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 +5 -5
- package/dist/testSuite/merge.js.map +1 -1
- package/dist/testSuite/schema.js +5 -5
- package/dist/testSuite/schema.js.map +1 -1
- package/dist/testSuite/store.js +3 -3
- 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 +794 -164
- package/dist/tools/act.js.map +1 -1
- package/dist/tools/agent.js +451 -128
- package/dist/tools/agent.js.map +1 -1
- package/dist/tools/appControl.js +69 -19
- package/dist/tools/appControl.js.map +1 -1
- package/dist/tools/appMap.js +188 -130
- package/dist/tools/appMap.js.map +1 -1
- package/dist/tools/build.js +32 -42
- package/dist/tools/build.js.map +1 -1
- package/dist/tools/bundletool.js +21 -31
- package/dist/tools/bundletool.js.map +1 -1
- package/dist/tools/clearOverlay.js +55 -12
- package/dist/tools/clearOverlay.js.map +1 -1
- package/dist/tools/device.js +76 -24
- package/dist/tools/device.js.map +1 -1
- package/dist/tools/doctor.js +68 -28
- package/dist/tools/doctor.js.map +1 -1
- package/dist/tools/explore.js +41 -47
- package/dist/tools/explore.js.map +1 -1
- package/dist/tools/featureTesting.js +31 -48
- package/dist/tools/featureTesting.js.map +1 -1
- package/dist/tools/firstRun.js +34 -41
- package/dist/tools/firstRun.js.map +1 -1
- package/dist/tools/flow.js +183 -103
- package/dist/tools/flow.js.map +1 -1
- package/dist/tools/flowRepair.js +25 -13
- package/dist/tools/flowRepair.js.map +1 -1
- package/dist/tools/generate.js +52 -89
- package/dist/tools/generate.js.map +1 -1
- package/dist/tools/getArtifact.js +16 -5
- package/dist/tools/getArtifact.js.map +1 -1
- package/dist/tools/health.js +15 -12
- package/dist/tools/health.js.map +1 -1
- package/dist/tools/ios.js +45 -223
- package/dist/tools/ios.js.map +1 -1
- package/dist/tools/issues.js +251 -35
- package/dist/tools/issues.js.map +1 -1
- package/dist/tools/jobs.js +41 -16
- package/dist/tools/jobs.js.map +1 -1
- package/dist/tools/metro.js +36 -35
- package/dist/tools/metro.js.map +1 -1
- package/dist/tools/mobileAudit.js +50 -45
- package/dist/tools/mobileAudit.js.map +1 -1
- package/dist/tools/network.js +31 -14
- package/dist/tools/network.js.map +1 -1
- package/dist/tools/note.js +26 -26
- package/dist/tools/note.js.map +1 -1
- package/dist/tools/prepareIosTarget.js +10 -16
- package/dist/tools/prepareIosTarget.js.map +1 -1
- package/dist/tools/prepareTarget.js +117 -50
- package/dist/tools/prepareTarget.js.map +1 -1
- package/dist/tools/report.js +11 -22
- package/dist/tools/report.js.map +1 -1
- package/dist/tools/resolveArtifact.js +11 -15
- package/dist/tools/resolveArtifact.js.map +1 -1
- package/dist/tools/resolveTarget.js +78 -24
- package/dist/tools/resolveTarget.js.map +1 -1
- package/dist/tools/screenRecord.js +23 -21
- package/dist/tools/screenRecord.js.map +1 -1
- package/dist/tools/screenshot.js +23 -16
- package/dist/tools/screenshot.js.map +1 -1
- package/dist/tools/smoke.js +20 -16
- package/dist/tools/smoke.js.map +1 -1
- package/dist/tools/snapshot.js +155 -118
- package/dist/tools/snapshot.js.map +1 -1
- package/dist/tools/startSession.js +104 -116
- package/dist/tools/startSession.js.map +1 -1
- package/dist/tools/suite.js +72 -43
- package/dist/tools/suite.js.map +1 -1
- package/dist/tools/testSuite.js +30 -20
- package/dist/tools/testSuite.js.map +1 -1
- package/dist/tools/testThis.js +24 -28
- package/dist/tools/testThis.js.map +1 -1
- package/dist/tools/visual.js +686 -210
- package/dist/tools/visual.js.map +1 -1
- package/dist/tools/wait.js +9 -38
- package/dist/tools/wait.js.map +1 -1
- package/dist/tools/wda.js +187 -57
- package/dist/tools/wda.js.map +1 -1
- package/dist/version.js +31 -22
- package/dist/version.js.map +1 -1
- package/dist/visual/ocr.js +53 -6
- package/dist/visual/ocr.js.map +1 -1
- package/dist/visual/provider.js +80 -12
- 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 +194 -128
- package/docs/physical-devices.md +84 -0
- package/docs/tools.md +812 -152
- package/package.json +3 -2
- package/dist/tools/assertVisual.js +0 -84
- package/dist/tools/assertVisual.js.map +0 -1
- package/dist/tools/automationGenerate.js.map +0 -1
- package/dist/tools/capabilities.js +0 -179
- 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.map +0 -1
- package/dist/tools/history.js +0 -86
- package/dist/tools/history.js.map +0 -1
- package/dist/tools/locator.js +0 -85
- package/dist/tools/locator.js.map +0 -1
- package/dist/tools/permissions.js +0 -174
- package/dist/tools/permissions.js.map +0 -1
- package/dist/tools/plan.js +0 -52
- package/dist/tools/plan.js.map +0 -1
- package/dist/tools/screenInfo.js +0 -76
- package/dist/tools/screenInfo.js.map +0 -1
- package/dist/tools/seed.js +0 -133
- package/dist/tools/seed.js.map +0 -1
- package/dist/tools/state.js +0 -217
- package/dist/tools/state.js.map +0 -1
- package/dist/tools/visualText.js +0 -106
- package/dist/tools/visualText.js.map +0 -1
package/dist/tools/smoke.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// qa_smoke
|
|
1
|
+
// qa_smoke: server-side smoke orchestration. Runs the whole loop WITHOUT
|
|
2
2
|
// the model mediating each step (the context-efficiency + determinism win): launch the app,
|
|
3
3
|
// run the deterministic baseline (snapshot quality + Tier-1 health + an evidence screenshot),
|
|
4
4
|
// then run every saved flow (.swipium/flows/*.yaml). Records a structured qa_note per workflow
|
|
@@ -6,38 +6,42 @@
|
|
|
6
6
|
//
|
|
7
7
|
// Scope note: a single honest orchestrator. Generic credential-login / per-screen-visual smokes
|
|
8
8
|
// are app-specific and fragile to synthesize, so login is handled by authoring a login *flow*
|
|
9
|
-
// (run here automatically) rather than a separate
|
|
9
|
+
// (run here automatically) rather than a separate login-smoke tool that guesses.
|
|
10
10
|
import { z } from 'zod';
|
|
11
|
-
import { qaOk, qaError } from '../lib/result.js';
|
|
12
|
-
import { getDriver } from '../session/attach.js';
|
|
11
|
+
import { qaOk, qaError, unknownSessionError } from '../lib/result.js';
|
|
12
|
+
import { blockedDeviceResult, getDriver } from '../session/attach.js';
|
|
13
13
|
import { runSmoke } from '../services/smoke.js';
|
|
14
14
|
export function registerSmoke(server, sessions) {
|
|
15
15
|
server.registerTool('qa_smoke', {
|
|
16
16
|
title: 'Run a smoke test',
|
|
17
|
-
description: '
|
|
17
|
+
description: 'Server-side smoke: optionally launch, run the baseline (snapshot quality + health + evidence screenshot), then every ' +
|
|
18
|
+
'saved flow in .swipium/flows. Records a qa_note per workflow; call qa_report after. Needs a prepared device.',
|
|
18
19
|
inputSchema: {
|
|
19
20
|
sessionId: z.string(),
|
|
20
|
-
launch: z.boolean().optional().describe('Launch
|
|
21
|
+
launch: z.boolean().optional().describe('Launch first (default true with an appId).'),
|
|
21
22
|
runFlows: z.boolean().optional().describe('Run saved .swipium/flows (default true).'),
|
|
22
|
-
variables: z.record(z.string()).optional().describe('
|
|
23
|
+
variables: z.record(z.string()).optional().describe('${VAR} values for flows (over stored inputs, SWIPIUM_* env).'),
|
|
23
24
|
},
|
|
24
25
|
}, async ({ sessionId, launch, runFlows, variables }) => {
|
|
25
26
|
const session = sessions.get(sessionId);
|
|
26
|
-
|
|
27
|
+
if (!session)
|
|
28
|
+
return unknownSessionError(sessionId);
|
|
29
|
+
const { driver: d, blocked } = await getDriver(session);
|
|
27
30
|
if (!session || !d) {
|
|
28
|
-
return
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
31
|
+
return (blockedDeviceResult(blocked) ??
|
|
32
|
+
qaError({
|
|
33
|
+
what: 'No device attached to this session',
|
|
34
|
+
changedState: false,
|
|
35
|
+
retrySafe: true,
|
|
36
|
+
nextSteps: ['Call qa_prepare_target first, then qa_smoke.'],
|
|
37
|
+
}));
|
|
34
38
|
}
|
|
35
39
|
const result = await runSmoke(sessions, session, d, { launch, runFlows, variables });
|
|
36
40
|
const launchOutcome = result.baseline.launch?.outcome ?? 'unknown';
|
|
37
|
-
const summary = `qa_smoke done
|
|
41
|
+
const summary = `qa_smoke done: launch=${launchOutcome}, flows ${result.flowsPassed}/${result.flowsTotal} passed.\n` +
|
|
38
42
|
`baseline: ${JSON.stringify(result.baseline.launch)}\n` +
|
|
39
43
|
(result.flows.length
|
|
40
|
-
? result.flows.map((f) => `${f.passed ? '✓' : '✗'} ${f.name}${f.passed ? '' :
|
|
44
|
+
? result.flows.map((f) => `${f.passed ? '✓' : '✗'} ${f.name}${f.passed ? '' : `: ${f.reason}`}`).join('\n')
|
|
41
45
|
: 'no saved flows (.swipium/flows is empty)') +
|
|
42
46
|
`\nCall qa_report to summarize.`;
|
|
43
47
|
return qaOk({
|
package/dist/tools/smoke.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"smoke.js","sourceRoot":"","sources":["../../src/tools/smoke.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"smoke.js","sourceRoot":"","sources":["../../src/tools/smoke.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/snapshot.js
CHANGED
|
@@ -1,142 +1,175 @@
|
|
|
1
|
-
// qa_snapshot
|
|
1
|
+
// qa_snapshot: the observation layer.
|
|
2
2
|
// Snapshot returns compact @eN refs + a snapshotQuality verdict (+ optional diff).
|
|
3
3
|
import { z } from 'zod';
|
|
4
|
-
import { qaOk, qaError } from '../lib/result.js';
|
|
4
|
+
import { qaOk, qaError, unknownSessionError, cancelledResult } from '../lib/result.js';
|
|
5
5
|
import { parseSnapshot, signature, renderElements } from '../snapshot/parse.js';
|
|
6
6
|
import { presentElements } from '../snapshot/present.js';
|
|
7
7
|
import { makeRedactor, isSecureNode } from '../lib/redact.js';
|
|
8
8
|
import { detectTreeOverlays, classifyForeground } from '../snapshot/overlays.js';
|
|
9
9
|
import { detectAuthScreen } from '../oracle/auth.js';
|
|
10
|
-
import {
|
|
10
|
+
import { dumpRootPackage } from '../oracle/health.js';
|
|
11
|
+
import { blockedDeviceResult, getDriver, rehydrateNote } from '../session/attach.js';
|
|
12
|
+
import { isAbortError, runWithSignal } from '../lib/abortScope.js';
|
|
13
|
+
/** The bounded structured-dump probe a visual-fallback session still attempts on each qa_snapshot /
|
|
14
|
+
* qa_act observation: one short try, so a still-busy screen costs seconds, not the full retry ladder. */
|
|
15
|
+
export const VISUAL_FALLBACK_PROBE = { timeoutMs: 6000, attempts: 2 };
|
|
11
16
|
export function registerSnapshot(server, sessions) {
|
|
12
17
|
server.registerTool('qa_snapshot', {
|
|
13
18
|
title: 'Snapshot the screen',
|
|
14
|
-
description: 'Capture the
|
|
19
|
+
description: 'Capture the screen as compact addressable elements (@e1, @e2 …) with a snapshotQuality verdict. Interactive-only and ' +
|
|
20
|
+
'no screenshot by default; busy screens are capped (use filter for the rest). Use @eN refs with qa_act; re-snapshot ' +
|
|
21
|
+
'after navigation.',
|
|
15
22
|
inputSchema: {
|
|
16
23
|
sessionId: z.string(),
|
|
17
|
-
diff: z
|
|
18
|
-
|
|
19
|
-
.optional()
|
|
20
|
-
.describe('Return only what changed vs the previous snapshot (needs a prior snapshot in this session).'),
|
|
21
|
-
filter: z
|
|
22
|
-
.string()
|
|
23
|
-
.optional()
|
|
24
|
-
.describe("Case-insensitive substring matched against each element's text/label/id/role; only matching elements are returned. Use when elements were omitted by the presented-element cap."),
|
|
24
|
+
diff: z.boolean().optional().describe('Only what changed since the previous snapshot.'),
|
|
25
|
+
filter: z.string().optional().describe('Substring match on text/label/id/role (finds capped elements).'),
|
|
25
26
|
},
|
|
26
|
-
}, async ({ sessionId, diff, filter }) => {
|
|
27
|
+
}, async ({ sessionId, diff, filter }, extra) => {
|
|
27
28
|
const session = sessions.get(sessionId);
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
return qaError({
|
|
31
|
-
what: 'No device attached to this session',
|
|
32
|
-
changedState: false,
|
|
33
|
-
retrySafe: true,
|
|
34
|
-
nextSteps: ['Call qa_prepare_target first.'],
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
if (driver.kind === 'simulator') {
|
|
38
|
-
return qaError({
|
|
39
|
-
what: 'A structured UI tree is not available on the iOS simulator backend',
|
|
40
|
-
changedState: false,
|
|
41
|
-
retrySafe: false,
|
|
42
|
-
failureCode: 'BACKEND_UNSUPPORTED',
|
|
43
|
-
nextSteps: ['Attach WebDriverAgent with qa_wda for a structured UI tree. Without WDA, use qa_screenshot + qa_assert_visual.'],
|
|
44
|
-
});
|
|
29
|
+
if (!session) {
|
|
30
|
+
return unknownSessionError(sessionId);
|
|
45
31
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
}
|
|
57
|
-
let xml;
|
|
58
|
-
try {
|
|
59
|
-
xml = await driver.dumpXml();
|
|
32
|
+
const { driver, rehydrated, blocked } = await getDriver(session);
|
|
33
|
+
if (!driver) {
|
|
34
|
+
return (blockedDeviceResult(blocked) ??
|
|
35
|
+
qaError({
|
|
36
|
+
what: 'No device attached to this session',
|
|
37
|
+
changedState: false,
|
|
38
|
+
retrySafe: true,
|
|
39
|
+
failureCode: 'NO_DEVICE',
|
|
40
|
+
nextSteps: ['Call qa_prepare_target first.'],
|
|
41
|
+
}));
|
|
60
42
|
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
sessions.bump(session, 'snapshotFailures');
|
|
66
|
-
const failures = session.counters.snapshotFailures;
|
|
67
|
-
if (failures >= session.budget.maxSnapshotFailures) {
|
|
68
|
-
sessions.setMode(session, 'visual-fallback');
|
|
43
|
+
// Cancellation: this call's signal is scoped to the call (abortScope), so aborting it never
|
|
44
|
+
// touches a concurrently running job's adb/WDA calls (and vice versa).
|
|
45
|
+
return runWithSignal(extra?.signal, async () => {
|
|
46
|
+
if (driver.kind === 'simulator') {
|
|
69
47
|
return qaError({
|
|
70
|
-
what:
|
|
48
|
+
what: 'A structured UI tree is not available on the iOS simulator backend',
|
|
71
49
|
changedState: false,
|
|
72
50
|
retrySafe: false,
|
|
73
|
-
failureCode: '
|
|
51
|
+
failureCode: 'BACKEND_UNSUPPORTED',
|
|
74
52
|
nextSteps: [
|
|
75
|
-
'
|
|
76
|
-
'Use qa_screenshot, then qa_act with coordinate targets (taps default to a short press).',
|
|
77
|
-
'qa_check_health stays available (crash/ANR/foreground).',
|
|
53
|
+
'Attach WebDriverAgent with qa_wda for a structured UI tree. Without WDA, use qa_screenshot + qa_visual mode:"assert".',
|
|
78
54
|
],
|
|
79
55
|
});
|
|
80
56
|
}
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
57
|
+
// visual-fallback is per-SCREEN, never permanent (real-device smoke: one slow screen left
|
|
58
|
+
// the session answering VISUAL_ONLY_SCREEN forever). In visual-fallback we still try ONE
|
|
59
|
+
// bounded structured dump; success switches the session back to 'structured'.
|
|
60
|
+
const inFallback = session.mode === 'visual-fallback';
|
|
61
|
+
let xml;
|
|
62
|
+
try {
|
|
63
|
+
xml = await driver.dumpXml(inFallback ? VISUAL_FALLBACK_PROBE : undefined);
|
|
64
|
+
}
|
|
65
|
+
catch (e) {
|
|
66
|
+
// Cancelled (the MCP request was aborted): not a snapshot failure. No counter, no
|
|
67
|
+
// mode switch, no tool error (the report's tool status is unaffected).
|
|
68
|
+
if (isAbortError(e))
|
|
69
|
+
return cancelledResult('Snapshot cancelled: the call was aborted before the UI tree was captured');
|
|
70
|
+
if (inFallback) {
|
|
71
|
+
return qaError({
|
|
72
|
+
what: 'Session is in visual-fallback mode; a structured UI tree is still unavailable on this screen.',
|
|
73
|
+
changedState: false,
|
|
74
|
+
retrySafe: true,
|
|
75
|
+
failureCode: 'VISUAL_ONLY_SCREEN',
|
|
76
|
+
nextSteps: [
|
|
77
|
+
'Use qa_screenshot, then qa_act with coordinate targets (durationMs press). qa_check_health still works.',
|
|
78
|
+
'Each qa_snapshot / qa_act retries a bounded structured dump; the session returns to structured mode as soon as one succeeds.',
|
|
79
|
+
],
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
// Classify repeated idle-state / dump failures and switch to visual fallback.
|
|
83
|
+
const msg = String(e);
|
|
84
|
+
const idle = /idle|could not get idle|dump/i.test(msg);
|
|
85
|
+
sessions.bump(session, 'snapshotFailures');
|
|
86
|
+
const failures = session.counters.snapshotFailures;
|
|
87
|
+
if (failures >= session.budget.maxSnapshotFailures) {
|
|
88
|
+
sessions.setMode(session, 'visual-fallback');
|
|
89
|
+
return qaError({
|
|
90
|
+
what: `Could not produce a UI tree after ${failures} attempts${idle ? ' (never reached idle)' : ''}, likely a looping animation, dev overlay, web view, or canvas.`,
|
|
91
|
+
changedState: false,
|
|
92
|
+
retrySafe: false,
|
|
93
|
+
failureCode: 'VISUAL_ONLY_SCREEN',
|
|
94
|
+
nextSteps: [
|
|
95
|
+
'Switched session to visual-fallback mode for this screen (qa_snapshot keeps probing and switches back once a dump succeeds).',
|
|
96
|
+
'Use qa_screenshot, then qa_act with coordinate targets (taps default to a short press).',
|
|
97
|
+
'qa_check_health stays available (crash/ANR/foreground).',
|
|
98
|
+
],
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
return qaError({
|
|
102
|
+
what: `Snapshot (UI tree dump) failed (${failures}/${session.budget.maxSnapshotFailures})${idle ? ', never reached idle' : ''}: ${msg}`,
|
|
103
|
+
changedState: false,
|
|
104
|
+
retrySafe: true,
|
|
105
|
+
failureCode: 'SNAPSHOT_FAILED',
|
|
106
|
+
nextSteps: [
|
|
107
|
+
`Retry; after ${session.budget.maxSnapshotFailures} consecutive failures Swipium switches to visual-fallback (screenshots).`,
|
|
108
|
+
],
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
const modeRecovered = sessions.noteStructuredDump(session);
|
|
112
|
+
const parsed = parseSnapshot(xml, { interactiveOnly: true });
|
|
113
|
+
const prev = session.lastSnapshot;
|
|
114
|
+
const newSigs = new Set(parsed.elements.map(signature));
|
|
115
|
+
const redact = makeRedactor(session.secrets);
|
|
116
|
+
const f = filter?.trim().toLowerCase();
|
|
117
|
+
const pool = f
|
|
118
|
+
? parsed.elements.filter((e) => [e.text, e.label, e.id, e.role].some((v) => v?.toLowerCase().includes(f)))
|
|
119
|
+
: parsed.elements;
|
|
120
|
+
const { elements: shown, rendered, omitted } = presentElements(pool, redact);
|
|
121
|
+
let diffText = '';
|
|
122
|
+
let diffPayload;
|
|
123
|
+
if (diff && prev) {
|
|
124
|
+
const added = parsed.elements.filter((e) => !prev.signatures.has(signature(e)));
|
|
125
|
+
const removed = [...prev.signatures].filter((s) => !newSigs.has(s));
|
|
126
|
+
const addedShown = presentElements(added, redact).elements;
|
|
127
|
+
diffPayload = { added: addedShown.map((e) => e.ref + ' ' + (e.label ?? e.text ?? e.role)), removed };
|
|
128
|
+
diffText = `\nDIFF vs previous: +${added.length} / -${removed.length}\n` + renderElements(addedShown);
|
|
129
|
+
}
|
|
130
|
+
// persist for inspect + next diff (fullByRef keeps raw nodes; masking happens on emit)
|
|
131
|
+
session.lastSnapshot = { fullByRef: parsed.fullByRef, signatures: newSigs, allNodes: parsed.allNodes };
|
|
132
|
+
// Auth-state awareness (P1.5): note login screens; the FIRST screen seen sets authedAtStart.
|
|
133
|
+
const auth = detectAuthScreen(parsed.allNodes);
|
|
134
|
+
if (session.auth.authedAtStart === undefined)
|
|
135
|
+
sessions.markAuth(session, { authedAtStart: !auth.isLoginScreen });
|
|
136
|
+
if (auth.isLoginScreen && !session.auth.loginScreenSeen)
|
|
137
|
+
sessions.markAuth(session, { loginScreenSeen: true, loginScreenSeenAt: Date.now() });
|
|
138
|
+
// Overlay awareness (CR4): tree overlays (LogBox/dialog/snackbar) + keyboard + foreground class.
|
|
139
|
+
const overlays = detectTreeOverlays(parsed.allNodes, parsed.screen);
|
|
140
|
+
// IME + foreground in parallel; when the dump's root package IS the app under test, the
|
|
141
|
+
// heavy `dumpsys activity activities` is skipped (classifyForeground returns null for it).
|
|
142
|
+
const rootPkg = dumpRootPackage(parsed.allNodes);
|
|
143
|
+
const [imeUp, foreground] = await Promise.all([
|
|
144
|
+
driver.imeShown().catch(() => false),
|
|
145
|
+
session.appId && rootPkg === session.appId ? Promise.resolve(rootPkg) : driver.foregroundOwner().catch(() => 'unknown'),
|
|
146
|
+
]);
|
|
147
|
+
if (imeUp)
|
|
148
|
+
overlays.push({ type: 'keyboard', detail: 'soft keyboard shown' });
|
|
149
|
+
const fgOverlay = classifyForeground(session.appId, foreground);
|
|
150
|
+
if (fgOverlay)
|
|
151
|
+
overlays.push(fgOverlay);
|
|
152
|
+
const q = parsed.quality;
|
|
153
|
+
const header = (rehydrated ? rehydrateNote(session) + '\n' : '') +
|
|
154
|
+
(modeRecovered ? 'mode: structured again (a UI tree dump succeeded; visual-fallback cleared)\n' : '') +
|
|
155
|
+
`quality=${q.verdict} (${q.reasons.join('; ')})\n` +
|
|
156
|
+
`screen=${parsed.screen[0]}x${parsed.screen[1]} elements=${parsed.elements.length}${f ? ` (filter "${filter}" matched ${pool.length})` : ''} totalNodes=${parsed.total}` +
|
|
157
|
+
(overlays.length ? `\noverlays: ${overlays.map((o) => o.type).join(', ')} (clear with qa_clear_overlay)` : '');
|
|
158
|
+
return qaOk({
|
|
159
|
+
...(modeRecovered ? { modeRecovered: true, mode: 'structured' } : {}),
|
|
160
|
+
quality: q.verdict,
|
|
161
|
+
qualityReasons: q.reasons,
|
|
162
|
+
qualitySignals: q.signals,
|
|
163
|
+
screen: parsed.screen,
|
|
164
|
+
elementCount: parsed.elements.length,
|
|
165
|
+
...(f ? { filter, filterMatches: pool.length } : {}),
|
|
166
|
+
elementsOmitted: omitted,
|
|
167
|
+
totalNodes: parsed.total,
|
|
168
|
+
overlays,
|
|
169
|
+
elements: shown,
|
|
170
|
+
...(diffPayload ? { diff: diffPayload } : {}),
|
|
171
|
+
}, `${header}\n\n${rendered}${diffText}`, { textOmit: ['elements', 'diff'] });
|
|
172
|
+
});
|
|
140
173
|
});
|
|
141
174
|
server.registerTool('qa_inspect', {
|
|
142
175
|
title: 'Inspect one element',
|
|
@@ -144,12 +177,16 @@ export function registerSnapshot(server, sessions) {
|
|
|
144
177
|
inputSchema: { sessionId: z.string(), ref: z.string().describe('e.g. "@e3"') },
|
|
145
178
|
}, async ({ sessionId, ref }) => {
|
|
146
179
|
const session = sessions.get(sessionId);
|
|
147
|
-
|
|
148
|
-
|
|
180
|
+
if (!session) {
|
|
181
|
+
return unknownSessionError(sessionId);
|
|
182
|
+
}
|
|
183
|
+
const node = session.lastSnapshot?.fullByRef.get(ref);
|
|
184
|
+
if (!node) {
|
|
149
185
|
return qaError({
|
|
150
186
|
what: `No element ${ref} in the latest snapshot`,
|
|
151
187
|
changedState: false,
|
|
152
188
|
retrySafe: true,
|
|
189
|
+
failureCode: 'STALE_REF',
|
|
153
190
|
nextSteps: ['Run qa_snapshot first; refs invalidate after navigation.'],
|
|
154
191
|
});
|
|
155
192
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/tools/snapshot.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/tools/snapshot.ts"],"names":[],"mappings":"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"}
|