swipium 1.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/LICENSE +21 -0
- package/README.md +295 -0
- package/dist/appMap/automationLink.js +74 -0
- package/dist/appMap/automationLink.js.map +1 -0
- package/dist/appMap/build.js +193 -0
- package/dist/appMap/build.js.map +1 -0
- package/dist/appMap/codeIndex.js +73 -0
- package/dist/appMap/codeIndex.js.map +1 -0
- package/dist/appMap/featureModel.js +83 -0
- package/dist/appMap/featureModel.js.map +1 -0
- package/dist/appMap/firstRunApply.js +131 -0
- package/dist/appMap/firstRunApply.js.map +1 -0
- package/dist/appMap/fsWalk.js +75 -0
- package/dist/appMap/fsWalk.js.map +1 -0
- package/dist/appMap/issues.js +227 -0
- package/dist/appMap/issues.js.map +1 -0
- package/dist/appMap/migrations.js +87 -0
- package/dist/appMap/migrations.js.map +1 -0
- package/dist/appMap/prelaunch.js +66 -0
- package/dist/appMap/prelaunch.js.map +1 -0
- package/dist/appMap/projectRegistry.js +70 -0
- package/dist/appMap/projectRegistry.js.map +1 -0
- package/dist/appMap/provenance.js +52 -0
- package/dist/appMap/provenance.js.map +1 -0
- package/dist/appMap/query.js +118 -0
- package/dist/appMap/query.js.map +1 -0
- package/dist/appMap/runtimeMerge.js +207 -0
- package/dist/appMap/runtimeMerge.js.map +1 -0
- package/dist/appMap/schema.js +65 -0
- package/dist/appMap/schema.js.map +1 -0
- package/dist/appMap/screenMatch.js +75 -0
- package/dist/appMap/screenMatch.js.map +1 -0
- package/dist/appMap/staticScan.js +614 -0
- package/dist/appMap/staticScan.js.map +1 -0
- package/dist/appMap/store.js +173 -0
- package/dist/appMap/store.js.map +1 -0
- package/dist/appMap/tsAstScan.js +184 -0
- package/dist/appMap/tsAstScan.js.map +1 -0
- package/dist/artifacts/bundletool.js +199 -0
- package/dist/artifacts/bundletool.js.map +1 -0
- package/dist/artifacts/resolve.js +388 -0
- package/dist/artifacts/resolve.js.map +1 -0
- package/dist/automationGen/appiumModel.js +129 -0
- package/dist/automationGen/appiumModel.js.map +1 -0
- package/dist/automationGen/ciEmitter.js +80 -0
- package/dist/automationGen/ciEmitter.js.map +1 -0
- package/dist/automationGen/jsEmitter.js +440 -0
- package/dist/automationGen/jsEmitter.js.map +1 -0
- package/dist/automationGen/packagePatch.js +56 -0
- package/dist/automationGen/packagePatch.js.map +1 -0
- package/dist/automationGen/projectProfile.js +317 -0
- package/dist/automationGen/projectProfile.js.map +1 -0
- package/dist/automationGen/pythonEmitter.js +386 -0
- package/dist/automationGen/pythonEmitter.js.map +1 -0
- package/dist/automationGen/readmeEmitter.js +66 -0
- package/dist/automationGen/readmeEmitter.js.map +1 -0
- package/dist/automationGen/suitePlan.js +94 -0
- package/dist/automationGen/suitePlan.js.map +1 -0
- package/dist/automationGen/validation.js +150 -0
- package/dist/automationGen/validation.js.map +1 -0
- package/dist/build/parseBuildLog.js +119 -0
- package/dist/build/parseBuildLog.js.map +1 -0
- package/dist/build/plan.js +150 -0
- package/dist/build/plan.js.map +1 -0
- package/dist/ci/preflight.js +85 -0
- package/dist/ci/preflight.js.map +1 -0
- package/dist/cli/init.js +105 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/scan.js +85 -0
- package/dist/cli/scan.js.map +1 -0
- package/dist/cli/suite.js +85 -0
- package/dist/cli/suite.js.map +1 -0
- package/dist/cli/verify.js +62 -0
- package/dist/cli/verify.js.map +1 -0
- package/dist/consent/consent.js +43 -0
- package/dist/consent/consent.js.map +1 -0
- package/dist/context/detect.js +156 -0
- package/dist/context/detect.js.map +1 -0
- package/dist/context/findApps.js +198 -0
- package/dist/context/findApps.js.map +1 -0
- package/dist/context/projectRoot.js +41 -0
- package/dist/context/projectRoot.js.map +1 -0
- package/dist/context/scan.js +167 -0
- package/dist/context/scan.js.map +1 -0
- package/dist/core/target.js +115 -0
- package/dist/core/target.js.map +1 -0
- package/dist/core/targetPlan.js +140 -0
- package/dist/core/targetPlan.js.map +1 -0
- package/dist/drivers/DirectDriver.js +228 -0
- package/dist/drivers/DirectDriver.js.map +1 -0
- package/dist/drivers/Driver.js +4 -0
- package/dist/drivers/Driver.js.map +1 -0
- package/dist/drivers/SimctlDriver.js +127 -0
- package/dist/drivers/SimctlDriver.js.map +1 -0
- package/dist/drivers/WdaDriver.js +250 -0
- package/dist/drivers/WdaDriver.js.map +1 -0
- package/dist/explore/candidates.js +93 -0
- package/dist/explore/candidates.js.map +1 -0
- package/dist/explore/graph.js +116 -0
- package/dist/explore/graph.js.map +1 -0
- package/dist/explore/memory.js +35 -0
- package/dist/explore/memory.js.map +1 -0
- package/dist/explore/planner.js +105 -0
- package/dist/explore/planner.js.map +1 -0
- package/dist/explore/policy.js +85 -0
- package/dist/explore/policy.js.map +1 -0
- package/dist/explore/runner.js +475 -0
- package/dist/explore/runner.js.map +1 -0
- package/dist/explore/signatures.js +35 -0
- package/dist/explore/signatures.js.map +1 -0
- package/dist/explore/suite.js +55 -0
- package/dist/explore/suite.js.map +1 -0
- package/dist/featureTesting/executionBootstrap.js +140 -0
- package/dist/featureTesting/executionBootstrap.js.map +1 -0
- package/dist/firstRun/authStateMachine.js +83 -0
- package/dist/firstRun/authStateMachine.js.map +1 -0
- package/dist/firstRun/classifyScreen.js +201 -0
- package/dist/firstRun/classifyScreen.js.map +1 -0
- package/dist/firstRun/firstRunPlanner.js +207 -0
- package/dist/firstRun/firstRunPlanner.js.map +1 -0
- package/dist/firstRun/firstRunRunner.js +331 -0
- package/dist/firstRun/firstRunRunner.js.map +1 -0
- package/dist/firstRun/generatedDataPolicy.js +215 -0
- package/dist/firstRun/generatedDataPolicy.js.map +1 -0
- package/dist/firstRun/inputPlanner.js +67 -0
- package/dist/firstRun/inputPlanner.js.map +1 -0
- package/dist/firstRun/onboardingStateMachine.js +46 -0
- package/dist/firstRun/onboardingStateMachine.js.map +1 -0
- package/dist/firstRun/paywallPolicy.js +54 -0
- package/dist/firstRun/paywallPolicy.js.map +1 -0
- package/dist/firstRun/types.js +7 -0
- package/dist/firstRun/types.js.map +1 -0
- package/dist/fixtures/catalog.js +131 -0
- package/dist/fixtures/catalog.js.map +1 -0
- package/dist/flows/discover.js +18 -0
- package/dist/flows/discover.js.map +1 -0
- package/dist/flows/generate.js +211 -0
- package/dist/flows/generate.js.map +1 -0
- package/dist/flows/lint.js +97 -0
- package/dist/flows/lint.js.map +1 -0
- package/dist/flows/pack.js +68 -0
- package/dist/flows/pack.js.map +1 -0
- package/dist/flows/run.js +738 -0
- package/dist/flows/run.js.map +1 -0
- package/dist/flows/schema.js +240 -0
- package/dist/flows/schema.js.map +1 -0
- package/dist/flows/seedExec.js +108 -0
- package/dist/flows/seedExec.js.map +1 -0
- package/dist/flows/templates.js +155 -0
- package/dist/flows/templates.js.map +1 -0
- package/dist/flows/waitGuards.js +12 -0
- package/dist/flows/waitGuards.js.map +1 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/ios/signing.js +182 -0
- package/dist/ios/signing.js.map +1 -0
- package/dist/issues/classify.js +186 -0
- package/dist/issues/classify.js.map +1 -0
- package/dist/issues/fingerprint.js +130 -0
- package/dist/issues/fingerprint.js.map +1 -0
- package/dist/issues/index.js +240 -0
- package/dist/issues/index.js.map +1 -0
- package/dist/issues/metrics.js +155 -0
- package/dist/issues/metrics.js.map +1 -0
- package/dist/issues/recurrence.js +193 -0
- package/dist/issues/recurrence.js.map +1 -0
- package/dist/issues/report.js +110 -0
- package/dist/issues/report.js.map +1 -0
- package/dist/issues/reportBridge.js +119 -0
- package/dist/issues/reportBridge.js.map +1 -0
- package/dist/issues/schema.js +90 -0
- package/dist/issues/schema.js.map +1 -0
- package/dist/issues/sourceRevision.js +108 -0
- package/dist/issues/sourceRevision.js.map +1 -0
- package/dist/issues/store.js +155 -0
- package/dist/issues/store.js.map +1 -0
- package/dist/lib/android.js +278 -0
- package/dist/lib/android.js.map +1 -0
- package/dist/lib/commandTemplate.js +55 -0
- package/dist/lib/commandTemplate.js.map +1 -0
- package/dist/lib/coordSpace.js +23 -0
- package/dist/lib/coordSpace.js.map +1 -0
- package/dist/lib/device.js +87 -0
- package/dist/lib/device.js.map +1 -0
- package/dist/lib/gitignore.js +22 -0
- package/dist/lib/gitignore.js.map +1 -0
- package/dist/lib/image.js +97 -0
- package/dist/lib/image.js.map +1 -0
- package/dist/lib/logger.js +8 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/metroState.js +45 -0
- package/dist/lib/metroState.js.map +1 -0
- package/dist/lib/needsInput.js +201 -0
- package/dist/lib/needsInput.js.map +1 -0
- package/dist/lib/png.js +103 -0
- package/dist/lib/png.js.map +1 -0
- package/dist/lib/redact.js +21 -0
- package/dist/lib/redact.js.map +1 -0
- package/dist/lib/result.js +87 -0
- package/dist/lib/result.js.map +1 -0
- package/dist/lib/schemaHash.js +65 -0
- package/dist/lib/schemaHash.js.map +1 -0
- package/dist/lib/sensitive.js +13 -0
- package/dist/lib/sensitive.js.map +1 -0
- package/dist/lib/simctl.js +149 -0
- package/dist/lib/simctl.js.map +1 -0
- package/dist/lib/spawn.js +144 -0
- package/dist/lib/spawn.js.map +1 -0
- package/dist/lib/wda.js +347 -0
- package/dist/lib/wda.js.map +1 -0
- package/dist/lib/wdaConfig.js +69 -0
- package/dist/lib/wdaConfig.js.map +1 -0
- package/dist/lib/wdaTune.js +58 -0
- package/dist/lib/wdaTune.js.map +1 -0
- package/dist/oracle/auth.js +22 -0
- package/dist/oracle/auth.js.map +1 -0
- package/dist/oracle/failures.js +193 -0
- package/dist/oracle/failures.js.map +1 -0
- package/dist/oracle/health.js +123 -0
- package/dist/oracle/health.js.map +1 -0
- package/dist/oracle/record.js +36 -0
- package/dist/oracle/record.js.map +1 -0
- package/dist/orchestration/envelope.js +52 -0
- package/dist/orchestration/envelope.js.map +1 -0
- package/dist/orchestration/goal.js +98 -0
- package/dist/orchestration/goal.js.map +1 -0
- package/dist/plan/plan.js +124 -0
- package/dist/plan/plan.js.map +1 -0
- package/dist/prompts/index.js +63 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/report/artifactManifest.js +44 -0
- package/dist/report/artifactManifest.js.map +1 -0
- package/dist/report/coverage.js +60 -0
- package/dist/report/coverage.js.map +1 -0
- package/dist/report/evidence.js +84 -0
- package/dist/report/evidence.js.map +1 -0
- package/dist/report/export.js +447 -0
- package/dist/report/export.js.map +1 -0
- package/dist/report/flake.js +61 -0
- package/dist/report/flake.js.map +1 -0
- package/dist/report/history.js +564 -0
- package/dist/report/history.js.map +1 -0
- package/dist/report/policy.js +98 -0
- package/dist/report/policy.js.map +1 -0
- package/dist/report/qaLevel.js +96 -0
- package/dist/report/qaLevel.js.map +1 -0
- package/dist/report/readiness.js +213 -0
- package/dist/report/readiness.js.map +1 -0
- package/dist/report/summary.js +42 -0
- package/dist/report/summary.js.map +1 -0
- package/dist/report/testCatalog.js +93 -0
- package/dist/report/testCatalog.js.map +1 -0
- package/dist/report/timing.js +37 -0
- package/dist/report/timing.js.map +1 -0
- package/dist/server.js +180 -0
- package/dist/server.js.map +1 -0
- package/dist/services/automationGenerate.js +60 -0
- package/dist/services/automationGenerate.js.map +1 -0
- package/dist/services/build.js +66 -0
- package/dist/services/build.js.map +1 -0
- package/dist/services/preflight.js +51 -0
- package/dist/services/preflight.js.map +1 -0
- package/dist/services/prepareAndroid.js +183 -0
- package/dist/services/prepareAndroid.js.map +1 -0
- package/dist/services/prepareIos.js +162 -0
- package/dist/services/prepareIos.js.map +1 -0
- package/dist/services/report.js +537 -0
- package/dist/services/report.js.map +1 -0
- package/dist/services/smoke.js +120 -0
- package/dist/services/smoke.js.map +1 -0
- package/dist/services/suiteGenerate.js +123 -0
- package/dist/services/suiteGenerate.js.map +1 -0
- package/dist/services/testSuiteKnowledge.js +150 -0
- package/dist/services/testSuiteKnowledge.js.map +1 -0
- package/dist/session/attach.js +47 -0
- package/dist/session/attach.js.map +1 -0
- package/dist/session/progress.js +56 -0
- package/dist/session/progress.js.map +1 -0
- package/dist/session/store.js +329 -0
- package/dist/session/store.js.map +1 -0
- package/dist/snapshot/overlays.js +132 -0
- package/dist/snapshot/overlays.js.map +1 -0
- package/dist/snapshot/parse.js +204 -0
- package/dist/snapshot/parse.js.map +1 -0
- package/dist/snapshot/present.js +12 -0
- package/dist/snapshot/present.js.map +1 -0
- package/dist/snapshot/settle.js +36 -0
- package/dist/snapshot/settle.js.map +1 -0
- package/dist/state/profile.js +318 -0
- package/dist/state/profile.js.map +1 -0
- package/dist/suite/compile.js +176 -0
- package/dist/suite/compile.js.map +1 -0
- package/dist/suite/lint.js +45 -0
- package/dist/suite/lint.js.map +1 -0
- package/dist/suite/pom.js +285 -0
- package/dist/suite/pom.js.map +1 -0
- package/dist/suite/testcase.js +87 -0
- package/dist/suite/testcase.js.map +1 -0
- package/dist/testSuite/generator.js +222 -0
- package/dist/testSuite/generator.js.map +1 -0
- package/dist/testSuite/history.js +44 -0
- package/dist/testSuite/history.js.map +1 -0
- package/dist/testSuite/issueLinks.js +96 -0
- package/dist/testSuite/issueLinks.js.map +1 -0
- package/dist/testSuite/merge.js +190 -0
- package/dist/testSuite/merge.js.map +1 -0
- package/dist/testSuite/schema.js +86 -0
- package/dist/testSuite/schema.js.map +1 -0
- package/dist/testSuite/store.js +116 -0
- package/dist/testSuite/store.js.map +1 -0
- package/dist/testSuite/traceability.js +55 -0
- package/dist/testSuite/traceability.js.map +1 -0
- package/dist/tools/act.js +457 -0
- package/dist/tools/act.js.map +1 -0
- package/dist/tools/agent.js +225 -0
- package/dist/tools/agent.js.map +1 -0
- package/dist/tools/appMap.js +317 -0
- package/dist/tools/appMap.js.map +1 -0
- package/dist/tools/assertVisual.js +74 -0
- package/dist/tools/assertVisual.js.map +1 -0
- package/dist/tools/automationGenerate.js +394 -0
- package/dist/tools/automationGenerate.js.map +1 -0
- package/dist/tools/capabilities.js +114 -0
- package/dist/tools/capabilities.js.map +1 -0
- package/dist/tools/clearOverlay.js +150 -0
- package/dist/tools/clearOverlay.js.map +1 -0
- package/dist/tools/detectContext.js +41 -0
- package/dist/tools/detectContext.js.map +1 -0
- package/dist/tools/doctor.js +116 -0
- package/dist/tools/doctor.js.map +1 -0
- package/dist/tools/explore.js +289 -0
- package/dist/tools/explore.js.map +1 -0
- package/dist/tools/firstRun.js +136 -0
- package/dist/tools/firstRun.js.map +1 -0
- package/dist/tools/flow.js +331 -0
- package/dist/tools/flow.js.map +1 -0
- package/dist/tools/flowGenerate.js +55 -0
- package/dist/tools/flowGenerate.js.map +1 -0
- package/dist/tools/getArtifact.js +39 -0
- package/dist/tools/getArtifact.js.map +1 -0
- package/dist/tools/health.js +41 -0
- package/dist/tools/health.js.map +1 -0
- package/dist/tools/ios.js +492 -0
- package/dist/tools/ios.js.map +1 -0
- package/dist/tools/jobs.js +20 -0
- package/dist/tools/jobs.js.map +1 -0
- package/dist/tools/network.js +50 -0
- package/dist/tools/network.js.map +1 -0
- package/dist/tools/note.js +69 -0
- package/dist/tools/note.js.map +1 -0
- package/dist/tools/plan.js +49 -0
- package/dist/tools/plan.js.map +1 -0
- package/dist/tools/prepareIosTarget.js +99 -0
- package/dist/tools/prepareIosTarget.js.map +1 -0
- package/dist/tools/prepareTarget.js +257 -0
- package/dist/tools/prepareTarget.js.map +1 -0
- package/dist/tools/report.js +42 -0
- package/dist/tools/report.js.map +1 -0
- package/dist/tools/screenRecord.js +24 -0
- package/dist/tools/screenRecord.js.map +1 -0
- package/dist/tools/screenshot.js +63 -0
- package/dist/tools/screenshot.js.map +1 -0
- package/dist/tools/smoke.js +39 -0
- package/dist/tools/smoke.js.map +1 -0
- package/dist/tools/snapshot.js +129 -0
- package/dist/tools/snapshot.js.map +1 -0
- package/dist/tools/startSession.js +169 -0
- package/dist/tools/startSession.js.map +1 -0
- package/dist/tools/state.js +87 -0
- package/dist/tools/state.js.map +1 -0
- package/dist/tools/suite.js +412 -0
- package/dist/tools/suite.js.map +1 -0
- package/dist/tools/testThis.js +774 -0
- package/dist/tools/testThis.js.map +1 -0
- package/dist/tools/wda.js +477 -0
- package/dist/tools/wda.js.map +1 -0
- package/dist/version.js +62 -0
- package/dist/version.js.map +1 -0
- package/dist/visual/ocr.js +72 -0
- package/dist/visual/ocr.js.map +1 -0
- package/dist/visual/provider.js +75 -0
- package/dist/visual/provider.js.map +1 -0
- package/docs/README.md +19 -0
- package/docs/assets/swipium-lockup-ink-on-light.png +0 -0
- package/docs/mcp-server.md +135 -0
- package/docs/tools.md +130 -0
- package/package.json +70 -0
|
@@ -0,0 +1,457 @@
|
|
|
1
|
+
// qa_act — the single consolidated action tool (DESIGN §3 locked schema).
|
|
2
|
+
// Resolves a target (ref | selector | coords), performs the action, waits for the screen
|
|
3
|
+
// to settle, then returns the post-action snapshot + a deterministic health check. So one
|
|
4
|
+
// call both acts AND observes the result.
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
import { qaOk, qaError, qaStop } from '../lib/result.js';
|
|
7
|
+
import { parseSnapshot, signature } from '../snapshot/parse.js';
|
|
8
|
+
import { presentElements } from '../snapshot/present.js';
|
|
9
|
+
import { obstructionAt } from '../snapshot/overlays.js';
|
|
10
|
+
import { settle } from '../snapshot/settle.js';
|
|
11
|
+
import { checkHealth } from '../oracle/health.js';
|
|
12
|
+
import { recordHealthFindings } from '../oracle/record.js';
|
|
13
|
+
import { makeRedactor } from '../lib/redact.js';
|
|
14
|
+
import { getDriver } from '../session/attach.js';
|
|
15
|
+
import { resolveTarget, setsEqual } from '../core/target.js';
|
|
16
|
+
import { recordableNativeSelector, recordableTap } from '../flows/generate.js';
|
|
17
|
+
import { classifyFlowDriverError } from '../flows/run.js';
|
|
18
|
+
function nativeSelectorFor(selector) {
|
|
19
|
+
const m = selector?.match(/^(accessibility id|name|predicate string|class chain)\s*=\s*(.+)$/i);
|
|
20
|
+
if (!m)
|
|
21
|
+
return null;
|
|
22
|
+
return { using: m[1].toLowerCase(), value: m[2] };
|
|
23
|
+
}
|
|
24
|
+
function recordableNativeTarget(session, native) {
|
|
25
|
+
const selectorKind = native.using === 'accessibility id' ? 'accessibility_id' : native.using === 'name' ? 'name' : native.using === 'predicate string' ? 'predicate' : 'class_chain';
|
|
26
|
+
return {
|
|
27
|
+
selector: native.value,
|
|
28
|
+
selectorKind,
|
|
29
|
+
exportability: 'semantic',
|
|
30
|
+
...recordableNativeSelector(session, selectorKind, native.value),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
export function registerAct(server, sessions) {
|
|
34
|
+
server.registerTool('qa_act', {
|
|
35
|
+
title: 'Act on the screen',
|
|
36
|
+
description: 'Perform one synchronized UI action and observe the result. Actions & their fields:\n' +
|
|
37
|
+
'- tap: target {ref|text|id|selector|x,y}\n' +
|
|
38
|
+
'- type: target (a field) + text + mode:"replace"|"append" (default replace); optional submit:true\n' +
|
|
39
|
+
'- clear: target (a field), focuses it and clears existing text\n' +
|
|
40
|
+
'- swipe: direction up|down|left|right (optional target as start point)\n' +
|
|
41
|
+
'- scroll: direction + optional untilVisible {text|id} + maxScrolls (default 8)\n' +
|
|
42
|
+
'- press: key back|home|enter\n' +
|
|
43
|
+
'- open_url: url (deep link)\n' +
|
|
44
|
+
'- wait: for {settled:true | ref | text | id | selector} + timeoutMs\n' +
|
|
45
|
+
'Every non-wait action auto-waits for the screen to settle, then returns the post snapshot (quality + @eN elements), whether the screen changed, and a health check.',
|
|
46
|
+
inputSchema: {
|
|
47
|
+
sessionId: z.string(),
|
|
48
|
+
action: z.enum(['tap', 'type', 'clear', 'swipe', 'scroll', 'press', 'open_url', 'wait']),
|
|
49
|
+
target: z
|
|
50
|
+
.object({
|
|
51
|
+
ref: z.string().optional(),
|
|
52
|
+
text: z.string().optional(),
|
|
53
|
+
id: z.string().optional(),
|
|
54
|
+
selector: z.string().optional().describe('Backend-native selector, e.g. "accessibility id=email", "name=Continue", "predicate string=label == \\"Continue\\"", or "class chain=**/XCUIElementTypeButton[...]".'),
|
|
55
|
+
index: z.number().optional(),
|
|
56
|
+
x: z.number().optional(),
|
|
57
|
+
y: z.number().optional(),
|
|
58
|
+
})
|
|
59
|
+
.optional(),
|
|
60
|
+
text: z.string().optional(),
|
|
61
|
+
mode: z.enum(['replace', 'append']).optional(),
|
|
62
|
+
submit: z.boolean().optional(),
|
|
63
|
+
direction: z.enum(['up', 'down', 'left', 'right']).optional(),
|
|
64
|
+
untilVisible: z.object({ text: z.string().optional(), id: z.string().optional() }).optional(),
|
|
65
|
+
maxScrolls: z.number().optional(),
|
|
66
|
+
key: z.enum(['back', 'home', 'enter']).optional(),
|
|
67
|
+
url: z.string().optional(),
|
|
68
|
+
durationMs: z.number().optional().describe('tap press duration. Coordinate taps default to ~100ms (RN ignores instant taps); ref/selector taps are instant unless set.'),
|
|
69
|
+
ignoreOverlay: z.boolean().optional().describe('tap even if an overlay obstructs the target (default false → returns blockedByOverlay).'),
|
|
70
|
+
for: z
|
|
71
|
+
.object({
|
|
72
|
+
settled: z.boolean().optional(),
|
|
73
|
+
ref: z.string().optional(),
|
|
74
|
+
text: z.string().optional(),
|
|
75
|
+
id: z.string().optional(),
|
|
76
|
+
selector: z.string().optional().describe('Backend-native selector, e.g. "accessibility id=email" or "name=Continue". Requires WDA/native selector support.'),
|
|
77
|
+
})
|
|
78
|
+
.optional(),
|
|
79
|
+
timeoutMs: z.number().optional(),
|
|
80
|
+
},
|
|
81
|
+
}, async (args) => {
|
|
82
|
+
const { sessionId, action } = args;
|
|
83
|
+
const session = sessions.get(sessionId);
|
|
84
|
+
const { driver: d } = session ? await getDriver(session) : { driver: undefined };
|
|
85
|
+
if (!session || !d) {
|
|
86
|
+
return qaError({
|
|
87
|
+
what: 'No device attached to this session',
|
|
88
|
+
changedState: false,
|
|
89
|
+
retrySafe: true,
|
|
90
|
+
nextSteps: ['Call qa_prepare_target first.'],
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
if (d.kind === 'simulator') {
|
|
94
|
+
return qaError({
|
|
95
|
+
what: 'Structured interaction (tap/type/swipe) is not available on the iOS simulator backend',
|
|
96
|
+
changedState: false,
|
|
97
|
+
retrySafe: false,
|
|
98
|
+
failureCode: 'BACKEND_UNSUPPORTED',
|
|
99
|
+
nextSteps: ['Attach WebDriverAgent with qa_wda for structured tap/type/snapshot. Without WDA, navigate via qa_ios deep links and verify with qa_assert_visual.'],
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
// Budget gate (review §4.1 / Rec 4): refuse new work once the session budget is spent.
|
|
103
|
+
// `wait` is exempt from the action/screenshot caps (it's synchronization, not an
|
|
104
|
+
// action), but it is NOT exempt from the TIME budget — otherwise repeated waits could
|
|
105
|
+
// burn the clock indefinitely.
|
|
106
|
+
const stopReason = sessions.budgetStop(session);
|
|
107
|
+
if (stopReason && (action !== 'wait' || /time budget/.test(stopReason))) {
|
|
108
|
+
return qaStop(stopReason, { counters: session.counters, mode: session.mode });
|
|
109
|
+
}
|
|
110
|
+
const fail = (what, changedState) => qaError({ what, changedState, retrySafe: true, nextSteps: ['Run qa_snapshot to see the current screen, then retry.'] });
|
|
111
|
+
// ---- wait is its own path (no settle/health afterward) ----
|
|
112
|
+
if (action === 'wait') {
|
|
113
|
+
const timeoutMs = args.timeoutMs ?? 8000;
|
|
114
|
+
if (args.for?.settled || !args.for) {
|
|
115
|
+
const s = await settle(d, { timeoutMs });
|
|
116
|
+
const post = parseSnapshot(s.xml);
|
|
117
|
+
session.lastSnapshot = { fullByRef: post.fullByRef, signatures: new Set(post.elements.map(signature)), allNodes: post.allNodes };
|
|
118
|
+
const { elements: shown, rendered } = presentElements(post.elements, makeRedactor(session.secrets));
|
|
119
|
+
return qaOk({ action, settled: s.settled, quality: post.quality.verdict, elements: shown }, `wait(settled)=${s.settled}\n\n${rendered}`);
|
|
120
|
+
}
|
|
121
|
+
const deadline = Date.now() + timeoutMs;
|
|
122
|
+
const want = args.for;
|
|
123
|
+
const native = nativeSelectorFor(want?.selector);
|
|
124
|
+
if (want?.selector && !native) {
|
|
125
|
+
return qaError({ what: `Unsupported wait selector ${JSON.stringify(want.selector)}`, changedState: false, retrySafe: true, nextSteps: ['Use accessibility id=..., name=..., predicate string=..., class chain=..., or wait by text/id/ref.'] });
|
|
126
|
+
}
|
|
127
|
+
if (native) {
|
|
128
|
+
if (!d.existsBySelector)
|
|
129
|
+
return qaError({
|
|
130
|
+
what: `${native.using} waits require backend-native selector support`,
|
|
131
|
+
changedState: false,
|
|
132
|
+
retrySafe: false,
|
|
133
|
+
failureCode: 'BACKEND_UNSUPPORTED',
|
|
134
|
+
nextSteps: ['Use a WDA-backed iOS session, or wait by text/id/ref on this backend.'],
|
|
135
|
+
});
|
|
136
|
+
while (Date.now() < deadline) {
|
|
137
|
+
if (await d.existsBySelector(native.using, native.value)) {
|
|
138
|
+
return qaOk({ action, found: true, selector: want?.selector, via: 'native-selector' }, `wait: found ${want?.selector}`);
|
|
139
|
+
}
|
|
140
|
+
await new Promise((r) => setTimeout(r, 400));
|
|
141
|
+
}
|
|
142
|
+
return qaError({ what: `wait timed out (${timeoutMs}ms) for ${JSON.stringify(want)}`, changedState: false, retrySafe: true, nextSteps: ['Re-check the native selector value, or run qa_snapshot to inspect the current screen.'] });
|
|
143
|
+
}
|
|
144
|
+
while (Date.now() < deadline) {
|
|
145
|
+
const parsed = parseSnapshot(await d.dumpXml());
|
|
146
|
+
session.lastSnapshot = { fullByRef: parsed.fullByRef, signatures: new Set(parsed.elements.map(signature)), allNodes: parsed.allNodes };
|
|
147
|
+
const hit = parsed.elements.find((e) => (want.ref && e.ref === want.ref) ||
|
|
148
|
+
(want.id && e.id === want.id) ||
|
|
149
|
+
(want.text && (e.text?.toLowerCase().includes(want.text.toLowerCase()) || e.label?.toLowerCase().includes(want.text.toLowerCase()))));
|
|
150
|
+
if (hit)
|
|
151
|
+
return qaOk({ action, found: true, ref: hit.ref }, `wait: found ${hit.ref}`);
|
|
152
|
+
await new Promise((r) => setTimeout(r, 400));
|
|
153
|
+
}
|
|
154
|
+
return qaError({ what: `wait timed out (${timeoutMs}ms) for ${JSON.stringify(want)}`, changedState: false, retrySafe: true, nextSteps: ['Re-snapshot; the element may use different text/id.'] });
|
|
155
|
+
}
|
|
156
|
+
// Phase timing (P1.6): mark the first real action so the report can split setup vs active.
|
|
157
|
+
sessions.milestone(session, 'first_action');
|
|
158
|
+
const preSigs = session.lastSnapshot?.signatures ?? new Set();
|
|
159
|
+
let meta = {};
|
|
160
|
+
// remembered so a no-change tap can be retried as a longer press (RN tap quirk)
|
|
161
|
+
let tapRetry;
|
|
162
|
+
// action-IR step to record once the action succeeds (built here while lastSnapshot is
|
|
163
|
+
// still the PRE-navigation screen, so a tapped @ref still resolves to its label).
|
|
164
|
+
let toRecord;
|
|
165
|
+
try {
|
|
166
|
+
switch (action) {
|
|
167
|
+
case 'tap': {
|
|
168
|
+
const native = nativeSelectorFor(args.target?.selector);
|
|
169
|
+
if (native) {
|
|
170
|
+
if (!d.tapBySelector)
|
|
171
|
+
return qaError({
|
|
172
|
+
what: `${native.using} selectors require backend-native selector support`,
|
|
173
|
+
changedState: false,
|
|
174
|
+
retrySafe: false,
|
|
175
|
+
failureCode: 'BACKEND_UNSUPPORTED',
|
|
176
|
+
nextSteps: ['Use a WDA-backed iOS session, or target by ref/text/id/coordinates on this backend.'],
|
|
177
|
+
});
|
|
178
|
+
await d.tapBySelector(native.using, native.value);
|
|
179
|
+
meta = { selector: args.target?.selector, via: 'native-selector' };
|
|
180
|
+
toRecord = { action: 'tap', ...recordableNativeTarget(session, native) };
|
|
181
|
+
break;
|
|
182
|
+
}
|
|
183
|
+
const t = await resolveTarget(session, args.target);
|
|
184
|
+
if ('error' in t)
|
|
185
|
+
return fail(t.error, false);
|
|
186
|
+
// Overlay obstruction check (CR4): if another element is drawn over the target
|
|
187
|
+
// point, return a structured blockedByOverlay instead of tapping blindly.
|
|
188
|
+
if (!args.ignoreOverlay && t.via !== 'coords' && session.lastSnapshot?.allNodes) {
|
|
189
|
+
// works for ref AND selector taps — t.ref is the resolved @eN in either case
|
|
190
|
+
const node = t.ref ? session.lastSnapshot.fullByRef.get(t.ref) : undefined;
|
|
191
|
+
const obs = obstructionAt(session.lastSnapshot.allNodes, node, t.x, t.y);
|
|
192
|
+
if (obs.obstructed) {
|
|
193
|
+
return qaError({
|
|
194
|
+
what: `Target at (${t.x},${t.y}) is obstructed by ${obs.by?.cls?.split('.').pop()}${obs.by?.text ? ` "${obs.by.text}"` : ''}`,
|
|
195
|
+
changedState: false,
|
|
196
|
+
retrySafe: true,
|
|
197
|
+
failureCode: 'OVERLAY_OBSTRUCTION',
|
|
198
|
+
nextSteps: ['Call qa_clear_overlay (auto, or hide_keyboard/minimize_logbox), then retry — or pass ignoreOverlay:true to tap anyway.'],
|
|
199
|
+
}, { blockedByOverlay: true, obstructedBy: obs.by });
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
// Coordinate taps default to a short press (RN often ignores instant taps);
|
|
203
|
+
// ref/selector taps stay instant unless durationMs is given.
|
|
204
|
+
const isCoord = t.via === 'coords';
|
|
205
|
+
const durationMs = args.durationMs ?? (isCoord ? 100 : undefined);
|
|
206
|
+
if (durationMs)
|
|
207
|
+
await d.pressXY(t.x, t.y, durationMs);
|
|
208
|
+
else
|
|
209
|
+
await d.tapXY(t.x, t.y);
|
|
210
|
+
tapRetry = { x: t.x, y: t.y, instant: !durationMs };
|
|
211
|
+
meta = { tappedAt: [t.x, t.y], via: t.via, ...(durationMs ? { durationMs } : {}) };
|
|
212
|
+
toRecord = { action: 'tap', ...recordableTap(session, args.target, t) };
|
|
213
|
+
break;
|
|
214
|
+
}
|
|
215
|
+
case 'type': {
|
|
216
|
+
if (args.text == null)
|
|
217
|
+
return fail('type requires `text`.', false);
|
|
218
|
+
const native = nativeSelectorFor(args.target?.selector);
|
|
219
|
+
if (native) {
|
|
220
|
+
if (!d.typeBySelector)
|
|
221
|
+
return qaError({
|
|
222
|
+
what: `${native.using} selectors require backend-native selector support`,
|
|
223
|
+
changedState: false,
|
|
224
|
+
retrySafe: false,
|
|
225
|
+
failureCode: 'BACKEND_UNSUPPORTED',
|
|
226
|
+
nextSteps: ['Use a WDA-backed iOS session, or target by ref/text/id/coordinates on this backend.'],
|
|
227
|
+
});
|
|
228
|
+
if ((args.mode ?? 'replace') === 'replace') {
|
|
229
|
+
if (!d.clearBySelector)
|
|
230
|
+
return qaError({
|
|
231
|
+
what: `replace-mode typing by ${native.using} requires backend-native clear support`,
|
|
232
|
+
changedState: false,
|
|
233
|
+
retrySafe: false,
|
|
234
|
+
failureCode: 'BACKEND_UNSUPPORTED',
|
|
235
|
+
nextSteps: ['Use append mode, or attach a WDA backend that supports element clear.'],
|
|
236
|
+
});
|
|
237
|
+
await d.clearBySelector(native.using, native.value);
|
|
238
|
+
}
|
|
239
|
+
await d.typeBySelector(native.using, native.value, args.text);
|
|
240
|
+
meta = { typedChars: args.text.length, redacted: true, mode: args.mode ?? 'replace', via: 'native-selector', selector: args.target?.selector, submit: !!args.submit };
|
|
241
|
+
toRecord = { action: 'type', ...recordableNativeTarget(session, native), text: args.text };
|
|
242
|
+
if (args.submit)
|
|
243
|
+
await d.pressKey('enter');
|
|
244
|
+
break;
|
|
245
|
+
}
|
|
246
|
+
const t = await resolveTarget(session, args.target);
|
|
247
|
+
if ('error' in t)
|
|
248
|
+
return fail(t.error, false);
|
|
249
|
+
// Typing into a secure field → remember the value so it's scrubbed everywhere, and
|
|
250
|
+
// record that a login was performed (auth-state reporting, P1.5).
|
|
251
|
+
if (t.secure) {
|
|
252
|
+
session.secrets.add(args.text);
|
|
253
|
+
sessions.markAuth(session, { loginPerformed: true, loginPerformedAt: Date.now() });
|
|
254
|
+
sessions.milestone(session, 'login_performed');
|
|
255
|
+
}
|
|
256
|
+
await d.tapXY(t.x, t.y); // focus + raise IME (real touch)
|
|
257
|
+
await new Promise((r) => setTimeout(r, 700));
|
|
258
|
+
if ((args.mode ?? 'replace') === 'replace')
|
|
259
|
+
await d.clearFocusedText(t.textLen);
|
|
260
|
+
await d.inputText(args.text);
|
|
261
|
+
if (args.submit)
|
|
262
|
+
await d.pressKey('enter');
|
|
263
|
+
// Never echo the typed value — it may be a password/OTP/email/token and would
|
|
264
|
+
// leak into the agent transcript + artifacts (DESIGN §9.7 sensitive-mode).
|
|
265
|
+
meta = { typedChars: args.text.length, redacted: true, mode: args.mode ?? 'replace', via: t.via, submit: !!args.submit };
|
|
266
|
+
// Never store a secret's value in the IR — secrets become a ${VAR} at generate time.
|
|
267
|
+
{
|
|
268
|
+
const targetRecord = recordableTap(session, args.target, t);
|
|
269
|
+
toRecord = {
|
|
270
|
+
action: 'type',
|
|
271
|
+
selector: targetRecord.selector,
|
|
272
|
+
selectorKind: targetRecord.selectorKind,
|
|
273
|
+
secret: !!t.secure,
|
|
274
|
+
text: t.secure ? undefined : args.text,
|
|
275
|
+
exportability: t.secure ? 'needs-human-data' : targetRecord.exportability,
|
|
276
|
+
provenance: targetRecord.provenance,
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
break;
|
|
280
|
+
}
|
|
281
|
+
case 'clear': {
|
|
282
|
+
const native = nativeSelectorFor(args.target?.selector);
|
|
283
|
+
if (native) {
|
|
284
|
+
if (!d.clearBySelector)
|
|
285
|
+
return qaError({
|
|
286
|
+
what: `${native.using} selectors require backend-native clear support`,
|
|
287
|
+
changedState: false,
|
|
288
|
+
retrySafe: false,
|
|
289
|
+
failureCode: 'BACKEND_UNSUPPORTED',
|
|
290
|
+
nextSteps: ['Use a WDA-backed iOS session, or target by ref/text/id/coordinates on this backend.'],
|
|
291
|
+
});
|
|
292
|
+
await d.clearBySelector(native.using, native.value);
|
|
293
|
+
meta = { cleared: true, via: 'native-selector', selector: args.target?.selector };
|
|
294
|
+
toRecord = { action: 'clear', ...recordableNativeTarget(session, native) };
|
|
295
|
+
break;
|
|
296
|
+
}
|
|
297
|
+
const t = await resolveTarget(session, args.target);
|
|
298
|
+
if ('error' in t)
|
|
299
|
+
return fail(t.error, false);
|
|
300
|
+
await d.tapXY(t.x, t.y);
|
|
301
|
+
await new Promise((r) => setTimeout(r, 400));
|
|
302
|
+
await d.clearFocusedText(t.textLen);
|
|
303
|
+
meta = { cleared: true, via: t.via };
|
|
304
|
+
toRecord = { action: 'clear', ...recordableTap(session, args.target, t) };
|
|
305
|
+
break;
|
|
306
|
+
}
|
|
307
|
+
case 'swipe': {
|
|
308
|
+
if (!args.direction)
|
|
309
|
+
return fail('swipe requires `direction`.', false);
|
|
310
|
+
const start = args.target ? await resolveTarget(session, args.target) : null;
|
|
311
|
+
const sx = start && !('error' in start) ? start.x : 0;
|
|
312
|
+
const sy = start && !('error' in start) ? start.y : 0;
|
|
313
|
+
const from = sx && sy ? { x: sx, y: sy } : { x: 540, y: 1200 };
|
|
314
|
+
const dist = 800;
|
|
315
|
+
const to = {
|
|
316
|
+
up: { x: from.x, y: from.y - dist },
|
|
317
|
+
down: { x: from.x, y: from.y + dist },
|
|
318
|
+
left: { x: from.x - dist, y: from.y },
|
|
319
|
+
right: { x: from.x + dist, y: from.y },
|
|
320
|
+
}[args.direction];
|
|
321
|
+
await d.swipe(from.x, from.y, to.x, to.y, 300);
|
|
322
|
+
meta = { direction: args.direction };
|
|
323
|
+
toRecord = { action: 'swipe', direction: args.direction, exportability: 'coordinate' };
|
|
324
|
+
break;
|
|
325
|
+
}
|
|
326
|
+
case 'scroll': {
|
|
327
|
+
if (!args.direction)
|
|
328
|
+
return fail('scroll requires `direction`.', false);
|
|
329
|
+
const max = args.maxScrolls ?? 8;
|
|
330
|
+
// scroll down = swipe up; build a screen-relative gesture
|
|
331
|
+
const dir = args.direction;
|
|
332
|
+
let found = false;
|
|
333
|
+
for (let i = 0; i < max; i++) {
|
|
334
|
+
const cx = 540;
|
|
335
|
+
const cy = 1200;
|
|
336
|
+
const dist = 900;
|
|
337
|
+
const vec = {
|
|
338
|
+
down: [cx, cy + dist / 2, cx, cy - dist / 2],
|
|
339
|
+
up: [cx, cy - dist / 2, cx, cy + dist / 2],
|
|
340
|
+
left: [cx + dist / 2, cy, cx - dist / 2, cy],
|
|
341
|
+
right: [cx - dist / 2, cy, cx + dist / 2, cy],
|
|
342
|
+
}[dir];
|
|
343
|
+
await d.swipe(vec[0], vec[1], vec[2], vec[3], 300);
|
|
344
|
+
await new Promise((r) => setTimeout(r, 400));
|
|
345
|
+
if (args.untilVisible) {
|
|
346
|
+
const parsed = parseSnapshot(await d.dumpXml());
|
|
347
|
+
const u = args.untilVisible;
|
|
348
|
+
found = parsed.elements.some((e) => (u.id && e.id === u.id) || (u.text && (e.text?.toLowerCase().includes(u.text.toLowerCase()) || e.label?.toLowerCase().includes(u.text.toLowerCase()))));
|
|
349
|
+
if (found)
|
|
350
|
+
break;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
meta = { direction: dir, untilVisibleFound: args.untilVisible ? found : undefined };
|
|
354
|
+
toRecord = { action: 'scroll', direction: dir, selector: args.untilVisible?.text, exportability: args.untilVisible?.text ? 'semantic' : 'coordinate' };
|
|
355
|
+
break;
|
|
356
|
+
}
|
|
357
|
+
case 'press': {
|
|
358
|
+
if (!args.key)
|
|
359
|
+
return fail('press requires `key`.', false);
|
|
360
|
+
await d.pressKey(args.key);
|
|
361
|
+
meta = { key: args.key };
|
|
362
|
+
toRecord = { action: 'press', key: args.key, exportability: 'semantic' };
|
|
363
|
+
break;
|
|
364
|
+
}
|
|
365
|
+
case 'open_url': {
|
|
366
|
+
if (!args.url)
|
|
367
|
+
return fail('open_url requires `url`.', false);
|
|
368
|
+
await d.openUrl(args.url);
|
|
369
|
+
meta = { url: args.url };
|
|
370
|
+
toRecord = { action: 'open_url', url: args.url, exportability: 'semantic' };
|
|
371
|
+
break;
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
catch (e) {
|
|
376
|
+
const failureCode = classifyFlowDriverError(e);
|
|
377
|
+
return qaError({
|
|
378
|
+
what: `Action "${action}" failed: ${String(e)}`,
|
|
379
|
+
changedState: true,
|
|
380
|
+
retrySafe: !['WDA_SESSION_FAILED', 'UNKNOWN'].includes(failureCode),
|
|
381
|
+
failureCode,
|
|
382
|
+
nextSteps: failureCode === 'UNKNOWN' ? ['Confirm the device is online and re-snapshot.'] : ['Use the failureCode to choose recovery, then re-snapshot before retrying.'],
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
// count this as an action (wait already returned earlier)
|
|
386
|
+
sessions.bump(session, 'actions');
|
|
387
|
+
// Record the action into the IR for qa_flow_generate (the action definitely happened here;
|
|
388
|
+
// recorded now so a later post-snapshot failure doesn't lose the step).
|
|
389
|
+
if (toRecord)
|
|
390
|
+
sessions.addRecordedAction(session, { at: Date.now(), ...toRecord });
|
|
391
|
+
// Post-action observation is wrapped so a settle/dump/parse failure (e.g. the
|
|
392
|
+
// looping-animation case) returns a Swipium-shaped result, never a raw MCP error.
|
|
393
|
+
try {
|
|
394
|
+
// settle → observe → health
|
|
395
|
+
let s = await settle(d, { timeoutMs: args.timeoutMs ?? 8000 });
|
|
396
|
+
let post = parseSnapshot(s.xml);
|
|
397
|
+
let postSigs = new Set(post.elements.map(signature));
|
|
398
|
+
let changed = !setsEqual(preSigs, postSigs);
|
|
399
|
+
// No-change retry (review §4.5/§4.7): an instant tap that did nothing is often the RN
|
|
400
|
+
// tap quirk — retry ONCE as a longer press before believing it's blocked.
|
|
401
|
+
let retriedAsPress = false;
|
|
402
|
+
if (!changed && action === 'tap' && tapRetry?.instant) {
|
|
403
|
+
await d.pressXY(tapRetry.x, tapRetry.y, 120);
|
|
404
|
+
retriedAsPress = true;
|
|
405
|
+
s = await settle(d, { timeoutMs: args.timeoutMs ?? 8000 });
|
|
406
|
+
post = parseSnapshot(s.xml);
|
|
407
|
+
postSigs = new Set(post.elements.map(signature));
|
|
408
|
+
changed = !setsEqual(preSigs, postSigs);
|
|
409
|
+
}
|
|
410
|
+
session.lastSnapshot = { fullByRef: post.fullByRef, signatures: postSigs, allNodes: post.allNodes };
|
|
411
|
+
const health = await checkHealth(d, session.appId, s.xml);
|
|
412
|
+
// Track no-change actions for the budget / no-op-loop detector.
|
|
413
|
+
if (!changed && (action === 'tap' || action === 'swipe' || action === 'scroll' || action === 'press')) {
|
|
414
|
+
sessions.bump(session, 'noChangeActions');
|
|
415
|
+
}
|
|
416
|
+
const budgetReached = sessions.budgetStop(session);
|
|
417
|
+
// Sensitive-mode present: mask secure fields + scrub known secrets AND the just-typed
|
|
418
|
+
// value (covers non-secure fields like email for this immediate response).
|
|
419
|
+
const redact = makeRedactor([...session.secrets, ...(action === 'type' && args.text ? [args.text] : [])]);
|
|
420
|
+
const { elements: outElements, rendered } = presentElements(post.elements, redact);
|
|
421
|
+
// Record non-info findings for qa_report (deterministic bug trail) + app-error screenshot.
|
|
422
|
+
await recordHealthFindings(sessions, session, health.findings, d, health.foreground);
|
|
423
|
+
const banner = `${action} ${JSON.stringify(meta)} → changed=${changed}${retriedAsPress ? ' (retried as press)' : ''} ` +
|
|
424
|
+
`settled=${s.settled} quality=${post.quality.verdict} native=${health.nativeHealthy ? 'ok' : health.nativeStatus} app=${health.appStatus}` +
|
|
425
|
+
(budgetReached ? `\n⏹ budget reached: ${budgetReached} — call qa_report.` : '') +
|
|
426
|
+
(!changed && retriedAsPress ? `\nNo change even after a press retry — likely wrong coords / disabled element / overlay / auth wall.` : '');
|
|
427
|
+
const findings = health.findings.length ? '\n' + health.findings.map((f) => `[${f.severity}] ${f.layer ?? '?'}/${f.kind}: ${f.detail}${f.evidence ? ` — "${f.evidence}"` : ''}`).join('\n') : '';
|
|
428
|
+
return qaOk({
|
|
429
|
+
action,
|
|
430
|
+
...meta,
|
|
431
|
+
changed,
|
|
432
|
+
retriedAsPress,
|
|
433
|
+
settled: s.settled,
|
|
434
|
+
quality: post.quality.verdict,
|
|
435
|
+
health,
|
|
436
|
+
counters: session.counters,
|
|
437
|
+
...(budgetReached ? { budgetReached } : {}),
|
|
438
|
+
elements: outElements,
|
|
439
|
+
}, `${banner}${findings}\n\n${rendered}`);
|
|
440
|
+
}
|
|
441
|
+
catch (e) {
|
|
442
|
+
// The action ran; observing the result failed (often a UI that never reaches idle).
|
|
443
|
+
const idle = /idle|dump|hierarchy/i.test(String(e));
|
|
444
|
+
if (idle)
|
|
445
|
+
sessions.setMode(session, 'visual-fallback');
|
|
446
|
+
return qaError({
|
|
447
|
+
what: `Action "${action}" ran, but observing the result failed: ${String(e)}`,
|
|
448
|
+
changedState: true,
|
|
449
|
+
retrySafe: false,
|
|
450
|
+
nextSteps: idle
|
|
451
|
+
? ['Switched to visual-fallback. Use qa_screenshot; qa_check_health still works.']
|
|
452
|
+
: ['Re-check the device is online, then qa_screenshot / qa_check_health.'],
|
|
453
|
+
});
|
|
454
|
+
}
|
|
455
|
+
});
|
|
456
|
+
}
|
|
457
|
+
//# sourceMappingURL=act.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"act.js","sourceRoot":"","sources":["../../src/tools/act.ts"],"names":[],"mappings":"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"}
|