appium-mcp 1.74.1 → 1.74.3
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 +12 -0
- package/dist/tests/tools/gestures/ai-element.test.d.ts +2 -0
- package/dist/tests/tools/gestures/ai-element.test.d.ts.map +1 -0
- package/dist/tests/tools/gestures/ai-element.test.js +93 -0
- package/dist/tests/tools/gestures/ai-element.test.js.map +1 -0
- package/dist/tools/app-management/app.js +1 -1
- package/dist/tools/app-management/app.js.map +1 -1
- package/dist/tools/app-management/list-apps.d.ts +2 -1
- package/dist/tools/app-management/list-apps.d.ts.map +1 -1
- package/dist/tools/app-management/list-apps.js +8 -8
- package/dist/tools/app-management/list-apps.js.map +1 -1
- package/dist/tools/app-management/resolve-app-id.d.ts.map +1 -1
- package/dist/tools/app-management/resolve-app-id.js +10 -6
- package/dist/tools/app-management/resolve-app-id.js.map +1 -1
- package/dist/tools/gestures/handlers/ai-element.d.ts +56 -0
- package/dist/tools/gestures/handlers/ai-element.d.ts.map +1 -0
- package/dist/tools/gestures/handlers/ai-element.js +95 -0
- package/dist/tools/gestures/handlers/ai-element.js.map +1 -0
- package/dist/tools/gestures/handlers/pinch.d.ts.map +1 -1
- package/dist/tools/gestures/handlers/pinch.js +31 -13
- package/dist/tools/gestures/handlers/pinch.js.map +1 -1
- package/dist/tools/gestures/handlers/swipe-scroll.d.ts.map +1 -1
- package/dist/tools/gestures/handlers/swipe-scroll.js +16 -2
- package/dist/tools/gestures/handlers/swipe-scroll.js.map +1 -1
- package/dist/tools/gestures/handlers/tap.d.ts.map +1 -1
- package/dist/tools/gestures/handlers/tap.js +51 -41
- package/dist/tools/gestures/handlers/tap.js.map +1 -1
- package/dist/tools/tool-response.d.ts +2 -0
- package/dist/tools/tool-response.d.ts.map +1 -1
- package/dist/tools/tool-response.js +6 -2
- package/dist/tools/tool-response.js.map +1 -1
- package/package.json +1 -1
- package/server.json +2 -2
- package/src/resources/submodules.zip +0 -0
- package/src/tools/app-management/app.ts +1 -1
- package/src/tools/app-management/list-apps.ts +17 -10
- package/src/tools/app-management/resolve-app-id.ts +13 -9
- package/src/tools/gestures/handlers/ai-element.ts +140 -0
- package/src/tools/gestures/handlers/pinch.ts +35 -18
- package/src/tools/gestures/handlers/swipe-scroll.ts +20 -7
- package/src/tools/gestures/handlers/tap.ts +56 -50
- package/src/tools/tool-response.ts +7 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,15 @@
|
|
|
1
|
+
## [1.74.3](https://github.com/appium/appium-mcp/compare/v1.74.2...v1.74.3) (2026-05-17)
|
|
2
|
+
|
|
3
|
+
### Bug Fixes
|
|
4
|
+
|
|
5
|
+
* **gestures:** handle appium_ai coordinate UUIDs in all gesture handlers ([#321](https://github.com/appium/appium-mcp/issues/321)) ([1f3714d](https://github.com/appium/appium-mcp/commit/1f3714de4856a83ba4a7d9e04f82068cbf90351f))
|
|
6
|
+
|
|
7
|
+
## [1.74.2](https://github.com/appium/appium-mcp/compare/v1.74.1...v1.74.2) (2026-05-16)
|
|
8
|
+
|
|
9
|
+
### Bug Fixes
|
|
10
|
+
|
|
11
|
+
* **app-management:** use resolveDriver and errorResult for lifecycle tools ([#328](https://github.com/appium/appium-mcp/issues/328)) ([b1091d9](https://github.com/appium/appium-mcp/commit/b1091d96020e5437afb147d5c2e52ce4c93b0285))
|
|
12
|
+
|
|
1
13
|
## [1.74.1](https://github.com/appium/appium-mcp/compare/v1.74.0...v1.74.1) (2026-05-16)
|
|
2
14
|
|
|
3
15
|
### Bug Fixes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-element.test.d.ts","sourceRoot":"","sources":["../../../../src/tests/tools/gestures/ai-element.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { describe, test, expect, jest, beforeEach } from '@jest/globals';
|
|
2
|
+
jest.unstable_mockModule('../../../session-store', () => ({
|
|
3
|
+
getDriver: jest.fn(),
|
|
4
|
+
getPlatformName: jest.fn(),
|
|
5
|
+
PLATFORM: { ios: 'iOS', android: 'Android' },
|
|
6
|
+
}));
|
|
7
|
+
jest.unstable_mockModule('../../../command', () => ({
|
|
8
|
+
getElementRect: jest.fn(),
|
|
9
|
+
}));
|
|
10
|
+
const { AI_ELEMENT_PREFIX, isAiElementUUID, parseAiElement, resolveTargetRect, } = await import('../../../tools/gestures/handlers/ai-element.js');
|
|
11
|
+
const fakeDriver = {};
|
|
12
|
+
describe('isAiElementUUID', () => {
|
|
13
|
+
test('returns true for ai-element UUIDs', () => {
|
|
14
|
+
expect(isAiElementUUID('ai-element:100,200:50,150,150,250')).toBe(true);
|
|
15
|
+
expect(isAiElementUUID(AI_ELEMENT_PREFIX + '0,0:0,0,1,1')).toBe(true);
|
|
16
|
+
});
|
|
17
|
+
test('returns false for traditional UUIDs and falsy values', () => {
|
|
18
|
+
expect(isAiElementUUID('11111111-2222-3333-4444-555555555555')).toBe(false);
|
|
19
|
+
expect(isAiElementUUID('')).toBe(false);
|
|
20
|
+
expect(isAiElementUUID(undefined)).toBe(false);
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
describe('parseAiElement', () => {
|
|
24
|
+
test('parses centre + bbox into a rect that spans the bbox', () => {
|
|
25
|
+
const result = parseAiElement('ai-element:200,300:100,200,300,400');
|
|
26
|
+
expect(result).toEqual({
|
|
27
|
+
center: { x: 200, y: 300 },
|
|
28
|
+
rect: { x: 100, y: 200, width: 200, height: 200 },
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
test('falls back to a centred minimum rect when bbox is missing', () => {
|
|
32
|
+
const result = parseAiElement('ai-element:42,84');
|
|
33
|
+
expect(result).toEqual({
|
|
34
|
+
center: { x: 42, y: 84 },
|
|
35
|
+
rect: { x: -8, y: 34, width: 100, height: 100 },
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
test('falls back to a centred minimum rect when bbox is malformed', () => {
|
|
39
|
+
const result = parseAiElement('ai-element:10,20:not,a,real,bbox');
|
|
40
|
+
expect(result).toEqual({
|
|
41
|
+
center: { x: 10, y: 20 },
|
|
42
|
+
rect: { x: -40, y: -30, width: 100, height: 100 },
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
test('falls back to centred minimum rect when bbox is degenerate (x1<=x0 or y1<=y0)', () => {
|
|
46
|
+
expect(parseAiElement('ai-element:5,5:10,10,10,20')).toEqual({
|
|
47
|
+
center: { x: 5, y: 5 },
|
|
48
|
+
rect: { x: -45, y: -45, width: 100, height: 100 },
|
|
49
|
+
});
|
|
50
|
+
expect(parseAiElement('ai-element:5,5:10,10,20,10')).toEqual({
|
|
51
|
+
center: { x: 5, y: 5 },
|
|
52
|
+
rect: { x: -45, y: -45, width: 100, height: 100 },
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
test('returns an error when the centre segment is missing', () => {
|
|
56
|
+
const result = parseAiElement('ai-element');
|
|
57
|
+
expect(result).toEqual({
|
|
58
|
+
error: 'Invalid ai-element UUID: missing coordinate segment.',
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
test('returns an error when centre coordinates are not numbers', () => {
|
|
62
|
+
const result = parseAiElement('ai-element:foo,bar');
|
|
63
|
+
expect('error' in result).toBe(true);
|
|
64
|
+
if ('error' in result) {
|
|
65
|
+
expect(result.error).toMatch(/centre coordinates are not numbers/);
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
describe('resolveTargetRect', () => {
|
|
70
|
+
beforeEach(async () => {
|
|
71
|
+
const cmd = await import('../../../command.js');
|
|
72
|
+
jest.mocked(cmd.getElementRect).mockReset();
|
|
73
|
+
});
|
|
74
|
+
test('delegates traditional UUIDs to getElementRect', async () => {
|
|
75
|
+
const cmd = await import('../../../command.js');
|
|
76
|
+
const rect = { x: 3, y: 4, width: 30, height: 40 };
|
|
77
|
+
jest.mocked(cmd.getElementRect).mockResolvedValueOnce(rect);
|
|
78
|
+
await expect(resolveTargetRect(fakeDriver, 'aaaaaaaa-bbbb')).resolves.toBe(rect);
|
|
79
|
+
const getElMock = jest.mocked(cmd.getElementRect);
|
|
80
|
+
expect(getElMock.mock.calls).toHaveLength(1);
|
|
81
|
+
expect(getElMock.mock.calls[0]?.[1]).toBe('aaaaaaaa-bbbb');
|
|
82
|
+
});
|
|
83
|
+
test('returns { error } when getElementRect rejects', async () => {
|
|
84
|
+
const cmd = await import('../../../command.js');
|
|
85
|
+
jest
|
|
86
|
+
.mocked(cmd.getElementRect)
|
|
87
|
+
.mockRejectedValueOnce(new Error('stale element reference'));
|
|
88
|
+
await expect(resolveTargetRect(fakeDriver, 'aaaaaaaa-bbbb')).resolves.toEqual({
|
|
89
|
+
error: 'stale element reference',
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
//# sourceMappingURL=ai-element.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-element.test.js","sourceRoot":"","sources":["../../../../src/tests/tools/gestures/ai-element.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { errorResult, toolErrorMessage } from '../tool-response.js';
|
|
2
1
|
import { z } from 'zod';
|
|
3
2
|
import { resolveAppId, resolveId } from './resolve-app-id.js';
|
|
4
3
|
import { activate } from './activate-app.js';
|
|
@@ -11,6 +10,7 @@ import { queryState } from './query-app-state.js';
|
|
|
11
10
|
import { background, DEFAULT_BACKGROUND_SECONDS } from './background-app.js';
|
|
12
11
|
import { clear } from './clear-app.js';
|
|
13
12
|
import { deepLink } from './deep-link.js';
|
|
13
|
+
import { errorResult, toolErrorMessage } from '../tool-response.js';
|
|
14
14
|
const APP_ACTIONS = [
|
|
15
15
|
'activate',
|
|
16
16
|
'terminate',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../../src/tools/app-management/app.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../../src/tools/app-management/app.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { ContentResult } from 'fastmcp';
|
|
2
|
-
|
|
2
|
+
import type { DriverInstance } from '../../session-store.js';
|
|
3
|
+
export declare function listAppsFromDevice(driver: DriverInstance, applicationType?: 'User' | 'System'): Promise<{
|
|
3
4
|
packageName: string;
|
|
4
5
|
appName: string;
|
|
5
6
|
}[]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-apps.d.ts","sourceRoot":"","sources":["../../../src/tools/app-management/list-apps.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"list-apps.d.ts","sourceRoot":"","sources":["../../../src/tools/app-management/list-apps.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAG7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAyB7D,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,cAAc,EACtB,eAAe,GAAE,MAAM,GAAG,QAAiB,GAC1C,OAAO,CAAC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,CAmDrD;AAED,wBAAsB,IAAI,CACxB,eAAe,CAAC,EAAE,MAAM,GAAG,QAAQ,EACnC,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,aAAa,CAAC,CAqBxB"}
|
|
@@ -1,15 +1,11 @@
|
|
|
1
1
|
import { exec } from 'node:child_process';
|
|
2
2
|
import { promisify } from 'node:util';
|
|
3
|
-
import {
|
|
3
|
+
import { getPlatformName, isRemoteDriverSession, isAndroidUiautomator2DriverSession, isXCUITestDriverSession, PLATFORM, } from '../../session-store.js';
|
|
4
4
|
import { createUIResource, createAppListUI, addUIResourceToResponse, } from '../../ui/mcp-ui-utils.js';
|
|
5
5
|
import { execute } from '../../command.js';
|
|
6
|
-
import { textResult, errorResult, toolErrorMessage } from '../tool-response.js';
|
|
6
|
+
import { resolveDriver, textResult, errorResult, toolErrorMessage, } from '../tool-response.js';
|
|
7
7
|
const execAsync = promisify(exec);
|
|
8
|
-
export async function listAppsFromDevice(applicationType = 'User'
|
|
9
|
-
const driver = getDriver(sessionId);
|
|
10
|
-
if (!driver) {
|
|
11
|
-
throw new Error('No driver found');
|
|
12
|
-
}
|
|
8
|
+
export async function listAppsFromDevice(driver, applicationType = 'User') {
|
|
13
9
|
const platform = getPlatformName(driver);
|
|
14
10
|
if (isRemoteDriverSession(driver)) {
|
|
15
11
|
if (platform === PLATFORM.android) {
|
|
@@ -48,8 +44,12 @@ export async function listAppsFromDevice(applicationType = 'User', sessionId) {
|
|
|
48
44
|
throw new Error(`listApps is not implemented for platform: ${platform}`);
|
|
49
45
|
}
|
|
50
46
|
export async function list(applicationType, sessionId) {
|
|
47
|
+
const resolved = resolveDriver(sessionId);
|
|
48
|
+
if (!resolved.ok) {
|
|
49
|
+
return resolved.result;
|
|
50
|
+
}
|
|
51
51
|
try {
|
|
52
|
-
const apps = await listAppsFromDevice(
|
|
52
|
+
const apps = await listAppsFromDevice(resolved.driver, applicationType ?? 'User');
|
|
53
53
|
const textResponse = textResult(`Installed apps: ${JSON.stringify(apps, null, 2)}`);
|
|
54
54
|
const uiResource = createUIResource(`ui://appium-mcp/app-list/${Date.now()}`, createAppListUI(apps));
|
|
55
55
|
return addUIResourceToResponse(textResponse, uiResource);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-apps.js","sourceRoot":"","sources":["../../../src/tools/app-management/list-apps.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"list-apps.js","sourceRoot":"","sources":["../../../src/tools/app-management/list-apps.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve-app-id.d.ts","sourceRoot":"","sources":["../../../src/tools/app-management/resolve-app-id.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"resolve-app-id.d.ts","sourceRoot":"","sources":["../../../src/tools/app-management/resolve-app-id.ts"],"names":[],"mappings":"AAmBA,wBAAgB,sBAAsB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAE/D;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,SAAS,CAC7B,EAAE,EAAE,MAAM,GAAG,SAAS,EACtB,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC,CAWjB;AAED,wBAAsB,YAAY,CAChC,IAAI,EAAE,MAAM,EACZ,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC,CAoCjB"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { getSessionId, getDriver, getPlatformName, PLATFORM, isXCUITestDriverSession, } from '../../session-store.js';
|
|
2
2
|
import { listAppsFromDevice } from './list-apps.js';
|
|
3
|
+
import { noActiveDriverSessionMessage } from '../tool-response.js';
|
|
3
4
|
const CACHE_TTL_MS = 60_000; // 1 minute
|
|
4
5
|
const appListCache = new Map();
|
|
5
6
|
export function invalidateAppListCache(sessionId) {
|
|
@@ -56,7 +57,7 @@ export async function resolveAppId(name, sessionId) {
|
|
|
56
57
|
}
|
|
57
58
|
}
|
|
58
59
|
if (scored.length === 0) {
|
|
59
|
-
throw new Error(`No installed app matched the name "${name}". Use appium_app_lifecycle with action=list
|
|
60
|
+
throw new Error(`No installed app matched the name "${name}". Use appium_app_lifecycle with action=list to see available apps.`);
|
|
60
61
|
}
|
|
61
62
|
scored.sort((a, b) => b.score - a.score);
|
|
62
63
|
return scored[0].packageName;
|
|
@@ -71,17 +72,20 @@ async function getInstalledApps(sessionId) {
|
|
|
71
72
|
return cached.apps;
|
|
72
73
|
}
|
|
73
74
|
const driver = getDriver(sessionId);
|
|
74
|
-
|
|
75
|
+
if (!driver) {
|
|
76
|
+
throw new Error(noActiveDriverSessionMessage(sessionId));
|
|
77
|
+
}
|
|
78
|
+
const platform = getPlatformName(driver);
|
|
75
79
|
let apps;
|
|
76
|
-
const isSimulator =
|
|
80
|
+
const isSimulator = isXCUITestDriverSession(driver)
|
|
77
81
|
? driver.isSimulator()
|
|
78
82
|
: false;
|
|
79
83
|
if (platform === PLATFORM.ios && !isSimulator) {
|
|
80
84
|
// Real iOS device: User and System app lists are separate — fetch both in parallel.
|
|
81
85
|
// Use allSettled so a failure on one type (e.g. System) doesn't discard the other.
|
|
82
86
|
const results = await Promise.allSettled([
|
|
83
|
-
listAppsFromDevice('User'
|
|
84
|
-
listAppsFromDevice('System'
|
|
87
|
+
listAppsFromDevice(driver, 'User'),
|
|
88
|
+
listAppsFromDevice(driver, 'System'),
|
|
85
89
|
]);
|
|
86
90
|
const seen = new Set();
|
|
87
91
|
apps = [];
|
|
@@ -98,7 +102,7 @@ async function getInstalledApps(sessionId) {
|
|
|
98
102
|
}
|
|
99
103
|
else {
|
|
100
104
|
// Android or iOS Simulator: single call returns all apps
|
|
101
|
-
apps = await listAppsFromDevice('User'
|
|
105
|
+
apps = await listAppsFromDevice(driver, 'User');
|
|
102
106
|
}
|
|
103
107
|
appListCache.set(key, { apps, timestamp: Date.now() });
|
|
104
108
|
return apps;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve-app-id.js","sourceRoot":"","sources":["../../../src/tools/app-management/resolve-app-id.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,SAAS,EACT,eAAe,EACf,QAAQ,EACR,uBAAuB,GACxB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"resolve-app-id.js","sourceRoot":"","sources":["../../../src/tools/app-management/resolve-app-id.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Helpers for the special "ai-element:" UUIDs produced by the appium_ai
|
|
3
|
+
* find_element handler.
|
|
4
|
+
*
|
|
5
|
+
* The format is:
|
|
6
|
+
*
|
|
7
|
+
* ai-element:<cx>,<cy>:<x0>,<y0>,<x1>,<y1>
|
|
8
|
+
*
|
|
9
|
+
* where (cx, cy) is the visual centre of the target and (x0,y0,x1,y1) is
|
|
10
|
+
* the bounding box returned by the vision model. Both are pixel
|
|
11
|
+
* coordinates in the screenshot's coordinate space, NOT real WebDriver
|
|
12
|
+
* element ids — so they MUST NOT be passed to driver.getElementRect or
|
|
13
|
+
* to platform-native commands like `mobile: doubleTap`, `mobile: pinch`,
|
|
14
|
+
* etc., which require a real element id.
|
|
15
|
+
*
|
|
16
|
+
* Centralising the prefix, the parser, and the rect-resolution helper
|
|
17
|
+
* here keeps every gesture handler honest: if it ever needs a rect for
|
|
18
|
+
* a UUID, it goes through `resolveTargetRect` and gets the right thing
|
|
19
|
+
* for both AI and traditional UUIDs.
|
|
20
|
+
*/
|
|
21
|
+
import type { ContentResult } from 'fastmcp';
|
|
22
|
+
import type { Rect } from '@appium/types';
|
|
23
|
+
import type { DriverInstance } from '../../../session-store.js';
|
|
24
|
+
export declare const AI_ELEMENT_PREFIX = "ai-element:";
|
|
25
|
+
export declare const AI_DISABLED_REJECTION: string;
|
|
26
|
+
export type ParsedAiElement = {
|
|
27
|
+
center: {
|
|
28
|
+
x: number;
|
|
29
|
+
y: number;
|
|
30
|
+
};
|
|
31
|
+
rect: Rect;
|
|
32
|
+
};
|
|
33
|
+
export declare function isAiElementUUID(uuid: string | undefined): uuid is string;
|
|
34
|
+
/**
|
|
35
|
+
* Parse an `ai-element:` UUID into a centre point and a synthetic rect.
|
|
36
|
+
*
|
|
37
|
+
* If the bbox segment is present and well-formed, the rect describes the
|
|
38
|
+
* full bounding box. Otherwise we fall back to a small rect centred on
|
|
39
|
+
* `(cx, cy)`, so directional swipe/scroll still has usable start/end deltas.
|
|
40
|
+
*/
|
|
41
|
+
export declare function parseAiElement(uuid: string): ParsedAiElement | {
|
|
42
|
+
error: string;
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* Single dispatcher for "give me a rect for this UUID":
|
|
46
|
+
* - ai-element UUID → rect synthesised from the bbox / centre fallback, no driver call
|
|
47
|
+
* - traditional UUID → `getElementRect` on the driver
|
|
48
|
+
*
|
|
49
|
+
* Returns `{ error }` for malformed AI UUIDs or for driver lookup failures (`getElementRect`
|
|
50
|
+
* rejects). Call sites avoid try/catch and handle both cases the same way.
|
|
51
|
+
*/
|
|
52
|
+
export declare function resolveTargetRect(driver: DriverInstance, elementUUID: string): Promise<Rect | {
|
|
53
|
+
error: string;
|
|
54
|
+
}>;
|
|
55
|
+
export declare function aiDisabledResult(): ContentResult;
|
|
56
|
+
//# sourceMappingURL=ai-element.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-element.d.ts","sourceRoot":"","sources":["../../../../src/tools/gestures/handlers/ai-element.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAE1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAGhE,eAAO,MAAM,iBAAiB,gBAAgB,CAAC;AAE/C,eAAO,MAAM,qBAAqB,QAGoD,CAAC;AAEvF,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACjC,IAAI,EAAE,IAAI,CAAC;CACZ,CAAC;AAaF,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,IAAI,MAAM,CAExE;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,GACX,eAAe,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAkCrC;AAED;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,cAAc,EACtB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAenC;AAED,wBAAgB,gBAAgB,IAAI,aAAa,CAEhD"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { getElementRect } from '../../../command.js';
|
|
2
|
+
import { errorResult } from '../../tool-response.js';
|
|
3
|
+
export const AI_ELEMENT_PREFIX = 'ai-element:';
|
|
4
|
+
export const AI_DISABLED_REJECTION = `Received an ai-element: UUID, but the appium_ai tool is not registered ` +
|
|
5
|
+
`(AI_VISION_ENABLED is not set to true). Use appium_find_element to get a real ` +
|
|
6
|
+
`element UUID, or enable AI_VISION_ENABLED=true with the required AI_VISION_* keys.`;
|
|
7
|
+
/**
|
|
8
|
+
* When centre-only AI UUIDs have no bbox, direction-based swipe/scroll uses
|
|
9
|
+
* `rect.width` / `rect.height` with 0.2 / 0.8 edges; an effective 1x1 rect
|
|
10
|
+
* makes start/end identical after rounding. Keep a minimum inset area so those
|
|
11
|
+
* gestures still move visibly while staying centred on the parsed point.
|
|
12
|
+
*
|
|
13
|
+
* Values are screenshot pixels; callers can clamp against the window if needed.
|
|
14
|
+
*/
|
|
15
|
+
const AI_FALLBACK_RECT_WIDTH = 100;
|
|
16
|
+
const AI_FALLBACK_RECT_HEIGHT = 100;
|
|
17
|
+
export function isAiElementUUID(uuid) {
|
|
18
|
+
return typeof uuid === 'string' && uuid.startsWith(AI_ELEMENT_PREFIX);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Parse an `ai-element:` UUID into a centre point and a synthetic rect.
|
|
22
|
+
*
|
|
23
|
+
* If the bbox segment is present and well-formed, the rect describes the
|
|
24
|
+
* full bounding box. Otherwise we fall back to a small rect centred on
|
|
25
|
+
* `(cx, cy)`, so directional swipe/scroll still has usable start/end deltas.
|
|
26
|
+
*/
|
|
27
|
+
export function parseAiElement(uuid) {
|
|
28
|
+
const parts = uuid.split(':');
|
|
29
|
+
if (parts.length < 2) {
|
|
30
|
+
return { error: 'Invalid ai-element UUID: missing coordinate segment.' };
|
|
31
|
+
}
|
|
32
|
+
const [cxStr, cyStr] = (parts[1] ?? '').split(',');
|
|
33
|
+
const cx = Number.parseInt(cxStr ?? '', 10);
|
|
34
|
+
const cy = Number.parseInt(cyStr ?? '', 10);
|
|
35
|
+
if (!Number.isFinite(cx) || !Number.isFinite(cy)) {
|
|
36
|
+
return {
|
|
37
|
+
error: `Invalid ai-element UUID: centre coordinates are not numbers ('${parts[1]}').`,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
let rect = rectAroundCenter(cx, cy);
|
|
41
|
+
if (parts[2]) {
|
|
42
|
+
const bbox = parts[2].split(',').map((v) => Number.parseInt(v, 10));
|
|
43
|
+
if (bbox.length === 4 &&
|
|
44
|
+
bbox.every((n) => Number.isFinite(n)) &&
|
|
45
|
+
bbox[2] > bbox[0] &&
|
|
46
|
+
bbox[3] > bbox[1]) {
|
|
47
|
+
rect = {
|
|
48
|
+
x: bbox[0],
|
|
49
|
+
y: bbox[1],
|
|
50
|
+
width: bbox[2] - bbox[0],
|
|
51
|
+
height: bbox[3] - bbox[1],
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return { center: { x: cx, y: cy }, rect };
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Single dispatcher for "give me a rect for this UUID":
|
|
59
|
+
* - ai-element UUID → rect synthesised from the bbox / centre fallback, no driver call
|
|
60
|
+
* - traditional UUID → `getElementRect` on the driver
|
|
61
|
+
*
|
|
62
|
+
* Returns `{ error }` for malformed AI UUIDs or for driver lookup failures (`getElementRect`
|
|
63
|
+
* rejects). Call sites avoid try/catch and handle both cases the same way.
|
|
64
|
+
*/
|
|
65
|
+
export async function resolveTargetRect(driver, elementUUID) {
|
|
66
|
+
if (isAiElementUUID(elementUUID)) {
|
|
67
|
+
const parsed = parseAiElement(elementUUID);
|
|
68
|
+
if ('error' in parsed) {
|
|
69
|
+
return parsed;
|
|
70
|
+
}
|
|
71
|
+
return parsed.rect;
|
|
72
|
+
}
|
|
73
|
+
try {
|
|
74
|
+
return await getElementRect(driver, elementUUID);
|
|
75
|
+
}
|
|
76
|
+
catch (err) {
|
|
77
|
+
return {
|
|
78
|
+
error: err instanceof Error ? err.message : String(err),
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
export function aiDisabledResult() {
|
|
83
|
+
return errorResult(AI_DISABLED_REJECTION);
|
|
84
|
+
}
|
|
85
|
+
function rectAroundCenter(cx, cy) {
|
|
86
|
+
const w = AI_FALLBACK_RECT_WIDTH;
|
|
87
|
+
const h = AI_FALLBACK_RECT_HEIGHT;
|
|
88
|
+
return {
|
|
89
|
+
x: cx - Math.floor(w / 2),
|
|
90
|
+
y: cy - Math.floor(h / 2),
|
|
91
|
+
width: w,
|
|
92
|
+
height: h,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=ai-element.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-element.js","sourceRoot":"","sources":["../../../../src/tools/gestures/handlers/ai-element.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pinch.d.ts","sourceRoot":"","sources":["../../../../src/tools/gestures/handlers/pinch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"pinch.d.ts","sourceRoot":"","sources":["../../../../src/tools/gestures/handlers/pinch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAchE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAMhD,KAAK,QAAQ,GAAG;IACd,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,KAAK,WAAW,GAAG;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,wBAAgB,yBAAyB,CACvC,WAAW,EAAE,QAAQ,EACrB,UAAU,EAAE,QAAQ,GACnB,WAAW,CAyCb;AAED,wBAAsB,eAAe,CACnC,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,WAAW,GAChB,OAAO,CAAC,aAAa,CAAC,CA6KxB"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { getPlatformName, PLATFORM } from '../../../session-store.js';
|
|
2
|
-
import { execute,
|
|
2
|
+
import { execute, getWindowRect, performActions } from '../../../command.js';
|
|
3
3
|
import { errorResult, textResult, toolErrorMessage, } from '../../tool-response.js';
|
|
4
|
+
import { isAIEnabled } from '../../ai/config.js';
|
|
5
|
+
import { aiDisabledResult, isAiElementUUID, resolveTargetRect, } from './ai-element.js';
|
|
4
6
|
const DEFAULT_VELOCITY = 2.2;
|
|
5
7
|
const DEFAULT_PINCH_SPREAD_RATIO = 0.3;
|
|
6
8
|
const MIN_ELEMENT_PINCH_SPREAD_RATIO = 0.15;
|
|
@@ -41,6 +43,14 @@ export async function handlePinchZoom(driver, args) {
|
|
|
41
43
|
return errorResult('pinch_zoom requires both x and y when using custom coordinates.');
|
|
42
44
|
}
|
|
43
45
|
const useCustomCoords = !args.elementUUID && args.x !== undefined && args.y !== undefined;
|
|
46
|
+
// ai-element UUIDs are coordinate UUIDs, not real element ids: drive the
|
|
47
|
+
// gesture from the bbox and skip the iOS/Android native paths that need
|
|
48
|
+
// a real `elementId`.
|
|
49
|
+
const isAiUUID = isAiElementUUID(args.elementUUID);
|
|
50
|
+
if (isAiUUID && !isAIEnabled()) {
|
|
51
|
+
return aiDisabledResult();
|
|
52
|
+
}
|
|
53
|
+
const useCoordPath = useCustomCoords || isAiUUID;
|
|
44
54
|
try {
|
|
45
55
|
const platform = getPlatformName(driver);
|
|
46
56
|
let cx;
|
|
@@ -49,7 +59,10 @@ export async function handlePinchZoom(driver, args) {
|
|
|
49
59
|
let windowRect = null;
|
|
50
60
|
if (args.elementUUID) {
|
|
51
61
|
windowRect = await getWindowRect(driver);
|
|
52
|
-
const rect = await
|
|
62
|
+
const rect = await resolveTargetRect(driver, args.elementUUID);
|
|
63
|
+
if ('error' in rect) {
|
|
64
|
+
return errorResult(rect.error);
|
|
65
|
+
}
|
|
53
66
|
({ cx, cy, spread } = resolveElementPinchTarget(rect, windowRect));
|
|
54
67
|
}
|
|
55
68
|
else if (useCustomCoords) {
|
|
@@ -94,10 +107,11 @@ export async function handlePinchZoom(driver, args) {
|
|
|
94
107
|
},
|
|
95
108
|
]);
|
|
96
109
|
}
|
|
97
|
-
else if (
|
|
98
|
-
// Zoom in at a
|
|
99
|
-
// with a region centered at (cx, cy). spread is
|
|
100
|
-
// fits within the window.
|
|
110
|
+
else if (useCoordPath && platform === PLATFORM.android) {
|
|
111
|
+
// Zoom in at a coordinate-driven center on Android: use the native
|
|
112
|
+
// pinchOpenGesture with a region centered at (cx, cy). spread is
|
|
113
|
+
// pre-clamped so the region fits within the window. Also covers
|
|
114
|
+
// ai-element UUIDs, whose synthetic rect is used to pick the region.
|
|
101
115
|
const percent = Math.min(0.99, 1 - 1 / scale);
|
|
102
116
|
await execute(driver, 'mobile: pinchOpenGesture', {
|
|
103
117
|
left: cx - spread,
|
|
@@ -107,8 +121,10 @@ export async function handlePinchZoom(driver, args) {
|
|
|
107
121
|
percent,
|
|
108
122
|
});
|
|
109
123
|
}
|
|
110
|
-
else if (
|
|
111
|
-
// Zoom in at a
|
|
124
|
+
else if (useCoordPath) {
|
|
125
|
+
// Zoom in at a coordinate-driven center on iOS using W3C Actions.
|
|
126
|
+
// Same path is used for ai-element UUIDs because `mobile: pinch`
|
|
127
|
+
// requires a real elementId we don't have.
|
|
112
128
|
const startSpread = Math.max(1, Math.floor(spread / scale));
|
|
113
129
|
const endSpread = spread;
|
|
114
130
|
const duration = Math.floor((1 / Math.abs(velocity)) * 1000);
|
|
@@ -168,11 +184,13 @@ export async function handlePinchZoom(driver, args) {
|
|
|
168
184
|
return errorResult(`pinch_zoom is not supported on platform '${platform}'. Supported: iOS, Android.`);
|
|
169
185
|
}
|
|
170
186
|
const direction = scale < 1 ? 'out' : 'in';
|
|
171
|
-
const target =
|
|
172
|
-
? `element ${
|
|
173
|
-
:
|
|
174
|
-
? `
|
|
175
|
-
:
|
|
187
|
+
const target = isAiUUID
|
|
188
|
+
? `AI element coordinates (${cx}, ${cy})`
|
|
189
|
+
: args.elementUUID
|
|
190
|
+
? `element ${args.elementUUID}`
|
|
191
|
+
: useCustomCoords
|
|
192
|
+
? `coordinates (${cx}, ${cy})`
|
|
193
|
+
: 'screen';
|
|
176
194
|
return textResult(`Successfully pinched ${direction} (scale=${scale}) on ${target}.`);
|
|
177
195
|
}
|
|
178
196
|
catch (err) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pinch.js","sourceRoot":"","sources":["../../../../src/tools/gestures/handlers/pinch.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,
|
|
1
|
+
{"version":3,"file":"pinch.js","sourceRoot":"","sources":["../../../../src/tools/gestures/handlers/pinch.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"swipe-scroll.d.ts","sourceRoot":"","sources":["../../../../src/tools/gestures/handlers/swipe-scroll.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"swipe-scroll.d.ts","sourceRoot":"","sources":["../../../../src/tools/gestures/handlers/swipe-scroll.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAchE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAiBhD,MAAM,MAAM,qBAAqB,GAAG;IAClC,SAAS,EAAE,IAAI,GAAG,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,IAAI,CAAC,CA2Cf;AAkCD,wBAAsB,YAAY,CAChC,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,WAAW,GAChB,OAAO,CAAC,aAAa,CAAC,CAuCxB;AAED,wBAAsB,WAAW,CAC/B,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,WAAW,GAChB,OAAO,CAAC,aAAa,CAAC,CAkDxB"}
|