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,290 @@
1
+ /**
2
+ * JSON-RPC client for Apple WIP frames via ios_webkit_debug_proxy.
3
+ *
4
+ * **Wire format (verified 2026-05-16 on iOS 26.5.0 + iwdp v1.9.2)**:
5
+ *
6
+ * The top-level ws connection at `ws://<host>:<port>/devtools/page/N` only
7
+ * exposes Apple's `Target.*` envelope domain. Real protocol domains
8
+ * (Runtime / Network / DOM / Console / Debugger / Page) are NOT directly
9
+ * callable on this connection — sending `Runtime.evaluate` at the top level
10
+ * returns `-32601 'Runtime' domain was not found`.
11
+ *
12
+ * Apple's WIP uses a multi-target dispatch model:
13
+ *
14
+ * ─── outbound (client → device) ─────────────────────────────────────────
15
+ * { id: <outerId>, method: "Target.sendMessageToTarget",
16
+ * params: { targetId, message: "<stringified inner JSON-RPC>" } }
17
+ *
18
+ * ─── inbound (device → client) ─────────────────────────────────────────
19
+ * { method: "Target.dispatchMessageFromTarget",
20
+ * params: { targetId, message: "<stringified inner JSON-RPC>" } }
21
+ *
22
+ * ─── target lifecycle (passive notifications) ──────────────────────────
23
+ * { method: "Target.targetCreated", params: { targetInfo: {targetId, type} } }
24
+ * { method: "Target.targetDestroyed", params: { targetId } }
25
+ *
26
+ * Outer and inner JSON-RPC `id` sequences are independent. This class hides
27
+ * all of that — callers just `send('Runtime.evaluate', {...})` and get back
28
+ * the inner result.
29
+ *
30
+ * Spec source (planned): WebKit `Source/WebInspectorUI/Protocol/*.json`.
31
+ */
32
+ import WebSocket from 'ws';
33
+ const DEBUG = process.env['WDM_WS_DEBUG'] === '1';
34
+ export class WipSession {
35
+ ws;
36
+ nextOuterId = 1;
37
+ nextInnerId = 1;
38
+ pending = new Map();
39
+ events = new Map();
40
+ targets = new Map();
41
+ pageTargetId;
42
+ pageTargetWaiters = [];
43
+ closed = false;
44
+ async connect(url, timeoutMs = 10_000) {
45
+ if (this.ws)
46
+ throw new Error('WipSession already connected');
47
+ return new Promise((resolve, reject) => {
48
+ const ws = new WebSocket(url, { perMessageDeflate: false });
49
+ const timer = setTimeout(() => {
50
+ ws.terminate();
51
+ reject(new Error(`Timeout (${timeoutMs}ms) connecting to ${url}`));
52
+ }, timeoutMs);
53
+ ws.once('open', () => {
54
+ clearTimeout(timer);
55
+ this.ws = ws;
56
+ resolve();
57
+ });
58
+ ws.once('error', err => {
59
+ clearTimeout(timer);
60
+ reject(err instanceof Error ? err : new Error(String(err)));
61
+ });
62
+ ws.on('message', d => this.handleOuter(d));
63
+ ws.on('close', () => this.handleClose());
64
+ });
65
+ }
66
+ /**
67
+ * Wait until a `Target.targetCreated` event with type=page arrives.
68
+ * Resolves immediately if a page target has already been seen.
69
+ */
70
+ async waitForPageTarget(timeoutMs = 5_000) {
71
+ if (this.pageTargetId)
72
+ return this.targets.get(this.pageTargetId);
73
+ return new Promise((resolve, reject) => {
74
+ const timer = setTimeout(() => {
75
+ const idx = this.pageTargetWaiters.indexOf(once);
76
+ if (idx >= 0)
77
+ this.pageTargetWaiters.splice(idx, 1);
78
+ reject(new Error(`Timeout (${timeoutMs}ms) waiting for page target. Seen targets: ${[...this.targets.values()].map(t => `${t.targetId}(${t.type})`).join(', ') || '(none)'}`));
79
+ }, timeoutMs);
80
+ const once = (t) => {
81
+ clearTimeout(timer);
82
+ resolve(t);
83
+ };
84
+ this.pageTargetWaiters.push(once);
85
+ });
86
+ }
87
+ /**
88
+ * Send an inner JSON-RPC request to the page target, wrapped in
89
+ * Target.sendMessageToTarget. Resolves with the inner result.
90
+ */
91
+ send(method, params, timeoutMs = 15_000) {
92
+ if (!this.ws || this.closed) {
93
+ return Promise.reject(new Error(`WipSession not connected (method=${method})`));
94
+ }
95
+ if (!this.pageTargetId) {
96
+ return Promise.reject(new Error(`No page target attached (call waitForPageTarget first). method=${method}`));
97
+ }
98
+ return this.sendToTarget(this.pageTargetId, method, params, timeoutMs);
99
+ }
100
+ sendToTarget(targetId, method, params, timeoutMs = 15_000) {
101
+ if (!this.ws || this.closed) {
102
+ return Promise.reject(new Error(`WipSession not connected (method=${method})`));
103
+ }
104
+ const innerId = this.nextInnerId++;
105
+ return new Promise((resolve, reject) => {
106
+ const timer = setTimeout(() => {
107
+ this.pending.delete(innerId);
108
+ reject(new Error(`Timeout (${timeoutMs}ms) waiting for ${method} response (innerId=${innerId})`));
109
+ }, timeoutMs);
110
+ this.pending.set(innerId, {
111
+ method,
112
+ resolve: result => {
113
+ clearTimeout(timer);
114
+ resolve(result);
115
+ },
116
+ reject: err => {
117
+ clearTimeout(timer);
118
+ reject(err);
119
+ },
120
+ });
121
+ const inner = JSON.stringify({ id: innerId, method, params });
122
+ const outer = JSON.stringify({
123
+ id: this.nextOuterId++,
124
+ method: 'Target.sendMessageToTarget',
125
+ params: { targetId, message: inner },
126
+ });
127
+ if (DEBUG)
128
+ process.stderr.write(`[wip-ws → ${targetId}] ${inner}\n`);
129
+ this.ws.send(outer, err => {
130
+ if (err) {
131
+ const p = this.pending.get(innerId);
132
+ this.pending.delete(innerId);
133
+ clearTimeout(timer);
134
+ p?.reject(err instanceof Error ? err : new Error(String(err)));
135
+ }
136
+ });
137
+ });
138
+ }
139
+ /**
140
+ * Subscribe to a domain event (e.g. `Console.messageAdded`,
141
+ * `Network.requestWillBeSent`). Handlers receive the inner `params`.
142
+ */
143
+ on(event, handler) {
144
+ let set = this.events.get(event);
145
+ if (!set) {
146
+ set = new Set();
147
+ this.events.set(event, set);
148
+ }
149
+ set.add(handler);
150
+ return () => set.delete(handler);
151
+ }
152
+ close() {
153
+ if (this.closed)
154
+ return;
155
+ this.closed = true;
156
+ if (this.ws) {
157
+ try {
158
+ this.ws.close();
159
+ }
160
+ catch {
161
+ // ignore
162
+ }
163
+ this.ws = undefined;
164
+ }
165
+ }
166
+ getTargets() {
167
+ return [...this.targets.values()];
168
+ }
169
+ handleOuter(data) {
170
+ let msg;
171
+ try {
172
+ msg = JSON.parse(typeof data === 'string' ? data : data.toString());
173
+ }
174
+ catch {
175
+ return;
176
+ }
177
+ if (typeof msg !== 'object' || msg === null)
178
+ return;
179
+ const o = msg;
180
+ // Outer-level event: Target.targetCreated / Target.targetDestroyed / Target.dispatchMessageFromTarget
181
+ if (typeof o.method === 'string') {
182
+ switch (o.method) {
183
+ case 'Target.targetCreated': {
184
+ const t = o.params?.['targetInfo'];
185
+ if (t && typeof t.targetId === 'string') {
186
+ this.targets.set(t.targetId, t);
187
+ if (DEBUG)
188
+ process.stderr.write(`[wip-ws target+] ${t.targetId} (${t.type})\n`);
189
+ if (t.type === 'page' && !this.pageTargetId) {
190
+ this.pageTargetId = t.targetId;
191
+ const waiters = this.pageTargetWaiters.splice(0);
192
+ for (const w of waiters)
193
+ w(t);
194
+ }
195
+ }
196
+ return;
197
+ }
198
+ case 'Target.targetDestroyed': {
199
+ const tid = o.params?.['targetId'];
200
+ if (typeof tid === 'string') {
201
+ this.targets.delete(tid);
202
+ if (this.pageTargetId === tid)
203
+ this.pageTargetId = undefined;
204
+ if (DEBUG)
205
+ process.stderr.write(`[wip-ws target-] ${tid}\n`);
206
+ }
207
+ return;
208
+ }
209
+ case 'Target.dispatchMessageFromTarget': {
210
+ const params = o.params;
211
+ const inner = params?.['message'];
212
+ if (typeof inner === 'string') {
213
+ this.handleInner(inner);
214
+ }
215
+ return;
216
+ }
217
+ default:
218
+ // Unknown outer event — pass through to subscribers for the event
219
+ this.dispatchEvent(o.method, o.params);
220
+ return;
221
+ }
222
+ }
223
+ // Outer-level RPC response. Apple WIP ALWAYS sends `{result: {}, id: outerId}`
224
+ // as a sendMessageToTarget ack — content is empty, the real inner response
225
+ // (with method-specific result or error) arrives wrapped in
226
+ // `Target.dispatchMessageFromTarget`. We log for debug but never resolve
227
+ // pending from here.
228
+ if (DEBUG && typeof o.id === 'number') {
229
+ process.stderr.write(`[wip-ws outer ack] id=${o.id} ${JSON.stringify(o).slice(0, 200)}\n`);
230
+ }
231
+ }
232
+ handleInner(rawInner) {
233
+ if (DEBUG)
234
+ process.stderr.write(`[wip-ws ←] ${rawInner.slice(0, 300)}\n`);
235
+ let msg;
236
+ try {
237
+ msg = JSON.parse(rawInner);
238
+ }
239
+ catch {
240
+ return;
241
+ }
242
+ if (typeof msg !== 'object' || msg === null)
243
+ return;
244
+ const o = msg;
245
+ if (typeof o.id === 'number') {
246
+ const p = this.pending.get(o.id);
247
+ if (!p)
248
+ return;
249
+ this.pending.delete(o.id);
250
+ if (o.error) {
251
+ const err = o.error;
252
+ p.reject(new Error(`${p.method} failed: ${err.message ?? JSON.stringify(o.error)}`));
253
+ }
254
+ else {
255
+ p.resolve(o.result);
256
+ }
257
+ return;
258
+ }
259
+ if (typeof o.method === 'string') {
260
+ this.dispatchEvent(o.method, o.params);
261
+ }
262
+ }
263
+ dispatchEvent(method, params) {
264
+ const handlers = this.events.get(method);
265
+ if (!handlers)
266
+ return;
267
+ for (const h of handlers) {
268
+ try {
269
+ h(params);
270
+ }
271
+ catch {
272
+ // ignore handler error
273
+ }
274
+ }
275
+ }
276
+ handleClose() {
277
+ this.closed = true;
278
+ const err = new Error('WipSession closed by peer');
279
+ for (const p of this.pending.values()) {
280
+ p.reject(err);
281
+ }
282
+ this.pending.clear();
283
+ for (const w of this.pageTargetWaiters.splice(0)) {
284
+ // Re-trigger waiters with a synthetic rejection through their promise chain — but we have no reject here.
285
+ // Drop them: they'll time out via their own timer instead.
286
+ void w;
287
+ }
288
+ }
289
+ }
290
+ //# sourceMappingURL=ws-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws-session.js","sourceRoot":"","sources":["../../../src/wip-client/ws-session.ts"],"names":[],"mappings":"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"}