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.
Files changed (171) hide show
  1. package/CONTRIBUTING.md +61 -0
  2. package/LICENSE +202 -0
  3. package/NOTICE +16 -0
  4. package/README.md +187 -0
  5. package/build/src/bin/ios-webkit-mcp.d.ts +2 -0
  6. package/build/src/bin/ios-webkit-mcp.js +14 -0
  7. package/build/src/bin/ios-webkit-mcp.js.map +1 -0
  8. package/build/src/capability.d.ts +61 -0
  9. package/build/src/capability.js +146 -0
  10. package/build/src/capability.js.map +1 -0
  11. package/build/src/index.d.ts +1 -0
  12. package/build/src/index.js +2 -0
  13. package/build/src/index.js.map +1 -0
  14. package/build/src/page-session.d.ts +108 -0
  15. package/build/src/page-session.js +331 -0
  16. package/build/src/page-session.js.map +1 -0
  17. package/build/src/server.d.ts +11 -0
  18. package/build/src/server.js +144 -0
  19. package/build/src/server.js.map +1 -0
  20. package/build/src/tools/analyze_performance.d.ts +40 -0
  21. package/build/src/tools/analyze_performance.js +112 -0
  22. package/build/src/tools/analyze_performance.js.map +1 -0
  23. package/build/src/tools/breakpoints.d.ts +80 -0
  24. package/build/src/tools/breakpoints.js +167 -0
  25. package/build/src/tools/breakpoints.js.map +1 -0
  26. package/build/src/tools/clear_console.d.ts +11 -0
  27. package/build/src/tools/clear_console.js +32 -0
  28. package/build/src/tools/clear_console.js.map +1 -0
  29. package/build/src/tools/click.d.ts +20 -0
  30. package/build/src/tools/click.js +88 -0
  31. package/build/src/tools/click.js.map +1 -0
  32. package/build/src/tools/debug_element.d.ts +36 -0
  33. package/build/src/tools/debug_element.js +66 -0
  34. package/build/src/tools/debug_element.js.map +1 -0
  35. package/build/src/tools/debugger.d.ts +44 -0
  36. package/build/src/tools/debugger.js +117 -0
  37. package/build/src/tools/debugger.js.map +1 -0
  38. package/build/src/tools/delete_cookie.d.ts +18 -0
  39. package/build/src/tools/delete_cookie.js +33 -0
  40. package/build/src/tools/delete_cookie.js.map +1 -0
  41. package/build/src/tools/drag.d.ts +40 -0
  42. package/build/src/tools/drag.js +202 -0
  43. package/build/src/tools/drag.js.map +1 -0
  44. package/build/src/tools/evaluate_script.d.ts +24 -0
  45. package/build/src/tools/evaluate_script.js +172 -0
  46. package/build/src/tools/evaluate_script.js.map +1 -0
  47. package/build/src/tools/fill.d.ts +22 -0
  48. package/build/src/tools/fill.js +104 -0
  49. package/build/src/tools/fill.js.map +1 -0
  50. package/build/src/tools/fill_form.d.ts +34 -0
  51. package/build/src/tools/fill_form.js +110 -0
  52. package/build/src/tools/fill_form.js.map +1 -0
  53. package/build/src/tools/gc_heap.d.ts +16 -0
  54. package/build/src/tools/gc_heap.js +66 -0
  55. package/build/src/tools/gc_heap.js.map +1 -0
  56. package/build/src/tools/get_capability_snapshot.d.ts +17 -0
  57. package/build/src/tools/get_capability_snapshot.js +50 -0
  58. package/build/src/tools/get_capability_snapshot.js.map +1 -0
  59. package/build/src/tools/get_console_message.d.ts +18 -0
  60. package/build/src/tools/get_console_message.js +92 -0
  61. package/build/src/tools/get_console_message.js.map +1 -0
  62. package/build/src/tools/get_cookies.d.ts +20 -0
  63. package/build/src/tools/get_cookies.js +59 -0
  64. package/build/src/tools/get_cookies.js.map +1 -0
  65. package/build/src/tools/get_event_listeners.d.ts +29 -0
  66. package/build/src/tools/get_event_listeners.js +129 -0
  67. package/build/src/tools/get_event_listeners.js.map +1 -0
  68. package/build/src/tools/get_network_request.d.ts +22 -0
  69. package/build/src/tools/get_network_request.js +121 -0
  70. package/build/src/tools/get_network_request.js.map +1 -0
  71. package/build/src/tools/get_performance_metrics.d.ts +27 -0
  72. package/build/src/tools/get_performance_metrics.js +185 -0
  73. package/build/src/tools/get_performance_metrics.js.map +1 -0
  74. package/build/src/tools/get_resource_tree.d.ts +18 -0
  75. package/build/src/tools/get_resource_tree.js +82 -0
  76. package/build/src/tools/get_resource_tree.js.map +1 -0
  77. package/build/src/tools/handle_dialog.d.ts +39 -0
  78. package/build/src/tools/handle_dialog.js +182 -0
  79. package/build/src/tools/handle_dialog.js.map +1 -0
  80. package/build/src/tools/highlight_node.d.ts +41 -0
  81. package/build/src/tools/highlight_node.js +95 -0
  82. package/build/src/tools/highlight_node.js.map +1 -0
  83. package/build/src/tools/hover.d.ts +20 -0
  84. package/build/src/tools/hover.js +89 -0
  85. package/build/src/tools/hover.js.map +1 -0
  86. package/build/src/tools/intercept.d.ts +81 -0
  87. package/build/src/tools/intercept.js +161 -0
  88. package/build/src/tools/intercept.js.map +1 -0
  89. package/build/src/tools/list_console_messages.d.ts +20 -0
  90. package/build/src/tools/list_console_messages.js +105 -0
  91. package/build/src/tools/list_console_messages.js.map +1 -0
  92. package/build/src/tools/list_indexeddb.d.ts +16 -0
  93. package/build/src/tools/list_indexeddb.js +55 -0
  94. package/build/src/tools/list_indexeddb.js.map +1 -0
  95. package/build/src/tools/list_network_requests.d.ts +25 -0
  96. package/build/src/tools/list_network_requests.js +108 -0
  97. package/build/src/tools/list_network_requests.js.map +1 -0
  98. package/build/src/tools/list_pages.d.ts +17 -0
  99. package/build/src/tools/list_pages.js +113 -0
  100. package/build/src/tools/list_pages.js.map +1 -0
  101. package/build/src/tools/navigate_page.d.ts +18 -0
  102. package/build/src/tools/navigate_page.js +73 -0
  103. package/build/src/tools/navigate_page.js.map +1 -0
  104. package/build/src/tools/network_runtime.d.ts +51 -0
  105. package/build/src/tools/network_runtime.js +101 -0
  106. package/build/src/tools/network_runtime.js.map +1 -0
  107. package/build/src/tools/press_key.d.ts +32 -0
  108. package/build/src/tools/press_key.js +108 -0
  109. package/build/src/tools/press_key.js.map +1 -0
  110. package/build/src/tools/query_dom_node.d.ts +22 -0
  111. package/build/src/tools/query_dom_node.js +103 -0
  112. package/build/src/tools/query_dom_node.js.map +1 -0
  113. package/build/src/tools/record_cpu_profile.d.ts +38 -0
  114. package/build/src/tools/record_cpu_profile.js +174 -0
  115. package/build/src/tools/record_cpu_profile.js.map +1 -0
  116. package/build/src/tools/record_memory_tracking.d.ts +32 -0
  117. package/build/src/tools/record_memory_tracking.js +103 -0
  118. package/build/src/tools/record_memory_tracking.js.map +1 -0
  119. package/build/src/tools/record_timeline.d.ts +20 -0
  120. package/build/src/tools/record_timeline.js +110 -0
  121. package/build/src/tools/record_timeline.js.map +1 -0
  122. package/build/src/tools/reload_page.d.ts +18 -0
  123. package/build/src/tools/reload_page.js +59 -0
  124. package/build/src/tools/reload_page.js.map +1 -0
  125. package/build/src/tools/select_page.d.ts +18 -0
  126. package/build/src/tools/select_page.js +54 -0
  127. package/build/src/tools/select_page.js.map +1 -0
  128. package/build/src/tools/set_extra_http_headers.d.ts +16 -0
  129. package/build/src/tools/set_extra_http_headers.js +55 -0
  130. package/build/src/tools/set_extra_http_headers.js.map +1 -0
  131. package/build/src/tools/set_init_script.d.ts +16 -0
  132. package/build/src/tools/set_init_script.js +43 -0
  133. package/build/src/tools/set_init_script.js.map +1 -0
  134. package/build/src/tools/set_outer_html.d.ts +18 -0
  135. package/build/src/tools/set_outer_html.js +52 -0
  136. package/build/src/tools/set_outer_html.js.map +1 -0
  137. package/build/src/tools/set_user_agent.d.ts +40 -0
  138. package/build/src/tools/set_user_agent.js +83 -0
  139. package/build/src/tools/set_user_agent.js.map +1 -0
  140. package/build/src/tools/summarize_console_errors.d.ts +40 -0
  141. package/build/src/tools/summarize_console_errors.js +131 -0
  142. package/build/src/tools/summarize_console_errors.js.map +1 -0
  143. package/build/src/tools/take_memory_snapshot.d.ts +18 -0
  144. package/build/src/tools/take_memory_snapshot.js +88 -0
  145. package/build/src/tools/take_memory_snapshot.js.map +1 -0
  146. package/build/src/tools/take_node_screenshot.d.ts +29 -0
  147. package/build/src/tools/take_node_screenshot.js +57 -0
  148. package/build/src/tools/take_node_screenshot.js.map +1 -0
  149. package/build/src/tools/take_screenshot.d.ts +51 -0
  150. package/build/src/tools/take_screenshot.js +108 -0
  151. package/build/src/tools/take_screenshot.js.map +1 -0
  152. package/build/src/tools/take_snapshot.d.ts +22 -0
  153. package/build/src/tools/take_snapshot.js +142 -0
  154. package/build/src/tools/take_snapshot.js.map +1 -0
  155. package/build/src/tools/type_text.d.ts +34 -0
  156. package/build/src/tools/type_text.js +203 -0
  157. package/build/src/tools/type_text.js.map +1 -0
  158. package/build/src/tools/wait_for.d.ts +24 -0
  159. package/build/src/tools/wait_for.js +93 -0
  160. package/build/src/tools/wait_for.js.map +1 -0
  161. package/build/src/tools/wip_send.d.ts +22 -0
  162. package/build/src/tools/wip_send.js +81 -0
  163. package/build/src/tools/wip_send.js.map +1 -0
  164. package/build/src/wip-client/iwdp-http.d.ts +17 -0
  165. package/build/src/wip-client/iwdp-http.js +98 -0
  166. package/build/src/wip-client/iwdp-http.js.map +1 -0
  167. package/build/src/wip-client/ws-session.d.ts +41 -0
  168. package/build/src/wip-client/ws-session.js +290 -0
  169. package/build/src/wip-client/ws-session.js.map +1 -0
  170. package/docs/spec.md +689 -0
  171. package/package.json +77 -0
@@ -0,0 +1,88 @@
1
+ import { z } from 'zod';
2
+ import { PageSession } from '../page-session.js';
3
+ export const clickTool = {
4
+ name: 'click',
5
+ description: [
6
+ 'Click an element on the inspected iOS WebView page.',
7
+ 'NOTE: WIP has no `Input.*` domain (verified `-32601` on Dialog/Input methods). This tool dispatches a synthetic click via `Runtime.evaluate("el.click()")` — it triggers the click handler but does NOT replay an authentic touch event sequence (touchstart/touchend/mousedown/mouseup). For interactions that require gesture-quality events (long press, drag, native scroll triggers), evaluate yourself with `dispatchEvent`.',
8
+ 'Selector matches via `document.querySelector(selector)`. Returns whether the element was found + clicked.',
9
+ ].join(' '),
10
+ inputSchema: {
11
+ selector: z.string().min(1).describe('CSS selector for the element to click.'),
12
+ nth: z
13
+ .number()
14
+ .int()
15
+ .min(0)
16
+ .optional()
17
+ .describe('When the selector matches multiple, pick the Nth (0-indexed). Default 0.'),
18
+ waitAfterMs: z
19
+ .number()
20
+ .int()
21
+ .min(0)
22
+ .max(10_000)
23
+ .optional()
24
+ .describe('Block after the click for this long (default 200) so subsequent reads see post-click state.'),
25
+ },
26
+ handler: async ({ selector, nth = 0, waitAfterMs = 200, }) => {
27
+ let ps;
28
+ try {
29
+ ps = await PageSession.get();
30
+ }
31
+ catch (e) {
32
+ return errorResult(`Unable to attach to a WKWebView page: ${describe(e)}`);
33
+ }
34
+ const selJson = JSON.stringify(selector);
35
+ const expression = `
36
+ (() => {
37
+ const matches = document.querySelectorAll(${selJson});
38
+ if (matches.length === 0) return { ok: false, reason: 'no_match', selector: ${selJson} };
39
+ if (${nth} >= matches.length) return { ok: false, reason: 'nth_out_of_range', selector: ${selJson}, found: matches.length };
40
+ const el = matches[${nth}];
41
+ const rect = el.getBoundingClientRect();
42
+ const tag = el.tagName.toLowerCase();
43
+ const visible = rect.width > 0 && rect.height > 0;
44
+ try {
45
+ el.click();
46
+ } catch (e) {
47
+ return { ok: false, reason: 'click_threw', error: String(e), tag };
48
+ }
49
+ return { ok: true, tag, rect: { x: rect.x, y: rect.y, w: rect.width, h: rect.height }, visible, foundCount: matches.length };
50
+ })()
51
+ `;
52
+ let result;
53
+ try {
54
+ result = await ps.session.send('Runtime.evaluate', { expression, returnByValue: true, awaitPromise: false }, 10_000);
55
+ }
56
+ catch (e) {
57
+ return errorResult(`Runtime.evaluate (click) failed: ${describe(e)}`);
58
+ }
59
+ if (waitAfterMs > 0) {
60
+ await new Promise(r => setTimeout(r, waitAfterMs));
61
+ }
62
+ const value = result?.result?.value;
63
+ const v = value;
64
+ if (!v || v.ok !== true) {
65
+ return errorResult(`# click: failed\n\nselector: \`${selector}\`\n\n${JSON.stringify(value)}`);
66
+ }
67
+ return textResult([
68
+ `# click ✓ ${selector}`,
69
+ '',
70
+ `tag: \`<${v.tag}>\``,
71
+ `match count: ${v.foundCount} (picked nth=${nth})`,
72
+ `visible: ${v.visible}`,
73
+ `rect: ${JSON.stringify(v.rect)}`,
74
+ '',
75
+ '⚠ This is a synthetic `el.click()` invocation, not a real touch event. Long-press / drag / gesture-only handlers will NOT fire.',
76
+ ].join('\n'));
77
+ },
78
+ };
79
+ function textResult(text) {
80
+ return { content: [{ type: 'text', text }] };
81
+ }
82
+ function errorResult(text) {
83
+ return { content: [{ type: 'text', text }], isError: true };
84
+ }
85
+ function describe(e) {
86
+ return e instanceof Error ? e.message : String(e);
87
+ }
88
+ //# sourceMappingURL=click.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"click.js","sourceRoot":"","sources":["../../../src/tools/click.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * `debug_element` (batch-14 composite) — one-call deep-dive on a DOM element.
3
+ *
4
+ * Combines:
5
+ * - `query_dom_node` (selector → outerHTML)
6
+ * - `get_event_listeners` (selector → bound handlers)
7
+ * - `take_node_screenshot` (selector → PNG dataURL preview, optional)
8
+ * - `highlight_node` (selector → visual overlay, optional)
9
+ *
10
+ * Useful when an AI agent says "what is this `.feed-item` doing?" and wants
11
+ * one consolidated answer instead of 4 round-trips.
12
+ */
13
+ import { z } from 'zod';
14
+ export declare const debugElementTool: {
15
+ name: string;
16
+ description: string;
17
+ inputSchema: {
18
+ selector: z.ZodString;
19
+ perNodeMaxLen: z.ZodOptional<z.ZodNumber>;
20
+ withScreenshot: z.ZodOptional<z.ZodBoolean>;
21
+ withHighlight: z.ZodOptional<z.ZodBoolean>;
22
+ includeAncestors: z.ZodOptional<z.ZodBoolean>;
23
+ };
24
+ handler: ({ selector, perNodeMaxLen, withScreenshot, withHighlight, includeAncestors, }: {
25
+ selector: string;
26
+ perNodeMaxLen?: number;
27
+ withScreenshot?: boolean;
28
+ withHighlight?: boolean;
29
+ includeAncestors?: boolean;
30
+ }) => Promise<{
31
+ content: {
32
+ type: "text";
33
+ text: string;
34
+ }[];
35
+ }>;
36
+ };
@@ -0,0 +1,66 @@
1
+ /**
2
+ * `debug_element` (batch-14 composite) — one-call deep-dive on a DOM element.
3
+ *
4
+ * Combines:
5
+ * - `query_dom_node` (selector → outerHTML)
6
+ * - `get_event_listeners` (selector → bound handlers)
7
+ * - `take_node_screenshot` (selector → PNG dataURL preview, optional)
8
+ * - `highlight_node` (selector → visual overlay, optional)
9
+ *
10
+ * Useful when an AI agent says "what is this `.feed-item` doing?" and wants
11
+ * one consolidated answer instead of 4 round-trips.
12
+ */
13
+ import { z } from 'zod';
14
+ import { queryDomNodeTool } from './query_dom_node.js';
15
+ import { getEventListenersTool } from './get_event_listeners.js';
16
+ import { takeNodeScreenshotTool } from './take_node_screenshot.js';
17
+ import { highlightNodeTool } from './highlight_node.js';
18
+ export const debugElementTool = {
19
+ name: 'debug_element',
20
+ description: [
21
+ 'Run a one-shot deep-dive on a DOM element matching `selector`: outerHTML + event listeners + optional screenshot + optional highlight.',
22
+ 'Composes `query_dom_node` + `get_event_listeners` (+ `take_node_screenshot`/`highlight_node` if requested) into a single markdown report — saves the AI 3-4 round-trips when investigating "what is this element doing?".',
23
+ ].join(' '),
24
+ inputSchema: {
25
+ selector: z.string().min(1).describe('CSS selector. First match used.'),
26
+ perNodeMaxLen: z.number().int().min(100).max(50_000).optional().describe('Truncation cap on outerHTML (default 4000).'),
27
+ withScreenshot: z.boolean().optional().describe('Capture node screenshot (default false — bandwidth heavy).'),
28
+ withHighlight: z.boolean().optional().describe('Apply visible highlight overlay so the user/AI can verify the picked element on screen (default false; remember to call hide_highlight later).'),
29
+ includeAncestors: z.boolean().optional().describe('Walk parent chain in event listener enumeration (default false).'),
30
+ },
31
+ handler: async ({ selector, perNodeMaxLen = 4_000, withScreenshot = false, withHighlight = false, includeAncestors = false, }) => {
32
+ // DOM-touching sub-tools must NOT run in parallel — Apple WIP `DOM.getDocument`
33
+ // bumps node generation, invalidating concurrent nodeId lookups. Serialize them.
34
+ const domR = (await queryDomNodeTool.handler({ selector, mode: 'first', perNodeMaxLen }));
35
+ const evtR = (await getEventListenersTool.handler({ selector, includeAncestors }));
36
+ const results = [domR, evtR];
37
+ if (withScreenshot)
38
+ results.push((await takeNodeScreenshotTool.handler({ selector })));
39
+ if (withHighlight)
40
+ results.push((await highlightNodeTool.handler({ selector })));
41
+ const lines = [`# debug_element ✓ \`${selector}\``, ''];
42
+ lines.push('## DOM');
43
+ lines.push(stripTitle(domR.content[0]?.text ?? '(no dom output)'));
44
+ lines.push('');
45
+ lines.push('## Event Listeners');
46
+ lines.push(stripTitle(evtR.content[0]?.text ?? '(no listeners output)'));
47
+ let next = 2;
48
+ if (withScreenshot) {
49
+ lines.push('');
50
+ lines.push('## Screenshot');
51
+ lines.push(stripTitle(results[next].content[0]?.text ?? '(no screenshot)'));
52
+ next += 1;
53
+ }
54
+ if (withHighlight) {
55
+ lines.push('');
56
+ lines.push('## Highlight');
57
+ lines.push(stripTitle(results[next].content[0]?.text ?? '(no highlight)'));
58
+ lines.push('⚠ Remember to call `hide_highlight` to clear the overlay when done.');
59
+ }
60
+ return { content: [{ type: 'text', text: lines.join('\n') }] };
61
+ },
62
+ };
63
+ function stripTitle(text) {
64
+ return text.replace(/^# [^\n]*\n+/, '');
65
+ }
66
+ //# sourceMappingURL=debug_element.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug_element.js","sourceRoot":"","sources":["../../../src/tools/debug_element.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import { z } from 'zod';
2
+ export declare const pauseDebuggerTool: {
3
+ name: string;
4
+ description: string;
5
+ inputSchema: {};
6
+ handler: () => Promise<{
7
+ content: {
8
+ type: "text";
9
+ text: string;
10
+ }[];
11
+ }>;
12
+ };
13
+ export declare const resumeDebuggerTool: {
14
+ name: string;
15
+ description: string;
16
+ inputSchema: {};
17
+ handler: () => Promise<{
18
+ content: {
19
+ type: "text";
20
+ text: string;
21
+ }[];
22
+ }>;
23
+ };
24
+ export declare const setBreakpointByUrlTool: {
25
+ name: string;
26
+ description: string;
27
+ inputSchema: {
28
+ url: z.ZodString;
29
+ lineNumber: z.ZodNumber;
30
+ columnNumber: z.ZodOptional<z.ZodNumber>;
31
+ condition: z.ZodOptional<z.ZodString>;
32
+ };
33
+ handler: ({ url, lineNumber, columnNumber, condition }: {
34
+ url: string;
35
+ lineNumber: number;
36
+ columnNumber?: number;
37
+ condition?: string;
38
+ }) => Promise<{
39
+ content: {
40
+ type: "text";
41
+ text: string;
42
+ }[];
43
+ }>;
44
+ };
@@ -0,0 +1,117 @@
1
+ import { z } from 'zod';
2
+ import { PageSession } from '../page-session.js';
3
+ /**
4
+ * Apple WIP `Debugger` domain is exposed on iOS (probe-confirmed 2026-05-16):
5
+ * Debugger.{enable,disable,pause,resume,setBreakpointByUrl,setBreakpointsActive}
6
+ *
7
+ * Caveats:
8
+ * - `Debugger.pause` marks "pause on next JS execution opportunity" — the
9
+ * actual pause happens asynchronously when the page next runs script,
10
+ * visible via `Debugger.paused` events. The tool returns immediately.
11
+ * - While paused, subsequent `Runtime.evaluate` calls may block the WIP
12
+ * event loop or execute in pause context (different scope). Use
13
+ * `resume_debugger` before further work to be safe.
14
+ * - `Debugger.enable` is idempotent on Apple WIP — we call it lazily.
15
+ */
16
+ const ensureEnabled = async (ps) => {
17
+ try {
18
+ await ps.session.send('Debugger.enable', undefined, 5_000);
19
+ }
20
+ catch { /* idempotent */ }
21
+ };
22
+ export const pauseDebuggerTool = {
23
+ name: 'pause_debugger',
24
+ description: [
25
+ 'Request a JavaScript execution pause on the inspected iOS WebView page via WIP `Debugger.pause` (probe-confirmed 2026-05-16).',
26
+ 'NOTE: Pause is async — actual pause happens when the page next executes script. The tool returns immediately. While paused, other tools may behave unexpectedly. Call `resume_debugger` before further interaction.',
27
+ 'Always re-enable Debugger lazily (idempotent on Apple WIP).',
28
+ ].join(' '),
29
+ inputSchema: {},
30
+ handler: async () => {
31
+ let ps;
32
+ try {
33
+ ps = await PageSession.get();
34
+ }
35
+ catch (e) {
36
+ return errorResult(`Unable to attach: ${describe(e)}`);
37
+ }
38
+ await ensureEnabled(ps);
39
+ try {
40
+ await ps.session.send('Debugger.pause', undefined, 5_000);
41
+ }
42
+ catch (e) {
43
+ return errorResult(`Debugger.pause failed: ${describe(e)}`);
44
+ }
45
+ return textResult('# pause_debugger ✓\n\nPause requested. The page will pause on its next JS execution (timer fire / event handler / promise tick). Call `resume_debugger` to unblock.');
46
+ },
47
+ };
48
+ export const resumeDebuggerTool = {
49
+ name: 'resume_debugger',
50
+ description: 'Resume JavaScript execution if paused, via WIP `Debugger.resume` (probe-confirmed 2026-05-16). Safe to call unconditionally — silently no-ops if not paused.',
51
+ inputSchema: {},
52
+ handler: async () => {
53
+ let ps;
54
+ try {
55
+ ps = await PageSession.get();
56
+ }
57
+ catch (e) {
58
+ return errorResult(`Unable to attach: ${describe(e)}`);
59
+ }
60
+ await ensureEnabled(ps);
61
+ try {
62
+ await ps.session.send('Debugger.resume', undefined, 5_000);
63
+ }
64
+ catch (e) {
65
+ const err = e;
66
+ if (err.message?.includes('Was not paused'))
67
+ return textResult('# resume_debugger ✓ (was not paused, no-op)');
68
+ return errorResult(`Debugger.resume failed: ${describe(e)}`);
69
+ }
70
+ return textResult('# resume_debugger ✓');
71
+ },
72
+ };
73
+ export const setBreakpointByUrlTool = {
74
+ name: 'set_breakpoint_by_url',
75
+ description: 'Set a JavaScript breakpoint by source URL + line via WIP `Debugger.setBreakpointByUrl` (probe-confirmed 2026-05-16). Returns breakpointId for later removal (not yet exposed) and resolved source locations.',
76
+ inputSchema: {
77
+ url: z.string().min(1).describe('Source URL pattern (exact match unless urlRegex used).'),
78
+ lineNumber: z.number().int().min(0).describe('0-based line number in source.'),
79
+ columnNumber: z.number().int().min(0).optional().describe('0-based column (default 0).'),
80
+ condition: z.string().optional().describe('JS expression — break only when expression evaluates truthy in scope.'),
81
+ },
82
+ handler: async ({ url, lineNumber, columnNumber = 0, condition }) => {
83
+ let ps;
84
+ try {
85
+ ps = await PageSession.get();
86
+ }
87
+ catch (e) {
88
+ return errorResult(`Unable to attach: ${describe(e)}`);
89
+ }
90
+ await ensureEnabled(ps);
91
+ let r;
92
+ try {
93
+ r = await ps.session.send('Debugger.setBreakpointByUrl', {
94
+ url, lineNumber, columnNumber, ...(condition ? { condition } : {}),
95
+ }, 10_000);
96
+ }
97
+ catch (e) {
98
+ return errorResult(`Debugger.setBreakpointByUrl failed: ${describe(e)}`);
99
+ }
100
+ const lines = [
101
+ `# set_breakpoint_by_url ✓ \`${r.breakpointId}\``,
102
+ '',
103
+ `URL: ${url}:${lineNumber}:${columnNumber}${condition ? ` (when: ${condition})` : ''}`,
104
+ `Resolved locations: ${r.locations?.length ?? 0}${(r.locations?.length ?? 0) === 0 ? ' (no script loaded matches yet — breakpoint will activate when matching script loads)' : ''}`,
105
+ ];
106
+ if (r.locations?.length) {
107
+ lines.push('');
108
+ for (const loc of r.locations)
109
+ lines.push(`- scriptId=${loc.scriptId} line=${loc.lineNumber} col=${loc.columnNumber}`);
110
+ }
111
+ return textResult(lines.join('\n'));
112
+ },
113
+ };
114
+ function textResult(text) { return { content: [{ type: 'text', text }] }; }
115
+ function errorResult(text) { return { content: [{ type: 'text', text }], isError: true }; }
116
+ function describe(e) { return e instanceof Error ? e.message : String(e); }
117
+ //# sourceMappingURL=debugger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debugger.js","sourceRoot":"","sources":["../../../src/tools/debugger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { z } from 'zod';
2
+ export declare const deleteCookieTool: {
3
+ name: string;
4
+ description: string;
5
+ inputSchema: {
6
+ cookieName: z.ZodString;
7
+ url: z.ZodString;
8
+ };
9
+ handler: ({ cookieName, url }: {
10
+ cookieName: string;
11
+ url: string;
12
+ }) => Promise<{
13
+ content: {
14
+ type: "text";
15
+ text: string;
16
+ }[];
17
+ }>;
18
+ };
@@ -0,0 +1,33 @@
1
+ import { z } from 'zod';
2
+ import { PageSession } from '../page-session.js';
3
+ export const deleteCookieTool = {
4
+ name: 'delete_cookie',
5
+ description: [
6
+ 'Delete a single cookie by name + URL via WIP `Page.deleteCookie` (Apple-specific, probe-confirmed 2026-05-16).',
7
+ 'NOTE: WIP\'s `Network.deleteCookies` is NOT exposed on iOS — only `Page.deleteCookie` works, and it takes `cookieName` + `url` (not domain/path).',
8
+ ].join(' '),
9
+ inputSchema: {
10
+ cookieName: z.string().min(1).describe('Exact cookie name to delete.'),
11
+ url: z.string().url().describe('Origin URL the cookie is scoped to (e.g. https://example.com).'),
12
+ },
13
+ handler: async ({ cookieName, url }) => {
14
+ let ps;
15
+ try {
16
+ ps = await PageSession.get();
17
+ }
18
+ catch (e) {
19
+ return errorResult(`Unable to attach: ${describe(e)}`);
20
+ }
21
+ try {
22
+ await ps.session.send('Page.deleteCookie', { cookieName, url }, 10_000);
23
+ }
24
+ catch (e) {
25
+ return errorResult(`Page.deleteCookie failed: ${describe(e)}`);
26
+ }
27
+ return textResult(`# delete_cookie ✓\n\nname: \`${cookieName}\` · url: \`${url}\`\n\nRun \`get_cookies\` with \`nameSubstring=${cookieName}\` to verify removal.`);
28
+ },
29
+ };
30
+ function textResult(text) { return { content: [{ type: 'text', text }] }; }
31
+ function errorResult(text) { return { content: [{ type: 'text', text }], isError: true }; }
32
+ function describe(e) { return e instanceof Error ? e.message : String(e); }
33
+ //# sourceMappingURL=delete_cookie.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete_cookie.js","sourceRoot":"","sources":["../../../src/tools/delete_cookie.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,IAAI,EAAE,eAAe;IACrB,WAAW,EAAE;QACX,gHAAgH;QAChH,mJAAmJ;KACpJ,CAAC,IAAI,CAAC,GAAG,CAAC;IAEX,WAAW,EAAE;QACX,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,8BAA8B,CAAC;QACtE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,gEAAgE,CAAC;KACjG;IAED,OAAO,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,GAAG,EAAuC,EAAE,EAAE;QAC1E,IAAI,EAAe,CAAC;QACpB,IAAI,CAAC;YAAC,EAAE,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,CAAC;QAAC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YAAC,OAAO,WAAW,CAAC,qBAAqB,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAAC,CAAC;QAC3G,IAAI,CAAC;YAAC,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC;QAAC,CAAC;QAChF,OAAO,CAAC,EAAE,CAAC;YAAC,OAAO,WAAW,CAAC,6BAA6B,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAAC,CAAC;QAC7E,OAAO,UAAU,CAAC,gCAAgC,UAAU,eAAe,GAAG,kDAAkD,UAAU,uBAAuB,CAAC,CAAC;IACrK,CAAC;CACF,CAAC;AAEF,SAAS,UAAU,CAAC,IAAY,IAAI,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAC5F,SAAS,WAAW,CAAC,IAAY,IAAI,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAC5G,SAAS,QAAQ,CAAC,CAAU,IAAI,OAAO,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,40 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * WIP gotcha: `Runtime.evaluate` with `awaitPromise:true` does NOT correctly
4
+ * serialize the resolved value of a returned Promise (even `Promise.resolve(42)`
5
+ * comes back as `{}`). So this tool keeps the inner expression synchronous.
6
+ * Per-step delay is implemented by issuing one Runtime.evaluate per pointermove
7
+ * step from TS land when `stepDelayMs > 0`. When `stepDelayMs === 0`, the entire
8
+ * sequence runs in a single sync IIFE.
9
+ */
10
+ export declare const dragTool: {
11
+ name: string;
12
+ description: string;
13
+ inputSchema: {
14
+ fromSelector: z.ZodString;
15
+ fromNth: z.ZodOptional<z.ZodNumber>;
16
+ toSelector: z.ZodOptional<z.ZodString>;
17
+ toNth: z.ZodOptional<z.ZodNumber>;
18
+ dx: z.ZodOptional<z.ZodNumber>;
19
+ dy: z.ZodOptional<z.ZodNumber>;
20
+ steps: z.ZodOptional<z.ZodNumber>;
21
+ stepDelayMs: z.ZodOptional<z.ZodNumber>;
22
+ waitAfterMs: z.ZodOptional<z.ZodNumber>;
23
+ };
24
+ handler: ({ fromSelector, fromNth, toSelector, toNth, dx, dy, steps, stepDelayMs, waitAfterMs, }: {
25
+ fromSelector: string;
26
+ fromNth?: number;
27
+ toSelector?: string;
28
+ toNth?: number;
29
+ dx?: number;
30
+ dy?: number;
31
+ steps?: number;
32
+ stepDelayMs?: number;
33
+ waitAfterMs?: number;
34
+ }) => Promise<{
35
+ content: {
36
+ type: "text";
37
+ text: string;
38
+ }[];
39
+ }>;
40
+ };