swipium 1.1.0 → 1.2.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/README.md +15 -9
- package/THREAT_MODEL.md +59 -0
- package/dist/appMap/diff.js +60 -0
- package/dist/appMap/diff.js.map +1 -0
- package/dist/automation/capabilities.js +167 -0
- package/dist/automation/capabilities.js.map +1 -0
- package/dist/automation/gestures.js +94 -0
- package/dist/automation/gestures.js.map +1 -0
- package/dist/automation/maestroIr.js +282 -0
- package/dist/automation/maestroIr.js.map +1 -0
- package/dist/automation/plan.js +268 -0
- package/dist/automation/plan.js.map +1 -0
- package/dist/automation/report.js +83 -0
- package/dist/automation/report.js.map +1 -0
- package/dist/automation/selectors.js +201 -0
- package/dist/automation/selectors.js.map +1 -0
- package/dist/automation/types.js +13 -0
- package/dist/automation/types.js.map +1 -0
- package/dist/automation/waits.js +91 -0
- package/dist/automation/waits.js.map +1 -0
- package/dist/automation/webview.js +81 -0
- package/dist/automation/webview.js.map +1 -0
- package/dist/flows/repair.js +363 -0
- package/dist/flows/repair.js.map +1 -0
- package/dist/interop/maestro.js +151 -0
- package/dist/interop/maestro.js.map +1 -0
- package/dist/mobileAudit/checks.js +251 -0
- package/dist/mobileAudit/checks.js.map +1 -0
- package/dist/mobileAudit/evidence.js +49 -0
- package/dist/mobileAudit/evidence.js.map +1 -0
- package/dist/mobileAudit/profiles.js +73 -0
- package/dist/mobileAudit/profiles.js.map +1 -0
- package/dist/mobileAudit/results.js +41 -0
- package/dist/mobileAudit/results.js.map +1 -0
- package/dist/mobileAudit/runner.js +229 -0
- package/dist/mobileAudit/runner.js.map +1 -0
- package/dist/oracle/locator.js +177 -0
- package/dist/oracle/locator.js.map +1 -0
- package/dist/server.js +20 -0
- package/dist/server.js.map +1 -1
- package/dist/testSuite/exporter.js +70 -0
- package/dist/testSuite/exporter.js.map +1 -0
- package/dist/testSuite/lint.js +53 -0
- package/dist/testSuite/lint.js.map +1 -0
- package/dist/tools/capabilities.js +46 -4
- package/dist/tools/capabilities.js.map +1 -1
- package/dist/tools/flow.js +67 -1
- package/dist/tools/flow.js.map +1 -1
- package/dist/tools/flowRepair.js +66 -0
- package/dist/tools/flowRepair.js.map +1 -0
- package/dist/tools/idling.js +104 -0
- package/dist/tools/idling.js.map +1 -0
- package/dist/tools/inputCapabilities.js +30 -0
- package/dist/tools/inputCapabilities.js.map +1 -0
- package/dist/tools/issues.js +218 -0
- package/dist/tools/issues.js.map +1 -0
- package/dist/tools/jobs.js +12 -1
- package/dist/tools/jobs.js.map +1 -1
- package/dist/tools/locator.js +57 -0
- package/dist/tools/locator.js.map +1 -0
- package/dist/tools/maestro.js +78 -0
- package/dist/tools/maestro.js.map +1 -0
- package/dist/tools/mobileAudit.js +115 -0
- package/dist/tools/mobileAudit.js.map +1 -0
- package/dist/tools/suite.js +49 -1
- package/dist/tools/suite.js.map +1 -1
- package/dist/tools/testSuite.js +233 -0
- package/dist/tools/testSuite.js.map +1 -0
- package/dist/tools/wait.js +58 -0
- package/dist/tools/wait.js.map +1 -0
- package/dist/version.js +31 -2
- package/dist/version.js.map +1 -1
- package/docs/mcp-server.md +1 -1
- package/docs/tools.md +46 -1
- package/package.json +3 -2
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
// Automation Kernel V2 — Workstream 8: Maestro Interop V2 at the Action IR level. The existing
|
|
2
|
+
// src/interop/maestro.ts maps a shallow subset to Flow V2 YAML; this module imports/exports the
|
|
3
|
+
// richer Maestro automation semantics (tapOn repeat/delay/retryTapIfNoChange/settle timeout,
|
|
4
|
+
// longPressOn, scrollUntilVisible full options, waitForAnimationToEnd, assertNotVisible, eraseText)
|
|
5
|
+
// into Action IR WITHOUT semantic loss, grading every command with an exact reason and the suggested
|
|
6
|
+
// Swipium equivalent. Pure: parse in, IR out.
|
|
7
|
+
import { parse as parseYaml, stringify } from 'yaml';
|
|
8
|
+
import { selectorFromMaestro, selectorToAppium } from './selectors.js';
|
|
9
|
+
function num(v) {
|
|
10
|
+
return typeof v === 'number' && Number.isFinite(v) ? v : undefined;
|
|
11
|
+
}
|
|
12
|
+
function obj(v) {
|
|
13
|
+
return v && typeof v === 'object' && !Array.isArray(v) ? v : null;
|
|
14
|
+
}
|
|
15
|
+
/** Import a Maestro flow into Action IR, preserving retry/repeat/settle/scroll semantics. */
|
|
16
|
+
export function importMaestroActions(maestroYaml) {
|
|
17
|
+
const doc = parseYaml(maestroYaml);
|
|
18
|
+
const raw = Array.isArray(doc) ? doc : Array.isArray(doc?.commands) ? doc.commands : [];
|
|
19
|
+
const actions = [];
|
|
20
|
+
const grades = [];
|
|
21
|
+
const unsupported = [];
|
|
22
|
+
const grade = (index, command, g, reason, swipiumEquivalent) => grades.push({ index, command, grade: g, reason, swipiumEquivalent });
|
|
23
|
+
const unsupp = (index, command, reason, swipiumEquivalent) => {
|
|
24
|
+
unsupported.push({ command, reason });
|
|
25
|
+
grade(index, command, 'manual_review_required', reason, swipiumEquivalent);
|
|
26
|
+
};
|
|
27
|
+
raw.forEach((entry, index) => {
|
|
28
|
+
const o = obj(entry);
|
|
29
|
+
if (!o) {
|
|
30
|
+
unsupp(index, String(entry), 'Maestro command must be a single-key object.');
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const [cmd, value] = Object.entries(o)[0] ?? [];
|
|
34
|
+
const v = obj(value);
|
|
35
|
+
switch (cmd) {
|
|
36
|
+
case 'tapOn': {
|
|
37
|
+
const sel = selectorFromMaestro(v?.selector ?? value);
|
|
38
|
+
const action = { kind: 'tap', expectedChange: 'unknown', note: 'tapOn' };
|
|
39
|
+
if (sel)
|
|
40
|
+
action.selector = sel;
|
|
41
|
+
// Explicit automation semantics — never hidden.
|
|
42
|
+
if (v) {
|
|
43
|
+
if (v.retryTapIfNoChange === true)
|
|
44
|
+
action.retryIfNoChange = true;
|
|
45
|
+
const repeat = num(v.repeat);
|
|
46
|
+
if (repeat != null)
|
|
47
|
+
action.repeat = repeat;
|
|
48
|
+
const settle = num(v.waitToSettleTimeoutMs);
|
|
49
|
+
if (settle != null)
|
|
50
|
+
action.timeoutMs = settle;
|
|
51
|
+
if (v.point != null && !sel)
|
|
52
|
+
action.selector = { strategy: 'coordinate', value: String(v.point), source: 'maestro_import', risk: 'high', portable: false };
|
|
53
|
+
}
|
|
54
|
+
actions.push(action);
|
|
55
|
+
const carried = [action.retryIfNoChange ? 'retryTapIfNoChange' : null, action.repeat != null ? `repeat=${action.repeat}` : null, action.timeoutMs != null ? `settle=${action.timeoutMs}ms` : null].filter(Boolean);
|
|
56
|
+
grade(index, cmd, sel ? 'portable' : 'manual_review_required', sel ? `tapOn → tap${carried.length ? ` (${carried.join(', ')})` : ''}` : 'tapOn point/selector not in supported subset; review.', 'tap');
|
|
57
|
+
break;
|
|
58
|
+
}
|
|
59
|
+
case 'longPressOn': {
|
|
60
|
+
const sel = selectorFromMaestro(v?.selector ?? value);
|
|
61
|
+
const gesture = { kind: 'longPress', target: sel ?? undefined, durationMs: num(v?.duration) ?? 800 };
|
|
62
|
+
actions.push({ kind: 'longPress', selector: sel ?? undefined, gesture, note: 'longPressOn' });
|
|
63
|
+
grade(index, cmd, sel ? 'maestro_supported' : 'manual_review_required', 'longPressOn → longPress gesture', 'longPress');
|
|
64
|
+
break;
|
|
65
|
+
}
|
|
66
|
+
case 'scrollUntilVisible': {
|
|
67
|
+
const inner = v?.element ?? v?.visible ?? value;
|
|
68
|
+
const sel = selectorFromMaestro(inner);
|
|
69
|
+
if (!sel) {
|
|
70
|
+
unsupp(index, cmd, 'scrollUntilVisible needs a text/id/accessibility element selector.', 'scrollUntilVisible');
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
const direction = (typeof v?.direction === 'string' ? v.direction.toLowerCase() : 'down');
|
|
74
|
+
const gesture = {
|
|
75
|
+
kind: 'scroll',
|
|
76
|
+
target: sel,
|
|
77
|
+
direction,
|
|
78
|
+
speed: num(v?.speed),
|
|
79
|
+
visibilityPercentage: num(v?.visibilityPercentage) ?? 100,
|
|
80
|
+
centerElement: v?.centerElement === true,
|
|
81
|
+
};
|
|
82
|
+
actions.push({ kind: 'scrollUntilVisible', selector: sel, gesture, timeoutMs: num(v?.timeout), note: 'scrollUntilVisible' });
|
|
83
|
+
grade(index, cmd, 'maestro_supported', `scrollUntilVisible → scrollUntilVisible (direction=${direction}, visibility=${gesture.visibilityPercentage}%${gesture.centerElement ? ', center' : ''})`, 'scrollUntilVisible');
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
case 'waitForAnimationToEnd':
|
|
87
|
+
actions.push({ kind: 'waitForAnimationToEnd', timeoutMs: num(v?.timeout), note: 'waitForAnimationToEnd' });
|
|
88
|
+
grade(index, cmd, 'maestro_supported', 'waitForAnimationToEnd → animation wait (pass-with-warning on timeout)', 'waitForAnimationToEnd');
|
|
89
|
+
break;
|
|
90
|
+
case 'assertVisible': {
|
|
91
|
+
const sel = selectorFromMaestro(value);
|
|
92
|
+
if (!sel) {
|
|
93
|
+
unsupp(index, cmd, 'assertVisible selector not in supported subset.', 'assertVisible');
|
|
94
|
+
break;
|
|
95
|
+
}
|
|
96
|
+
actions.push({ kind: 'assertVisible', selector: sel, note: 'assertVisible' });
|
|
97
|
+
grade(index, cmd, 'portable', 'assertVisible → assertVisible (acts as a condition wait)', 'assertVisible');
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
100
|
+
case 'assertNotVisible': {
|
|
101
|
+
const sel = selectorFromMaestro(value);
|
|
102
|
+
if (!sel) {
|
|
103
|
+
unsupp(index, cmd, 'assertNotVisible selector not in supported subset.', 'assertNotVisible');
|
|
104
|
+
break;
|
|
105
|
+
}
|
|
106
|
+
actions.push({ kind: 'waitForNotVisible', selector: sel, note: 'assertNotVisible' });
|
|
107
|
+
grade(index, cmd, 'portable', 'assertNotVisible → waitForNotVisible', 'assertNotVisible');
|
|
108
|
+
break;
|
|
109
|
+
}
|
|
110
|
+
case 'inputText': {
|
|
111
|
+
const text = typeof value === 'string' ? value : typeof v?.text === 'string' ? v.text : undefined;
|
|
112
|
+
if (text == null) {
|
|
113
|
+
unsupp(index, cmd, 'inputText needs a string (object-form variables need a Swipium fixture).', 'inputText');
|
|
114
|
+
break;
|
|
115
|
+
}
|
|
116
|
+
actions.push({ kind: 'inputText', text, note: 'inputText' });
|
|
117
|
+
grade(index, cmd, 'portable', 'inputText → inputText', 'inputText');
|
|
118
|
+
break;
|
|
119
|
+
}
|
|
120
|
+
case 'eraseText':
|
|
121
|
+
actions.push({ kind: 'clearText', note: 'eraseText' });
|
|
122
|
+
grade(index, cmd, 'maestro_supported', 'eraseText → clearText', 'clearText (inputText into a cleared field)');
|
|
123
|
+
break;
|
|
124
|
+
case 'launchApp':
|
|
125
|
+
if (v && Object.keys(v).length) {
|
|
126
|
+
unsupp(index, cmd, 'launchApp options (clearState/permissions/arguments) need a Swipium state profile.', 'state profile + prepareTarget');
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
actions.push({ kind: 'lifecycle', note: 'launchApp' });
|
|
130
|
+
grade(index, cmd, 'maestro_supported', 'launchApp (no options) → prepareTarget', 'prepareTarget');
|
|
131
|
+
}
|
|
132
|
+
break;
|
|
133
|
+
case 'openLink':
|
|
134
|
+
actions.push({ kind: 'openUrl', text: typeof value === 'string' ? value : String(v?.link ?? ''), note: 'openLink' });
|
|
135
|
+
grade(index, cmd, 'portable', 'openLink → openUrl', 'openUrl');
|
|
136
|
+
break;
|
|
137
|
+
case 'clearState':
|
|
138
|
+
unsupp(index, cmd, 'clearState is semantic-lossy; model it as a Swipium state profile with reset policy and consent.', 'state profile');
|
|
139
|
+
break;
|
|
140
|
+
case 'repeat':
|
|
141
|
+
unsupp(index, cmd, 'Maestro repeat loops must be bounded, deterministic, and non-mutating in Swipium; review and unroll explicitly.', 'explicit repeated steps');
|
|
142
|
+
break;
|
|
143
|
+
default:
|
|
144
|
+
unsupp(index, cmd ?? 'unknown', 'command not supported by the Swipium Maestro import subset.');
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
return { actions, grades, unsupported };
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Export Action IR back to Maestro YAML. Native selectors map to Maestro selector blocks (never
|
|
151
|
+
* XPath); Appium/WDA/WebView/visual-only steps that have no portable Maestro form are emitted as an
|
|
152
|
+
* explicit `manualReview` entry and graded manual_review_required — not a silent comment.
|
|
153
|
+
*/
|
|
154
|
+
export function exportMaestroActions(actions) {
|
|
155
|
+
const commands = [];
|
|
156
|
+
const grades = [];
|
|
157
|
+
const unsupported = [];
|
|
158
|
+
const pushManual = (index, command, reason) => {
|
|
159
|
+
commands.push({ manualReview: reason });
|
|
160
|
+
unsupported.push({ command, reason });
|
|
161
|
+
grades.push({ index, command, grade: 'manual_review_required', reason });
|
|
162
|
+
};
|
|
163
|
+
// Resolve a selector to a Maestro selector block (or plain text). iOS predicate/class-chain and
|
|
164
|
+
// visual/coordinate selectors have NO portable Maestro form — they are flagged for manual review,
|
|
165
|
+
// never silently downgraded to a text matcher (which would be semantic loss graded "portable").
|
|
166
|
+
const exportSelector = (action) => {
|
|
167
|
+
const sel = action.selector;
|
|
168
|
+
if (!sel)
|
|
169
|
+
return {};
|
|
170
|
+
if (sel.strategy === 'ios_predicate' || sel.strategy === 'ios_class_chain') {
|
|
171
|
+
return { manualReason: `${sel.strategy} ("${sel.value}") has no portable Maestro selector; export needs manual review (use an accessibility id, or keep the native Appium/WDA selector).` };
|
|
172
|
+
}
|
|
173
|
+
const loc = selectorToAppium(sel);
|
|
174
|
+
if (!loc) {
|
|
175
|
+
return { manualReason: `${sel.strategy} ("${sel.value}") is visual/coordinate-only and has no portable Maestro selector; export needs manual review.` };
|
|
176
|
+
}
|
|
177
|
+
if (loc.using === 'id')
|
|
178
|
+
return { value: { id: loc.value } };
|
|
179
|
+
if (loc.using === 'accessibility id')
|
|
180
|
+
return { value: { label: loc.value } };
|
|
181
|
+
return { value: sel.value }; // text → Maestro text matcher (a genuine, portable Maestro form)
|
|
182
|
+
};
|
|
183
|
+
actions.forEach((action, index) => {
|
|
184
|
+
switch (action.kind) {
|
|
185
|
+
case 'tap': {
|
|
186
|
+
const { value, manualReason } = exportSelector(action);
|
|
187
|
+
if (manualReason) {
|
|
188
|
+
pushManual(index, 'tap', manualReason);
|
|
189
|
+
break;
|
|
190
|
+
}
|
|
191
|
+
const tapOn = value ? (typeof value === 'string' ? { text: value } : value) : {};
|
|
192
|
+
if (action.retryIfNoChange)
|
|
193
|
+
tapOn.retryTapIfNoChange = true;
|
|
194
|
+
if (action.repeat != null)
|
|
195
|
+
tapOn.repeat = action.repeat;
|
|
196
|
+
if (action.timeoutMs != null)
|
|
197
|
+
tapOn.waitToSettleTimeoutMs = action.timeoutMs;
|
|
198
|
+
commands.push({ tapOn });
|
|
199
|
+
grades.push({ index, command: 'tap', grade: 'portable', reason: 'tap → tapOn' });
|
|
200
|
+
break;
|
|
201
|
+
}
|
|
202
|
+
case 'longPress': {
|
|
203
|
+
const { value, manualReason } = exportSelector(action);
|
|
204
|
+
if (manualReason) {
|
|
205
|
+
pushManual(index, 'longPress', manualReason);
|
|
206
|
+
break;
|
|
207
|
+
}
|
|
208
|
+
commands.push({ longPressOn: value ?? {} });
|
|
209
|
+
grades.push({ index, command: 'longPress', grade: 'maestro_supported', reason: 'longPress → longPressOn' });
|
|
210
|
+
break;
|
|
211
|
+
}
|
|
212
|
+
case 'scrollUntilVisible': {
|
|
213
|
+
const { value, manualReason } = exportSelector(action);
|
|
214
|
+
if (manualReason) {
|
|
215
|
+
pushManual(index, 'scrollUntilVisible', manualReason);
|
|
216
|
+
break;
|
|
217
|
+
}
|
|
218
|
+
const g = action.gesture;
|
|
219
|
+
commands.push({
|
|
220
|
+
scrollUntilVisible: {
|
|
221
|
+
element: value ?? action.selector?.value,
|
|
222
|
+
direction: (g?.direction ?? 'down').toUpperCase(),
|
|
223
|
+
...(g?.visibilityPercentage != null ? { visibilityPercentage: g.visibilityPercentage } : {}),
|
|
224
|
+
...(g?.centerElement ? { centerElement: true } : {}),
|
|
225
|
+
...(action.timeoutMs != null ? { timeout: action.timeoutMs } : {}),
|
|
226
|
+
},
|
|
227
|
+
});
|
|
228
|
+
grades.push({ index, command: 'scrollUntilVisible', grade: 'maestro_supported', reason: 'scrollUntilVisible → scrollUntilVisible (fields preserved)' });
|
|
229
|
+
break;
|
|
230
|
+
}
|
|
231
|
+
case 'waitForNotVisible': {
|
|
232
|
+
const { value, manualReason } = exportSelector(action);
|
|
233
|
+
if (manualReason) {
|
|
234
|
+
pushManual(index, 'waitForNotVisible', manualReason);
|
|
235
|
+
break;
|
|
236
|
+
}
|
|
237
|
+
commands.push({ assertNotVisible: value ?? action.selector?.value });
|
|
238
|
+
grades.push({ index, command: 'waitForNotVisible', grade: 'portable', reason: 'waitForNotVisible → assertNotVisible' });
|
|
239
|
+
break;
|
|
240
|
+
}
|
|
241
|
+
case 'assertVisible': {
|
|
242
|
+
const { value, manualReason } = exportSelector(action);
|
|
243
|
+
if (manualReason) {
|
|
244
|
+
pushManual(index, 'assertVisible', manualReason);
|
|
245
|
+
break;
|
|
246
|
+
}
|
|
247
|
+
commands.push({ assertVisible: value ?? action.selector?.value });
|
|
248
|
+
grades.push({ index, command: 'assertVisible', grade: 'portable', reason: 'assertVisible → assertVisible' });
|
|
249
|
+
break;
|
|
250
|
+
}
|
|
251
|
+
case 'inputText':
|
|
252
|
+
commands.push({ inputText: action.text ?? '' });
|
|
253
|
+
grades.push({ index, command: 'inputText', grade: 'portable', reason: 'inputText → inputText' });
|
|
254
|
+
break;
|
|
255
|
+
case 'clearText':
|
|
256
|
+
commands.push({ eraseText: true });
|
|
257
|
+
grades.push({ index, command: 'clearText', grade: 'maestro_supported', reason: 'clearText → eraseText' });
|
|
258
|
+
break;
|
|
259
|
+
case 'waitForAnimationToEnd':
|
|
260
|
+
commands.push({ waitForAnimationToEnd: action.timeoutMs != null ? { timeout: action.timeoutMs } : {} });
|
|
261
|
+
grades.push({ index, command: 'waitForAnimationToEnd', grade: 'maestro_supported', reason: 'waitForAnimationToEnd → waitForAnimationToEnd' });
|
|
262
|
+
break;
|
|
263
|
+
case 'openUrl':
|
|
264
|
+
commands.push({ openLink: action.text ?? '' });
|
|
265
|
+
grades.push({ index, command: 'openUrl', grade: 'portable', reason: 'openUrl → openLink' });
|
|
266
|
+
break;
|
|
267
|
+
case 'lifecycle':
|
|
268
|
+
if (action.note === 'launchApp' || action.note === 'prepareTarget') {
|
|
269
|
+
commands.push({ launchApp: {} });
|
|
270
|
+
grades.push({ index, command: 'lifecycle', grade: 'maestro_supported', reason: `${action.note} → launchApp` });
|
|
271
|
+
}
|
|
272
|
+
else {
|
|
273
|
+
pushManual(index, action.note ?? 'lifecycle', `${action.note ?? 'lifecycle'} has no portable Maestro form; review manually.`);
|
|
274
|
+
}
|
|
275
|
+
break;
|
|
276
|
+
default:
|
|
277
|
+
pushManual(index, action.kind, `${action.note ?? action.kind} requires Swipium/Appium/WDA and has no portable Maestro form; review manually.`);
|
|
278
|
+
}
|
|
279
|
+
});
|
|
280
|
+
return { maestroYaml: stringify(commands), commands, grades, unsupported };
|
|
281
|
+
}
|
|
282
|
+
//# sourceMappingURL=maestroIr.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"maestroIr.js","sourceRoot":"","sources":["../../src/automation/maestroIr.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
// Automation Kernel V2 — Workstream 3: the Action Compiler. Compiles a Flow V2 file into Action IR,
|
|
2
|
+
// then into a backend-specific automation plan WITHOUT touching a device. Every step is classified
|
|
3
|
+
// before execution (native / supported_with_fallback / visual_only / unsupported) and unsupported
|
|
4
|
+
// steps name the exact missing capability and a concrete next step. This is the pure core behind the
|
|
5
|
+
// qa_flow_plan tool; it does not execute or mutate anything.
|
|
6
|
+
import { selectorSupported } from './capabilities.js';
|
|
7
|
+
import { checkSelectorBackend, parseSelector, selectorForCoordinate, selectorForVisual } from './selectors.js';
|
|
8
|
+
import { gestureSupport } from './gestures.js';
|
|
9
|
+
import { isVisualStrategy } from './types.js';
|
|
10
|
+
/** Compile a single Flow V2 step into Action IR. Returns null for steps with no automation action. */
|
|
11
|
+
export function compileStep(step) {
|
|
12
|
+
switch (step.kind) {
|
|
13
|
+
case 'tap':
|
|
14
|
+
return { kind: 'tap', selector: parseSelector(step.selector), expectedChange: 'unknown', note: step.selector };
|
|
15
|
+
case 'tapAt':
|
|
16
|
+
return { kind: 'tap', selector: selectorForCoordinate(`${step.x},${step.y}`), expectedChange: 'unknown', note: `tapAt ${step.x},${step.y}` };
|
|
17
|
+
case 'tapImage':
|
|
18
|
+
return { kind: 'tap', selector: selectorForVisual('image', step.template), expectedChange: 'unknown', note: `tapImage ${step.template}` };
|
|
19
|
+
case 'tapOcrText':
|
|
20
|
+
return { kind: 'tap', selector: selectorForVisual('ocr_text', step.query), expectedChange: 'unknown', note: `tapOcrText ${step.query}` };
|
|
21
|
+
case 'inputText':
|
|
22
|
+
return { kind: 'inputText', selector: step.into ? parseSelector(step.into) : undefined, text: step.value, note: step.into ?? '(focused field)' };
|
|
23
|
+
case 'assertVisible':
|
|
24
|
+
return { kind: 'assertVisible', selector: parseSelector(step.query), note: step.query };
|
|
25
|
+
case 'assertNotVisible':
|
|
26
|
+
return { kind: 'waitForNotVisible', selector: parseSelector(step.query), note: step.query };
|
|
27
|
+
case 'assertImage':
|
|
28
|
+
return { kind: 'assertVisual', selector: selectorForVisual('image', step.template), note: `assertImage ${step.template}` };
|
|
29
|
+
case 'assertOcrText':
|
|
30
|
+
return { kind: 'assertVisual', selector: selectorForVisual('ocr_text', step.query), note: `assertOcrText ${step.query}` };
|
|
31
|
+
case 'assertVisual':
|
|
32
|
+
return { kind: 'assertVisual', note: step.description };
|
|
33
|
+
case 'assertDiff':
|
|
34
|
+
return { kind: 'assertVisual', note: `assertDiff ${step.baseline}` };
|
|
35
|
+
case 'swipe': {
|
|
36
|
+
const gesture = { kind: 'swipe', direction: step.direction, area: step.area };
|
|
37
|
+
return { kind: 'swipe', gesture, note: `swipe ${step.direction}` };
|
|
38
|
+
}
|
|
39
|
+
case 'scrollTo': {
|
|
40
|
+
const selector = parseSelector(step.query);
|
|
41
|
+
const gesture = { kind: 'scroll', target: selector, direction: 'down', visibilityPercentage: 100 };
|
|
42
|
+
return { kind: 'scrollUntilVisible', selector, gesture, note: step.query };
|
|
43
|
+
}
|
|
44
|
+
case 'press':
|
|
45
|
+
return { kind: 'pressKey', text: step.key, note: `press ${step.key}` };
|
|
46
|
+
case 'openUrl':
|
|
47
|
+
return { kind: 'openUrl', text: step.url, note: step.url };
|
|
48
|
+
case 'waitForVisible':
|
|
49
|
+
return { kind: 'waitForVisible', selector: parseSelector(step.query), timeoutMs: step.timeoutMs, note: step.query };
|
|
50
|
+
case 'wait':
|
|
51
|
+
return step.query
|
|
52
|
+
? { kind: 'waitForVisible', selector: parseSelector(step.query), note: step.query }
|
|
53
|
+
: { kind: 'waitForIdle', idleSource: 'heuristic', timeoutMs: step.ms, note: step.ms != null ? `wait ${step.ms}ms` : 'wait' };
|
|
54
|
+
case 'waitForIdle':
|
|
55
|
+
return { kind: 'waitForIdle', idleSource: 'heuristic', timeoutMs: step.timeoutMs, note: 'waitForIdle' };
|
|
56
|
+
// Lifecycle / environment / meta steps — modeled but not selector-targeted.
|
|
57
|
+
case 'prepareTarget':
|
|
58
|
+
case 'restartApp':
|
|
59
|
+
case 'clearOverlay':
|
|
60
|
+
case 'networkOffline':
|
|
61
|
+
case 'networkOnline':
|
|
62
|
+
case 'seed':
|
|
63
|
+
case 'note':
|
|
64
|
+
case 'screenshot':
|
|
65
|
+
return { kind: 'lifecycle', note: step.kind };
|
|
66
|
+
default:
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/** Compile all of a flow's setup + main + teardown steps into Action IR. */
|
|
71
|
+
export function compileActions(flow) {
|
|
72
|
+
return [...flow.setup, ...flow.steps, ...flow.teardown]
|
|
73
|
+
.map(compileStep)
|
|
74
|
+
.filter((a) => a != null);
|
|
75
|
+
}
|
|
76
|
+
const STRUCTURED_ACTIONS = new Set([
|
|
77
|
+
'tap', 'longPress', 'doubleTap', 'inputText', 'clearText', 'scrollUntilVisible',
|
|
78
|
+
'waitForVisible', 'waitForNotVisible', 'assertVisible',
|
|
79
|
+
]);
|
|
80
|
+
function hasNonAscii(text) {
|
|
81
|
+
if (!text)
|
|
82
|
+
return false;
|
|
83
|
+
for (let i = 0; i < text.length; i++)
|
|
84
|
+
if (text.charCodeAt(i) > 127)
|
|
85
|
+
return true;
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Classify a text-input action's backend support. Returns a blocking Classification, or null when the
|
|
90
|
+
* input is fine. ASCII needs textInputAscii; literal non-ASCII text (e.g. "José") additionally needs
|
|
91
|
+
* textInputUnicode — adb `input text` cannot type Unicode reliably, so Android direct is blocked.
|
|
92
|
+
*/
|
|
93
|
+
function inputTextSupport(action, caps) {
|
|
94
|
+
if (!caps.textInputAscii)
|
|
95
|
+
return { support: 'unsupported', reason: `text input is unsupported on ${caps.backend}.`, requiredCapability: 'textInputAscii' };
|
|
96
|
+
if (hasNonAscii(action.text) && !caps.textInputUnicode) {
|
|
97
|
+
return {
|
|
98
|
+
support: 'unsupported',
|
|
99
|
+
reason: `text "${action.text}" contains non-ASCII characters; ${caps.backend} cannot input Unicode reliably.`,
|
|
100
|
+
requiredCapability: 'textInputUnicode',
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
function classifyAction(action, caps) {
|
|
106
|
+
// Lifecycle / control actions: available wherever lifecycle is (launch is our proxy).
|
|
107
|
+
if (action.kind === 'lifecycle' || action.kind === 'openUrl' || action.kind === 'pressKey') {
|
|
108
|
+
if (action.kind === 'openUrl' && !caps.openUrl) {
|
|
109
|
+
return { support: 'unsupported', reason: `openUrl is not supported on ${caps.backend}.`, requiredCapability: 'openUrl' };
|
|
110
|
+
}
|
|
111
|
+
return { support: 'native', reason: `${action.note ?? action.kind} runs as a lifecycle/control step on ${caps.backend}.` };
|
|
112
|
+
}
|
|
113
|
+
if (action.kind === 'waitForIdle') {
|
|
114
|
+
if (action.idleSource === 'app_declared' && !caps.appDeclaredIdling) {
|
|
115
|
+
return { support: 'supported_with_fallback', reason: `app-declared idling is unavailable on ${caps.backend}; will fall back to heuristic settling (not app proof).` };
|
|
116
|
+
}
|
|
117
|
+
return { support: 'native', reason: `waitForIdle uses ${caps.wdaIdling ? 'backend' : 'heuristic'} settling on ${caps.backend}.` };
|
|
118
|
+
}
|
|
119
|
+
if (action.kind === 'waitForAnimationToEnd') {
|
|
120
|
+
return { support: 'native', reason: `animation wait is honored heuristically on ${caps.backend}.` };
|
|
121
|
+
}
|
|
122
|
+
if (action.kind === 'swipe' && action.gesture) {
|
|
123
|
+
const g = gestureSupport(action.gesture, caps);
|
|
124
|
+
return g.supported
|
|
125
|
+
? { support: 'native', reason: g.reason }
|
|
126
|
+
: { support: 'unsupported', reason: g.reason, requiredCapability: g.requiredCapability };
|
|
127
|
+
}
|
|
128
|
+
if (action.kind === 'pinch' || action.kind === 'drag' || action.kind === 'longPress' || action.kind === 'doubleTap') {
|
|
129
|
+
const g = gestureSupport(action.gesture ?? { kind: action.kind === 'pinch' ? 'pinch' : action.kind === 'drag' ? 'drag' : action.kind === 'longPress' ? 'longPress' : 'doubleTap' }, caps);
|
|
130
|
+
if (!g.supported && (STRUCTURED_ACTIONS.has(action.kind) || action.kind === 'pinch' || action.kind === 'drag')) {
|
|
131
|
+
return { support: 'unsupported', reason: g.reason, requiredCapability: g.requiredCapability };
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
const selector = action.selector;
|
|
135
|
+
// Visual-strategy targets are candidate evidence only.
|
|
136
|
+
if (selector && isVisualStrategy(selector.strategy)) {
|
|
137
|
+
const ok = selectorSupported(caps, selector.strategy);
|
|
138
|
+
return ok
|
|
139
|
+
? { support: 'visual_only', reason: `${action.kind} uses a ${selector.strategy} target — visual/OCR candidate evidence, not a structured locator proof.` }
|
|
140
|
+
: { support: 'unsupported', reason: `${selector.strategy} fallback is unavailable on ${caps.backend}.`, requiredCapability: selector.strategy };
|
|
141
|
+
}
|
|
142
|
+
// assertVisual with no selector is always visual-only candidate evidence.
|
|
143
|
+
if (action.kind === 'assertVisual') {
|
|
144
|
+
return { support: 'visual_only', reason: 'assertVisual records visual candidate evidence; it is not a structured assertion.' };
|
|
145
|
+
}
|
|
146
|
+
// Coordinate targets work anywhere we can screenshot, but are a fallback (brittle).
|
|
147
|
+
if (selector && selector.strategy === 'coordinate') {
|
|
148
|
+
return selectorSupported(caps, 'coordinate')
|
|
149
|
+
? { support: 'supported_with_fallback', reason: `${action.kind} by coordinate is a brittle fallback on ${caps.backend}; prefer a durable selector.` }
|
|
150
|
+
: { support: 'unsupported', reason: `coordinate targeting needs screenshot support on ${caps.backend}.`, requiredCapability: 'screenshot' };
|
|
151
|
+
}
|
|
152
|
+
// Structured selector actions: the backend must support the selector strategy.
|
|
153
|
+
if (selector && STRUCTURED_ACTIONS.has(action.kind)) {
|
|
154
|
+
const check = checkSelectorBackend(selector, caps);
|
|
155
|
+
if (!check.supported) {
|
|
156
|
+
// If the backend has no structured tree at all (e.g. iOS raw sim), surface the structural blocker.
|
|
157
|
+
if (!caps.structuredTree) {
|
|
158
|
+
return {
|
|
159
|
+
support: 'unsupported',
|
|
160
|
+
reason: `${caps.backend} cannot run structured ${action.kind}; ${check.detail}`,
|
|
161
|
+
requiredCapability: 'structuredTree',
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
return { support: 'unsupported', reason: check.detail ?? `${selector.strategy} unsupported on ${caps.backend}.`, requiredCapability: selector.strategy };
|
|
165
|
+
}
|
|
166
|
+
// Text input also needs the right input capability (ASCII, and Unicode for non-ASCII text).
|
|
167
|
+
if (action.kind === 'inputText') {
|
|
168
|
+
const t = inputTextSupport(action, caps);
|
|
169
|
+
if (t)
|
|
170
|
+
return t;
|
|
171
|
+
}
|
|
172
|
+
return { support: 'native', reason: `${action.kind} via ${selector.strategy} is native on ${caps.backend}.` };
|
|
173
|
+
}
|
|
174
|
+
// inputText into the focused field (no selector).
|
|
175
|
+
if (action.kind === 'inputText') {
|
|
176
|
+
const t = inputTextSupport(action, caps);
|
|
177
|
+
if (t)
|
|
178
|
+
return t;
|
|
179
|
+
return { support: 'native', reason: `text input into the focused field is native on ${caps.backend}.` };
|
|
180
|
+
}
|
|
181
|
+
return { support: 'native', reason: `${action.kind} is supported on ${caps.backend}.` };
|
|
182
|
+
}
|
|
183
|
+
function nextStepForRequirement(requiredCapability, backend) {
|
|
184
|
+
switch (requiredCapability) {
|
|
185
|
+
case 'structuredTree':
|
|
186
|
+
return 'Attach WDA or Appium for structured selectors, or rewrite the step as a visual/OCR check.';
|
|
187
|
+
case 'pinch':
|
|
188
|
+
return 'Attach Appium UiAutomator2/XCUITest, or replace the pinch with a swipe/scroll.';
|
|
189
|
+
case 'textInputAscii':
|
|
190
|
+
return 'Use a backend that supports text input (WDA/Appium), or drive the field another way.';
|
|
191
|
+
case 'textInputUnicode':
|
|
192
|
+
return 'Use WDA or Appium for Unicode text, or change the fixture value to ASCII (adb input text cannot type Unicode reliably).';
|
|
193
|
+
case 'accessibility_id':
|
|
194
|
+
case 'resource_id':
|
|
195
|
+
return 'Attach a structured backend, or add a durable accessibility id / resource id.';
|
|
196
|
+
case 'ios_predicate':
|
|
197
|
+
case 'ios_class_chain':
|
|
198
|
+
return 'Use iOS WDA or Appium XCUITest, or replace it with an accessibility id.';
|
|
199
|
+
case 'ocr_text':
|
|
200
|
+
case 'image':
|
|
201
|
+
return 'Enable visual/OCR fallback, or attach a structured backend.';
|
|
202
|
+
default:
|
|
203
|
+
return `Attach a backend on which this step is supported (current: ${backend}).`;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Compile a Flow V2 file into a backend-specific automation plan. Pure — no device, no mutation.
|
|
208
|
+
*/
|
|
209
|
+
export function compileAutomationPlan(flow, caps) {
|
|
210
|
+
const actions = compileActions(flow);
|
|
211
|
+
const steps = [];
|
|
212
|
+
const blockers = [];
|
|
213
|
+
const warnings = [];
|
|
214
|
+
actions.forEach((action, index) => {
|
|
215
|
+
const cls = classifyAction(action, caps);
|
|
216
|
+
const step = { index, action, support: cls.support, reason: cls.reason, requiredCapability: cls.requiredCapability };
|
|
217
|
+
steps.push(step);
|
|
218
|
+
if (cls.support === 'unsupported') {
|
|
219
|
+
blockers.push({
|
|
220
|
+
code: cls.requiredCapability === 'structuredTree' ? 'BACKEND_UNSUPPORTED' : 'STEP_UNSUPPORTED',
|
|
221
|
+
detail: `step ${index} (${action.note ?? action.kind}): ${cls.reason}`,
|
|
222
|
+
nextStep: nextStepForRequirement(cls.requiredCapability, caps.backend),
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
else if (cls.support === 'visual_only') {
|
|
226
|
+
warnings.push({
|
|
227
|
+
code: 'VISUAL_ONLY',
|
|
228
|
+
detail: `step ${index} (${action.note ?? action.kind}): ${cls.reason}`,
|
|
229
|
+
nextStep: 'This is candidate-level evidence; add a structured selector for CI-grade proof.',
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
else if (cls.support === 'supported_with_fallback') {
|
|
233
|
+
warnings.push({
|
|
234
|
+
code: 'FALLBACK_USED',
|
|
235
|
+
detail: `step ${index} (${action.note ?? action.kind}): ${cls.reason}`,
|
|
236
|
+
nextStep: 'Prefer a durable selector to avoid the fallback.',
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
});
|
|
240
|
+
const executable = steps.every((s) => s.support !== 'unsupported');
|
|
241
|
+
const visualOnly = steps.filter((s) => s.support === 'visual_only').length;
|
|
242
|
+
const supported = steps.filter((s) => s.support === 'native' || s.support === 'supported_with_fallback').length;
|
|
243
|
+
const agentMessage = buildAgentMessage(caps.backend, executable, supported, visualOnly, blockers);
|
|
244
|
+
const developerMessage = buildDeveloperMessage(caps, steps, blockers, warnings);
|
|
245
|
+
return { backend: caps.backend, executable, steps, blockers, warnings, agentMessage, developerMessage };
|
|
246
|
+
}
|
|
247
|
+
function buildAgentMessage(backend, executable, supported, visualOnly, blockers) {
|
|
248
|
+
if (!executable) {
|
|
249
|
+
const first = blockers[0];
|
|
250
|
+
return `This flow is not runnable on ${backend}: ${first?.detail ?? 'an unsupported step blocks it'}. ${first?.nextStep ?? ''}`.trim();
|
|
251
|
+
}
|
|
252
|
+
if (supported === 0 && visualOnly > 0) {
|
|
253
|
+
return `This flow is candidate-only on ${backend}: ${visualOnly} visual/OCR step(s) and no structured locators. It produces candidate evidence, not structured proof.`;
|
|
254
|
+
}
|
|
255
|
+
const visualPart = visualOnly ? ` and ${visualOnly} visual fallback step(s)` : '';
|
|
256
|
+
return `This flow is runnable on ${backend} with ${supported} structured step(s)${visualPart}.`;
|
|
257
|
+
}
|
|
258
|
+
function buildDeveloperMessage(caps, steps, blockers, warnings) {
|
|
259
|
+
const lines = [`Backend: ${caps.backend}. ${steps.length} step(s) planned.`];
|
|
260
|
+
for (const b of blockers)
|
|
261
|
+
lines.push(`BLOCKER ${b.code}: ${b.detail} → ${b.nextStep}`);
|
|
262
|
+
for (const w of warnings)
|
|
263
|
+
lines.push(`WARNING ${w.code}: ${w.detail} → ${w.nextStep}`);
|
|
264
|
+
if (caps.notes.length)
|
|
265
|
+
lines.push(`Backend notes: ${caps.notes.join(' ')}`);
|
|
266
|
+
return lines.join('\n');
|
|
267
|
+
}
|
|
268
|
+
//# sourceMappingURL=plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/automation/plan.ts"],"names":[],"mappings":"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"}
|