ios-webkit-mcp 0.18.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/CONTRIBUTING.md +61 -0
- package/LICENSE +202 -0
- package/NOTICE +16 -0
- package/README.md +187 -0
- package/build/src/bin/ios-webkit-mcp.d.ts +2 -0
- package/build/src/bin/ios-webkit-mcp.js +14 -0
- package/build/src/bin/ios-webkit-mcp.js.map +1 -0
- package/build/src/capability.d.ts +61 -0
- package/build/src/capability.js +146 -0
- package/build/src/capability.js.map +1 -0
- package/build/src/index.d.ts +1 -0
- package/build/src/index.js +2 -0
- package/build/src/index.js.map +1 -0
- package/build/src/page-session.d.ts +108 -0
- package/build/src/page-session.js +331 -0
- package/build/src/page-session.js.map +1 -0
- package/build/src/server.d.ts +11 -0
- package/build/src/server.js +144 -0
- package/build/src/server.js.map +1 -0
- package/build/src/tools/analyze_performance.d.ts +40 -0
- package/build/src/tools/analyze_performance.js +112 -0
- package/build/src/tools/analyze_performance.js.map +1 -0
- package/build/src/tools/breakpoints.d.ts +80 -0
- package/build/src/tools/breakpoints.js +167 -0
- package/build/src/tools/breakpoints.js.map +1 -0
- package/build/src/tools/clear_console.d.ts +11 -0
- package/build/src/tools/clear_console.js +32 -0
- package/build/src/tools/clear_console.js.map +1 -0
- package/build/src/tools/click.d.ts +20 -0
- package/build/src/tools/click.js +88 -0
- package/build/src/tools/click.js.map +1 -0
- package/build/src/tools/debug_element.d.ts +36 -0
- package/build/src/tools/debug_element.js +66 -0
- package/build/src/tools/debug_element.js.map +1 -0
- package/build/src/tools/debugger.d.ts +44 -0
- package/build/src/tools/debugger.js +117 -0
- package/build/src/tools/debugger.js.map +1 -0
- package/build/src/tools/delete_cookie.d.ts +18 -0
- package/build/src/tools/delete_cookie.js +33 -0
- package/build/src/tools/delete_cookie.js.map +1 -0
- package/build/src/tools/drag.d.ts +40 -0
- package/build/src/tools/drag.js +202 -0
- package/build/src/tools/drag.js.map +1 -0
- package/build/src/tools/evaluate_script.d.ts +24 -0
- package/build/src/tools/evaluate_script.js +172 -0
- package/build/src/tools/evaluate_script.js.map +1 -0
- package/build/src/tools/fill.d.ts +22 -0
- package/build/src/tools/fill.js +104 -0
- package/build/src/tools/fill.js.map +1 -0
- package/build/src/tools/fill_form.d.ts +34 -0
- package/build/src/tools/fill_form.js +110 -0
- package/build/src/tools/fill_form.js.map +1 -0
- package/build/src/tools/gc_heap.d.ts +16 -0
- package/build/src/tools/gc_heap.js +66 -0
- package/build/src/tools/gc_heap.js.map +1 -0
- package/build/src/tools/get_capability_snapshot.d.ts +17 -0
- package/build/src/tools/get_capability_snapshot.js +50 -0
- package/build/src/tools/get_capability_snapshot.js.map +1 -0
- package/build/src/tools/get_console_message.d.ts +18 -0
- package/build/src/tools/get_console_message.js +92 -0
- package/build/src/tools/get_console_message.js.map +1 -0
- package/build/src/tools/get_cookies.d.ts +20 -0
- package/build/src/tools/get_cookies.js +59 -0
- package/build/src/tools/get_cookies.js.map +1 -0
- package/build/src/tools/get_event_listeners.d.ts +29 -0
- package/build/src/tools/get_event_listeners.js +129 -0
- package/build/src/tools/get_event_listeners.js.map +1 -0
- package/build/src/tools/get_network_request.d.ts +22 -0
- package/build/src/tools/get_network_request.js +121 -0
- package/build/src/tools/get_network_request.js.map +1 -0
- package/build/src/tools/get_performance_metrics.d.ts +27 -0
- package/build/src/tools/get_performance_metrics.js +185 -0
- package/build/src/tools/get_performance_metrics.js.map +1 -0
- package/build/src/tools/get_resource_tree.d.ts +18 -0
- package/build/src/tools/get_resource_tree.js +82 -0
- package/build/src/tools/get_resource_tree.js.map +1 -0
- package/build/src/tools/handle_dialog.d.ts +39 -0
- package/build/src/tools/handle_dialog.js +182 -0
- package/build/src/tools/handle_dialog.js.map +1 -0
- package/build/src/tools/highlight_node.d.ts +41 -0
- package/build/src/tools/highlight_node.js +95 -0
- package/build/src/tools/highlight_node.js.map +1 -0
- package/build/src/tools/hover.d.ts +20 -0
- package/build/src/tools/hover.js +89 -0
- package/build/src/tools/hover.js.map +1 -0
- package/build/src/tools/intercept.d.ts +81 -0
- package/build/src/tools/intercept.js +161 -0
- package/build/src/tools/intercept.js.map +1 -0
- package/build/src/tools/list_console_messages.d.ts +20 -0
- package/build/src/tools/list_console_messages.js +105 -0
- package/build/src/tools/list_console_messages.js.map +1 -0
- package/build/src/tools/list_indexeddb.d.ts +16 -0
- package/build/src/tools/list_indexeddb.js +55 -0
- package/build/src/tools/list_indexeddb.js.map +1 -0
- package/build/src/tools/list_network_requests.d.ts +25 -0
- package/build/src/tools/list_network_requests.js +108 -0
- package/build/src/tools/list_network_requests.js.map +1 -0
- package/build/src/tools/list_pages.d.ts +17 -0
- package/build/src/tools/list_pages.js +113 -0
- package/build/src/tools/list_pages.js.map +1 -0
- package/build/src/tools/navigate_page.d.ts +18 -0
- package/build/src/tools/navigate_page.js +73 -0
- package/build/src/tools/navigate_page.js.map +1 -0
- package/build/src/tools/network_runtime.d.ts +51 -0
- package/build/src/tools/network_runtime.js +101 -0
- package/build/src/tools/network_runtime.js.map +1 -0
- package/build/src/tools/press_key.d.ts +32 -0
- package/build/src/tools/press_key.js +108 -0
- package/build/src/tools/press_key.js.map +1 -0
- package/build/src/tools/query_dom_node.d.ts +22 -0
- package/build/src/tools/query_dom_node.js +103 -0
- package/build/src/tools/query_dom_node.js.map +1 -0
- package/build/src/tools/record_cpu_profile.d.ts +38 -0
- package/build/src/tools/record_cpu_profile.js +174 -0
- package/build/src/tools/record_cpu_profile.js.map +1 -0
- package/build/src/tools/record_memory_tracking.d.ts +32 -0
- package/build/src/tools/record_memory_tracking.js +103 -0
- package/build/src/tools/record_memory_tracking.js.map +1 -0
- package/build/src/tools/record_timeline.d.ts +20 -0
- package/build/src/tools/record_timeline.js +110 -0
- package/build/src/tools/record_timeline.js.map +1 -0
- package/build/src/tools/reload_page.d.ts +18 -0
- package/build/src/tools/reload_page.js +59 -0
- package/build/src/tools/reload_page.js.map +1 -0
- package/build/src/tools/select_page.d.ts +18 -0
- package/build/src/tools/select_page.js +54 -0
- package/build/src/tools/select_page.js.map +1 -0
- package/build/src/tools/set_extra_http_headers.d.ts +16 -0
- package/build/src/tools/set_extra_http_headers.js +55 -0
- package/build/src/tools/set_extra_http_headers.js.map +1 -0
- package/build/src/tools/set_init_script.d.ts +16 -0
- package/build/src/tools/set_init_script.js +43 -0
- package/build/src/tools/set_init_script.js.map +1 -0
- package/build/src/tools/set_outer_html.d.ts +18 -0
- package/build/src/tools/set_outer_html.js +52 -0
- package/build/src/tools/set_outer_html.js.map +1 -0
- package/build/src/tools/set_user_agent.d.ts +40 -0
- package/build/src/tools/set_user_agent.js +83 -0
- package/build/src/tools/set_user_agent.js.map +1 -0
- package/build/src/tools/summarize_console_errors.d.ts +40 -0
- package/build/src/tools/summarize_console_errors.js +131 -0
- package/build/src/tools/summarize_console_errors.js.map +1 -0
- package/build/src/tools/take_memory_snapshot.d.ts +18 -0
- package/build/src/tools/take_memory_snapshot.js +88 -0
- package/build/src/tools/take_memory_snapshot.js.map +1 -0
- package/build/src/tools/take_node_screenshot.d.ts +29 -0
- package/build/src/tools/take_node_screenshot.js +57 -0
- package/build/src/tools/take_node_screenshot.js.map +1 -0
- package/build/src/tools/take_screenshot.d.ts +51 -0
- package/build/src/tools/take_screenshot.js +108 -0
- package/build/src/tools/take_screenshot.js.map +1 -0
- package/build/src/tools/take_snapshot.d.ts +22 -0
- package/build/src/tools/take_snapshot.js +142 -0
- package/build/src/tools/take_snapshot.js.map +1 -0
- package/build/src/tools/type_text.d.ts +34 -0
- package/build/src/tools/type_text.js +203 -0
- package/build/src/tools/type_text.js.map +1 -0
- package/build/src/tools/wait_for.d.ts +24 -0
- package/build/src/tools/wait_for.js +93 -0
- package/build/src/tools/wait_for.js.map +1 -0
- package/build/src/tools/wip_send.d.ts +22 -0
- package/build/src/tools/wip_send.js +81 -0
- package/build/src/tools/wip_send.js.map +1 -0
- package/build/src/wip-client/iwdp-http.d.ts +17 -0
- package/build/src/wip-client/iwdp-http.js +98 -0
- package/build/src/wip-client/iwdp-http.js.map +1 -0
- package/build/src/wip-client/ws-session.d.ts +41 -0
- package/build/src/wip-client/ws-session.js +290 -0
- package/build/src/wip-client/ws-session.js.map +1 -0
- package/docs/spec.md +689 -0
- package/package.json +77 -0
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { PageSession } from '../page-session.js';
|
|
3
|
+
/**
|
|
4
|
+
* WIP gotcha: `Runtime.evaluate` with `awaitPromise:true` does NOT correctly
|
|
5
|
+
* serialize the resolved value of a returned Promise (even `Promise.resolve(42)`
|
|
6
|
+
* comes back as `{}`). So this tool keeps the inner expression synchronous.
|
|
7
|
+
* Per-step delay is implemented by issuing one Runtime.evaluate per pointermove
|
|
8
|
+
* step from TS land when `stepDelayMs > 0`. When `stepDelayMs === 0`, the entire
|
|
9
|
+
* sequence runs in a single sync IIFE.
|
|
10
|
+
*/
|
|
11
|
+
export const dragTool = {
|
|
12
|
+
name: 'drag',
|
|
13
|
+
description: [
|
|
14
|
+
'Drag from a source element to a target element (or by pixel offset) on the inspected iOS WebView page.',
|
|
15
|
+
'NOTE: WIP has no `Input.dispatchTouch/MouseEvent`. Synthetic pointer sequence (`pointerdown` → N × `pointermove` → `pointerup`, mirrored for mouse) via `Runtime.evaluate`. iOS gesture recognizers (UIPanGestureRecognizer / native scroll) will NOT fire because no real touch reaches the WebView host. Useful for JS-implemented drag handlers; useless for native scroll triggers.',
|
|
16
|
+
'Provide exactly one destination: `toSelector` (element-to-element) OR `dx`/`dy` (offset from source center).',
|
|
17
|
+
].join(' '),
|
|
18
|
+
inputSchema: {
|
|
19
|
+
fromSelector: z.string().min(1).describe('CSS selector for the source element.'),
|
|
20
|
+
fromNth: z.number().int().min(0).optional().describe('Source nth match. Default 0.'),
|
|
21
|
+
toSelector: z.string().min(1).optional().describe('CSS selector for the destination element. Mutually exclusive with dx/dy.'),
|
|
22
|
+
toNth: z.number().int().min(0).optional().describe('Destination nth match. Default 0.'),
|
|
23
|
+
dx: z.number().optional().describe('X offset (CSS px) from source center. Mutually exclusive with toSelector.'),
|
|
24
|
+
dy: z.number().optional().describe('Y offset (CSS px) from source center. Mutually exclusive with toSelector.'),
|
|
25
|
+
steps: z.number().int().min(2).max(120).optional().describe('Number of pointermove steps between start and end. Default 12.'),
|
|
26
|
+
stepDelayMs: z.number().int().min(0).max(200).optional().describe('Delay between move steps. Default 12.'),
|
|
27
|
+
waitAfterMs: z.number().int().min(0).max(10_000).optional().describe('Block after release for this long (default 200).'),
|
|
28
|
+
},
|
|
29
|
+
handler: async ({ fromSelector, fromNth = 0, toSelector, toNth = 0, dx, dy, steps = 12, stepDelayMs = 12, waitAfterMs = 200, }) => {
|
|
30
|
+
const offsetMode = dx !== undefined || dy !== undefined;
|
|
31
|
+
if (offsetMode && toSelector !== undefined) {
|
|
32
|
+
return errorResult('Provide either `toSelector` OR `dx`/`dy`, not both.');
|
|
33
|
+
}
|
|
34
|
+
if (!offsetMode && toSelector === undefined) {
|
|
35
|
+
return errorResult('Provide one of: `toSelector` or `dx`/`dy`.');
|
|
36
|
+
}
|
|
37
|
+
let ps;
|
|
38
|
+
try {
|
|
39
|
+
ps = await PageSession.get();
|
|
40
|
+
}
|
|
41
|
+
catch (e) {
|
|
42
|
+
return errorResult(`Unable to attach to a WKWebView page: ${describe(e)}`);
|
|
43
|
+
}
|
|
44
|
+
const fromJson = JSON.stringify(fromSelector);
|
|
45
|
+
const toJson = toSelector !== undefined ? JSON.stringify(toSelector) : 'null';
|
|
46
|
+
const prelude = `
|
|
47
|
+
(() => {
|
|
48
|
+
const fromMatches = document.querySelectorAll(${fromJson});
|
|
49
|
+
if (fromMatches.length === 0) return { ok: false, reason: 'from_no_match', selector: ${fromJson} };
|
|
50
|
+
if (${fromNth} >= fromMatches.length) return { ok: false, reason: 'from_nth_out_of_range', found: fromMatches.length };
|
|
51
|
+
const src = fromMatches[${fromNth}];
|
|
52
|
+
const srcRect = src.getBoundingClientRect();
|
|
53
|
+
const sx = srcRect.x + srcRect.width / 2;
|
|
54
|
+
const sy = srcRect.y + srcRect.height / 2;
|
|
55
|
+
let ex, ey, dstTag = null;
|
|
56
|
+
if (${toJson} !== null) {
|
|
57
|
+
const toMatches = document.querySelectorAll(${toJson});
|
|
58
|
+
if (toMatches.length === 0) return { ok: false, reason: 'to_no_match', selector: ${toJson} };
|
|
59
|
+
if (${toNth} >= toMatches.length) return { ok: false, reason: 'to_nth_out_of_range', found: toMatches.length };
|
|
60
|
+
const dst = toMatches[${toNth}];
|
|
61
|
+
const r = dst.getBoundingClientRect();
|
|
62
|
+
ex = r.x + r.width / 2;
|
|
63
|
+
ey = r.y + r.height / 2;
|
|
64
|
+
dstTag = dst.tagName.toLowerCase();
|
|
65
|
+
} else {
|
|
66
|
+
ex = sx + ${dx ?? 0};
|
|
67
|
+
ey = sy + ${dy ?? 0};
|
|
68
|
+
}
|
|
69
|
+
window.__wdm_drag = { src, sx, sy, ex, ey };
|
|
70
|
+
return { ok: true, fromTag: src.tagName.toLowerCase(), dstTag, sx, sy, ex, ey };
|
|
71
|
+
})()
|
|
72
|
+
`;
|
|
73
|
+
let pre;
|
|
74
|
+
try {
|
|
75
|
+
pre = await ps.session.send('Runtime.evaluate', { expression: prelude, returnByValue: true, awaitPromise: false }, 10_000);
|
|
76
|
+
}
|
|
77
|
+
catch (e) {
|
|
78
|
+
return errorResult(`Runtime.evaluate (drag prelude) failed: ${describe(e)}`);
|
|
79
|
+
}
|
|
80
|
+
const preVal = pre?.result?.value;
|
|
81
|
+
if (!preVal || preVal.ok !== true) {
|
|
82
|
+
return errorResult(`# drag: failed at prelude\n\n${JSON.stringify(preVal)}`);
|
|
83
|
+
}
|
|
84
|
+
const fireSnippet = `(() => {
|
|
85
|
+
const d = window.__wdm_drag;
|
|
86
|
+
const src = d.src;
|
|
87
|
+
const fire = (type, x, y, evCtor, buttons) => {
|
|
88
|
+
src.dispatchEvent(new evCtor(type, {
|
|
89
|
+
bubbles: true, cancelable: true,
|
|
90
|
+
clientX: x, clientY: y,
|
|
91
|
+
pointerType: 'mouse', pointerId: 1, isPrimary: true,
|
|
92
|
+
button: 0, buttons: buttons != null ? buttons : 1,
|
|
93
|
+
}));
|
|
94
|
+
};
|
|
95
|
+
return fire;
|
|
96
|
+
})()`;
|
|
97
|
+
const downSync = `
|
|
98
|
+
(() => {
|
|
99
|
+
const d = window.__wdm_drag;
|
|
100
|
+
const src = d.src;
|
|
101
|
+
const init = { bubbles: true, cancelable: true, clientX: d.sx, clientY: d.sy, pointerType: 'mouse', pointerId: 1, isPrimary: true, button: 0, buttons: 1 };
|
|
102
|
+
src.dispatchEvent(new PointerEvent('pointerdown', init));
|
|
103
|
+
src.dispatchEvent(new MouseEvent('mousedown', init));
|
|
104
|
+
return { ok: true };
|
|
105
|
+
})()
|
|
106
|
+
`;
|
|
107
|
+
const moveSync = (t) => `
|
|
108
|
+
(() => {
|
|
109
|
+
const d = window.__wdm_drag;
|
|
110
|
+
const src = d.src;
|
|
111
|
+
const t = ${t};
|
|
112
|
+
const mx = d.sx + (d.ex - d.sx) * t;
|
|
113
|
+
const my = d.sy + (d.ey - d.sy) * t;
|
|
114
|
+
const init = { bubbles: true, cancelable: true, clientX: mx, clientY: my, pointerType: 'mouse', pointerId: 1, isPrimary: true, button: 0, buttons: 1 };
|
|
115
|
+
src.dispatchEvent(new PointerEvent('pointermove', init));
|
|
116
|
+
src.dispatchEvent(new MouseEvent('mousemove', init));
|
|
117
|
+
return { ok: true };
|
|
118
|
+
})()
|
|
119
|
+
`;
|
|
120
|
+
const upSync = `
|
|
121
|
+
(() => {
|
|
122
|
+
const d = window.__wdm_drag;
|
|
123
|
+
const src = d.src;
|
|
124
|
+
const init = { bubbles: true, cancelable: true, clientX: d.ex, clientY: d.ey, pointerType: 'mouse', pointerId: 1, isPrimary: true, button: 0, buttons: 0 };
|
|
125
|
+
src.dispatchEvent(new PointerEvent('pointerup', init));
|
|
126
|
+
src.dispatchEvent(new MouseEvent('mouseup', init));
|
|
127
|
+
return { ok: true };
|
|
128
|
+
})()
|
|
129
|
+
`;
|
|
130
|
+
const allInOne = `
|
|
131
|
+
(() => {
|
|
132
|
+
const d = window.__wdm_drag;
|
|
133
|
+
const src = d.src;
|
|
134
|
+
const steps = ${steps};
|
|
135
|
+
const fire = (type, x, y, evCtor, buttons) => {
|
|
136
|
+
src.dispatchEvent(new evCtor(type, {
|
|
137
|
+
bubbles: true, cancelable: true,
|
|
138
|
+
clientX: x, clientY: y,
|
|
139
|
+
pointerType: 'mouse', pointerId: 1, isPrimary: true,
|
|
140
|
+
button: 0, buttons: buttons != null ? buttons : 1,
|
|
141
|
+
}));
|
|
142
|
+
};
|
|
143
|
+
fire('pointerdown', d.sx, d.sy, PointerEvent);
|
|
144
|
+
fire('mousedown', d.sx, d.sy, MouseEvent);
|
|
145
|
+
for (let i = 1; i <= steps; i++) {
|
|
146
|
+
const t = i / steps;
|
|
147
|
+
const mx = d.sx + (d.ex - d.sx) * t;
|
|
148
|
+
const my = d.sy + (d.ey - d.sy) * t;
|
|
149
|
+
fire('pointermove', mx, my, PointerEvent);
|
|
150
|
+
fire('mousemove', mx, my, MouseEvent);
|
|
151
|
+
}
|
|
152
|
+
fire('pointerup', d.ex, d.ey, PointerEvent, 0);
|
|
153
|
+
fire('mouseup', d.ex, d.ey, MouseEvent, 0);
|
|
154
|
+
return { ok: true, steps };
|
|
155
|
+
})()
|
|
156
|
+
`;
|
|
157
|
+
try {
|
|
158
|
+
if (stepDelayMs === 0) {
|
|
159
|
+
const r = await ps.session.send('Runtime.evaluate', { expression: allInOne, returnByValue: true, awaitPromise: false }, 15_000);
|
|
160
|
+
const v = r?.result?.value;
|
|
161
|
+
if (!v || v.ok !== true) {
|
|
162
|
+
return errorResult(`# drag: failed at all-in-one\n\n${JSON.stringify(v)}`);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
await ps.session.send('Runtime.evaluate', { expression: downSync, returnByValue: true, awaitPromise: false }, 10_000);
|
|
167
|
+
for (let i = 1; i <= steps; i++) {
|
|
168
|
+
await ps.session.send('Runtime.evaluate', { expression: moveSync(i / steps), returnByValue: true, awaitPromise: false }, 10_000);
|
|
169
|
+
if (i < steps)
|
|
170
|
+
await new Promise(r => setTimeout(r, stepDelayMs));
|
|
171
|
+
}
|
|
172
|
+
await ps.session.send('Runtime.evaluate', { expression: upSync, returnByValue: true, awaitPromise: false }, 10_000);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
catch (e) {
|
|
176
|
+
return errorResult(`Runtime.evaluate (drag loop) failed: ${describe(e)}`);
|
|
177
|
+
}
|
|
178
|
+
if (waitAfterMs > 0) {
|
|
179
|
+
await new Promise(r => setTimeout(r, waitAfterMs));
|
|
180
|
+
}
|
|
181
|
+
void fireSnippet; // referenced for documentation; not executed
|
|
182
|
+
return textResult([
|
|
183
|
+
`# drag ✓`,
|
|
184
|
+
'',
|
|
185
|
+
`from: \`<${preVal.fromTag}>\` @ (${preVal.sx.toFixed(1)}, ${preVal.sy.toFixed(1)})`,
|
|
186
|
+
`to: ${preVal.dstTag ? `\`<${preVal.dstTag}>\` @ ` : ''}(${preVal.ex.toFixed(1)}, ${preVal.ey.toFixed(1)})`,
|
|
187
|
+
`steps: ${steps}${stepDelayMs > 0 ? ` (per-step, ${stepDelayMs}ms between)` : ' (single sync round-trip)'}`,
|
|
188
|
+
'',
|
|
189
|
+
'⚠ Synthetic Pointer/Mouse drag. No native iOS gesture recognizers fire — useful only for handlers attached in JS (e.g. `pointerdown` listeners, `react-dnd`, sortable libs). Native scroll / pinch / pan will NOT respond.',
|
|
190
|
+
].join('\n'));
|
|
191
|
+
},
|
|
192
|
+
};
|
|
193
|
+
function textResult(text) {
|
|
194
|
+
return { content: [{ type: 'text', text }] };
|
|
195
|
+
}
|
|
196
|
+
function errorResult(text) {
|
|
197
|
+
return { content: [{ type: 'text', text }], isError: true };
|
|
198
|
+
}
|
|
199
|
+
function describe(e) {
|
|
200
|
+
return e instanceof Error ? e.message : String(e);
|
|
201
|
+
}
|
|
202
|
+
//# sourceMappingURL=drag.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drag.js","sourceRoot":"","sources":["../../../src/tools/drag.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const evaluateScriptTool: {
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
inputSchema: {
|
|
6
|
+
expression: z.ZodString;
|
|
7
|
+
pageId: z.ZodOptional<z.ZodString>;
|
|
8
|
+
awaitPromise: z.ZodOptional<z.ZodBoolean>;
|
|
9
|
+
returnByValue: z.ZodOptional<z.ZodBoolean>;
|
|
10
|
+
proxyDeviceListUrl: z.ZodOptional<z.ZodString>;
|
|
11
|
+
};
|
|
12
|
+
handler: ({ expression, pageId, awaitPromise, returnByValue, proxyDeviceListUrl, }: {
|
|
13
|
+
expression: string;
|
|
14
|
+
pageId?: string;
|
|
15
|
+
awaitPromise?: boolean;
|
|
16
|
+
returnByValue?: boolean;
|
|
17
|
+
proxyDeviceListUrl?: string;
|
|
18
|
+
}) => Promise<{
|
|
19
|
+
content: {
|
|
20
|
+
type: "text";
|
|
21
|
+
text: string;
|
|
22
|
+
}[];
|
|
23
|
+
}>;
|
|
24
|
+
};
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { fetchProxyDevices, fetchDevicePages } from '../wip-client/iwdp-http.js';
|
|
3
|
+
import { WipSession } from '../wip-client/ws-session.js';
|
|
4
|
+
import { PageSession } from '../page-session.js';
|
|
5
|
+
const DEFAULT_PROXY_BASE = 'http://127.0.0.1:9221';
|
|
6
|
+
export const evaluateScriptTool = {
|
|
7
|
+
name: 'evaluate_script',
|
|
8
|
+
description: [
|
|
9
|
+
'Evaluate a JavaScript expression in the inspected iOS WebView page.',
|
|
10
|
+
'Wraps WIP `Runtime.evaluate`. Returns the value (when returnByValue=true) or a description string.',
|
|
11
|
+
'If pageId is omitted the first inspectable page on the first device is used.',
|
|
12
|
+
'Requires `ios_webkit_debug_proxy` running + iPhone connected + isInspectable=true.',
|
|
13
|
+
].join(' '),
|
|
14
|
+
inputSchema: {
|
|
15
|
+
expression: z
|
|
16
|
+
.string()
|
|
17
|
+
.min(1)
|
|
18
|
+
.describe('JavaScript expression to evaluate (e.g. `1+1`, `document.title`, `JSON.stringify(window.location)`)'),
|
|
19
|
+
pageId: z
|
|
20
|
+
.string()
|
|
21
|
+
.optional()
|
|
22
|
+
.describe('Page id from list_pages output. If omitted, uses the first available page.'),
|
|
23
|
+
awaitPromise: z
|
|
24
|
+
.boolean()
|
|
25
|
+
.optional()
|
|
26
|
+
.describe('If the expression returns a Promise, wait for it to settle (default true).'),
|
|
27
|
+
returnByValue: z
|
|
28
|
+
.boolean()
|
|
29
|
+
.optional()
|
|
30
|
+
.describe('Serialize the result by value (default true). Set false to keep an objectId reference.'),
|
|
31
|
+
proxyDeviceListUrl: z
|
|
32
|
+
.string()
|
|
33
|
+
.url()
|
|
34
|
+
.optional()
|
|
35
|
+
.describe(`Base URL of ios_webkit_debug_proxy's device-list endpoint (default ${DEFAULT_PROXY_BASE})`),
|
|
36
|
+
},
|
|
37
|
+
handler: async ({ expression, pageId, awaitPromise = true, returnByValue = true, proxyDeviceListUrl, }) => {
|
|
38
|
+
// Default mode (pageId omitted): use the shared PageSession so that
|
|
39
|
+
// Network / Console events fired by this expression flow into the same
|
|
40
|
+
// ws that list_console_messages / list_network_requests subscribe to.
|
|
41
|
+
// WIP per-ws Network.enable state is isolated, so a transient session
|
|
42
|
+
// would receive events that the persistent session never sees.
|
|
43
|
+
//
|
|
44
|
+
// Explicit pageId mode: open a transient session — useful for poking
|
|
45
|
+
// a non-default target (worker, secondary page) without disturbing
|
|
46
|
+
// the persistent attach.
|
|
47
|
+
let chosenPageMeta;
|
|
48
|
+
let evalResult;
|
|
49
|
+
let usingShared = false;
|
|
50
|
+
if (pageId == null && proxyDeviceListUrl == null) {
|
|
51
|
+
try {
|
|
52
|
+
const ps = await PageSession.get();
|
|
53
|
+
const info = ps.attachInfo;
|
|
54
|
+
chosenPageMeta = { device: info.deviceId, id: info.pageId, title: info.pageTitle, url: info.pageUrl };
|
|
55
|
+
evalResult = await ps.session.send('Runtime.evaluate', {
|
|
56
|
+
expression,
|
|
57
|
+
returnByValue,
|
|
58
|
+
awaitPromise,
|
|
59
|
+
generatePreview: true,
|
|
60
|
+
});
|
|
61
|
+
usingShared = true;
|
|
62
|
+
}
|
|
63
|
+
catch (e) {
|
|
64
|
+
return errorResult(`Runtime.evaluate (shared session) failed: ${describeError(e)}`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
// Transient session path.
|
|
69
|
+
const base = proxyDeviceListUrl ?? DEFAULT_PROXY_BASE;
|
|
70
|
+
let devices;
|
|
71
|
+
try {
|
|
72
|
+
devices = await fetchProxyDevices(base);
|
|
73
|
+
}
|
|
74
|
+
catch (e) {
|
|
75
|
+
return errorResult(`Failed to reach ios_webkit_debug_proxy at ${base}: ${describeError(e)}`);
|
|
76
|
+
}
|
|
77
|
+
if (devices.length === 0) {
|
|
78
|
+
return errorResult('No iOS devices found. Connect an iPhone via USB, trust this Mac, and ensure Settings > Safari > Advanced > Web Inspector = ON.');
|
|
79
|
+
}
|
|
80
|
+
let chosenPageUrl;
|
|
81
|
+
let chosenMeta;
|
|
82
|
+
for (const dev of devices) {
|
|
83
|
+
let pages;
|
|
84
|
+
try {
|
|
85
|
+
pages = await fetchDevicePages(dev.url);
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
let match;
|
|
91
|
+
if (pageId != null) {
|
|
92
|
+
match = pages.find(p => p.id === pageId);
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
match = pages.find(p => p.url && !p.title.startsWith('jsi_')) ?? pages[0];
|
|
96
|
+
}
|
|
97
|
+
if (match) {
|
|
98
|
+
chosenPageUrl = match.webSocketDebuggerUrl;
|
|
99
|
+
chosenMeta = { device: dev.deviceId, id: match.id, title: match.title, url: match.url };
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
if (!chosenPageUrl || !chosenMeta) {
|
|
104
|
+
return errorResult(pageId == null
|
|
105
|
+
? 'No inspectable pages available. Open a WebView page in the target app first (run `list_pages` to verify).'
|
|
106
|
+
: `Page id "${pageId}" not found. Run \`list_pages\` to see available ids.`);
|
|
107
|
+
}
|
|
108
|
+
chosenPageMeta = chosenMeta;
|
|
109
|
+
const session = new WipSession();
|
|
110
|
+
try {
|
|
111
|
+
await session.connect(chosenPageUrl);
|
|
112
|
+
await session.waitForPageTarget();
|
|
113
|
+
evalResult = await session.send('Runtime.evaluate', {
|
|
114
|
+
expression,
|
|
115
|
+
returnByValue,
|
|
116
|
+
awaitPromise,
|
|
117
|
+
generatePreview: true,
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
catch (e) {
|
|
121
|
+
session.close();
|
|
122
|
+
return errorResult(`Runtime.evaluate (transient) failed: ${describeError(e)}`);
|
|
123
|
+
}
|
|
124
|
+
finally {
|
|
125
|
+
session.close();
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
const lines = [];
|
|
129
|
+
lines.push(`# Runtime.evaluate result`);
|
|
130
|
+
lines.push('');
|
|
131
|
+
lines.push(`Target: device \`${chosenPageMeta.device.slice(0, 12)}…\` · page id \`${chosenPageMeta.id}\` · ${chosenPageMeta.title || chosenPageMeta.url}${usingShared ? ' (shared session)' : ' (transient session)'}`);
|
|
132
|
+
lines.push('');
|
|
133
|
+
lines.push('```js');
|
|
134
|
+
lines.push(expression.length > 200 ? expression.slice(0, 200) + '…' : expression);
|
|
135
|
+
lines.push('```');
|
|
136
|
+
lines.push('');
|
|
137
|
+
const ro = evalResult.result;
|
|
138
|
+
if (evalResult.wasThrown) {
|
|
139
|
+
lines.push(`**Threw**: ${ro.description ?? ro.value ?? '(no description)'}`);
|
|
140
|
+
}
|
|
141
|
+
else if (returnByValue && 'value' in ro) {
|
|
142
|
+
lines.push(`**Value** (${ro.type}${ro.subtype ? '/' + ro.subtype : ''}):`);
|
|
143
|
+
lines.push('```json');
|
|
144
|
+
try {
|
|
145
|
+
lines.push(JSON.stringify(ro.value, null, 2));
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
lines.push(String(ro.value));
|
|
149
|
+
}
|
|
150
|
+
lines.push('```');
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
lines.push(`**Result** (${ro.type}${ro.subtype ? '/' + ro.subtype : ''}): ${ro.description ?? ro.className ?? '(no description)'}`);
|
|
154
|
+
if (ro.objectId) {
|
|
155
|
+
lines.push(`objectId: \`${ro.objectId}\``);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return textResult(lines.join('\n'));
|
|
159
|
+
},
|
|
160
|
+
};
|
|
161
|
+
function textResult(text) {
|
|
162
|
+
return { content: [{ type: 'text', text }] };
|
|
163
|
+
}
|
|
164
|
+
function errorResult(text) {
|
|
165
|
+
return { content: [{ type: 'text', text }], isError: true };
|
|
166
|
+
}
|
|
167
|
+
function describeError(e) {
|
|
168
|
+
if (e instanceof Error)
|
|
169
|
+
return e.message;
|
|
170
|
+
return String(e);
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=evaluate_script.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluate_script.js","sourceRoot":"","sources":["../../../src/tools/evaluate_script.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const fillTool: {
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
inputSchema: {
|
|
6
|
+
selector: z.ZodString;
|
|
7
|
+
value: z.ZodString;
|
|
8
|
+
nth: z.ZodOptional<z.ZodNumber>;
|
|
9
|
+
waitAfterMs: z.ZodOptional<z.ZodNumber>;
|
|
10
|
+
};
|
|
11
|
+
handler: ({ selector, value, nth, waitAfterMs, }: {
|
|
12
|
+
selector: string;
|
|
13
|
+
value: string;
|
|
14
|
+
nth?: number;
|
|
15
|
+
waitAfterMs?: number;
|
|
16
|
+
}) => Promise<{
|
|
17
|
+
content: {
|
|
18
|
+
type: "text";
|
|
19
|
+
text: string;
|
|
20
|
+
}[];
|
|
21
|
+
}>;
|
|
22
|
+
};
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { PageSession } from '../page-session.js';
|
|
3
|
+
export const fillTool = {
|
|
4
|
+
name: 'fill',
|
|
5
|
+
description: [
|
|
6
|
+
'Set the value of an input / textarea / contenteditable on the inspected iOS WebView page in one shot.',
|
|
7
|
+
'NOTE: WIP has no `Input.*` domain. This tool runs `Runtime.evaluate` to assign `el.value` (via the native setter so React `onChange` fires) and dispatches synthetic `input` + `change` events. Real key sequences are NOT simulated — for per-keystroke behavior use `type_text`.',
|
|
8
|
+
'Selector matches via `document.querySelectorAll(selector)[nth]`.',
|
|
9
|
+
].join(' '),
|
|
10
|
+
inputSchema: {
|
|
11
|
+
selector: z.string().min(1).describe('CSS selector for the input / textarea / contenteditable element.'),
|
|
12
|
+
value: z.string().describe('Text to fill. Empty string is allowed (clears the field).'),
|
|
13
|
+
nth: z
|
|
14
|
+
.number()
|
|
15
|
+
.int()
|
|
16
|
+
.min(0)
|
|
17
|
+
.optional()
|
|
18
|
+
.describe('When the selector matches multiple, pick the Nth (0-indexed). Default 0.'),
|
|
19
|
+
waitAfterMs: z
|
|
20
|
+
.number()
|
|
21
|
+
.int()
|
|
22
|
+
.min(0)
|
|
23
|
+
.max(10_000)
|
|
24
|
+
.optional()
|
|
25
|
+
.describe('Block after fill for this long (default 100) so subsequent reads see post-fill state.'),
|
|
26
|
+
},
|
|
27
|
+
handler: async ({ selector, value, nth = 0, waitAfterMs = 100, }) => {
|
|
28
|
+
let ps;
|
|
29
|
+
try {
|
|
30
|
+
ps = await PageSession.get();
|
|
31
|
+
}
|
|
32
|
+
catch (e) {
|
|
33
|
+
return errorResult(`Unable to attach to a WKWebView page: ${describe(e)}`);
|
|
34
|
+
}
|
|
35
|
+
const selJson = JSON.stringify(selector);
|
|
36
|
+
const valJson = JSON.stringify(value);
|
|
37
|
+
const expression = `
|
|
38
|
+
(() => {
|
|
39
|
+
const matches = document.querySelectorAll(${selJson});
|
|
40
|
+
if (matches.length === 0) return { ok: false, reason: 'no_match', selector: ${selJson} };
|
|
41
|
+
if (${nth} >= matches.length) return { ok: false, reason: 'nth_out_of_range', found: matches.length };
|
|
42
|
+
const el = matches[${nth}];
|
|
43
|
+
const tag = el.tagName.toLowerCase();
|
|
44
|
+
const isInput = tag === 'input' || tag === 'textarea';
|
|
45
|
+
const isCE = el.isContentEditable === true;
|
|
46
|
+
if (!isInput && !isCE) return { ok: false, reason: 'not_fillable', tag };
|
|
47
|
+
try {
|
|
48
|
+
el.focus();
|
|
49
|
+
if (isInput) {
|
|
50
|
+
const proto = tag === 'input' ? HTMLInputElement.prototype : HTMLTextAreaElement.prototype;
|
|
51
|
+
const setter = Object.getOwnPropertyDescriptor(proto, 'value') && Object.getOwnPropertyDescriptor(proto, 'value').set;
|
|
52
|
+
if (setter) setter.call(el, ${valJson}); else el.value = ${valJson};
|
|
53
|
+
} else {
|
|
54
|
+
el.textContent = ${valJson};
|
|
55
|
+
}
|
|
56
|
+
el.dispatchEvent(new Event('input', { bubbles: true }));
|
|
57
|
+
el.dispatchEvent(new Event('change', { bubbles: true }));
|
|
58
|
+
} catch (e) {
|
|
59
|
+
return { ok: false, reason: 'fill_threw', error: String(e), tag };
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
ok: true,
|
|
63
|
+
tag,
|
|
64
|
+
mode: isInput ? 'value-setter' : 'contenteditable',
|
|
65
|
+
valueLen: ${valJson}.length,
|
|
66
|
+
foundCount: matches.length,
|
|
67
|
+
};
|
|
68
|
+
})()
|
|
69
|
+
`;
|
|
70
|
+
let result;
|
|
71
|
+
try {
|
|
72
|
+
result = await ps.session.send('Runtime.evaluate', { expression, returnByValue: true, awaitPromise: false }, 10_000);
|
|
73
|
+
}
|
|
74
|
+
catch (e) {
|
|
75
|
+
return errorResult(`Runtime.evaluate (fill) failed: ${describe(e)}`);
|
|
76
|
+
}
|
|
77
|
+
if (waitAfterMs > 0) {
|
|
78
|
+
await new Promise(r => setTimeout(r, waitAfterMs));
|
|
79
|
+
}
|
|
80
|
+
const v = result?.result?.value;
|
|
81
|
+
if (!v || v.ok !== true) {
|
|
82
|
+
return errorResult(`# fill: failed\n\nselector: \`${selector}\`\n\n${JSON.stringify(v)}`);
|
|
83
|
+
}
|
|
84
|
+
return textResult([
|
|
85
|
+
`# fill ✓ ${selector}`,
|
|
86
|
+
'',
|
|
87
|
+
`tag: \`<${v.tag}>\` (mode: ${v.mode})`,
|
|
88
|
+
`value length: ${v.valueLen}`,
|
|
89
|
+
`match count: ${v.foundCount} (picked nth=${nth})`,
|
|
90
|
+
'',
|
|
91
|
+
'⚠ Synthetic `value = …` + `input` / `change` events. Listeners depending on per-key events (composition, IME, key counters) will NOT fire. Use `type_text` for keystroke-level simulation.',
|
|
92
|
+
].join('\n'));
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
function textResult(text) {
|
|
96
|
+
return { content: [{ type: 'text', text }] };
|
|
97
|
+
}
|
|
98
|
+
function errorResult(text) {
|
|
99
|
+
return { content: [{ type: 'text', text }], isError: true };
|
|
100
|
+
}
|
|
101
|
+
function describe(e) {
|
|
102
|
+
return e instanceof Error ? e.message : String(e);
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=fill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fill.js","sourceRoot":"","sources":["../../../src/tools/fill.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const fillFormTool: {
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
inputSchema: {
|
|
6
|
+
fields: z.ZodArray<z.ZodObject<{
|
|
7
|
+
selector: z.ZodString;
|
|
8
|
+
value: z.ZodString;
|
|
9
|
+
nth: z.ZodOptional<z.ZodNumber>;
|
|
10
|
+
}, "strip", z.ZodTypeAny, {
|
|
11
|
+
value: string;
|
|
12
|
+
selector: string;
|
|
13
|
+
nth?: number | undefined;
|
|
14
|
+
}, {
|
|
15
|
+
value: string;
|
|
16
|
+
selector: string;
|
|
17
|
+
nth?: number | undefined;
|
|
18
|
+
}>, "many">;
|
|
19
|
+
waitAfterMs: z.ZodOptional<z.ZodNumber>;
|
|
20
|
+
};
|
|
21
|
+
handler: ({ fields, waitAfterMs, }: {
|
|
22
|
+
fields: Array<{
|
|
23
|
+
selector: string;
|
|
24
|
+
value: string;
|
|
25
|
+
nth?: number;
|
|
26
|
+
}>;
|
|
27
|
+
waitAfterMs?: number;
|
|
28
|
+
}) => Promise<{
|
|
29
|
+
content: {
|
|
30
|
+
type: "text";
|
|
31
|
+
text: string;
|
|
32
|
+
}[];
|
|
33
|
+
}>;
|
|
34
|
+
};
|