swipium 1.3.0 → 1.5.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 +142 -0
- package/README.md +89 -25
- package/THREAT_MODEL.md +1 -1
- package/dist/appMap/automationLink.js +13 -3
- package/dist/appMap/automationLink.js.map +1 -1
- package/dist/appMap/build.js +28 -6
- package/dist/appMap/build.js.map +1 -1
- package/dist/appMap/codeIndex.js +29 -3
- package/dist/appMap/codeIndex.js.map +1 -1
- package/dist/appMap/featureIndex.js +20 -2
- package/dist/appMap/featureIndex.js.map +1 -1
- package/dist/appMap/featureModel.js +42 -6
- package/dist/appMap/featureModel.js.map +1 -1
- package/dist/appMap/firstRunApply.js +22 -4
- 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 +0 -20
- package/dist/appMap/issues.js.map +1 -1
- package/dist/appMap/migrations.js +1 -1
- package/dist/appMap/migrations.js.map +1 -1
- package/dist/appMap/prelaunch.js.map +1 -1
- package/dist/appMap/projectRegistry.js +8 -2
- package/dist/appMap/projectRegistry.js.map +1 -1
- package/dist/appMap/query.js +20 -4
- package/dist/appMap/query.js.map +1 -1
- package/dist/appMap/runtimeMerge.js +9 -2
- package/dist/appMap/runtimeMerge.js.map +1 -1
- package/dist/appMap/schema.js.map +1 -1
- package/dist/appMap/screenMatch.js +5 -1
- package/dist/appMap/screenMatch.js.map +1 -1
- package/dist/appMap/staticScan.js +134 -22
- package/dist/appMap/staticScan.js.map +1 -1
- package/dist/appMap/store.js +4 -79
- package/dist/appMap/store.js.map +1 -1
- package/dist/appMap/tsAstScan.js +31 -9
- package/dist/appMap/tsAstScan.js.map +1 -1
- package/dist/artifacts/bundletool.js +44 -7
- package/dist/artifacts/bundletool.js.map +1 -1
- package/dist/artifacts/resolve.js +33 -6
- package/dist/artifacts/resolve.js.map +1 -1
- package/dist/automation/capabilities.js +109 -27
- package/dist/automation/capabilities.js.map +1 -1
- package/dist/automation/gestures.js +5 -1
- package/dist/automation/gestures.js.map +1 -1
- package/dist/automation/plan.js +65 -17
- package/dist/automation/plan.js.map +1 -1
- package/dist/automation/report.js +12 -2
- package/dist/automation/report.js.map +1 -1
- package/dist/automation/selectors.js +8 -3
- package/dist/automation/selectors.js.map +1 -1
- package/dist/automation/types.js.map +1 -1
- package/dist/automation/waits.js +9 -3
- package/dist/automation/waits.js.map +1 -1
- package/dist/automation/webview.js +7 -1
- package/dist/automation/webview.js.map +1 -1
- package/dist/automationGen/appiumModel.js +3 -1
- package/dist/automationGen/appiumModel.js.map +1 -1
- package/dist/automationGen/ciEmitter.js +1 -1
- package/dist/automationGen/ciEmitter.js.map +1 -1
- package/dist/automationGen/jsEmitter.js +29 -21
- package/dist/automationGen/jsEmitter.js.map +1 -1
- package/dist/automationGen/projectProfile.js +5 -1
- package/dist/automationGen/projectProfile.js.map +1 -1
- package/dist/automationGen/pythonEmitter.js +3 -3
- package/dist/automationGen/pythonEmitter.js.map +1 -1
- package/dist/automationGen/readmeEmitter.js.map +1 -1
- package/dist/automationGen/suitePlan.js +11 -6
- package/dist/automationGen/suitePlan.js.map +1 -1
- package/dist/automationGen/validation.js +33 -5
- package/dist/automationGen/validation.js.map +1 -1
- package/dist/build/parseBuildLog.js +234 -30
- package/dist/build/parseBuildLog.js.map +1 -1
- package/dist/build/plan.js +33 -12
- package/dist/build/plan.js.map +1 -1
- package/dist/ci/preflight.js.map +1 -1
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/scan.js +1 -1
- package/dist/cli/scan.js.map +1 -1
- package/dist/cli/suite.js +2 -2
- package/dist/cli/suite.js.map +1 -1
- package/dist/cli/verify.js.map +1 -1
- package/dist/context/detect.js +10 -4
- package/dist/context/detect.js.map +1 -1
- package/dist/context/findApps.js +16 -2
- package/dist/context/findApps.js.map +1 -1
- package/dist/context/scan.js.map +1 -1
- package/dist/core/target.js +7 -5
- package/dist/core/target.js.map +1 -1
- package/dist/core/targetPlan.js +135 -17
- package/dist/core/targetPlan.js.map +1 -1
- package/dist/drivers/DirectDriver.js +17 -7
- package/dist/drivers/DirectDriver.js.map +1 -1
- package/dist/drivers/SimctlDriver.js +4 -1
- package/dist/drivers/SimctlDriver.js.map +1 -1
- package/dist/drivers/WdaDriver.js +15 -5
- package/dist/drivers/WdaDriver.js.map +1 -1
- package/dist/explore/candidates.js +5 -1
- package/dist/explore/candidates.js.map +1 -1
- package/dist/explore/graph.js +11 -2
- 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 +6 -1
- package/dist/explore/policy.js.map +1 -1
- package/dist/explore/runner.js +179 -23
- package/dist/explore/runner.js.map +1 -1
- package/dist/explore/signatures.js +3 -1
- 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 +128 -19
- package/dist/featureTesting/executionBootstrap.js.map +1 -1
- package/dist/featureTesting/featureMap.js +4 -1
- package/dist/featureTesting/featureMap.js.map +1 -1
- package/dist/featureTesting/featureScope.js +94 -13
- package/dist/featureTesting/featureScope.js.map +1 -1
- package/dist/featureTesting/mapFeatureScope.js +37 -8
- package/dist/featureTesting/mapFeatureScope.js.map +1 -1
- package/dist/featureTesting/objectiveModel.js +5 -1
- package/dist/featureTesting/objectiveModel.js.map +1 -1
- package/dist/featureTesting/resultMerge.js +10 -2
- package/dist/featureTesting/resultMerge.js.map +1 -1
- package/dist/featureTesting/sources.js +4 -1
- package/dist/featureTesting/sources.js.map +1 -1
- package/dist/featureTesting/suiteBridge.js +7 -1
- package/dist/featureTesting/suiteBridge.js.map +1 -1
- package/dist/featureTesting/synonyms.js +31 -3
- package/dist/featureTesting/synonyms.js.map +1 -1
- package/dist/featureTesting/testCaseFactory.js +16 -4
- package/dist/featureTesting/testCaseFactory.js.map +1 -1
- package/dist/featureTesting/testPlan.js +32 -10
- package/dist/featureTesting/testPlan.js.map +1 -1
- package/dist/firstRun/classifyScreen.js +4 -1
- package/dist/firstRun/classifyScreen.js.map +1 -1
- package/dist/firstRun/firstRunPlanner.js +5 -2
- package/dist/firstRun/firstRunPlanner.js.map +1 -1
- package/dist/firstRun/firstRunRunner.js +84 -23
- package/dist/firstRun/firstRunRunner.js.map +1 -1
- package/dist/firstRun/generatedDataPolicy.js +16 -6
- package/dist/firstRun/generatedDataPolicy.js.map +1 -1
- package/dist/firstRun/inputPlanner.js +40 -6
- package/dist/firstRun/inputPlanner.js.map +1 -1
- package/dist/firstRun/paywallPolicy.js.map +1 -1
- package/dist/fixtures/catalog.js +39 -6
- package/dist/fixtures/catalog.js.map +1 -1
- package/dist/flows/generate.js +53 -12
- 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 +18 -2
- package/dist/flows/pack.js.map +1 -1
- package/dist/flows/repair.js +71 -20
- package/dist/flows/repair.js.map +1 -1
- package/dist/flows/run.js +164 -51
- package/dist/flows/run.js.map +1 -1
- package/dist/flows/schema.js +57 -20
- package/dist/flows/schema.js.map +1 -1
- package/dist/flows/seedExec.js +5 -1
- package/dist/flows/seedExec.js.map +1 -1
- package/dist/ios/signing.js +32 -3
- package/dist/ios/signing.js.map +1 -1
- package/dist/issues/classify.js +12 -4
- package/dist/issues/classify.js.map +1 -1
- package/dist/issues/fingerprint.js +11 -5
- package/dist/issues/fingerprint.js.map +1 -1
- package/dist/issues/index.js +4 -20
- package/dist/issues/index.js.map +1 -1
- package/dist/issues/metrics.js +2 -1
- package/dist/issues/metrics.js.map +1 -1
- package/dist/issues/recurrence.js.map +1 -1
- package/dist/issues/report.js +8 -4
- package/dist/issues/report.js.map +1 -1
- package/dist/issues/reportBridge.js +36 -5
- package/dist/issues/reportBridge.js.map +1 -1
- package/dist/issues/schema.js.map +1 -1
- package/dist/issues/store.js.map +1 -1
- package/dist/lib/android.js +9 -1
- package/dist/lib/android.js.map +1 -1
- package/dist/lib/device.js +21 -5
- package/dist/lib/device.js.map +1 -1
- package/dist/lib/image.js +11 -2
- package/dist/lib/image.js.map +1 -1
- package/dist/lib/lockfile.js +60 -0
- package/dist/lib/lockfile.js.map +1 -0
- package/dist/lib/needsInput.js +6 -3
- package/dist/lib/needsInput.js.map +1 -1
- package/dist/lib/png.js +2 -1
- package/dist/lib/png.js.map +1 -1
- package/dist/lib/result.js +16 -1
- package/dist/lib/result.js.map +1 -1
- package/dist/lib/schemaHash.js +4 -2
- package/dist/lib/schemaHash.js.map +1 -1
- package/dist/lib/sensitive.js +3 -1
- package/dist/lib/sensitive.js.map +1 -1
- package/dist/lib/simctl.js.map +1 -1
- package/dist/lib/spawn.js +29 -10
- package/dist/lib/spawn.js.map +1 -1
- package/dist/lib/wda.js +27 -10
- 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 +141 -19
- package/dist/mobileAudit/checks.js.map +1 -1
- package/dist/mobileAudit/profiles.js +120 -19
- package/dist/mobileAudit/profiles.js.map +1 -1
- package/dist/mobileAudit/results.js +7 -2
- package/dist/mobileAudit/results.js.map +1 -1
- package/dist/mobileAudit/runner.js +144 -19
- package/dist/mobileAudit/runner.js.map +1 -1
- package/dist/oracle/auth.js.map +1 -1
- package/dist/oracle/failures.js +888 -131
- package/dist/oracle/failures.js.map +1 -1
- package/dist/oracle/health.js +90 -14
- package/dist/oracle/health.js.map +1 -1
- package/dist/oracle/locator.js +147 -18
- package/dist/oracle/locator.js.map +1 -1
- package/dist/oracle/record.js.map +1 -1
- package/dist/orchestration/goal.js +3 -9
- package/dist/orchestration/goal.js.map +1 -1
- package/dist/orchestration/testThis/execute.js +126 -0
- package/dist/orchestration/testThis/execute.js.map +1 -0
- package/dist/orchestration/testThis/pipeline.js +324 -0
- package/dist/orchestration/testThis/pipeline.js.map +1 -0
- package/dist/orchestration/testThis/plan.js +430 -0
- package/dist/orchestration/testThis/plan.js.map +1 -0
- package/dist/orchestration/testThis/terminal.js +118 -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.map +1 -1
- package/dist/prompts/index.js +3 -3
- 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 +59 -37
- package/dist/report/export.js.map +1 -1
- 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 +11 -3
- package/dist/report/policy.js.map +1 -1
- package/dist/report/qaLevel.js +2 -8
- 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/summary.js.map +1 -1
- package/dist/report/timing.js +23 -23
- package/dist/report/timing.js.map +1 -1
- package/dist/server.js +42 -37
- package/dist/server.js.map +1 -1
- package/dist/services/automationGenerate.js.map +1 -1
- package/dist/services/build.js +8 -2
- package/dist/services/build.js.map +1 -1
- package/dist/services/preflight.js +38 -6
- package/dist/services/preflight.js.map +1 -1
- package/dist/services/prepareAndroid.js +46 -10
- package/dist/services/prepareAndroid.js.map +1 -1
- package/dist/services/prepareIos.js +72 -10
- package/dist/services/prepareIos.js.map +1 -1
- package/dist/services/report.js +173 -37
- package/dist/services/report.js.map +1 -1
- package/dist/services/smoke.js +36 -6
- package/dist/services/smoke.js.map +1 -1
- package/dist/services/suiteGenerate.js +16 -4
- package/dist/services/suiteGenerate.js.map +1 -1
- package/dist/services/testSuiteKnowledge.js +38 -6
- package/dist/services/testSuiteKnowledge.js.map +1 -1
- package/dist/session/attach.js +16 -0
- package/dist/session/attach.js.map +1 -1
- package/dist/session/processRegistry.js +164 -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/store.js +216 -43
- package/dist/session/store.js.map +1 -1
- package/dist/snapshot/overlays.js +7 -2
- package/dist/snapshot/overlays.js.map +1 -1
- package/dist/snapshot/parse.js +2 -8
- package/dist/snapshot/parse.js.map +1 -1
- package/dist/snapshot/present.js +27 -3
- package/dist/snapshot/present.js.map +1 -1
- package/dist/state/profile.js +36 -9
- package/dist/state/profile.js.map +1 -1
- package/dist/suite/compile.js +7 -2
- package/dist/suite/compile.js.map +1 -1
- package/dist/suite/lint.js +21 -3
- package/dist/suite/lint.js.map +1 -1
- package/dist/suite/pom.js +26 -4
- package/dist/suite/pom.js.map +1 -1
- package/dist/suite/testcase.js +6 -4
- package/dist/suite/testcase.js.map +1 -1
- package/dist/testSuite/exporter.js +6 -2
- package/dist/testSuite/exporter.js.map +1 -1
- package/dist/testSuite/generator.js +31 -6
- package/dist/testSuite/generator.js.map +1 -1
- package/dist/testSuite/issueLinks.js.map +1 -1
- package/dist/testSuite/lint.js +1 -1
- package/dist/testSuite/lint.js.map +1 -1
- package/dist/testSuite/merge.js +8 -2
- package/dist/testSuite/merge.js.map +1 -1
- package/dist/testSuite/schema.js +16 -11
- package/dist/testSuite/schema.js.map +1 -1
- package/dist/testSuite/store.js +9 -1
- package/dist/testSuite/store.js.map +1 -1
- package/dist/tools/act.js +107 -43
- package/dist/tools/act.js.map +1 -1
- package/dist/tools/agent.js +123 -25
- package/dist/tools/agent.js.map +1 -1
- package/dist/tools/appControl.js +16 -3
- package/dist/tools/appControl.js.map +1 -1
- package/dist/tools/appMap.js +331 -63
- package/dist/tools/appMap.js.map +1 -1
- package/dist/tools/assertVisual.js +12 -2
- package/dist/tools/assertVisual.js.map +1 -1
- package/dist/tools/automationGenerate.js +276 -241
- package/dist/tools/automationGenerate.js.map +1 -1
- package/dist/tools/build.js +92 -41
- package/dist/tools/build.js.map +1 -1
- package/dist/tools/bundletool.js +139 -28
- package/dist/tools/bundletool.js.map +1 -1
- package/dist/tools/capabilities.js +45 -71
- package/dist/tools/capabilities.js.map +1 -1
- package/dist/tools/clearOverlay.js +45 -8
- package/dist/tools/clearOverlay.js.map +1 -1
- package/dist/tools/detectContext.js +1 -1
- package/dist/tools/detectContext.js.map +1 -1
- package/dist/tools/device.js +44 -7
- package/dist/tools/device.js.map +1 -1
- package/dist/tools/doctor.js +38 -15
- package/dist/tools/doctor.js.map +1 -1
- package/dist/tools/explore.js +96 -22
- package/dist/tools/explore.js.map +1 -1
- package/dist/tools/featureTesting.js +153 -114
- package/dist/tools/featureTesting.js.map +1 -1
- package/dist/tools/firstRun.js +95 -60
- package/dist/tools/firstRun.js.map +1 -1
- package/dist/tools/flow.js +236 -101
- package/dist/tools/flow.js.map +1 -1
- package/dist/tools/flowGenerate.js +51 -47
- package/dist/tools/flowGenerate.js.map +1 -1
- package/dist/tools/flowRepair.js +24 -4
- package/dist/tools/flowRepair.js.map +1 -1
- package/dist/tools/generate.js +236 -0
- package/dist/tools/generate.js.map +1 -0
- package/dist/tools/getArtifact.js +21 -3
- package/dist/tools/getArtifact.js.map +1 -1
- package/dist/tools/health.js +3 -1
- package/dist/tools/health.js.map +1 -1
- package/dist/tools/history.js +40 -10
- package/dist/tools/history.js.map +1 -1
- package/dist/tools/ios.js +157 -25
- package/dist/tools/ios.js.map +1 -1
- package/dist/tools/issues.js +19 -150
- package/dist/tools/issues.js.map +1 -1
- package/dist/tools/jobs.js +23 -4
- package/dist/tools/jobs.js.map +1 -1
- package/dist/tools/locator.js +36 -8
- package/dist/tools/locator.js.map +1 -1
- package/dist/tools/metro.js +61 -16
- package/dist/tools/metro.js.map +1 -1
- package/dist/tools/mobileAudit.js +67 -15
- package/dist/tools/mobileAudit.js.map +1 -1
- package/dist/tools/network.js +6 -1
- package/dist/tools/network.js.map +1 -1
- package/dist/tools/note.js +20 -6
- package/dist/tools/note.js.map +1 -1
- package/dist/tools/permissions.js +31 -6
- package/dist/tools/permissions.js.map +1 -1
- package/dist/tools/plan.js +5 -2
- package/dist/tools/plan.js.map +1 -1
- package/dist/tools/prepareIosTarget.js +31 -8
- package/dist/tools/prepareIosTarget.js.map +1 -1
- package/dist/tools/prepareTarget.js +97 -18
- package/dist/tools/prepareTarget.js.map +1 -1
- package/dist/tools/report.js +24 -5
- package/dist/tools/report.js.map +1 -1
- package/dist/tools/resolveArtifact.js +9 -5
- package/dist/tools/resolveArtifact.js.map +1 -1
- package/dist/tools/resolveTarget.js +11 -2
- package/dist/tools/resolveTarget.js.map +1 -1
- package/dist/tools/screenInfo.js +8 -2
- package/dist/tools/screenInfo.js.map +1 -1
- package/dist/tools/screenRecord.js +74 -11
- package/dist/tools/screenRecord.js.map +1 -1
- package/dist/tools/screenshot.js +23 -6
- package/dist/tools/screenshot.js.map +1 -1
- package/dist/tools/seed.js +38 -6
- package/dist/tools/seed.js.map +1 -1
- package/dist/tools/smoke.js +16 -3
- package/dist/tools/smoke.js.map +1 -1
- package/dist/tools/snapshot.js +59 -6
- package/dist/tools/snapshot.js.map +1 -1
- package/dist/tools/startSession.js +54 -9
- package/dist/tools/startSession.js.map +1 -1
- package/dist/tools/state.js +62 -15
- package/dist/tools/state.js.map +1 -1
- package/dist/tools/suite.js +350 -298
- package/dist/tools/suite.js.map +1 -1
- package/dist/tools/testSuite.js +94 -28
- package/dist/tools/testSuite.js.map +1 -1
- package/dist/tools/testThis.js +30 -793
- package/dist/tools/testThis.js.map +1 -1
- package/dist/tools/visual.js +124 -18
- package/dist/tools/visual.js.map +1 -1
- package/dist/tools/visualText.js +51 -6
- package/dist/tools/visualText.js.map +1 -1
- package/dist/tools/wait.js +18 -3
- package/dist/tools/wait.js.map +1 -1
- package/dist/tools/wda.js +157 -29
- package/dist/tools/wda.js.map +1 -1
- package/dist/version.js +17 -49
- package/dist/version.js.map +1 -1
- package/dist/visual/ocr.js +12 -2
- package/dist/visual/ocr.js.map +1 -1
- package/dist/visual/provider.js +7 -3
- package/dist/visual/provider.js.map +1 -1
- package/docs/mcp-server.md +44 -4
- package/docs/tools.md +42 -100
- package/package.json +14 -5
- 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/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/maestro.js +0 -78
- package/dist/tools/maestro.js.map +0 -1
package/dist/tools/firstRun.js
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
// SWIPIUM-REQ-02 — first-run MCP
|
|
2
|
-
//
|
|
3
|
-
//
|
|
1
|
+
// SWIPIUM-REQ-02 — first-run MCP tool (1.5.0 consolidation: the former plan/continue
|
|
2
|
+
// twins are one qa_first_run with a mode enum).
|
|
3
|
+
// mode:"plan" read-only: classify the current screen + return the safe plan (no acting).
|
|
4
|
+
// mode:"continue" execute one bounded step or a bounded first-run sequence (until-driven).
|
|
4
5
|
//
|
|
5
6
|
// These drive the pure planning layer (src/firstRun/*) and the bounded driver loop (firstRunRunner).
|
|
6
7
|
// Secrets (generated passwords) are added to the session redaction set and never appear in output;
|
|
7
8
|
// generated emails are recorded as evidence so a developer can reproduce the throwaway account.
|
|
8
9
|
import { z } from 'zod';
|
|
9
|
-
import { qaOk, qaError } from '../lib/result.js';
|
|
10
|
+
import { qaOk, qaError, qaAnnotate } from '../lib/result.js';
|
|
10
11
|
import { qaNeedsInput, NeedsInput } from '../lib/needsInput.js';
|
|
11
12
|
import { getDriver } from '../session/attach.js';
|
|
12
13
|
import { planFirstRun } from '../firstRun/firstRunPlanner.js';
|
|
@@ -19,69 +20,92 @@ function needsInputPayload(kind, reason) {
|
|
|
19
20
|
return NeedsInput.credentials(reason);
|
|
20
21
|
}
|
|
21
22
|
export function registerFirstRun(server, sessions) {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
description: 'Read-only. Classifies the CURRENT screen of a launched app (login / create-account / login-or-create / OTP / onboarding / permissions / paywall / home / feature / error) using the UI snapshot + visible text + app-map/code context, then returns the SAFE first-run plan WITHOUT acting: the classification + confidence + evidence, the required inputs, the planned actions, the environment classification, and whether safe generated-account creation is allowed here. No taps, no typing, no secrets. Requires a prepared device (qa_test_this / qa_prepare_target first). To actually execute the plan, call qa_first_run_continue.',
|
|
23
|
+
server.registerTool('qa_first_run', {
|
|
24
|
+
title: 'First run: plan or continue through login/onboarding',
|
|
25
|
+
description: 'USE WHEN the app opens on a first-run gate (login / create-account / OTP / onboarding / permissions / paywall) and you need to get past it safely. mode:"plan" (default) is READ-ONLY: classify the current screen and return the safe plan without acting; mode:"continue" executes bounded first-run steps with safe generated test data where policy allows, and returns ONE NeedsInput question when it will not act (production-like environment, OTP/verification). Requires a prepared device (qa_test_this / qa_prepare_target first). Returns classification + confidence + evidence, actions taken (secrets redacted), resulting state, appMapPatch, evidence URIs, and the next recommended tool.',
|
|
26
26
|
inputSchema: {
|
|
27
27
|
sessionId: z.string(),
|
|
28
|
-
|
|
28
|
+
mode: z
|
|
29
|
+
.enum(['plan', 'continue'])
|
|
30
|
+
.optional()
|
|
31
|
+
.describe('plan (default): READ-ONLY — classify the CURRENT screen (login/create-account/login-or-create/OTP/onboarding/permissions/paywall/home/feature/error) from the UI snapshot + visible text + app-map/code context, and return the safe plan: required inputs, planned actions, environment classification, and whether generated-account creation is allowed here; no taps, no typing, no secrets. continue: EXECUTE the plan like a practical QA engineer — in a TEST/STAGING environment it fills login/create-account forms with generated data (email swipium_<timestamp>@yopmail.com + a strong password stored as a secret), moves through onboarding via safe Next/Continue/Skip, records paywall coverage WITHOUT purchasing, and hands permission prompts to the guardrails; it refuses automatic account creation in unknown/production-like environments and stops with NeedsInput on OTP/verification. Bounded by `until`.'),
|
|
32
|
+
until: z
|
|
33
|
+
.enum(['one_step', 'until_gate', 'until_home'])
|
|
34
|
+
.optional()
|
|
35
|
+
.describe('(mode:"continue" only) How far to run: one_step (default) handles one screen; until_gate runs until a paywall/OTP/permission gate; until_home runs until home/feature.'),
|
|
36
|
+
allowGeneratedAccount: z
|
|
37
|
+
.boolean()
|
|
38
|
+
.optional()
|
|
39
|
+
.describe('Override the policy decision on creating a throwaway account (true to allow, false to forbid).'),
|
|
29
40
|
testDataPolicyPath: z.string().optional().describe('Path to a test-data policy JSON (default .swipium/test-data-policy.json).'),
|
|
41
|
+
maxSteps: z.number().optional().describe('(mode:"continue" only) Hard cap on executed steps.'),
|
|
42
|
+
maxDurationMs: z.number().optional().describe('(mode:"continue" only) Hard cap on execution time.'),
|
|
30
43
|
},
|
|
31
|
-
}, async ({ sessionId, allowGeneratedAccount, testDataPolicyPath }) => {
|
|
44
|
+
}, async ({ sessionId, mode, until, allowGeneratedAccount, testDataPolicyPath, maxSteps, maxDurationMs }) => {
|
|
45
|
+
const effectiveMode = mode ?? 'plan';
|
|
46
|
+
const notes = [];
|
|
32
47
|
const session = sessions.get(sessionId);
|
|
33
48
|
if (!session)
|
|
34
|
-
return qaError({
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
const plan = planFirstRun({ ...obs, screenSignature: obs.screenSignature, appError: obs.appError }, session, { policy, decision });
|
|
41
|
-
const summary = `🔎 first-run plan — screen: ${plan.classification.purpose} (confidence ${plan.classification.confidence})\n` +
|
|
42
|
-
`environment: ${environment.environment} (prodRisk=${environment.productionRisk}); generated account ${decision.allowed ? 'ALLOWED' : 'NOT allowed'} — ${decision.reason}\n` +
|
|
43
|
-
`state: ${plan.state}${plan.pathTaken ? ` [${plan.pathTaken}]` : ''}; planned actions: ${plan.actions.length}` +
|
|
44
|
-
(plan.needsInput ? `\n❓ ${plan.needsInput.reason}` : '') +
|
|
45
|
-
`\n→ execute with qa_first_run_continue { sessionId:"${session.id}", mode:"one_step" }`;
|
|
46
|
-
return qaOk({
|
|
47
|
-
sessionId: session.id,
|
|
48
|
-
classification: plan.classification,
|
|
49
|
-
state: plan.state,
|
|
50
|
-
pathTaken: plan.pathTaken,
|
|
51
|
-
actions: plan.actions, // no raw values — secrets stay in the secure store
|
|
52
|
-
expectedNextPurposes: plan.expectedNextPurposes,
|
|
53
|
-
stopConditions: plan.stopConditions,
|
|
54
|
-
appMapPatch: plan.mapUpdates,
|
|
55
|
-
environment,
|
|
56
|
-
generatedAccountDecision: decision,
|
|
57
|
-
policySource,
|
|
58
|
-
needsInput: plan.needsInput ?? null,
|
|
59
|
-
nextRecommendedTool: plan.nextRecommendedTool ?? 'qa_first_run_continue',
|
|
60
|
-
evidence: obs.screenshotUri ? [obs.screenshotUri] : [],
|
|
61
|
-
}, summary);
|
|
62
|
-
});
|
|
63
|
-
// ---- qa_first_run_continue (executes) ----
|
|
64
|
-
server.registerTool('qa_first_run_continue', {
|
|
65
|
-
title: 'First-run continue (execute)',
|
|
66
|
-
description: 'Executes the first-run plan as a practical QA engineer: classifies each screen and, in a TEST/STAGING environment, safely fills login/create-account forms with generated data (email swipium_<timestamp>@yopmail.com + a strong password stored as a secret), moves through onboarding via safe Next/Continue/Skip, records paywall coverage WITHOUT purchasing, and hands permission prompts to the guardrails. mode: one_step (one screen) | until_gate (until a paywall/OTP/permission gate) | until_home (until home/feature). Refuses automatic account creation in unknown/production-like environments and returns ONE NeedsInput question instead. Stops with NeedsInput on OTP/verification. Returns screen classifications, generated variables (secrets redacted), actions attempted, the resulting state, an appMapPatch, evidence URIs, and the next recommended tool. Requires a prepared device.',
|
|
67
|
-
inputSchema: {
|
|
68
|
-
sessionId: z.string(),
|
|
69
|
-
mode: z.enum(['one_step', 'until_gate', 'until_home']).optional().describe('one_step (default): one screen; until_gate: until a paywall/OTP/permission gate; until_home: until home/feature.'),
|
|
70
|
-
allowGeneratedAccount: z.boolean().optional().describe('Override the policy decision on creating a throwaway account.'),
|
|
71
|
-
testDataPolicyPath: z.string().optional().describe('Path to a test-data policy JSON (default .swipium/test-data-policy.json).'),
|
|
72
|
-
maxSteps: z.number().optional(),
|
|
73
|
-
maxDurationMs: z.number().optional(),
|
|
74
|
-
},
|
|
75
|
-
}, async ({ sessionId, mode, allowGeneratedAccount, testDataPolicyPath, maxSteps, maxDurationMs }) => {
|
|
76
|
-
const session = sessions.get(sessionId);
|
|
77
|
-
if (!session)
|
|
78
|
-
return qaError({ what: `Unknown sessionId ${sessionId}`, changedState: false, retrySafe: true, nextSteps: ['Call qa_start_session first.'] });
|
|
49
|
+
return qaError({
|
|
50
|
+
what: `Unknown sessionId ${sessionId}`,
|
|
51
|
+
changedState: false,
|
|
52
|
+
retrySafe: true,
|
|
53
|
+
nextSteps: ['Call qa_start_session first.'],
|
|
54
|
+
});
|
|
79
55
|
const { driver } = await getDriver(session);
|
|
80
56
|
if (!driver)
|
|
81
|
-
return qaError({
|
|
57
|
+
return qaError({
|
|
58
|
+
what: 'No device attached to this session',
|
|
59
|
+
changedState: false,
|
|
60
|
+
retrySafe: true,
|
|
61
|
+
nextSteps: [
|
|
62
|
+
`Prepare a device first: qa_test_this { mode:"execute" } or qa_prepare_target, then qa_first_run { mode:"${effectiveMode}" }.`,
|
|
63
|
+
],
|
|
64
|
+
});
|
|
65
|
+
// ---- mode:"plan" — read-only (merged twin, 1.5.0). ----
|
|
66
|
+
if (effectiveMode === 'plan') {
|
|
67
|
+
const ignored = [
|
|
68
|
+
until !== undefined && 'until',
|
|
69
|
+
maxSteps !== undefined && 'maxSteps',
|
|
70
|
+
maxDurationMs !== undefined && 'maxDurationMs',
|
|
71
|
+
].filter((x) => !!x);
|
|
72
|
+
if (ignored.length)
|
|
73
|
+
notes.push(`ignored parameter(s) not applicable to mode:"plan": ${ignored.join(', ')} — re-run with mode:"continue" to execute`);
|
|
74
|
+
const { policy, policySource, environment, decision } = resolveFirstRunPolicy(session, {
|
|
75
|
+
testDataPolicyPath,
|
|
76
|
+
allowGeneratedAccount,
|
|
77
|
+
});
|
|
78
|
+
const obs = await observeScreen(sessions, session, driver);
|
|
79
|
+
const plan = planFirstRun({ ...obs, screenSignature: obs.screenSignature, appError: obs.appError }, session, { policy, decision });
|
|
80
|
+
const summary = `🔎 first-run plan — screen: ${plan.classification.purpose} (confidence ${plan.classification.confidence})\n` +
|
|
81
|
+
`environment: ${environment.environment} (prodRisk=${environment.productionRisk}); generated account ${decision.allowed ? 'ALLOWED' : 'NOT allowed'} — ${decision.reason}\n` +
|
|
82
|
+
`state: ${plan.state}${plan.pathTaken ? ` [${plan.pathTaken}]` : ''}; planned actions: ${plan.actions.length}` +
|
|
83
|
+
(plan.needsInput ? `\n❓ ${plan.needsInput.reason}` : '') +
|
|
84
|
+
`\n→ execute with qa_first_run { sessionId:"${session.id}", mode:"continue", until:"one_step" }`;
|
|
85
|
+
return qaAnnotate(qaOk({
|
|
86
|
+
sessionId: session.id,
|
|
87
|
+
classification: plan.classification,
|
|
88
|
+
state: plan.state,
|
|
89
|
+
pathTaken: plan.pathTaken,
|
|
90
|
+
actions: plan.actions, // no raw values — secrets stay in the secure store
|
|
91
|
+
expectedNextPurposes: plan.expectedNextPurposes,
|
|
92
|
+
stopConditions: plan.stopConditions,
|
|
93
|
+
appMapPatch: plan.mapUpdates,
|
|
94
|
+
environment,
|
|
95
|
+
generatedAccountDecision: decision,
|
|
96
|
+
policySource,
|
|
97
|
+
needsInput: plan.needsInput ?? null,
|
|
98
|
+
nextRecommendedTool: plan.nextRecommendedTool ?? 'qa_first_run',
|
|
99
|
+
evidence: obs.screenshotUri ? [obs.screenshotUri] : [],
|
|
100
|
+
}, summary), notes);
|
|
101
|
+
}
|
|
102
|
+
// ---- mode:"continue" — execute (merged twin, 1.5.0). ----
|
|
82
103
|
const res = await runFirstRun(sessions, session, driver, {
|
|
83
|
-
mode: (
|
|
84
|
-
allowGeneratedAccount,
|
|
104
|
+
mode: (until ?? 'one_step'),
|
|
105
|
+
allowGeneratedAccount,
|
|
106
|
+
testDataPolicyPath,
|
|
107
|
+
maxSteps,
|
|
108
|
+
maxDurationMs,
|
|
85
109
|
});
|
|
86
110
|
// Fix Group 5: fold first-run classifications into the durable app map (not just a detached
|
|
87
111
|
// artifact) so a runtime login/onboarding/paywall screen updates .swipium/app-map.json.
|
|
@@ -89,7 +113,13 @@ export function registerFirstRun(server, sessions) {
|
|
|
89
113
|
if (res.mapUpdates.length) {
|
|
90
114
|
try {
|
|
91
115
|
const { buildAppMap } = await import('../appMap/build.js');
|
|
92
|
-
const built = buildAppMap(session.root, {
|
|
116
|
+
const built = buildAppMap(session.root, {
|
|
117
|
+
mode: 'runtime_merge',
|
|
118
|
+
at: new Date().toISOString(),
|
|
119
|
+
sessionId: session.id,
|
|
120
|
+
firstRunPatches: res.mapUpdates,
|
|
121
|
+
persist: true,
|
|
122
|
+
});
|
|
93
123
|
appMapUri = built.save?.resourceUri;
|
|
94
124
|
}
|
|
95
125
|
catch {
|
|
@@ -101,7 +131,12 @@ export function registerFirstRun(server, sessions) {
|
|
|
101
131
|
state: res.state,
|
|
102
132
|
stoppedReason: res.stoppedReason,
|
|
103
133
|
steps: res.steps,
|
|
104
|
-
classifications: res.steps.map((s) => ({
|
|
134
|
+
classifications: res.steps.map((s) => ({
|
|
135
|
+
purpose: s.purpose,
|
|
136
|
+
confidence: s.confidence,
|
|
137
|
+
state: s.state,
|
|
138
|
+
screenSignature: s.screenSignature,
|
|
139
|
+
})),
|
|
105
140
|
environment: res.environment,
|
|
106
141
|
generatedAccountDecision: res.decision,
|
|
107
142
|
policySource: res.policySource,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"firstRun.js","sourceRoot":"","sources":["../../src/tools/firstRun.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"firstRun.js","sourceRoot":"","sources":["../../src/tools/firstRun.ts"],"names":[],"mappings":"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"}
|