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