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,146 @@
|
|
|
1
|
+
export class WipError extends Error {
|
|
2
|
+
code;
|
|
3
|
+
domain;
|
|
4
|
+
rawCode;
|
|
5
|
+
fallback;
|
|
6
|
+
constructor(code, message, opts) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.name = 'WipError';
|
|
9
|
+
this.code = code;
|
|
10
|
+
this.domain = opts?.domain;
|
|
11
|
+
this.rawCode = opts?.rawCode;
|
|
12
|
+
this.fallback = opts?.fallback;
|
|
13
|
+
}
|
|
14
|
+
toStructured() {
|
|
15
|
+
return {
|
|
16
|
+
code: this.code,
|
|
17
|
+
message: this.message,
|
|
18
|
+
...(this.domain !== undefined ? { domain: this.domain } : {}),
|
|
19
|
+
...(this.rawCode !== undefined ? { rawCode: this.rawCode } : {}),
|
|
20
|
+
...(this.fallback !== undefined ? { fallback: this.fallback } : {}),
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Map a raw WIP error response (or thrown Error) to a WipError with code.
|
|
26
|
+
* `code === -32601` → METHOD_NOT_FOUND (or DOMAIN_UNAVAILABLE if message
|
|
27
|
+
* contains "domain was not found"). `-32602` → INVALID_PARAMS. Plain timeout
|
|
28
|
+
* messages from `WipSession.send` → TIMEOUT.
|
|
29
|
+
*/
|
|
30
|
+
export function classifyWipError(err, method) {
|
|
31
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
32
|
+
// Match patterns from WipSession.handleInner reject + connect/send timeout
|
|
33
|
+
// strings.
|
|
34
|
+
if (/Timeout \(\d+ms\)/.test(msg)) {
|
|
35
|
+
return new WipError('TIMEOUT', msg, { domain: domainOf(method) });
|
|
36
|
+
}
|
|
37
|
+
// WipSession threw the legacy "<method> failed: <wip-error.message>" format.
|
|
38
|
+
// Check for known sentinel substrings in the WIP-side message.
|
|
39
|
+
const domainMatch = msg.match(/'([A-Z][A-Za-z0-9]+)' domain was not found/);
|
|
40
|
+
if (domainMatch) {
|
|
41
|
+
return new WipError('DOMAIN_UNAVAILABLE', msg, { domain: domainMatch[1], rawCode: -32601 });
|
|
42
|
+
}
|
|
43
|
+
if (/'[^']+' was not found/.test(msg)) {
|
|
44
|
+
return new WipError('METHOD_NOT_FOUND', msg, { domain: domainOf(method), rawCode: -32601 });
|
|
45
|
+
}
|
|
46
|
+
if (/Invalid params|expected/i.test(msg)) {
|
|
47
|
+
return new WipError('INVALID_PARAMS', msg, { domain: domainOf(method), rawCode: -32602 });
|
|
48
|
+
}
|
|
49
|
+
if (/WipSession not connected|closed by peer/.test(msg)) {
|
|
50
|
+
return new WipError('TRANSPORT_ERROR', msg, { domain: domainOf(method) });
|
|
51
|
+
}
|
|
52
|
+
return new WipError('INTERNAL', msg, { domain: domainOf(method) });
|
|
53
|
+
}
|
|
54
|
+
function domainOf(method) {
|
|
55
|
+
const idx = method.indexOf('.');
|
|
56
|
+
return idx > 0 ? method.slice(0, idx) : undefined;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Sentinels for Schema-fallback domain probing. **Important constraint**: any
|
|
60
|
+
* method that *hangs* (no response within `timeoutMs`) blocks every concurrent
|
|
61
|
+
* tool call on the same ws — Apple WIP serializes per-target message
|
|
62
|
+
* processing. So sentinels MUST be methods that always reply quickly (success
|
|
63
|
+
* or `-32601 NOT_FOUND`), never methods known to hang.
|
|
64
|
+
*
|
|
65
|
+
* CSS.* is intentionally NOT a sentinel: `CSS.enable` hangs on iOS 26.5 (real
|
|
66
|
+
* receipt 2026-05-17). Detection of CSS unavailability happens via:
|
|
67
|
+
* ① Schema.getDomains absence of "CSS" entry, OR
|
|
68
|
+
* ② tool-level timeout when a CSS-dependent tool eventually ships.
|
|
69
|
+
*
|
|
70
|
+
* Currently empty — all batch-13 Must tools live in domains we already have
|
|
71
|
+
* positive matrix coverage for.
|
|
72
|
+
*/
|
|
73
|
+
const SENTINEL_PROBES = [];
|
|
74
|
+
export async function probeCapabilities(session) {
|
|
75
|
+
const startedAt = Date.now();
|
|
76
|
+
const sentinels = {};
|
|
77
|
+
const notes = [];
|
|
78
|
+
let supportedDomains;
|
|
79
|
+
let schemaProbeSucceeded = false;
|
|
80
|
+
// Step 1: Schema.getDomains.
|
|
81
|
+
try {
|
|
82
|
+
const result = await session.send('Schema.getDomains', undefined, 3_000);
|
|
83
|
+
if (Array.isArray(result?.domains)) {
|
|
84
|
+
supportedDomains = new Set(result.domains
|
|
85
|
+
.map(d => (typeof d?.domain === 'string' ? d.domain : ''))
|
|
86
|
+
.filter(Boolean));
|
|
87
|
+
schemaProbeSucceeded = true;
|
|
88
|
+
notes.push(`Schema.getDomains → ${supportedDomains.size} domains`);
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
notes.push(`Schema.getDomains returned no domains[] array`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
catch (e) {
|
|
95
|
+
const err = classifyWipError(e, 'Schema.getDomains');
|
|
96
|
+
notes.push(`Schema.getDomains ${err.code}: ${err.message.slice(0, 80)}`);
|
|
97
|
+
}
|
|
98
|
+
// Step 2: Sentinel probes — currently CSS only.
|
|
99
|
+
await Promise.all(SENTINEL_PROBES.map(async ({ domain, method, params, timeoutMs }) => {
|
|
100
|
+
try {
|
|
101
|
+
await session.send(method, params, timeoutMs);
|
|
102
|
+
sentinels[domain] = 'ok';
|
|
103
|
+
}
|
|
104
|
+
catch (e) {
|
|
105
|
+
const err = classifyWipError(e, method);
|
|
106
|
+
if (err.code === 'TIMEOUT')
|
|
107
|
+
sentinels[domain] = 'timeout';
|
|
108
|
+
else if (err.code === 'DOMAIN_UNAVAILABLE' || err.code === 'METHOD_NOT_FOUND')
|
|
109
|
+
sentinels[domain] = 'not-found';
|
|
110
|
+
else if (err.code === 'INVALID_PARAMS')
|
|
111
|
+
sentinels[domain] = 'invalid-params';
|
|
112
|
+
else
|
|
113
|
+
sentinels[domain] = 'error';
|
|
114
|
+
}
|
|
115
|
+
}));
|
|
116
|
+
// Step 3: Cross-check Schema vs sentinels — capture "claimed but hung" cases.
|
|
117
|
+
for (const { domain } of SENTINEL_PROBES) {
|
|
118
|
+
const sentinel = sentinels[domain];
|
|
119
|
+
if (sentinel === 'timeout' && supportedDomains?.has(domain)) {
|
|
120
|
+
notes.push(`⚠ ${domain} domain reported by Schema but ${domain}.* hung — likely WebKit fork omits implementation. Treating as unavailable.`);
|
|
121
|
+
supportedDomains.delete(domain);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return {
|
|
125
|
+
probedAt: new Date(startedAt).toISOString(),
|
|
126
|
+
probeDurationMs: Date.now() - startedAt,
|
|
127
|
+
supportedDomains,
|
|
128
|
+
schemaProbeSucceeded,
|
|
129
|
+
sentinels,
|
|
130
|
+
notes,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Convenience: throw a structured WipError if the snapshot tells us the
|
|
135
|
+
* required domain is unavailable. No-op if `supportedDomains` is undefined
|
|
136
|
+
* (Schema probe failed → assume optimistic).
|
|
137
|
+
*/
|
|
138
|
+
export function assertDomainAvailable(snap, domain) {
|
|
139
|
+
if (!snap || !snap.supportedDomains)
|
|
140
|
+
return; // optimistic when discovery failed
|
|
141
|
+
if (!snap.supportedDomains.has(domain)) {
|
|
142
|
+
throw new WipError('DOMAIN_UNAVAILABLE', `${domain} domain is not supported on this WebKit build. ` +
|
|
143
|
+
`Schema.getDomains did not list it (probedAt=${snap.probedAt}).`, { domain, fallback: undefined });
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=capability.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capability.js","sourceRoot":"","sources":["../../src/capability.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { createServer } from './server.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { WipSession } from './wip-client/ws-session.js';
|
|
2
|
+
import { type CapabilitySnapshot } from './capability.js';
|
|
3
|
+
export interface ConsoleEntry {
|
|
4
|
+
source: 'Console.messageAdded' | 'Runtime.exceptionThrown';
|
|
5
|
+
level: string;
|
|
6
|
+
text: string;
|
|
7
|
+
url?: string;
|
|
8
|
+
line?: number;
|
|
9
|
+
column?: number;
|
|
10
|
+
timestamp?: number;
|
|
11
|
+
args?: unknown[];
|
|
12
|
+
stackTrace?: unknown;
|
|
13
|
+
raw: unknown;
|
|
14
|
+
}
|
|
15
|
+
export interface NetworkEntry {
|
|
16
|
+
requestId: string;
|
|
17
|
+
url: string;
|
|
18
|
+
method?: string;
|
|
19
|
+
status?: number;
|
|
20
|
+
statusText?: string;
|
|
21
|
+
mimeType?: string;
|
|
22
|
+
type?: string;
|
|
23
|
+
initiatorType?: string;
|
|
24
|
+
startedAt?: number;
|
|
25
|
+
endedAt?: number;
|
|
26
|
+
encodedDataLength?: number;
|
|
27
|
+
errorText?: string;
|
|
28
|
+
state: 'pending' | 'response-received' | 'finished' | 'failed';
|
|
29
|
+
requestHeaders?: Record<string, string>;
|
|
30
|
+
responseHeaders?: Record<string, string>;
|
|
31
|
+
postData?: string;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* batch-14 frozen contract for `Network.requestIntercepted` (cross-review v2.0.1):
|
|
35
|
+
* - 30s auto-continue if not consumed
|
|
36
|
+
* - 16 max concurrent pending; oldest auto-continued when overflow
|
|
37
|
+
* - explicit `abort=true` for block; default = continue
|
|
38
|
+
*/
|
|
39
|
+
export interface InterceptedRequest {
|
|
40
|
+
requestId: string;
|
|
41
|
+
url: string;
|
|
42
|
+
method?: string;
|
|
43
|
+
headers?: Record<string, string>;
|
|
44
|
+
postData?: string;
|
|
45
|
+
stage?: string;
|
|
46
|
+
arrivedAt: number;
|
|
47
|
+
autoContinueTimer?: ReturnType<typeof setTimeout>;
|
|
48
|
+
}
|
|
49
|
+
export declare const INTERCEPT_AUTO_CONTINUE_MS = 30000;
|
|
50
|
+
export declare const INTERCEPT_MAX_PENDING = 16;
|
|
51
|
+
export interface AttachInfo {
|
|
52
|
+
deviceId: string;
|
|
53
|
+
deviceOSVersion?: string;
|
|
54
|
+
pageId: string;
|
|
55
|
+
pageTitle: string;
|
|
56
|
+
pageUrl: string;
|
|
57
|
+
webSocketDebuggerUrl: string;
|
|
58
|
+
targetId?: string;
|
|
59
|
+
attachedAt: number;
|
|
60
|
+
}
|
|
61
|
+
export declare class PageSession {
|
|
62
|
+
private static cached;
|
|
63
|
+
static get(opts?: {
|
|
64
|
+
proxyDeviceListUrl?: string;
|
|
65
|
+
bufferCap?: number;
|
|
66
|
+
pageId?: string;
|
|
67
|
+
}): Promise<PageSession>;
|
|
68
|
+
static reset(): void;
|
|
69
|
+
readonly session: WipSession;
|
|
70
|
+
readonly consoleBuffer: ConsoleEntry[];
|
|
71
|
+
readonly networkBuffer: NetworkEntry[];
|
|
72
|
+
readonly networkById: Map<string, NetworkEntry>;
|
|
73
|
+
readonly intercepted: Map<string, InterceptedRequest>;
|
|
74
|
+
attachInfo: AttachInfo | undefined;
|
|
75
|
+
enableErrors: Array<{
|
|
76
|
+
method: string;
|
|
77
|
+
error: string;
|
|
78
|
+
}>;
|
|
79
|
+
private alive;
|
|
80
|
+
private readonly cap;
|
|
81
|
+
private capabilityPromise;
|
|
82
|
+
private capabilitySnapshot;
|
|
83
|
+
private constructor();
|
|
84
|
+
isAlive(): boolean;
|
|
85
|
+
close(): void;
|
|
86
|
+
private init;
|
|
87
|
+
/**
|
|
88
|
+
* Returns the capability snapshot synchronously if the background probe has
|
|
89
|
+
* completed, else `undefined`. Tools that want to fail fast should call
|
|
90
|
+
* `await pageSession.capability()` instead.
|
|
91
|
+
*/
|
|
92
|
+
capabilitySync(): CapabilitySnapshot | undefined;
|
|
93
|
+
/** Awaits capability probe completion. Resolves immediately if already done. */
|
|
94
|
+
capability(): Promise<CapabilitySnapshot>;
|
|
95
|
+
private push;
|
|
96
|
+
private recordConsoleMessageAdded;
|
|
97
|
+
private recordRuntimeException;
|
|
98
|
+
private upsertNetwork;
|
|
99
|
+
private recordNetworkRequestWillBeSent;
|
|
100
|
+
private recordNetworkResponseReceived;
|
|
101
|
+
private recordNetworkLoadingFinished;
|
|
102
|
+
private recordNetworkLoadingFailed;
|
|
103
|
+
private recordRequestIntercepted;
|
|
104
|
+
/** Drain an intercepted request's bookkeeping. Called when a tool consumes
|
|
105
|
+
* the request via continue/respond — clears auto-continue timer and removes
|
|
106
|
+
* from the pending map. Returns the entry if it existed. */
|
|
107
|
+
consumeIntercepted(requestId: string): InterceptedRequest | undefined;
|
|
108
|
+
}
|
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Singleton-ish persistent WIP page session shared by stream-based tools
|
|
3
|
+
* (list_console_messages / list_network_requests / take_snapshot).
|
|
4
|
+
*
|
|
5
|
+
* Lifecycle:
|
|
6
|
+
* - Lazy: created on first PageSession.get() call.
|
|
7
|
+
* - Picks the first WKWebView page (filters out JSCore workers).
|
|
8
|
+
* - Enables Console + Network + Runtime + DOM domains (each `enable` is
|
|
9
|
+
* try-best-effort; failures are logged but don't abort).
|
|
10
|
+
* - Subscribes Console.messageAdded / Runtime.exceptionThrown /
|
|
11
|
+
* Network.requestWillBeSent / responseReceived / loadingFailed and
|
|
12
|
+
* fills rolling buffers (default cap 200 each).
|
|
13
|
+
* - On ws close / target destroyed, marks itself stale; next get() rebuilds.
|
|
14
|
+
*
|
|
15
|
+
* Each tool calls `await PageSession.get()` then queries buffers or calls
|
|
16
|
+
* the underlying `session.send(...)` for one-shot RPCs.
|
|
17
|
+
*/
|
|
18
|
+
import { fetchProxyDevices, fetchDevicePages } from './wip-client/iwdp-http.js';
|
|
19
|
+
import { WipSession } from './wip-client/ws-session.js';
|
|
20
|
+
import { probeCapabilities } from './capability.js';
|
|
21
|
+
const DEFAULT_PROXY_BASE = 'http://127.0.0.1:9221';
|
|
22
|
+
const DEFAULT_BUFFER_CAP = 200;
|
|
23
|
+
export const INTERCEPT_AUTO_CONTINUE_MS = 30_000;
|
|
24
|
+
export const INTERCEPT_MAX_PENDING = 16;
|
|
25
|
+
export class PageSession {
|
|
26
|
+
static cached;
|
|
27
|
+
static async get(opts) {
|
|
28
|
+
if (PageSession.cached && PageSession.cached.alive) {
|
|
29
|
+
if (opts?.pageId && PageSession.cached.attachInfo?.pageId !== opts.pageId) {
|
|
30
|
+
PageSession.cached.close();
|
|
31
|
+
PageSession.cached = undefined;
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
return PageSession.cached;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
if (PageSession.cached) {
|
|
38
|
+
PageSession.cached.close();
|
|
39
|
+
}
|
|
40
|
+
const ps = new PageSession(opts?.bufferCap ?? DEFAULT_BUFFER_CAP);
|
|
41
|
+
await ps.init(opts?.proxyDeviceListUrl ?? DEFAULT_PROXY_BASE, opts?.pageId);
|
|
42
|
+
PageSession.cached = ps;
|
|
43
|
+
return ps;
|
|
44
|
+
}
|
|
45
|
+
static reset() {
|
|
46
|
+
if (PageSession.cached) {
|
|
47
|
+
PageSession.cached.close();
|
|
48
|
+
PageSession.cached = undefined;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
session = new WipSession();
|
|
52
|
+
consoleBuffer = [];
|
|
53
|
+
networkBuffer = [];
|
|
54
|
+
networkById = new Map();
|
|
55
|
+
intercepted = new Map();
|
|
56
|
+
attachInfo;
|
|
57
|
+
enableErrors = [];
|
|
58
|
+
alive = false;
|
|
59
|
+
cap;
|
|
60
|
+
capabilityPromise;
|
|
61
|
+
capabilitySnapshot;
|
|
62
|
+
constructor(bufferCap) {
|
|
63
|
+
this.cap = bufferCap;
|
|
64
|
+
}
|
|
65
|
+
isAlive() {
|
|
66
|
+
return this.alive;
|
|
67
|
+
}
|
|
68
|
+
close() {
|
|
69
|
+
this.alive = false;
|
|
70
|
+
this.session.close();
|
|
71
|
+
}
|
|
72
|
+
async init(proxyBase, pageId) {
|
|
73
|
+
// 1. Pick the requested pageId, else first non-worker WKWebView page across devices.
|
|
74
|
+
const devices = await fetchProxyDevices(proxyBase);
|
|
75
|
+
if (devices.length === 0) {
|
|
76
|
+
throw new Error('No iOS devices found via ios_webkit_debug_proxy. Connect iPhone, enable Web Inspector, ensure proxy is running.');
|
|
77
|
+
}
|
|
78
|
+
let chosenDev;
|
|
79
|
+
let chosenPage;
|
|
80
|
+
for (const dev of devices) {
|
|
81
|
+
const pages = await fetchDevicePages(dev.url);
|
|
82
|
+
let page;
|
|
83
|
+
if (pageId) {
|
|
84
|
+
page = pages.find(p => p.id === pageId);
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
page = pages.find(p => p.url && !p.title.startsWith('jsi_'));
|
|
88
|
+
}
|
|
89
|
+
if (page) {
|
|
90
|
+
chosenDev = dev;
|
|
91
|
+
chosenPage = page;
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
if (!chosenDev || !chosenPage) {
|
|
96
|
+
throw new Error(pageId
|
|
97
|
+
? `pageId ${JSON.stringify(pageId)} not found on any device. Run \`list_pages\` to enumerate.`
|
|
98
|
+
: 'No inspectable WKWebView page found. Open a WebView page in the target app first (see `list_pages`).');
|
|
99
|
+
}
|
|
100
|
+
// 2. Connect + wait for page target.
|
|
101
|
+
await this.session.connect(chosenPage.webSocketDebuggerUrl);
|
|
102
|
+
const target = await this.session.waitForPageTarget();
|
|
103
|
+
// 3. Wire event subscribers BEFORE enabling, so the first event isn't lost.
|
|
104
|
+
this.session.on('Console.messageAdded', params => this.recordConsoleMessageAdded(params));
|
|
105
|
+
this.session.on('Runtime.exceptionThrown', params => this.recordRuntimeException(params));
|
|
106
|
+
this.session.on('Network.requestWillBeSent', params => this.recordNetworkRequestWillBeSent(params));
|
|
107
|
+
this.session.on('Network.responseReceived', params => this.recordNetworkResponseReceived(params));
|
|
108
|
+
this.session.on('Network.loadingFinished', params => this.recordNetworkLoadingFinished(params));
|
|
109
|
+
this.session.on('Network.loadingFailed', params => this.recordNetworkLoadingFailed(params));
|
|
110
|
+
this.session.on('Network.requestIntercepted', params => this.recordRequestIntercepted(params));
|
|
111
|
+
// 4. Enable domains best-effort. WIP support varies — collect failures, don't abort.
|
|
112
|
+
for (const m of ['Console.enable', 'Network.enable', 'Runtime.enable', 'DOM.enable']) {
|
|
113
|
+
try {
|
|
114
|
+
await this.session.send(m, undefined, 5_000);
|
|
115
|
+
}
|
|
116
|
+
catch (e) {
|
|
117
|
+
this.enableErrors.push({ method: m, error: e instanceof Error ? e.message : String(e) });
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
this.attachInfo = {
|
|
121
|
+
deviceId: chosenDev.deviceId,
|
|
122
|
+
deviceOSVersion: chosenDev.deviceOSVersion,
|
|
123
|
+
pageId: chosenPage.id,
|
|
124
|
+
pageTitle: chosenPage.title,
|
|
125
|
+
pageUrl: chosenPage.url,
|
|
126
|
+
webSocketDebuggerUrl: chosenPage.webSocketDebuggerUrl,
|
|
127
|
+
targetId: target.targetId,
|
|
128
|
+
attachedAt: Date.now(),
|
|
129
|
+
};
|
|
130
|
+
this.alive = true;
|
|
131
|
+
// 5. Async fire-and-forget capability probe. Tools may consult `capability()`
|
|
132
|
+
// to fail-fast with DOMAIN_UNAVAILABLE before issuing doomed RPCs.
|
|
133
|
+
// NOTE: Sentinels that *hang* (e.g. CSS.* on iOS 26.5) are NOT included
|
|
134
|
+
// in probeCapabilities — Apple WIP serializes per-target responses, so a
|
|
135
|
+
// hanging probe blocks every concurrent tool call on the shared ws.
|
|
136
|
+
// Instead, we rely on Schema.getDomains where available + tool-level
|
|
137
|
+
// timeout fallback for unknown WebKit builds.
|
|
138
|
+
this.capabilityPromise = probeCapabilities(this.session)
|
|
139
|
+
.then(snap => {
|
|
140
|
+
this.capabilitySnapshot = snap;
|
|
141
|
+
return snap;
|
|
142
|
+
})
|
|
143
|
+
.catch(e => {
|
|
144
|
+
// Probe itself failed (rare). Synthesize an "unknown" snapshot so
|
|
145
|
+
// capability() resolves rather than hanging future awaiters.
|
|
146
|
+
const fallback = {
|
|
147
|
+
probedAt: new Date().toISOString(),
|
|
148
|
+
probeDurationMs: 0,
|
|
149
|
+
supportedDomains: undefined,
|
|
150
|
+
schemaProbeSucceeded: false,
|
|
151
|
+
sentinels: {},
|
|
152
|
+
notes: [`probe rejected: ${e instanceof Error ? e.message : String(e)}`],
|
|
153
|
+
};
|
|
154
|
+
this.capabilitySnapshot = fallback;
|
|
155
|
+
return fallback;
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Returns the capability snapshot synchronously if the background probe has
|
|
160
|
+
* completed, else `undefined`. Tools that want to fail fast should call
|
|
161
|
+
* `await pageSession.capability()` instead.
|
|
162
|
+
*/
|
|
163
|
+
capabilitySync() {
|
|
164
|
+
return this.capabilitySnapshot;
|
|
165
|
+
}
|
|
166
|
+
/** Awaits capability probe completion. Resolves immediately if already done. */
|
|
167
|
+
async capability() {
|
|
168
|
+
if (this.capabilitySnapshot)
|
|
169
|
+
return this.capabilitySnapshot;
|
|
170
|
+
if (this.capabilityPromise)
|
|
171
|
+
return this.capabilityPromise;
|
|
172
|
+
throw new Error('PageSession.capability() called before init() — should be unreachable');
|
|
173
|
+
}
|
|
174
|
+
push(buf, entry) {
|
|
175
|
+
buf.push(entry);
|
|
176
|
+
if (buf.length > this.cap) {
|
|
177
|
+
buf.splice(0, buf.length - this.cap);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
recordConsoleMessageAdded(p) {
|
|
181
|
+
const params = p?.message;
|
|
182
|
+
if (!params || typeof params !== 'object')
|
|
183
|
+
return;
|
|
184
|
+
const msg = params;
|
|
185
|
+
this.push(this.consoleBuffer, {
|
|
186
|
+
source: 'Console.messageAdded',
|
|
187
|
+
level: String(msg.level ?? 'log'),
|
|
188
|
+
text: String(msg.text ?? ''),
|
|
189
|
+
url: typeof msg.url === 'string' ? msg.url : undefined,
|
|
190
|
+
line: typeof msg.line === 'number' ? msg.line : undefined,
|
|
191
|
+
column: typeof msg.column === 'number' ? msg.column : undefined,
|
|
192
|
+
timestamp: typeof msg.timestamp === 'number' ? msg.timestamp : undefined,
|
|
193
|
+
args: Array.isArray(msg.parameters) ? msg.parameters : undefined,
|
|
194
|
+
stackTrace: msg.stackTrace,
|
|
195
|
+
raw: msg,
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
recordRuntimeException(p) {
|
|
199
|
+
const params = p;
|
|
200
|
+
if (!params)
|
|
201
|
+
return;
|
|
202
|
+
const details = params.exceptionDetails;
|
|
203
|
+
this.push(this.consoleBuffer, {
|
|
204
|
+
source: 'Runtime.exceptionThrown',
|
|
205
|
+
level: 'error',
|
|
206
|
+
text: String(details?.text ?? details?.exception ?? 'Uncaught exception'),
|
|
207
|
+
url: typeof details?.url === 'string' ? details.url : undefined,
|
|
208
|
+
line: typeof details?.lineNumber === 'number' ? details.lineNumber : undefined,
|
|
209
|
+
column: typeof details?.columnNumber === 'number' ? details.columnNumber : undefined,
|
|
210
|
+
timestamp: typeof params.timestamp === 'number' ? params.timestamp : undefined,
|
|
211
|
+
stackTrace: details?.stackTrace,
|
|
212
|
+
raw: params,
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
upsertNetwork(requestId, mutator) {
|
|
216
|
+
let entry = this.networkById.get(requestId);
|
|
217
|
+
if (!entry) {
|
|
218
|
+
entry = { requestId, url: '', state: 'pending' };
|
|
219
|
+
this.networkById.set(requestId, entry);
|
|
220
|
+
this.push(this.networkBuffer, entry);
|
|
221
|
+
}
|
|
222
|
+
mutator(entry);
|
|
223
|
+
}
|
|
224
|
+
recordNetworkRequestWillBeSent(p) {
|
|
225
|
+
const params = p;
|
|
226
|
+
if (!params || typeof params.requestId !== 'string')
|
|
227
|
+
return;
|
|
228
|
+
const req = params.request;
|
|
229
|
+
this.upsertNetwork(params.requestId, e => {
|
|
230
|
+
e.url = typeof req?.url === 'string' ? req.url : e.url;
|
|
231
|
+
e.method = typeof req?.method === 'string' ? req.method : e.method;
|
|
232
|
+
e.type = typeof params.type === 'string' ? params.type : e.type;
|
|
233
|
+
const initiator = params.initiator;
|
|
234
|
+
e.initiatorType = typeof initiator?.type === 'string' ? initiator.type : e.initiatorType;
|
|
235
|
+
e.startedAt = typeof params.timestamp === 'number' ? params.timestamp : e.startedAt;
|
|
236
|
+
const headers = req?.headers;
|
|
237
|
+
if (headers && typeof headers === 'object') {
|
|
238
|
+
e.requestHeaders = headers;
|
|
239
|
+
}
|
|
240
|
+
const postData = req?.postData;
|
|
241
|
+
if (typeof postData === 'string')
|
|
242
|
+
e.postData = postData;
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
recordNetworkResponseReceived(p) {
|
|
246
|
+
const params = p;
|
|
247
|
+
if (!params || typeof params.requestId !== 'string')
|
|
248
|
+
return;
|
|
249
|
+
const res = params.response;
|
|
250
|
+
this.upsertNetwork(params.requestId, e => {
|
|
251
|
+
e.state = 'response-received';
|
|
252
|
+
e.status = typeof res?.status === 'number' ? res.status : e.status;
|
|
253
|
+
e.statusText = typeof res?.statusText === 'string' ? res.statusText : e.statusText;
|
|
254
|
+
e.mimeType = typeof res?.mimeType === 'string' ? res.mimeType : e.mimeType;
|
|
255
|
+
e.type = typeof params.type === 'string' ? params.type : e.type;
|
|
256
|
+
const headers = res?.headers;
|
|
257
|
+
if (headers && typeof headers === 'object') {
|
|
258
|
+
e.responseHeaders = headers;
|
|
259
|
+
}
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
recordNetworkLoadingFinished(p) {
|
|
263
|
+
const params = p;
|
|
264
|
+
if (!params || typeof params.requestId !== 'string')
|
|
265
|
+
return;
|
|
266
|
+
this.upsertNetwork(params.requestId, e => {
|
|
267
|
+
e.state = 'finished';
|
|
268
|
+
e.endedAt = typeof params.timestamp === 'number' ? params.timestamp : e.endedAt;
|
|
269
|
+
e.encodedDataLength = typeof params.encodedDataLength === 'number' ? params.encodedDataLength : e.encodedDataLength;
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
recordNetworkLoadingFailed(p) {
|
|
273
|
+
const params = p;
|
|
274
|
+
if (!params || typeof params.requestId !== 'string')
|
|
275
|
+
return;
|
|
276
|
+
this.upsertNetwork(params.requestId, e => {
|
|
277
|
+
e.state = 'failed';
|
|
278
|
+
e.errorText = typeof params.errorText === 'string' ? params.errorText : e.errorText;
|
|
279
|
+
e.endedAt = typeof params.timestamp === 'number' ? params.timestamp : e.endedAt;
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
recordRequestIntercepted(p) {
|
|
283
|
+
const params = p;
|
|
284
|
+
if (!params || typeof params.requestId !== 'string')
|
|
285
|
+
return;
|
|
286
|
+
const requestId = params.requestId;
|
|
287
|
+
const req = params.request;
|
|
288
|
+
const entry = {
|
|
289
|
+
requestId,
|
|
290
|
+
url: typeof req?.url === 'string' ? req.url : '',
|
|
291
|
+
method: typeof req?.method === 'string' ? req.method : undefined,
|
|
292
|
+
headers: req?.headers && typeof req.headers === 'object' ? req.headers : undefined,
|
|
293
|
+
postData: typeof req?.postData === 'string' ? req.postData : undefined,
|
|
294
|
+
stage: typeof params.stage === 'string' ? params.stage : undefined,
|
|
295
|
+
arrivedAt: Date.now(),
|
|
296
|
+
};
|
|
297
|
+
// Enforce 16-pending cap: oldest is auto-continued and dropped.
|
|
298
|
+
if (this.intercepted.size >= INTERCEPT_MAX_PENDING) {
|
|
299
|
+
const oldest = this.intercepted.entries().next().value;
|
|
300
|
+
if (oldest) {
|
|
301
|
+
const [oldestId, oldestEntry] = oldest;
|
|
302
|
+
if (oldestEntry.autoContinueTimer)
|
|
303
|
+
clearTimeout(oldestEntry.autoContinueTimer);
|
|
304
|
+
this.intercepted.delete(oldestId);
|
|
305
|
+
// Best-effort auto-continue.
|
|
306
|
+
this.session.send('Network.interceptContinue', { requestId: oldestId }, 5_000).catch(() => { });
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
// 30s auto-continue if not consumed by tool.
|
|
310
|
+
entry.autoContinueTimer = setTimeout(() => {
|
|
311
|
+
if (this.intercepted.has(requestId)) {
|
|
312
|
+
this.intercepted.delete(requestId);
|
|
313
|
+
this.session.send('Network.interceptContinue', { requestId }, 5_000).catch(() => { });
|
|
314
|
+
}
|
|
315
|
+
}, INTERCEPT_AUTO_CONTINUE_MS);
|
|
316
|
+
this.intercepted.set(requestId, entry);
|
|
317
|
+
}
|
|
318
|
+
/** Drain an intercepted request's bookkeeping. Called when a tool consumes
|
|
319
|
+
* the request via continue/respond — clears auto-continue timer and removes
|
|
320
|
+
* from the pending map. Returns the entry if it existed. */
|
|
321
|
+
consumeIntercepted(requestId) {
|
|
322
|
+
const entry = this.intercepted.get(requestId);
|
|
323
|
+
if (!entry)
|
|
324
|
+
return undefined;
|
|
325
|
+
if (entry.autoContinueTimer)
|
|
326
|
+
clearTimeout(entry.autoContinueTimer);
|
|
327
|
+
this.intercepted.delete(requestId);
|
|
328
|
+
return entry;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
//# sourceMappingURL=page-session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page-session.js","sourceRoot":"","sources":["../../src/page-session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
/**
|
|
3
|
+
* Parse `WDM_DISABLE_TOOLS` env var (comma-separated tool name list) — runtime
|
|
4
|
+
* kill switch for individual tools, per spec batch-13 DoD §"回滚开关".
|
|
5
|
+
*
|
|
6
|
+
* WDM_DISABLE_TOOLS=set_init_script,record_timeline node …
|
|
7
|
+
*
|
|
8
|
+
* Exported for tests; underscore prefix signals "internal but reachable".
|
|
9
|
+
*/
|
|
10
|
+
export declare function _parseDisabledTools(value?: string | undefined): Set<string>;
|
|
11
|
+
export declare function createServer(): McpServer;
|