appium-mcp 1.75.4 → 1.75.7

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.
Files changed (40) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/tests/tools/gestures/ai-element.test.js +13 -1
  3. package/dist/tests/tools/gestures/ai-element.test.js.map +1 -1
  4. package/dist/tests/tools/gestures/swipe-scroll.test.d.ts +2 -0
  5. package/dist/tests/tools/gestures/swipe-scroll.test.d.ts.map +1 -0
  6. package/dist/tests/tools/gestures/swipe-scroll.test.js +55 -0
  7. package/dist/tests/tools/gestures/swipe-scroll.test.js.map +1 -0
  8. package/dist/tests/tools/interactions/webdriver-ai-element-rejection.test.d.ts +2 -0
  9. package/dist/tests/tools/interactions/webdriver-ai-element-rejection.test.d.ts.map +1 -0
  10. package/dist/tests/tools/interactions/webdriver-ai-element-rejection.test.js +86 -0
  11. package/dist/tests/tools/interactions/webdriver-ai-element-rejection.test.js.map +1 -0
  12. package/dist/tests/tools/llm-wording.test.d.ts +2 -0
  13. package/dist/tests/tools/llm-wording.test.d.ts.map +1 -0
  14. package/dist/tests/tools/llm-wording.test.js +85 -0
  15. package/dist/tests/tools/llm-wording.test.js.map +1 -0
  16. package/dist/tools/gestures/handlers/ai-element.d.ts +3 -0
  17. package/dist/tools/gestures/handlers/ai-element.d.ts.map +1 -1
  18. package/dist/tools/gestures/handlers/ai-element.js +12 -0
  19. package/dist/tools/gestures/handlers/ai-element.js.map +1 -1
  20. package/dist/tools/gestures/handlers/swipe-scroll.d.ts +23 -0
  21. package/dist/tools/gestures/handlers/swipe-scroll.d.ts.map +1 -1
  22. package/dist/tools/gestures/handlers/swipe-scroll.js +54 -1
  23. package/dist/tools/gestures/handlers/swipe-scroll.js.map +1 -1
  24. package/dist/tools/interactions/get-element-attribute.d.ts.map +1 -1
  25. package/dist/tools/interactions/get-element-attribute.js +5 -0
  26. package/dist/tools/interactions/get-element-attribute.js.map +1 -1
  27. package/dist/tools/interactions/get-text.d.ts.map +1 -1
  28. package/dist/tools/interactions/get-text.js +5 -0
  29. package/dist/tools/interactions/get-text.js.map +1 -1
  30. package/dist/tools/interactions/set-value.d.ts.map +1 -1
  31. package/dist/tools/interactions/set-value.js +7 -0
  32. package/dist/tools/interactions/set-value.js.map +1 -1
  33. package/package.json +2 -2
  34. package/server.json +2 -2
  35. package/src/resources/submodules.zip +0 -0
  36. package/src/tools/gestures/handlers/ai-element.ts +18 -0
  37. package/src/tools/gestures/handlers/swipe-scroll.ts +67 -1
  38. package/src/tools/interactions/get-element-attribute.ts +6 -0
  39. package/src/tools/interactions/get-text.ts +6 -0
  40. package/src/tools/interactions/set-value.ts +10 -0
package/CHANGELOG.md CHANGED
@@ -1,3 +1,21 @@
1
+ ## [1.75.7](https://github.com/appium/appium-mcp/compare/v1.75.6...v1.75.7) (2026-05-23)
2
+
3
+ ### Bug Fixes
4
+
5
+ * apply npm pkg fix to tweak package.json ([#362](https://github.com/appium/appium-mcp/issues/362)) ([412cae1](https://github.com/appium/appium-mcp/commit/412cae1f722d64ee3b73a2f3f050e022607fe0c1))
6
+
7
+ ## [1.75.6](https://github.com/appium/appium-mcp/compare/v1.75.5...v1.75.6) (2026-05-23)
8
+
9
+ ### Bug Fixes
10
+
11
+ * **interactions:** reject ai-element tokens in get and set tools ([#358](https://github.com/appium/appium-mcp/issues/358)) ([ac630a3](https://github.com/appium/appium-mcp/commit/ac630a3881bc58e262bac73e8fc687e13e57c286))
12
+
13
+ ## [1.75.5](https://github.com/appium/appium-mcp/compare/v1.75.4...v1.75.5) (2026-05-23)
14
+
15
+ ### Bug Fixes
16
+
17
+ * **gestures:** clamp direction gestures to window for ai-element targets ([#350](https://github.com/appium/appium-mcp/issues/350)) ([6f8db0b](https://github.com/appium/appium-mcp/commit/6f8db0bfa1462b8e54757d154b951425b8e8fbdd))
18
+
1
19
  ## [1.75.4](https://github.com/appium/appium-mcp/compare/v1.75.3...v1.75.4) (2026-05-23)
2
20
 
3
21
  ### Miscellaneous Chores
@@ -7,7 +7,7 @@ jest.unstable_mockModule('../../../session-store', () => ({
7
7
  jest.unstable_mockModule('../../../command', () => ({
8
8
  getElementRect: jest.fn(),
9
9
  }));
10
- const { AI_ELEMENT_PREFIX, isAiElementUUID, parseAiElement, resolveTargetRect, } = await import('../../../tools/gestures/handlers/ai-element.js');
10
+ const { AI_ELEMENT_PREFIX, AI_WEBDRIVER_REJECTION, isAiElementUUID, parseAiElement, resolveTargetRect, aiElementWebDriverRejectionIfNeeded, } = await import('../../../tools/gestures/handlers/ai-element.js');
11
11
  const fakeDriver = {};
12
12
  describe('isAiElementUUID', () => {
13
13
  test('returns true for ai-element UUIDs', () => {
@@ -20,6 +20,18 @@ describe('isAiElementUUID', () => {
20
20
  expect(isAiElementUUID(undefined)).toBe(false);
21
21
  });
22
22
  });
23
+ describe('aiElementWebDriverRejectionIfNeeded', () => {
24
+ test('returns isError for ai-element UUIDs', () => {
25
+ const result = aiElementWebDriverRejectionIfNeeded('ai-element:100,200:50,150,150,250');
26
+ expect(result?.isError).toBe(true);
27
+ const block = result?.content[0];
28
+ expect(block && 'text' in block && block.text).toBe(AI_WEBDRIVER_REJECTION);
29
+ });
30
+ test('returns undefined for real element ids and missing values', () => {
31
+ expect(aiElementWebDriverRejectionIfNeeded('aaaaaaaa-bbbb-cccc-dddd')).toBeUndefined();
32
+ expect(aiElementWebDriverRejectionIfNeeded(undefined)).toBeUndefined();
33
+ });
34
+ });
23
35
  describe('parseAiElement', () => {
24
36
  test('parses centre + bbox into a rect that spans the bbox', () => {
25
37
  const result = parseAiElement('ai-element:200,300:100,200,300,400');
@@ -1 +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
+ {"version":3,"file":"ai-element.test.js","sourceRoot":"","sources":["../../../../src/tests/tools/gestures/ai-element.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=swipe-scroll.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swipe-scroll.test.d.ts","sourceRoot":"","sources":["../../../../src/tests/tools/gestures/swipe-scroll.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,55 @@
1
+ import { describe, test, expect, jest } 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
+ execute: jest.fn(),
9
+ getElementRect: jest.fn(),
10
+ getWindowRect: jest.fn(),
11
+ performActions: jest.fn(),
12
+ }));
13
+ jest.unstable_mockModule('../../../tools/ai/config', () => ({
14
+ isAIEnabled: jest.fn(() => false),
15
+ }));
16
+ const { parseAiElement } = await import('../../../tools/gestures/handlers/ai-element.js');
17
+ const { clampDirectionCoordsToWindow, rectVisibleWithinWindow } = await import('../../../tools/gestures/handlers/swipe-scroll.js');
18
+ const PHONE_WINDOW = { x: 0, y: 0, width: 400, height: 800 };
19
+ describe('rectVisibleWithinWindow', () => {
20
+ test('clips ai-element fallback rect that extends past the left edge', () => {
21
+ const parsed = parseAiElement('ai-element:42,84');
22
+ expect('error' in parsed).toBe(false);
23
+ if ('error' in parsed) {
24
+ return;
25
+ }
26
+ const visible = rectVisibleWithinWindow(parsed.rect, PHONE_WINDOW);
27
+ expect(visible.x).toBeGreaterThanOrEqual(0);
28
+ expect(visible.y).toBeGreaterThanOrEqual(0);
29
+ expect(visible.x + visible.width).toBeLessThanOrEqual(PHONE_WINDOW.width);
30
+ expect(visible.y + visible.height).toBeLessThanOrEqual(PHONE_WINDOW.height);
31
+ expect(visible.width).toBeGreaterThan(0);
32
+ expect(visible.height).toBeGreaterThan(0);
33
+ });
34
+ test('returns a 1x1 rect at clamped centre when fully outside the window', () => {
35
+ const offScreen = { x: 500, y: 900, width: 100, height: 100 };
36
+ const visible = rectVisibleWithinWindow(offScreen, PHONE_WINDOW);
37
+ expect(visible).toEqual({ x: 399, y: 799, width: 1, height: 1 });
38
+ });
39
+ });
40
+ describe('clampDirectionCoordsToWindow', () => {
41
+ test('clamps swipe endpoints into inclusive window pixel bounds', () => {
42
+ const clamped = clampDirectionCoordsToWindow({ startX: -20, startY: 900, endX: 500, endY: -10 }, PHONE_WINDOW);
43
+ expect(clamped).toEqual({
44
+ startX: 0,
45
+ startY: 799,
46
+ endX: 399,
47
+ endY: 0,
48
+ });
49
+ });
50
+ test('preserves in-bounds directional coords', () => {
51
+ const coords = { startX: 200, startY: 600, endX: 200, endY: 200 };
52
+ expect(clampDirectionCoordsToWindow(coords, PHONE_WINDOW)).toEqual(coords);
53
+ });
54
+ });
55
+ //# sourceMappingURL=swipe-scroll.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swipe-scroll.test.js","sourceRoot":"","sources":["../../../../src/tests/tools/gestures/swipe-scroll.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=webdriver-ai-element-rejection.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webdriver-ai-element-rejection.test.d.ts","sourceRoot":"","sources":["../../../../src/tests/tools/interactions/webdriver-ai-element-rejection.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,86 @@
1
+ import { describe, test, expect, jest, beforeEach } from '@jest/globals';
2
+ jest.unstable_mockModule('../../../session-store.js', () => ({
3
+ getDriver: jest.fn(),
4
+ }));
5
+ jest.unstable_mockModule('../../../command.js', () => ({
6
+ getElementRect: jest.fn(),
7
+ setValue: jest.fn(),
8
+ getElementText: jest.fn(),
9
+ getElementAttribute: jest.fn(),
10
+ }));
11
+ const { getDriver } = await import('../../../session-store.js');
12
+ const { setValue, getElementText, getElementAttribute } = await import('../../../command.js');
13
+ const { AI_WEBDRIVER_REJECTION } = await import('../../../tools/gestures/handlers/ai-element.js');
14
+ const mockGetDriver = getDriver;
15
+ const mockSetValue = setValue;
16
+ const mockGetElementText = getElementText;
17
+ const mockGetElementAttribute = getElementAttribute;
18
+ const AI_UUID = 'ai-element:100,200:50,150,150,250';
19
+ const REAL_UUID = '11111111-2222-3333-4444-555555555555';
20
+ function textFromResult(result) {
21
+ const block = result.content[0];
22
+ return block && 'text' in block ? block.text : undefined;
23
+ }
24
+ describe('interaction tools and ai-element tokens', () => {
25
+ const mockServer = { addTool: jest.fn() };
26
+ beforeEach(() => {
27
+ mockGetDriver.mockReturnValue({});
28
+ mockSetValue.mockReset();
29
+ mockGetElementText.mockReset();
30
+ mockGetElementAttribute.mockReset();
31
+ });
32
+ async function loadTool(modulePath) {
33
+ const mod = await import(modulePath);
34
+ mod.default(mockServer);
35
+ return mockServer.addTool.mock.calls.at(-1)?.[0];
36
+ }
37
+ async function runTool(tool, args) {
38
+ return tool.execute(args, undefined);
39
+ }
40
+ test('set_value rejects ai-element without w3cActions', async () => {
41
+ const tool = await loadTool('../../../tools/interactions/set-value.js');
42
+ const result = await runTool(tool, { elementUUID: AI_UUID, text: 'hello' });
43
+ expect(result.isError).toBe(true);
44
+ expect(textFromResult(result)).toBe(AI_WEBDRIVER_REJECTION);
45
+ expect(mockSetValue).not.toHaveBeenCalled();
46
+ });
47
+ test('set_value still works with w3cActions', async () => {
48
+ const tool = await loadTool('../../../tools/interactions/set-value.js');
49
+ mockSetValue.mockResolvedValueOnce(undefined);
50
+ const result = await runTool(tool, {
51
+ elementUUID: AI_UUID,
52
+ text: 'hello',
53
+ w3cActions: true,
54
+ });
55
+ expect(result.isError).toBeUndefined();
56
+ expect(mockSetValue).toHaveBeenCalled();
57
+ });
58
+ test('set_value accepts a normal element id', async () => {
59
+ const tool = await loadTool('../../../tools/interactions/set-value.js');
60
+ mockSetValue.mockResolvedValueOnce(undefined);
61
+ const result = await runTool(tool, {
62
+ elementUUID: REAL_UUID,
63
+ text: 'hello',
64
+ });
65
+ expect(result.isError).toBeUndefined();
66
+ expect(mockSetValue).toHaveBeenCalledWith(expect.anything(), REAL_UUID, 'hello', undefined);
67
+ });
68
+ test('get_text rejects ai-element', async () => {
69
+ const tool = await loadTool('../../../tools/interactions/get-text.js');
70
+ const result = await runTool(tool, { elementUUID: AI_UUID });
71
+ expect(result.isError).toBe(true);
72
+ expect(textFromResult(result)).toBe(AI_WEBDRIVER_REJECTION);
73
+ expect(mockGetElementText).not.toHaveBeenCalled();
74
+ });
75
+ test('get_element_attribute rejects ai-element', async () => {
76
+ const tool = await loadTool('../../../tools/interactions/get-element-attribute.js');
77
+ const result = await runTool(tool, {
78
+ elementUUID: AI_UUID,
79
+ attribute: 'enabled',
80
+ });
81
+ expect(result.isError).toBe(true);
82
+ expect(textFromResult(result)).toBe(AI_WEBDRIVER_REJECTION);
83
+ expect(mockGetElementAttribute).not.toHaveBeenCalled();
84
+ });
85
+ });
86
+ //# sourceMappingURL=webdriver-ai-element-rejection.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webdriver-ai-element-rejection.test.js","sourceRoot":"","sources":["../../../../src/tests/tools/interactions/webdriver-ai-element-rejection.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=llm-wording.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-wording.test.d.ts","sourceRoot":"","sources":["../../../src/tests/tools/llm-wording.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,85 @@
1
+ import { describe, expect, jest, test } from '@jest/globals';
2
+ jest.unstable_mockModule('../../tools/tool-response', () => ({
3
+ errorResult: jest.fn((text) => ({
4
+ content: [{ type: 'text', text }],
5
+ isError: true,
6
+ })),
7
+ readWebElementId: jest.fn(),
8
+ resolveDriver: jest.fn(),
9
+ textResultWithPrimaryElementId: jest.fn(),
10
+ toolErrorMessage: jest.fn((err) => err instanceof Error ? err.message : String(err)),
11
+ }));
12
+ jest.unstable_mockModule('../../tools/session/attach-session', () => ({
13
+ attachSessionAction: jest.fn(),
14
+ }));
15
+ jest.unstable_mockModule('../../tools/session/create-session', () => ({
16
+ createSessionAction: jest.fn(),
17
+ }));
18
+ jest.unstable_mockModule('../../tools/session/delete-session', () => ({
19
+ deleteSessionAction: jest.fn(),
20
+ }));
21
+ jest.unstable_mockModule('../../tools/session/detach-session', () => ({
22
+ detachSessionAction: jest.fn(),
23
+ }));
24
+ jest.unstable_mockModule('../../tools/session/list-sessions', () => ({
25
+ listSessionsAction: jest.fn(),
26
+ }));
27
+ jest.unstable_mockModule('../../tools/session/select-session', () => ({
28
+ selectSessionAction: jest.fn(),
29
+ }));
30
+ function normalizeText(text) {
31
+ return text.replace(/\s+/g, ' ').trim();
32
+ }
33
+ async function registerTool(modulePath) {
34
+ const server = { addTool: jest.fn() };
35
+ const { default: register } = await import(modulePath);
36
+ register(server);
37
+ return server.addTool.mock.calls.at(-1)?.[0];
38
+ }
39
+ function paramDescription(tool, name) {
40
+ return tool.parameters.shape[name]?.description ?? '';
41
+ }
42
+ describe('LLM-facing MCP tool wording', () => {
43
+ test('appium_find_element guides models away from brittle or wrong find modes', async () => {
44
+ const tool = await registerTool('../../tools/interactions/find.js');
45
+ const description = normalizeText(tool.description);
46
+ const strategyDescription = normalizeText(paramDescription(tool, 'strategy'));
47
+ const selectorDescription = normalizeText(paramDescription(tool, 'selector'));
48
+ expect(tool.name).toBe('appium_find_element');
49
+ expect(description).toMatch(/strategy and selector/i);
50
+ expect(description).toMatch(/accessibility id .* id .* xpath/i);
51
+ expect(description).toMatch(/xpath.*last resort/i);
52
+ expect(description).toMatch(/appium_gesture.*scroll_to_element/i);
53
+ expect(description).toMatch(/appium_ai.*find_element/i);
54
+ expect(strategyDescription).toMatch(/cross-platform.*fastest.*stable/i);
55
+ expect(strategyDescription).toMatch(/iOS prefer/i);
56
+ expect(strategyDescription).toMatch(/Android prefer/i);
57
+ expect(strategyDescription).toMatch(/xpath last/i);
58
+ expect(selectorDescription).toMatch(/Do not pass natural-language descriptions/i);
59
+ });
60
+ test('appium_session_management explains local vs remote session creation', async () => {
61
+ const tool = await registerTool('../../tools/session/session.js');
62
+ const description = normalizeText(tool.description);
63
+ const actionDescription = normalizeText(paramDescription(tool, 'action'));
64
+ const platformDescription = normalizeText(paramDescription(tool, 'platform'));
65
+ const remoteServerUrlDescription = normalizeText(paramDescription(tool, 'remoteServerUrl'));
66
+ const sessionIdDescription = normalizeText(paramDescription(tool, 'sessionId'));
67
+ expect(tool.name).toBe('appium_session_management');
68
+ expect(description).toMatch(/create.*attach.*detach.*delete.*list.*select/i);
69
+ expect(actionDescription).toMatch(/DEFAULT MODE/i);
70
+ expect(actionDescription).toMatch(/no separate Appium process is needed/i);
71
+ expect(actionDescription).toMatch(/select_device tool FIRST/i);
72
+ expect(actionDescription).toMatch(/do NOT pass remoteServerUrl/i);
73
+ expect(actionDescription).toMatch(/NEVER invent a localhost URL/i);
74
+ expect(actionDescription).toMatch(/REMOTE SERVER MODE/i);
75
+ expect(actionDescription).toMatch(/only when user explicitly provides/i);
76
+ expect(actionDescription).toMatch(/without taking ownership/i);
77
+ expect(actionDescription).toMatch(/without deleting the real remote session/i);
78
+ expect(platformDescription).toMatch(/Required for create/i);
79
+ expect(platformDescription).toMatch(/general.*non-Android\/iOS/i);
80
+ expect(remoteServerUrlDescription).toMatch(/Omit to use local server/i);
81
+ expect(sessionIdDescription).toMatch(/Required for attach and select/i);
82
+ expect(tool.annotations?.destructiveHint).toBe(true);
83
+ });
84
+ });
85
+ //# sourceMappingURL=llm-wording.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-wording.test.js","sourceRoot":"","sources":["../../../src/tests/tools/llm-wording.test.ts"],"names":[],"mappings":"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"}
@@ -23,6 +23,7 @@ import type { Rect } from '@appium/types';
23
23
  import type { DriverInstance } from '../../../session-store.js';
24
24
  export declare const AI_ELEMENT_PREFIX = "ai-element:";
25
25
  export declare const AI_DISABLED_REJECTION: string;
26
+ export declare const AI_WEBDRIVER_REJECTION: string;
26
27
  export type ParsedAiElement = {
27
28
  center: {
28
29
  x: number;
@@ -53,4 +54,6 @@ export declare function resolveTargetRect(driver: DriverInstance, elementUUID: s
53
54
  error: string;
54
55
  }>;
55
56
  export declare function aiDisabledResult(): ContentResult;
57
+ export declare function aiElementWebDriverRejectedResult(): ContentResult;
58
+ export declare function aiElementWebDriverRejectionIfNeeded(elementUUID: string | undefined): ContentResult | undefined;
56
59
  //# sourceMappingURL=ai-element.d.ts.map
@@ -1 +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"}
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,eAAO,MAAM,sBAAsB,QAGgD,CAAC;AAEpF,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;AAED,wBAAgB,gCAAgC,IAAI,aAAa,CAEhE;AAED,wBAAgB,mCAAmC,CACjD,WAAW,EAAE,MAAM,GAAG,SAAS,GAC9B,aAAa,GAAG,SAAS,CAK3B"}
@@ -4,6 +4,9 @@ export const AI_ELEMENT_PREFIX = 'ai-element:';
4
4
  export const AI_DISABLED_REJECTION = `Received an ai-element: UUID, but the appium_ai tool is not registered ` +
5
5
  `(AI_VISION_ENABLED is not set to true). Use appium_find_element to get a real ` +
6
6
  `element UUID, or enable AI_VISION_ENABLED=true with the required AI_VISION_* keys.`;
7
+ export const AI_WEBDRIVER_REJECTION = `That is an ai-element token from appium_ai, not a WebDriver element id. ` +
8
+ `Use appium_gesture to tap it, or appium_find_element for a real id. ` +
9
+ `To type after a tap, use appium_set_value with w3cActions on the focused field.`;
7
10
  /**
8
11
  * When centre-only AI UUIDs have no bbox, direction-based swipe/scroll uses
9
12
  * `rect.width` / `rect.height` with 0.2 / 0.8 edges; an effective 1x1 rect
@@ -82,6 +85,15 @@ export async function resolveTargetRect(driver, elementUUID) {
82
85
  export function aiDisabledResult() {
83
86
  return errorResult(AI_DISABLED_REJECTION);
84
87
  }
88
+ export function aiElementWebDriverRejectedResult() {
89
+ return errorResult(AI_WEBDRIVER_REJECTION);
90
+ }
91
+ export function aiElementWebDriverRejectionIfNeeded(elementUUID) {
92
+ if (isAiElementUUID(elementUUID)) {
93
+ return aiElementWebDriverRejectedResult();
94
+ }
95
+ return undefined;
96
+ }
85
97
  function rectAroundCenter(cx, cy) {
86
98
  const w = AI_FALLBACK_RECT_WIDTH;
87
99
  const h = AI_FALLBACK_RECT_HEIGHT;
@@ -1 +1 @@
1
- {"version":3,"file":"ai-element.js","sourceRoot":"","sources":["../../../../src/tools/gestures/handlers/ai-element.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ai-element.js","sourceRoot":"","sources":["../../../../src/tools/gestures/handlers/ai-element.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,18 @@
1
1
  import type { ContentResult } from 'fastmcp';
2
2
  import type { DriverInstance } from '../../../session-store.js';
3
3
  import type { GestureArgs } from '../schema.js';
4
+ type Coords = {
5
+ startX: number;
6
+ startY: number;
7
+ endX: number;
8
+ endY: number;
9
+ };
10
+ interface Rect {
11
+ x: number;
12
+ y: number;
13
+ width: number;
14
+ height: number;
15
+ }
4
16
  export type VerticalScrollOptions = {
5
17
  direction: 'up' | 'down';
6
18
  distance: number;
@@ -12,4 +24,15 @@ export type VerticalScrollOptions = {
12
24
  export declare function performVerticalScroll(driver: DriverInstance, options: VerticalScrollOptions): Promise<void>;
13
25
  export declare function handleScroll(driver: DriverInstance, args: GestureArgs): Promise<ContentResult>;
14
26
  export declare function handleSwipe(driver: DriverInstance, args: GestureArgs): Promise<ContentResult>;
27
+ /**
28
+ * Clip an element rect to the visible window. Used for ai-element targets whose
29
+ * bbox or fallback rect can extend past the screenshot edges.
30
+ */
31
+ export declare function rectVisibleWithinWindow(elementRect: Rect, window: Rect): Rect;
32
+ /** Keep swipe/scroll pointer coords inside the window (inclusive pixel indices). */
33
+ export declare function clampDirectionCoordsToWindow(coords: Coords, window: {
34
+ width: number;
35
+ height: number;
36
+ }): Coords;
37
+ export {};
15
38
  //# sourceMappingURL=swipe-scroll.d.ts.map
@@ -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;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"}
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;AAGhD,KAAK,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7E,UAAU,IAAI;IACZ,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAOD,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;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,GAAG,IAAI,CA6B7E;AAED,oFAAoF;AACpF,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,MAAM,EACd,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACxC,MAAM,CASR"}
@@ -161,6 +161,44 @@ export async function handleSwipe(driver, args) {
161
161
  return errorResult(`Failed to swipe. ${toolErrorMessage(err)}`);
162
162
  }
163
163
  }
164
+ /**
165
+ * Clip an element rect to the visible window. Used for ai-element targets whose
166
+ * bbox or fallback rect can extend past the screenshot edges.
167
+ */
168
+ export function rectVisibleWithinWindow(elementRect, window) {
169
+ const windowLeft = window.x ?? 0;
170
+ const windowTop = window.y ?? 0;
171
+ const windowRight = windowLeft + window.width;
172
+ const windowBottom = windowTop + window.height;
173
+ const visibleLeft = Math.max(windowLeft, elementRect.x);
174
+ const visibleTop = Math.max(windowTop, elementRect.y);
175
+ const visibleRight = Math.min(windowRight, elementRect.x + elementRect.width);
176
+ const visibleBottom = Math.min(windowBottom, elementRect.y + elementRect.height);
177
+ const width = Math.max(0, visibleRight - visibleLeft);
178
+ const height = Math.max(0, visibleBottom - visibleTop);
179
+ if (width > 0 && height > 0) {
180
+ return { x: visibleLeft, y: visibleTop, width, height };
181
+ }
182
+ const cx = elementRect.x + elementRect.width / 2;
183
+ const cy = elementRect.y + elementRect.height / 2;
184
+ return {
185
+ x: Math.floor(clamp(cx, windowLeft, windowRight - 1)),
186
+ y: Math.floor(clamp(cy, windowTop, windowBottom - 1)),
187
+ width: 1,
188
+ height: 1,
189
+ };
190
+ }
191
+ /** Keep swipe/scroll pointer coords inside the window (inclusive pixel indices). */
192
+ export function clampDirectionCoordsToWindow(coords, window) {
193
+ const maxX = Math.max(0, window.width - 1);
194
+ const maxY = Math.max(0, window.height - 1);
195
+ return {
196
+ startX: Math.floor(clamp(coords.startX, 0, maxX)),
197
+ startY: Math.floor(clamp(coords.startY, 0, maxY)),
198
+ endX: Math.floor(clamp(coords.endX, 0, maxX)),
199
+ endY: Math.floor(clamp(coords.endY, 0, maxY)),
200
+ };
201
+ }
164
202
  function coordsForDirection(direction, rect) {
165
203
  const centerX = Math.floor(rect.x + rect.width / 2);
166
204
  const centerY = Math.floor(rect.y + rect.height / 2);
@@ -205,12 +243,24 @@ async function resolveCoords(driver, args) {
205
243
  if ('error' in rect) {
206
244
  return rect;
207
245
  }
208
- return coordsForDirection(args.direction, {
246
+ const targetRect = {
209
247
  x: rect.x,
210
248
  y: rect.y,
211
249
  width: rect.width,
212
250
  height: rect.height,
251
+ };
252
+ if (!isAiElementUUID(args.elementUUID)) {
253
+ return coordsForDirection(args.direction, targetRect);
254
+ }
255
+ const window = await getWindowRect(driver);
256
+ const clippedRect = rectVisibleWithinWindow(targetRect, {
257
+ x: 0,
258
+ y: 0,
259
+ width: window.width,
260
+ height: window.height,
213
261
  });
262
+ const coords = coordsForDirection(args.direction, clippedRect);
263
+ return clampDirectionCoordsToWindow(coords, window);
214
264
  }
215
265
  const window = await getWindowRect(driver);
216
266
  return coordsForDirection(args.direction, {
@@ -230,6 +280,9 @@ async function resolveCoords(driver, args) {
230
280
  error: 'Either direction OR custom coordinates (x, y, endX, endY) must be provided.',
231
281
  };
232
282
  }
283
+ function clamp(value, min, max) {
284
+ return Math.min(max, Math.max(min, value));
285
+ }
233
286
  async function performW3CDrag(driver, coords, duration, initialPause) {
234
287
  const actions = [
235
288
  { type: 'pointerMove', duration: 0, x: coords.startX, y: coords.startY },
@@ -1 +1 @@
1
- {"version":3,"file":"swipe-scroll.js","sourceRoot":"","sources":["../../../../src/tools/gestures/handlers/swipe-scroll.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"swipe-scroll.js","sourceRoot":"","sources":["../../../../src/tools/gestures/handlers/swipe-scroll.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC7E,OAAO,EACL,WAAW,EACX,UAAU,EACV,gBAAgB,GACjB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AAazB,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAC/B,MAAM,uBAAuB,GAAG,GAAG,CAAC;AACpC,6FAA6F;AAC7F,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAOpC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,MAAsB,EACtB,OAA8B;IAE9B,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IACrC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,gBAAgB,CACvC,MAAM,EACN,OAAO,CAAC,SAAS,EACjB,OAAO,CAAC,QAAQ,CACjB,CAAC;IAEF,IAAI,eAAe,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC,OAAO,EAAE,CAAC;QACjD,MAAM,cAAc,CAAC,MAAM,EAAE;YAC3B;gBACE,IAAI,EAAE,SAAS;gBACf,EAAE,EAAE,SAAS;gBACb,UAAU,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE;gBACpC,OAAO,EAAE;oBACP,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE;oBAC1D,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,EAAE;oBAClC,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,uBAAuB,EAAE;oBACpD;wBACE,IAAI,EAAE,aAAa;wBACnB,QAAQ,EAAE,uBAAuB;wBACjC,CAAC,EAAE,MAAM;wBACT,CAAC,EAAE,IAAI;qBACR;oBACD,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAE;iBACjC;aACF;SACF,CAAC,CAAC;IACL,CAAC;SAAM,IAAI,eAAe,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC,GAAG,EAAE,CAAC;QACpD,MAAM,OAAO,CAAC,MAAM,EAAE,gBAAgB,EAAE;YACtC,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,MAAM;YACN,MAAM;YACN,IAAI,EAAE,MAAM;YACZ,IAAI;SACL,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CACb,yBAAyB,eAAe,CAAC,MAAM,CAAC,uCAAuC,CACxF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CACvB,MAAc,EACd,SAAwB,EACxB,QAAgB;IAEhB,MAAM,GAAG,GAAG,MAAM,GAAG,GAAG,CAAC;IACzB,MAAM,QAAQ,GAAG,MAAM,GAAG,GAAG,GAAG,QAAQ,CAAC;IACzC,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;QACzB,OAAO;YACL,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,QAAQ,CAAC;YAClC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,QAAQ,CAAC;SACjC,CAAC;IACJ,CAAC;IACD,OAAO;QACL,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,QAAQ,CAAC;QAClC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,QAAQ,CAAC;KACjC,CAAC;AACJ,CAAC;AAED,MAAM,oBAAoB,GAAG;IAC3B,IAAI,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE;IAC1C,MAAM,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE;IAC5C,IAAI,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,YAAY,EAAE,CAAC,EAAE;CAChC,CAAC;AAEX,MAAM,iBAAiB,GAAiC;IACtD,EAAE,EAAE,MAAM;IACV,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,OAAO;IACb,KAAK,EAAE,MAAM;CACd,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,MAAsB,EACtB,IAAiB;IAEjB,IAAI,CAAC;QACH,IAAI,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACxD,OAAO,gBAAgB,EAAE,CAAC;QAC5B,CAAC;QACD,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;QACzC,iFAAiF;QACjF,qEAAqE;QACrE,MAAM,UAAU,GACd,QAAQ,KAAK,QAAQ,CAAC,OAAO,IAAI,IAAI,CAAC,SAAS;YAC7C,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;YAC3D,CAAC,CAAC,IAAI,CAAC;QACX,MAAM,YAAY,GAAG,MAAM,aAAa,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAC7D,IAAI,OAAO,IAAI,YAAY,EAAE,CAAC;YAC5B,OAAO,WAAW,CAAC,WAAW,YAAY,CAAC,KAAK,EAAE,CAAC,CAAC;QACtD,CAAC;QACD,MAAM,MAAM,GAAG,YAAY,CAAC;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,kBAAkB,CAAC;QAErD,IAAI,QAAQ,KAAK,QAAQ,CAAC,GAAG,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACrE,MAAM,OAAO,CAAC,MAAM,EAAE,gBAAgB,EAAE;gBACtC,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,IAAI,EAAE,MAAM,CAAC,IAAI;aAClB,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,MAAM,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,uBAAuB,CAAC,CAAC;QAC1E,CAAC;QAED,OAAO,UAAU,CACf,IAAI,CAAC,SAAS;YACZ,CAAC,CAAC,yBAAyB,IAAI,CAAC,SAAS,GAAG;YAC5C,CAAC,CAAC,+BAA+B,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,SAAS,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,IAAI,CAC3G,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,WAAW,CAAC,qBAAqB,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACnE,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,MAAsB,EACtB,IAAiB;IAEjB,IAAI,CAAC;QACH,IAAI,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACxD,OAAO,gBAAgB,EAAE,CAAC;QAC5B,CAAC;QACD,MAAM,YAAY,GAAG,MAAM,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACvD,IAAI,OAAO,IAAI,YAAY,EAAE,CAAC;YAC5B,OAAO,WAAW,CAAC,UAAU,YAAY,CAAC,KAAK,EAAE,CAAC,CAAC;QACrD,CAAC;QACD,MAAM,MAAM,GAAG,YAAY,CAAC;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,QAAQ,CAAC;QACrC,MAAM,OAAO,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;QAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC;QACnD,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;QAC1C,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;QAEzC,6FAA6F;QAC7F,IACE,QAAQ,KAAK,QAAQ,CAAC,GAAG;YACzB,IAAI,CAAC,SAAS;YACd,CAAC,IAAI,CAAC,WAAW;YACjB,KAAK,KAAK,MAAM,EAChB,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,OAAO,CAAC,MAAM,EAAE,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;YACxE,CAAC;YAAC,MAAM,CAAC;gBACP,IAAI,CAAC;oBACH,MAAM,OAAO,CAAC,MAAM,EAAE,+BAA+B,EAAE;wBACrD,KAAK,EAAE,MAAM,CAAC,MAAM;wBACpB,KAAK,EAAE,MAAM,CAAC,MAAM;wBACpB,GAAG,EAAE,MAAM,CAAC,IAAI;wBAChB,GAAG,EAAE,MAAM,CAAC,IAAI;wBAChB,QAAQ,EAAE,QAAQ,GAAG,IAAI;qBAC1B,CAAC,CAAC;gBACL,CAAC;gBAAC,MAAM,CAAC;oBACP,MAAM,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;gBAC/D,CAAC;YACH,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;QAC/D,CAAC;QAED,OAAO,UAAU,CACf,IAAI,CAAC,SAAS;YACZ,CAAC,CAAC,uBAAuB,IAAI,CAAC,SAAS,WAAW,KAAK,IAAI;YAC3D,CAAC,CAAC,6BAA6B,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,SAAS,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,YAAY,KAAK,IAAI,CAC1H,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,WAAW,CAAC,oBAAoB,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClE,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,WAAiB,EAAE,MAAY;IACrE,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,WAAW,GAAG,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC;IAC9C,MAAM,YAAY,GAAG,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC;IAE/C,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACxD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACtD,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IAC9E,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAC5B,YAAY,EACZ,WAAW,CAAC,CAAC,GAAG,WAAW,CAAC,MAAM,CACnC,CAAC;IAEF,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,GAAG,WAAW,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,GAAG,UAAU,CAAC,CAAC;IAEvD,IAAI,KAAK,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAC1D,CAAC;IAED,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,GAAG,WAAW,CAAC,KAAK,GAAG,CAAC,CAAC;IACjD,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;IAClD,OAAO;QACL,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE,UAAU,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC;QACrD,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,YAAY,GAAG,CAAC,CAAC,CAAC;QACrD,KAAK,EAAE,CAAC;QACR,MAAM,EAAE,CAAC;KACV,CAAC;AACJ,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,4BAA4B,CAC1C,MAAc,EACd,MAAyC;IAEzC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC5C,OAAO;QACL,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QACjD,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QACjD,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QAC7C,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;KAC9C,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,SAAoB,EAAE,IAAU;IAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACrD,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,MAAM;YACT,OAAO;gBACL,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC;gBAC7C,MAAM,EAAE,OAAO;gBACf,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC;gBAC3C,IAAI,EAAE,OAAO;aACd,CAAC;QACJ,KAAK,OAAO;YACV,OAAO;gBACL,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC;gBAC7C,MAAM,EAAE,OAAO;gBACf,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC;gBAC3C,IAAI,EAAE,OAAO;aACd,CAAC;QACJ,KAAK,IAAI;YACP,OAAO;gBACL,MAAM,EAAE,OAAO;gBACf,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;gBAC9C,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;aAC7C,CAAC;QACJ,KAAK,MAAM;YACT,OAAO;gBACL,MAAM,EAAE,OAAO;gBACf,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;gBAC9C,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;aAC7C,CAAC;IACN,CAAC;AACH,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,MAAsB,EACtB,IAAiB;IAEjB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,qEAAqE;YACrE,mEAAmE;YACnE,2BAA2B;YAC3B,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YAC/D,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;gBACpB,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,UAAU,GAAS;gBACvB,CAAC,EAAE,IAAI,CAAC,CAAC;gBACT,CAAC,EAAE,IAAI,CAAC,CAAC;gBACT,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB,CAAC;YACF,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;gBACvC,OAAO,kBAAkB,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;YACxD,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC;YAC3C,MAAM,WAAW,GAAG,uBAAuB,CAAC,UAAU,EAAE;gBACtD,CAAC,EAAE,CAAC;gBACJ,CAAC,EAAE,CAAC;gBACJ,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,MAAM,EAAE,MAAM,CAAC,MAAM;aACtB,CAAC,CAAC;YACH,MAAM,MAAM,GAAG,kBAAkB,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;YAC/D,OAAO,4BAA4B,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACtD,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC;QAC3C,OAAO,kBAAkB,CAAC,IAAI,CAAC,SAAS,EAAE;YACxC,CAAC,EAAE,CAAC;YACJ,CAAC,EAAE,CAAC;YACJ,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,CAAC,CAAC;IACL,CAAC;IAED,IACE,IAAI,CAAC,CAAC,KAAK,SAAS;QACpB,IAAI,CAAC,CAAC,KAAK,SAAS;QACpB,IAAI,CAAC,IAAI,KAAK,SAAS;QACvB,IAAI,CAAC,IAAI,KAAK,SAAS,EACvB,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;IAC9E,CAAC;IAED,OAAO;QACL,KAAK,EACH,6EAA6E;KAChF,CAAC;AACJ,CAAC;AAED,SAAS,KAAK,CAAC,KAAa,EAAE,GAAW,EAAE,GAAW;IACpD,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,MAAsB,EACtB,MAAc,EACd,QAAgB,EAChB,YAAoB;IAEpB,MAAM,OAAO,GAAG;QACd,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QACxE,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,EAAE;QAClC,GAAG,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACxE,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC,IAAI,EAAE;QACjE,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAE;KACjC,CAAC;IACF,MAAM,cAAc,CAAC,MAAM,EAAE;QAC3B;YACE,IAAI,EAAE,SAAS;YACf,EAAE,EAAE,SAAS;YACb,UAAU,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE;YACpC,OAAO;SACR;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"get-element-attribute.d.ts","sourceRoot":"","sources":["../../../src/tools/interactions/get-element-attribute.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,OAAO,EAAE,MAAM,SAAS,CAAC;AAWtD,MAAM,CAAC,OAAO,UAAU,uBAAuB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAmDrE"}
1
+ {"version":3,"file":"get-element-attribute.d.ts","sourceRoot":"","sources":["../../../src/tools/interactions/get-element-attribute.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,OAAO,EAAE,MAAM,SAAS,CAAC;AAYtD,MAAM,CAAC,OAAO,UAAU,uBAAuB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAwDrE"}
@@ -2,6 +2,7 @@ import { z } from 'zod';
2
2
  import { elementUUIDScheme } from '../../schema.js';
3
3
  import { getElementAttribute } from '../../command.js';
4
4
  import { resolveDriver, textResultWithPrimaryElementId, errorResult, toolErrorMessage, } from '../tool-response.js';
5
+ import { aiElementWebDriverRejectionIfNeeded } from '../gestures/handlers/ai-element.js';
5
6
  export default function getElementAttributeTool(server) {
6
7
  const schema = z.object({
7
8
  elementUUID: elementUUIDScheme,
@@ -27,6 +28,10 @@ export default function getElementAttributeTool(server) {
27
28
  return resolved.result;
28
29
  }
29
30
  const { driver } = resolved;
31
+ const aiRejection = aiElementWebDriverRejectionIfNeeded(args.elementUUID);
32
+ if (aiRejection) {
33
+ return aiRejection;
34
+ }
30
35
  try {
31
36
  const value = await getElementAttribute(driver, args.elementUUID, args.attribute);
32
37
  const detail = value !== null
@@ -1 +1 @@
1
- {"version":3,"file":"get-element-attribute.js","sourceRoot":"","sources":["../../../src/tools/interactions/get-element-attribute.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EACL,aAAa,EACb,8BAA8B,EAC9B,WAAW,EACX,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,CAAC,OAAO,UAAU,uBAAuB,CAAC,MAAe;IAC7D,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;QACtB,WAAW,EAAE,iBAAiB;QAC9B,SAAS,EAAE,CAAC;aACT,MAAM,EAAE;aACR,QAAQ,CACP,2OAA2O,CAC5O;QACH,SAAS,EAAE,CAAC;aACT,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,4DAA4D,CAAC;KAC1E,CAAC,CAAC;IAEH,MAAM,CAAC,OAAO,CAAC;QACb,IAAI,EAAE,8BAA8B;QACpC,WAAW,EACT,+MAA+M;QACjN,UAAU,EAAE,MAAM;QAClB,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,aAAa,EAAE,KAAK;SACrB;QACD,OAAO,EAAE,KAAK,EACZ,IAA4B,EAC5B,QAA6C,EACrB,EAAE;YAC1B,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC/C,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,OAAO,QAAQ,CAAC,MAAM,CAAC;YACzB,CAAC;YACD,MAAM,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC;YAE5B,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,mBAAmB,CACrC,MAAM,EACN,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,SAAS,CACf,CAAC;gBACF,MAAM,MAAM,GACV,KAAK,KAAK,IAAI;oBACZ,CAAC,CAAC,cAAc,IAAI,CAAC,SAAS,gBAAgB,IAAI,CAAC,WAAW,KAAK,KAAK,EAAE;oBAC1E,CAAC,CAAC,cAAc,IAAI,CAAC,SAAS,2BAA2B,IAAI,CAAC,WAAW,EAAE,CAAC;gBAChF,OAAO,8BAA8B,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;YAClE,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACtB,OAAO,WAAW,CAChB,4BAA4B,IAAI,CAAC,SAAS,kBAAkB,IAAI,CAAC,WAAW,UAAU,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAC9G,CAAC;YACJ,CAAC;QACH,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"get-element-attribute.js","sourceRoot":"","sources":["../../../src/tools/interactions/get-element-attribute.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EACL,aAAa,EACb,8BAA8B,EAC9B,WAAW,EACX,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,mCAAmC,EAAE,MAAM,oCAAoC,CAAC;AAEzF,MAAM,CAAC,OAAO,UAAU,uBAAuB,CAAC,MAAe;IAC7D,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;QACtB,WAAW,EAAE,iBAAiB;QAC9B,SAAS,EAAE,CAAC;aACT,MAAM,EAAE;aACR,QAAQ,CACP,2OAA2O,CAC5O;QACH,SAAS,EAAE,CAAC;aACT,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,4DAA4D,CAAC;KAC1E,CAAC,CAAC;IAEH,MAAM,CAAC,OAAO,CAAC;QACb,IAAI,EAAE,8BAA8B;QACpC,WAAW,EACT,+MAA+M;QACjN,UAAU,EAAE,MAAM;QAClB,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,aAAa,EAAE,KAAK;SACrB;QACD,OAAO,EAAE,KAAK,EACZ,IAA4B,EAC5B,QAA6C,EACrB,EAAE;YAC1B,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC/C,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,OAAO,QAAQ,CAAC,MAAM,CAAC;YACzB,CAAC;YACD,MAAM,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC;YAE5B,MAAM,WAAW,GAAG,mCAAmC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC1E,IAAI,WAAW,EAAE,CAAC;gBAChB,OAAO,WAAW,CAAC;YACrB,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,mBAAmB,CACrC,MAAM,EACN,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,SAAS,CACf,CAAC;gBACF,MAAM,MAAM,GACV,KAAK,KAAK,IAAI;oBACZ,CAAC,CAAC,cAAc,IAAI,CAAC,SAAS,gBAAgB,IAAI,CAAC,WAAW,KAAK,KAAK,EAAE;oBAC1E,CAAC,CAAC,cAAc,IAAI,CAAC,SAAS,2BAA2B,IAAI,CAAC,WAAW,EAAE,CAAC;gBAChF,OAAO,8BAA8B,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;YAClE,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACtB,OAAO,WAAW,CAChB,4BAA4B,IAAI,CAAC,SAAS,kBAAkB,IAAI,CAAC,WAAW,UAAU,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAC9G,CAAC;YACJ,CAAC;QACH,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"get-text.d.ts","sourceRoot":"","sources":["../../../src/tools/interactions/get-text.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,OAAO,EAAE,MAAM,SAAS,CAAC;AAWtD,MAAM,CAAC,OAAO,UAAU,OAAO,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAwCrD"}
1
+ {"version":3,"file":"get-text.d.ts","sourceRoot":"","sources":["../../../src/tools/interactions/get-text.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,OAAO,EAAE,MAAM,SAAS,CAAC;AAYtD,MAAM,CAAC,OAAO,UAAU,OAAO,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CA6CrD"}
@@ -2,6 +2,7 @@ import { z } from 'zod';
2
2
  import { elementUUIDScheme } from '../../schema.js';
3
3
  import { getElementText } from '../../command.js';
4
4
  import { resolveDriver, textResultWithPrimaryElementId, errorResult, toolErrorMessage, } from '../tool-response.js';
5
+ import { aiElementWebDriverRejectionIfNeeded } from '../gestures/handlers/ai-element.js';
5
6
  export default function getText(server) {
6
7
  const getTextSchema = z.object({
7
8
  elementUUID: elementUUIDScheme,
@@ -24,6 +25,10 @@ export default function getText(server) {
24
25
  return resolved.result;
25
26
  }
26
27
  const { driver } = resolved;
28
+ const aiRejection = aiElementWebDriverRejectionIfNeeded(args.elementUUID);
29
+ if (aiRejection) {
30
+ return aiRejection;
31
+ }
27
32
  try {
28
33
  const text = await getElementText(driver, args.elementUUID);
29
34
  return textResultWithPrimaryElementId(args.elementUUID, `Successfully got text ${text} from element ${args.elementUUID}.`);
@@ -1 +1 @@
1
- {"version":3,"file":"get-text.js","sourceRoot":"","sources":["../../../src/tools/interactions/get-text.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EACL,aAAa,EACb,8BAA8B,EAC9B,WAAW,EACX,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,CAAC,OAAO,UAAU,OAAO,CAAC,MAAe;IAC7C,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;QAC7B,WAAW,EAAE,iBAAiB;QAC9B,SAAS,EAAE,CAAC;aACT,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,4DAA4D,CAAC;KAC1E,CAAC,CAAC;IAEH,MAAM,CAAC,OAAO,CAAC;QACb,IAAI,EAAE,iBAAiB;QACvB,WAAW,EAAE,0BAA0B;QACvC,UAAU,EAAE,aAAa;QACzB,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,aAAa,EAAE,KAAK;SACrB;QACD,OAAO,EAAE,KAAK,EACZ,IAAmC,EACnC,QAA6C,EACrB,EAAE;YAC1B,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC/C,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,OAAO,QAAQ,CAAC,MAAM,CAAC;YACzB,CAAC;YACD,MAAM,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC;YAE5B,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;gBAC5D,OAAO,8BAA8B,CACnC,IAAI,CAAC,WAAW,EAChB,yBAAyB,IAAI,iBAAiB,IAAI,CAAC,WAAW,GAAG,CAClE,CAAC;YACJ,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACtB,OAAO,WAAW,CAChB,mCAAmC,IAAI,CAAC,WAAW,UAAU,gBAAgB,CAAC,GAAG,CAAC,EAAE,CACrF,CAAC;YACJ,CAAC;QACH,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"get-text.js","sourceRoot":"","sources":["../../../src/tools/interactions/get-text.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EACL,aAAa,EACb,8BAA8B,EAC9B,WAAW,EACX,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,mCAAmC,EAAE,MAAM,oCAAoC,CAAC;AAEzF,MAAM,CAAC,OAAO,UAAU,OAAO,CAAC,MAAe;IAC7C,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;QAC7B,WAAW,EAAE,iBAAiB;QAC9B,SAAS,EAAE,CAAC;aACT,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,4DAA4D,CAAC;KAC1E,CAAC,CAAC;IAEH,MAAM,CAAC,OAAO,CAAC;QACb,IAAI,EAAE,iBAAiB;QACvB,WAAW,EAAE,0BAA0B;QACvC,UAAU,EAAE,aAAa;QACzB,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,aAAa,EAAE,KAAK;SACrB;QACD,OAAO,EAAE,KAAK,EACZ,IAAmC,EACnC,QAA6C,EACrB,EAAE;YAC1B,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC/C,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,OAAO,QAAQ,CAAC,MAAM,CAAC;YACzB,CAAC;YACD,MAAM,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC;YAE5B,MAAM,WAAW,GAAG,mCAAmC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC1E,IAAI,WAAW,EAAE,CAAC;gBAChB,OAAO,WAAW,CAAC;YACrB,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;gBAC5D,OAAO,8BAA8B,CACnC,IAAI,CAAC,WAAW,EAChB,yBAAyB,IAAI,iBAAiB,IAAI,CAAC,WAAW,GAAG,CAClE,CAAC;YACJ,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACtB,OAAO,WAAW,CAChB,mCAAmC,IAAI,CAAC,WAAW,UAAU,gBAAgB,CAAC,GAAG,CAAC,EAAE,CACrF,CAAC;YACJ,CAAC;QACH,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"set-value.d.ts","sourceRoot":"","sources":["../../../src/tools/interactions/set-value.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,OAAO,EAAE,MAAM,SAAS,CAAC;AAYtD,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CA2DtD"}
1
+ {"version":3,"file":"set-value.d.ts","sourceRoot":"","sources":["../../../src/tools/interactions/set-value.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,OAAO,EAAE,MAAM,SAAS,CAAC;AAatD,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAoEtD"}
@@ -2,6 +2,7 @@ import { z } from 'zod';
2
2
  import { elementUUIDScheme } from '../../schema.js';
3
3
  import { setValue as _setValue } from '../../command.js';
4
4
  import { resolveDriver, textResult, textResultWithPrimaryElementId, errorResult, toolErrorMessage, } from '../tool-response.js';
5
+ import { aiElementWebDriverRejectionIfNeeded } from '../gestures/handlers/ai-element.js';
5
6
  export default function setValue(server) {
6
7
  const setValueSchema = z
7
8
  .object({
@@ -35,6 +36,12 @@ export default function setValue(server) {
35
36
  return resolved.result;
36
37
  }
37
38
  const { driver } = resolved;
39
+ if (!args.w3cActions) {
40
+ const aiRejection = aiElementWebDriverRejectionIfNeeded(args.elementUUID);
41
+ if (aiRejection) {
42
+ return aiRejection;
43
+ }
44
+ }
38
45
  try {
39
46
  await _setValue(driver, args.elementUUID ?? '', args.text, args.w3cActions);
40
47
  const detail = `Successfully set value ${args.text} into element ${args.elementUUID ?? '(focus)'}${args.w3cActions ? ' via W3C Actions' : ''}.`;
@@ -1 +1 @@
1
- {"version":3,"file":"set-value.js","sourceRoot":"","sources":["../../../src/tools/interactions/set-value.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,QAAQ,IAAI,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EACL,aAAa,EACb,UAAU,EACV,8BAA8B,EAC9B,WAAW,EACX,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,MAAe;IAC9C,MAAM,cAAc,GAAG,CAAC;SACrB,MAAM,CAAC;QACN,WAAW,EAAE,iBAAiB,CAAC,QAAQ,EAAE;QACzC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QAC9C,UAAU,EAAE,CAAC;aACV,OAAO,EAAE;aACT,QAAQ,EAAE;aACV,QAAQ,CACP,2EAA2E;YACzE,4EAA4E;YAC5E,yEAAyE,CAC5E;QACH,SAAS,EAAE,CAAC;aACT,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,4DAA4D,CAAC;KAC1E,CAAC;SACD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,IAAI,IAAI,CAAC,CAAC,WAAW,KAAK,SAAS,EAAE;QACnE,OAAO,EAAE,qDAAqD;KAC/D,CAAC,CAAC;IAEL,MAAM,CAAC,OAAO,CAAC;QACb,IAAI,EAAE,kBAAkB;QACxB,WAAW,EAAE,4BAA4B;QACzC,UAAU,EAAE,cAAc;QAC1B,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,aAAa,EAAE,KAAK;SACrB;QACD,OAAO,EAAE,KAAK,EACZ,IAAoC,EACpC,QAA6C,EACrB,EAAE;YAC1B,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC/C,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,OAAO,QAAQ,CAAC,MAAM,CAAC;YACzB,CAAC;YACD,MAAM,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC;YAE5B,IAAI,CAAC;gBACH,MAAM,SAAS,CACb,MAAM,EACN,IAAI,CAAC,WAAW,IAAI,EAAE,EACtB,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,UAAU,CAChB,CAAC;gBACF,MAAM,MAAM,GAAG,0BAA0B,IAAI,CAAC,IAAI,iBAAiB,IAAI,CAAC,WAAW,IAAI,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC;gBAChJ,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;oBACrB,OAAO,8BAA8B,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;gBAClE,CAAC;gBACD,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;YAC5B,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACtB,OAAO,WAAW,CAChB,uBAAuB,IAAI,CAAC,IAAI,iBAAiB,IAAI,CAAC,WAAW,IAAI,SAAS,UAAU,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAChH,CAAC;YACJ,CAAC;QACH,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"set-value.js","sourceRoot":"","sources":["../../../src/tools/interactions/set-value.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,QAAQ,IAAI,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EACL,aAAa,EACb,UAAU,EACV,8BAA8B,EAC9B,WAAW,EACX,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,mCAAmC,EAAE,MAAM,oCAAoC,CAAC;AAEzF,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,MAAe;IAC9C,MAAM,cAAc,GAAG,CAAC;SACrB,MAAM,CAAC;QACN,WAAW,EAAE,iBAAiB,CAAC,QAAQ,EAAE;QACzC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QAC9C,UAAU,EAAE,CAAC;aACV,OAAO,EAAE;aACT,QAAQ,EAAE;aACV,QAAQ,CACP,2EAA2E;YACzE,4EAA4E;YAC5E,yEAAyE,CAC5E;QACH,SAAS,EAAE,CAAC;aACT,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,4DAA4D,CAAC;KAC1E,CAAC;SACD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,IAAI,IAAI,CAAC,CAAC,WAAW,KAAK,SAAS,EAAE;QACnE,OAAO,EAAE,qDAAqD;KAC/D,CAAC,CAAC;IAEL,MAAM,CAAC,OAAO,CAAC;QACb,IAAI,EAAE,kBAAkB;QACxB,WAAW,EAAE,4BAA4B;QACzC,UAAU,EAAE,cAAc;QAC1B,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,aAAa,EAAE,KAAK;SACrB;QACD,OAAO,EAAE,KAAK,EACZ,IAAoC,EACpC,QAA6C,EACrB,EAAE;YAC1B,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC/C,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,OAAO,QAAQ,CAAC,MAAM,CAAC;YACzB,CAAC;YACD,MAAM,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC;YAE5B,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;gBACrB,MAAM,WAAW,GAAG,mCAAmC,CACrD,IAAI,CAAC,WAAW,CACjB,CAAC;gBACF,IAAI,WAAW,EAAE,CAAC;oBAChB,OAAO,WAAW,CAAC;gBACrB,CAAC;YACH,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,SAAS,CACb,MAAM,EACN,IAAI,CAAC,WAAW,IAAI,EAAE,EACtB,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,UAAU,CAChB,CAAC;gBACF,MAAM,MAAM,GAAG,0BAA0B,IAAI,CAAC,IAAI,iBAAiB,IAAI,CAAC,WAAW,IAAI,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC;gBAChJ,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;oBACrB,OAAO,8BAA8B,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;gBAClE,CAAC;gBACD,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;YAC5B,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACtB,OAAO,WAAW,CAChB,uBAAuB,IAAI,CAAC,IAAI,iBAAiB,IAAI,CAAC,WAAW,IAAI,SAAS,UAAU,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAChH,CAAC;YACJ,CAAC;QACH,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
package/package.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "appium-mcp",
3
3
  "mcpName": "io.github.appium/appium-mcp",
4
- "version": "1.75.4",
4
+ "version": "1.75.7",
5
5
  "type": "module",
6
6
  "repository": {
7
7
  "type": "git",
8
- "url": "https://github.com/appium/appium-mcp.git"
8
+ "url": "git+https://github.com/appium/appium-mcp.git"
9
9
  },
10
10
  "bugs": {
11
11
  "url": "https://github.com/appium/appium-mcp/issues"
package/server.json CHANGED
@@ -3,12 +3,12 @@
3
3
  "name": "io.github.appium/appium-mcp",
4
4
  "title": "MCP Appium - Mobile Development and Automation Server",
5
5
  "description": "MCP server for Appium mobile automation on iOS and Android devices with test creation tools.",
6
- "version": "1.75.4",
6
+ "version": "1.75.7",
7
7
  "packages": [
8
8
  {
9
9
  "registryType": "npm",
10
10
  "identifier": "appium-mcp",
11
- "version": "1.75.4",
11
+ "version": "1.75.7",
12
12
  "transport": {
13
13
  "type": "stdio"
14
14
  }
Binary file
@@ -31,6 +31,11 @@ export const AI_DISABLED_REJECTION =
31
31
  `(AI_VISION_ENABLED is not set to true). Use appium_find_element to get a real ` +
32
32
  `element UUID, or enable AI_VISION_ENABLED=true with the required AI_VISION_* keys.`;
33
33
 
34
+ export const AI_WEBDRIVER_REJECTION =
35
+ `That is an ai-element token from appium_ai, not a WebDriver element id. ` +
36
+ `Use appium_gesture to tap it, or appium_find_element for a real id. ` +
37
+ `To type after a tap, use appium_set_value with w3cActions on the focused field.`;
38
+
34
39
  export type ParsedAiElement = {
35
40
  center: { x: number; y: number };
36
41
  rect: Rect;
@@ -128,6 +133,19 @@ export function aiDisabledResult(): ContentResult {
128
133
  return errorResult(AI_DISABLED_REJECTION);
129
134
  }
130
135
 
136
+ export function aiElementWebDriverRejectedResult(): ContentResult {
137
+ return errorResult(AI_WEBDRIVER_REJECTION);
138
+ }
139
+
140
+ export function aiElementWebDriverRejectionIfNeeded(
141
+ elementUUID: string | undefined
142
+ ): ContentResult | undefined {
143
+ if (isAiElementUUID(elementUUID)) {
144
+ return aiElementWebDriverRejectedResult();
145
+ }
146
+ return undefined;
147
+ }
148
+
131
149
  function rectAroundCenter(cx: number, cy: number): Rect {
132
150
  const w = AI_FALLBACK_RECT_WIDTH;
133
151
  const h = AI_FALLBACK_RECT_HEIGHT;
@@ -218,6 +218,56 @@ export async function handleSwipe(
218
218
  }
219
219
  }
220
220
 
221
+ /**
222
+ * Clip an element rect to the visible window. Used for ai-element targets whose
223
+ * bbox or fallback rect can extend past the screenshot edges.
224
+ */
225
+ export function rectVisibleWithinWindow(elementRect: Rect, window: Rect): Rect {
226
+ const windowLeft = window.x ?? 0;
227
+ const windowTop = window.y ?? 0;
228
+ const windowRight = windowLeft + window.width;
229
+ const windowBottom = windowTop + window.height;
230
+
231
+ const visibleLeft = Math.max(windowLeft, elementRect.x);
232
+ const visibleTop = Math.max(windowTop, elementRect.y);
233
+ const visibleRight = Math.min(windowRight, elementRect.x + elementRect.width);
234
+ const visibleBottom = Math.min(
235
+ windowBottom,
236
+ elementRect.y + elementRect.height
237
+ );
238
+
239
+ const width = Math.max(0, visibleRight - visibleLeft);
240
+ const height = Math.max(0, visibleBottom - visibleTop);
241
+
242
+ if (width > 0 && height > 0) {
243
+ return { x: visibleLeft, y: visibleTop, width, height };
244
+ }
245
+
246
+ const cx = elementRect.x + elementRect.width / 2;
247
+ const cy = elementRect.y + elementRect.height / 2;
248
+ return {
249
+ x: Math.floor(clamp(cx, windowLeft, windowRight - 1)),
250
+ y: Math.floor(clamp(cy, windowTop, windowBottom - 1)),
251
+ width: 1,
252
+ height: 1,
253
+ };
254
+ }
255
+
256
+ /** Keep swipe/scroll pointer coords inside the window (inclusive pixel indices). */
257
+ export function clampDirectionCoordsToWindow(
258
+ coords: Coords,
259
+ window: { width: number; height: number }
260
+ ): Coords {
261
+ const maxX = Math.max(0, window.width - 1);
262
+ const maxY = Math.max(0, window.height - 1);
263
+ return {
264
+ startX: Math.floor(clamp(coords.startX, 0, maxX)),
265
+ startY: Math.floor(clamp(coords.startY, 0, maxY)),
266
+ endX: Math.floor(clamp(coords.endX, 0, maxX)),
267
+ endY: Math.floor(clamp(coords.endY, 0, maxY)),
268
+ };
269
+ }
270
+
221
271
  function coordsForDirection(direction: Direction, rect: Rect): Coords {
222
272
  const centerX = Math.floor(rect.x + rect.width / 2);
223
273
  const centerY = Math.floor(rect.y + rect.height / 2);
@@ -266,12 +316,24 @@ async function resolveCoords(
266
316
  if ('error' in rect) {
267
317
  return rect;
268
318
  }
269
- return coordsForDirection(args.direction, {
319
+ const targetRect: Rect = {
270
320
  x: rect.x,
271
321
  y: rect.y,
272
322
  width: rect.width,
273
323
  height: rect.height,
324
+ };
325
+ if (!isAiElementUUID(args.elementUUID)) {
326
+ return coordsForDirection(args.direction, targetRect);
327
+ }
328
+ const window = await getWindowRect(driver);
329
+ const clippedRect = rectVisibleWithinWindow(targetRect, {
330
+ x: 0,
331
+ y: 0,
332
+ width: window.width,
333
+ height: window.height,
274
334
  });
335
+ const coords = coordsForDirection(args.direction, clippedRect);
336
+ return clampDirectionCoordsToWindow(coords, window);
275
337
  }
276
338
  const window = await getWindowRect(driver);
277
339
  return coordsForDirection(args.direction, {
@@ -297,6 +359,10 @@ async function resolveCoords(
297
359
  };
298
360
  }
299
361
 
362
+ function clamp(value: number, min: number, max: number): number {
363
+ return Math.min(max, Math.max(min, value));
364
+ }
365
+
300
366
  async function performW3CDrag(
301
367
  driver: DriverInstance,
302
368
  coords: Coords,
@@ -8,6 +8,7 @@ import {
8
8
  errorResult,
9
9
  toolErrorMessage,
10
10
  } from '../tool-response.js';
11
+ import { aiElementWebDriverRejectionIfNeeded } from '../gestures/handlers/ai-element.js';
11
12
 
12
13
  export default function getElementAttributeTool(server: FastMCP): void {
13
14
  const schema = z.object({
@@ -42,6 +43,11 @@ export default function getElementAttributeTool(server: FastMCP): void {
42
43
  }
43
44
  const { driver } = resolved;
44
45
 
46
+ const aiRejection = aiElementWebDriverRejectionIfNeeded(args.elementUUID);
47
+ if (aiRejection) {
48
+ return aiRejection;
49
+ }
50
+
45
51
  try {
46
52
  const value = await getElementAttribute(
47
53
  driver,
@@ -8,6 +8,7 @@ import {
8
8
  errorResult,
9
9
  toolErrorMessage,
10
10
  } from '../tool-response.js';
11
+ import { aiElementWebDriverRejectionIfNeeded } from '../gestures/handlers/ai-element.js';
11
12
 
12
13
  export default function getText(server: FastMCP): void {
13
14
  const getTextSchema = z.object({
@@ -36,6 +37,11 @@ export default function getText(server: FastMCP): void {
36
37
  }
37
38
  const { driver } = resolved;
38
39
 
40
+ const aiRejection = aiElementWebDriverRejectionIfNeeded(args.elementUUID);
41
+ if (aiRejection) {
42
+ return aiRejection;
43
+ }
44
+
39
45
  try {
40
46
  const text = await getElementText(driver, args.elementUUID);
41
47
  return textResultWithPrimaryElementId(
@@ -9,6 +9,7 @@ import {
9
9
  errorResult,
10
10
  toolErrorMessage,
11
11
  } from '../tool-response.js';
12
+ import { aiElementWebDriverRejectionIfNeeded } from '../gestures/handlers/ai-element.js';
12
13
 
13
14
  export default function setValue(server: FastMCP): void {
14
15
  const setValueSchema = z
@@ -50,6 +51,15 @@ export default function setValue(server: FastMCP): void {
50
51
  }
51
52
  const { driver } = resolved;
52
53
 
54
+ if (!args.w3cActions) {
55
+ const aiRejection = aiElementWebDriverRejectionIfNeeded(
56
+ args.elementUUID
57
+ );
58
+ if (aiRejection) {
59
+ return aiRejection;
60
+ }
61
+ }
62
+
53
63
  try {
54
64
  await _setValue(
55
65
  driver,