appium-mcp 1.74.2 → 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 +6 -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/documentation/uploads/embeddings-Xenova-bge-small-en-v1.5.json +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/package.json +1 -1
- package/server.json +2 -2
- package/src/resources/submodules.zip +0 -0
- 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/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
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
|
+
|
|
1
7
|
## [1.74.2](https://github.com/appium/appium-mcp/compare/v1.74.1...v1.74.2) (2026-05-16)
|
|
2
8
|
|
|
3
9
|
### 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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"}
|