opensafari-mcp 0.1.1

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 (235) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +341 -0
  3. package/dist/115.index.js +2 -0
  4. package/dist/115.index.js.map +1 -0
  5. package/dist/67.index.js +2 -0
  6. package/dist/67.index.js.map +1 -0
  7. package/dist/679.index.js +2 -0
  8. package/dist/679.index.js.map +1 -0
  9. package/dist/681.index.js +2 -0
  10. package/dist/681.index.js.map +1 -0
  11. package/dist/838.index.js +2 -0
  12. package/dist/838.index.js.map +1 -0
  13. package/dist/auth/index.d.ts +3 -0
  14. package/dist/auth/index.d.ts.map +1 -0
  15. package/dist/auth/manager.d.ts +33 -0
  16. package/dist/auth/manager.d.ts.map +1 -0
  17. package/dist/cli/148.index.js +3 -0
  18. package/dist/cli/148.index.js.map +1 -0
  19. package/dist/cli/473.index.js +3 -0
  20. package/dist/cli/473.index.js.map +1 -0
  21. package/dist/cli/622.index.js +3 -0
  22. package/dist/cli/622.index.js.map +1 -0
  23. package/dist/cli/712.index.js +3 -0
  24. package/dist/cli/712.index.js.map +1 -0
  25. package/dist/cli/844.index.js +3 -0
  26. package/dist/cli/844.index.js.map +1 -0
  27. package/dist/cli/index.d.ts +3 -0
  28. package/dist/cli/index.d.ts.map +1 -0
  29. package/dist/cli/index.js +3 -0
  30. package/dist/cli/index.js.map +1 -0
  31. package/dist/comparison/cross-viewport.d.ts +36 -0
  32. package/dist/comparison/cross-viewport.d.ts.map +1 -0
  33. package/dist/comparison/index.d.ts +4 -0
  34. package/dist/comparison/index.d.ts.map +1 -0
  35. package/dist/comparison/report.d.ts +10 -0
  36. package/dist/comparison/report.d.ts.map +1 -0
  37. package/dist/config/defaults.d.ts +33 -0
  38. package/dist/config/defaults.d.ts.map +1 -0
  39. package/dist/config/global.d.ts +25 -0
  40. package/dist/config/global.d.ts.map +1 -0
  41. package/dist/config/index.d.ts +5 -0
  42. package/dist/config/index.d.ts.map +1 -0
  43. package/dist/config/tool-tiers.d.ts +7 -0
  44. package/dist/config/tool-tiers.d.ts.map +1 -0
  45. package/dist/errors/codes.d.ts +20 -0
  46. package/dist/errors/codes.d.ts.map +1 -0
  47. package/dist/errors/index.d.ts +4 -0
  48. package/dist/errors/index.d.ts.map +1 -0
  49. package/dist/errors/timeout.d.ts +20 -0
  50. package/dist/errors/timeout.d.ts.map +1 -0
  51. package/dist/index.d.ts +25 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +2 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/mcp-server.d.ts +41 -0
  56. package/dist/mcp-server.d.ts.map +1 -0
  57. package/dist/metrics/collector.d.ts +43 -0
  58. package/dist/metrics/collector.d.ts.map +1 -0
  59. package/dist/orchestration/index.d.ts +3 -0
  60. package/dist/orchestration/index.d.ts.map +1 -0
  61. package/dist/orchestration/workflow-engine.d.ts +90 -0
  62. package/dist/orchestration/workflow-engine.d.ts.map +1 -0
  63. package/dist/qa/audit.d.ts +42 -0
  64. package/dist/qa/audit.d.ts.map +1 -0
  65. package/dist/qa/detectors/auto-zoom.d.ts +4 -0
  66. package/dist/qa/detectors/auto-zoom.d.ts.map +1 -0
  67. package/dist/qa/detectors/dark-mode.d.ts +5 -0
  68. package/dist/qa/detectors/dark-mode.d.ts.map +1 -0
  69. package/dist/qa/detectors/fixed-stacking.d.ts +4 -0
  70. package/dist/qa/detectors/fixed-stacking.d.ts.map +1 -0
  71. package/dist/qa/detectors/horizontal-overflow.d.ts +4 -0
  72. package/dist/qa/detectors/horizontal-overflow.d.ts.map +1 -0
  73. package/dist/qa/detectors/hover-only.d.ts +4 -0
  74. package/dist/qa/detectors/hover-only.d.ts.map +1 -0
  75. package/dist/qa/detectors/index.d.ts +14 -0
  76. package/dist/qa/detectors/index.d.ts.map +1 -0
  77. package/dist/qa/detectors/input-type.d.ts +4 -0
  78. package/dist/qa/detectors/input-type.d.ts.map +1 -0
  79. package/dist/qa/detectors/keyboard-overlap.d.ts +4 -0
  80. package/dist/qa/detectors/keyboard-overlap.d.ts.map +1 -0
  81. package/dist/qa/detectors/orientation.d.ts +5 -0
  82. package/dist/qa/detectors/orientation.d.ts.map +1 -0
  83. package/dist/qa/detectors/pwa-meta.d.ts +4 -0
  84. package/dist/qa/detectors/pwa-meta.d.ts.map +1 -0
  85. package/dist/qa/detectors/safe-area.d.ts +4 -0
  86. package/dist/qa/detectors/safe-area.d.ts.map +1 -0
  87. package/dist/qa/detectors/scroll-lock.d.ts +4 -0
  88. package/dist/qa/detectors/scroll-lock.d.ts.map +1 -0
  89. package/dist/qa/detectors/touch-targets.d.ts +4 -0
  90. package/dist/qa/detectors/touch-targets.d.ts.map +1 -0
  91. package/dist/qa/detectors/vh100.d.ts +4 -0
  92. package/dist/qa/detectors/vh100.d.ts.map +1 -0
  93. package/dist/qa/history.d.ts +44 -0
  94. package/dist/qa/history.d.ts.map +1 -0
  95. package/dist/qa/index.d.ts +8 -0
  96. package/dist/qa/index.d.ts.map +1 -0
  97. package/dist/qa/report-markdown.d.ts +3 -0
  98. package/dist/qa/report-markdown.d.ts.map +1 -0
  99. package/dist/qa/types.d.ts +29 -0
  100. package/dist/qa/types.d.ts.map +1 -0
  101. package/dist/reliability/crash-watcher.d.ts +16 -0
  102. package/dist/reliability/crash-watcher.d.ts.map +1 -0
  103. package/dist/reliability/graceful-shutdown.d.ts +3 -0
  104. package/dist/reliability/graceful-shutdown.d.ts.map +1 -0
  105. package/dist/reliability/index.d.ts +4 -0
  106. package/dist/reliability/index.d.ts.map +1 -0
  107. package/dist/reliability/zombie-cleanup.d.ts +53 -0
  108. package/dist/reliability/zombie-cleanup.d.ts.map +1 -0
  109. package/dist/security/audit-logger.d.ts +2 -0
  110. package/dist/security/audit-logger.d.ts.map +1 -0
  111. package/dist/security/content-sanitizer.d.ts +32 -0
  112. package/dist/security/content-sanitizer.d.ts.map +1 -0
  113. package/dist/security/domain-guard.d.ts +16 -0
  114. package/dist/security/domain-guard.d.ts.map +1 -0
  115. package/dist/session-manager.d.ts +54 -0
  116. package/dist/session-manager.d.ts.map +1 -0
  117. package/dist/simulator/batch.d.ts +22 -0
  118. package/dist/simulator/batch.d.ts.map +1 -0
  119. package/dist/simulator/index.d.ts +15 -0
  120. package/dist/simulator/index.d.ts.map +1 -0
  121. package/dist/simulator/manager.d.ts +66 -0
  122. package/dist/simulator/manager.d.ts.map +1 -0
  123. package/dist/simulator/pool.d.ts +52 -0
  124. package/dist/simulator/pool.d.ts.map +1 -0
  125. package/dist/simulator/presets.d.ts +4 -0
  126. package/dist/simulator/presets.d.ts.map +1 -0
  127. package/dist/simulator/proxy.d.ts +78 -0
  128. package/dist/simulator/proxy.d.ts.map +1 -0
  129. package/dist/simulator/simctl.d.ts +12 -0
  130. package/dist/simulator/simctl.d.ts.map +1 -0
  131. package/dist/simulator/socket-finder.d.ts +22 -0
  132. package/dist/simulator/socket-finder.d.ts.map +1 -0
  133. package/dist/simulator/types.d.ts +21 -0
  134. package/dist/simulator/types.d.ts.map +1 -0
  135. package/dist/simulator/xcode-check.d.ts +15 -0
  136. package/dist/simulator/xcode-check.d.ts.map +1 -0
  137. package/dist/tools/appearance-toggle.d.ts +3 -0
  138. package/dist/tools/appearance-toggle.d.ts.map +1 -0
  139. package/dist/tools/auth.d.ts +3 -0
  140. package/dist/tools/auth.d.ts.map +1 -0
  141. package/dist/tools/batch-execute.d.ts +5 -0
  142. package/dist/tools/batch-execute.d.ts.map +1 -0
  143. package/dist/tools/batch-navigate.d.ts +5 -0
  144. package/dist/tools/batch-navigate.d.ts.map +1 -0
  145. package/dist/tools/batch-screenshot.d.ts +5 -0
  146. package/dist/tools/batch-screenshot.d.ts.map +1 -0
  147. package/dist/tools/click.d.ts +3 -0
  148. package/dist/tools/click.d.ts.map +1 -0
  149. package/dist/tools/cookies.d.ts +3 -0
  150. package/dist/tools/cookies.d.ts.map +1 -0
  151. package/dist/tools/cross-viewport-compare.d.ts +4 -0
  152. package/dist/tools/cross-viewport-compare.d.ts.map +1 -0
  153. package/dist/tools/device-boot.d.ts +3 -0
  154. package/dist/tools/device-boot.d.ts.map +1 -0
  155. package/dist/tools/device-list.d.ts +3 -0
  156. package/dist/tools/device-list.d.ts.map +1 -0
  157. package/dist/tools/device-rotate.d.ts +3 -0
  158. package/dist/tools/device-rotate.d.ts.map +1 -0
  159. package/dist/tools/device-shutdown.d.ts +3 -0
  160. package/dist/tools/device-shutdown.d.ts.map +1 -0
  161. package/dist/tools/dismiss-keyboard.d.ts +3 -0
  162. package/dist/tools/dismiss-keyboard.d.ts.map +1 -0
  163. package/dist/tools/index.d.ts +8 -0
  164. package/dist/tools/index.d.ts.map +1 -0
  165. package/dist/tools/inspect.d.ts +3 -0
  166. package/dist/tools/inspect.d.ts.map +1 -0
  167. package/dist/tools/javascript.d.ts +3 -0
  168. package/dist/tools/javascript.d.ts.map +1 -0
  169. package/dist/tools/long-press.d.ts +3 -0
  170. package/dist/tools/long-press.d.ts.map +1 -0
  171. package/dist/tools/navigate.d.ts +3 -0
  172. package/dist/tools/navigate.d.ts.map +1 -0
  173. package/dist/tools/orchestration-tools.d.ts +5 -0
  174. package/dist/tools/orchestration-tools.d.ts.map +1 -0
  175. package/dist/tools/press.d.ts +3 -0
  176. package/dist/tools/press.d.ts.map +1 -0
  177. package/dist/tools/qa-audit.d.ts +3 -0
  178. package/dist/tools/qa-audit.d.ts.map +1 -0
  179. package/dist/tools/qa-detectors.d.ts +3 -0
  180. package/dist/tools/qa-detectors.d.ts.map +1 -0
  181. package/dist/tools/query-dom.d.ts +3 -0
  182. package/dist/tools/query-dom.d.ts.map +1 -0
  183. package/dist/tools/read-page.d.ts +3 -0
  184. package/dist/tools/read-page.d.ts.map +1 -0
  185. package/dist/tools/screenshot.d.ts +3 -0
  186. package/dist/tools/screenshot.d.ts.map +1 -0
  187. package/dist/tools/scroll.d.ts +3 -0
  188. package/dist/tools/scroll.d.ts.map +1 -0
  189. package/dist/tools/select-option.d.ts +3 -0
  190. package/dist/tools/select-option.d.ts.map +1 -0
  191. package/dist/tools/swipe.d.ts +3 -0
  192. package/dist/tools/swipe.d.ts.map +1 -0
  193. package/dist/tools/type.d.ts +3 -0
  194. package/dist/tools/type.d.ts.map +1 -0
  195. package/dist/tools/wait-for.d.ts +3 -0
  196. package/dist/tools/wait-for.d.ts.map +1 -0
  197. package/dist/transports/http.d.ts +57 -0
  198. package/dist/transports/http.d.ts.map +1 -0
  199. package/dist/transports/index.d.ts +38 -0
  200. package/dist/transports/index.d.ts.map +1 -0
  201. package/dist/transports/stdio.d.ts +16 -0
  202. package/dist/transports/stdio.d.ts.map +1 -0
  203. package/dist/types/browser-backend.d.ts +84 -0
  204. package/dist/types/browser-backend.d.ts.map +1 -0
  205. package/dist/types/mcp.d.ts +63 -0
  206. package/dist/types/mcp.d.ts.map +1 -0
  207. package/dist/types/tool-manifest.d.ts +52 -0
  208. package/dist/types/tool-manifest.d.ts.map +1 -0
  209. package/dist/utils/format-age.d.ts +5 -0
  210. package/dist/utils/format-age.d.ts.map +1 -0
  211. package/dist/utils/format-error.d.ts +5 -0
  212. package/dist/utils/format-error.d.ts.map +1 -0
  213. package/dist/utils/logger.d.ts +10 -0
  214. package/dist/utils/logger.d.ts.map +1 -0
  215. package/dist/utils/rate-limiter.d.ts +72 -0
  216. package/dist/utils/rate-limiter.d.ts.map +1 -0
  217. package/dist/utils/request-queue.d.ts +37 -0
  218. package/dist/utils/request-queue.d.ts.map +1 -0
  219. package/dist/utils/schema-validator.d.ts +12 -0
  220. package/dist/utils/schema-validator.d.ts.map +1 -0
  221. package/dist/utils/url-utils.d.ts +5 -0
  222. package/dist/utils/url-utils.d.ts.map +1 -0
  223. package/dist/utils/with-timeout.d.ts +5 -0
  224. package/dist/utils/with-timeout.d.ts.map +1 -0
  225. package/dist/version.d.ts +5 -0
  226. package/dist/version.d.ts.map +1 -0
  227. package/dist/watchdog/event-loop-monitor.d.ts +86 -0
  228. package/dist/watchdog/event-loop-monitor.d.ts.map +1 -0
  229. package/dist/watchdog/simulator-monitor.d.ts +16 -0
  230. package/dist/watchdog/simulator-monitor.d.ts.map +1 -0
  231. package/dist/webkit/client.d.ts +106 -0
  232. package/dist/webkit/client.d.ts.map +1 -0
  233. package/dist/webkit/index.d.ts +3 -0
  234. package/dist/webkit/index.d.ts.map +1 -0
  235. package/package.json +84 -0
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Request Queue - Per-session FIFO queue for sequential request processing
3
+ * Ported from extension with promise-based lock mechanism
4
+ */
5
+ export declare class RequestQueue {
6
+ private queue;
7
+ private processingPromise;
8
+ private sessionId;
9
+ constructor(sessionId: string);
10
+ /**
11
+ * Add a function to the queue and return a promise for its result
12
+ */
13
+ enqueue<T>(fn: () => Promise<T>): Promise<T>;
14
+ /**
15
+ * Trigger processing if not already running
16
+ */
17
+ private triggerProcessing;
18
+ /**
19
+ * Process all items in the queue sequentially
20
+ */
21
+ private processQueue;
22
+ get pending(): number;
23
+ get isProcessing(): boolean;
24
+ clear(): void;
25
+ getSessionId(): string;
26
+ }
27
+ export declare class RequestQueueManager {
28
+ private queues;
29
+ getQueue(sessionId: string): RequestQueue;
30
+ enqueue<T>(sessionId: string, fn: () => Promise<T>): Promise<T>;
31
+ deleteQueue(sessionId: string): void;
32
+ getStats(): Map<string, {
33
+ pending: number;
34
+ processing: boolean;
35
+ }>;
36
+ }
37
+ //# sourceMappingURL=request-queue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-queue.d.ts","sourceRoot":"","sources":["../../src/utils/request-queue.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAWH,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAA4B;IACzC,OAAO,CAAC,iBAAiB,CAA8B;IACvD,OAAO,CAAC,SAAS,CAAS;gBAEd,SAAS,EAAE,MAAM;IAI7B;;OAEG;IACH,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAW5C;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAOzB;;OAEG;YACW,YAAY;IA6B1B,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,YAAY,IAAI,OAAO,CAE1B;IAED,KAAK,IAAI,IAAI;IAQb,YAAY,IAAI,MAAM;CAGvB;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,MAAM,CAAwC;IAEtD,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY;IASzC,OAAO,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAI/D,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAQpC,QAAQ,IAAI,GAAG,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,OAAO,CAAA;KAAE,CAAC;CAUlE"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Runtime schema validator for MCP tool registration.
3
+ * Warns about patterns incompatible with various AI APIs (Gemini, OpenAI, etc.).
4
+ * Does NOT throw — only logs warnings via console.error.
5
+ */
6
+ import { MCPToolDefinition } from '../types/mcp';
7
+ /**
8
+ * Validate a tool's input schema for cross-API compatibility.
9
+ * Logs warnings via console.error. Does NOT throw.
10
+ */
11
+ export declare function validateToolSchema(name: string, schema: MCPToolDefinition['inputSchema']): void;
12
+ //# sourceMappingURL=schema-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-validator.d.ts","sourceRoot":"","sources":["../../src/utils/schema-validator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAwEjD;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,iBAAiB,CAAC,aAAa,CAAC,GACvC,IAAI,CAqBN"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Extract the hostname from a URL string. Returns empty string on failure.
3
+ */
4
+ export declare function extractHostname(url: string): string;
5
+ //# sourceMappingURL=url-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url-utils.d.ts","sourceRoot":"","sources":["../../src/utils/url-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAMnD"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Race a promise against a timeout. Rejects with an OpenSafariTimeoutError if the timeout fires first.
3
+ */
4
+ export declare function withTimeout<T>(promise: Promise<T>, ms: number, label?: string): Promise<T>;
5
+ //# sourceMappingURL=with-timeout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"with-timeout.d.ts","sourceRoot":"","sources":["../../src/utils/with-timeout.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,SAAc,GAAG,OAAO,CAAC,CAAC,CAAC,CAM/F"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Version utility - reads version from package.json to avoid hardcoded strings
3
+ */
4
+ export declare function getVersion(): string;
5
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,wBAAgB,UAAU,IAAI,MAAM,CAUnC"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Event Loop Monitor — detects Node.js event loop blocking.
3
+ * Uses timer drift detection (lightweight, ~0.5% CPU overhead).
4
+ */
5
+ import { EventEmitter } from 'events';
6
+ export interface EventLoopMonitorOptions {
7
+ /** Check interval in ms. Default: 200 */
8
+ checkIntervalMs?: number;
9
+ /** Warn threshold in ms. Default: 2000 (2s) */
10
+ warnThresholdMs?: number;
11
+ /**
12
+ * Fatal threshold in ms. Default: 0 (disabled).
13
+ * Emits 'fatal' event when threshold exceeded.
14
+ * Callers MUST attach a 'fatal' listener to handle recovery (e.g., process.exit(1)).
15
+ * No automatic process termination — this is intentional for testability.
16
+ */
17
+ fatalThresholdMs?: number;
18
+ /**
19
+ * Fatal threshold in ms during heavy tool operations (screenshot, bulk cookies).
20
+ * Default: 120000 (120s). Heavy ops legitimately block the event loop longer
21
+ * than the normal threshold without indicating a true hang.
22
+ */
23
+ heavyOpFatalThresholdMs?: number;
24
+ }
25
+ export interface BlockEvent {
26
+ driftMs: number;
27
+ timestamp: number;
28
+ }
29
+ export declare class EventLoopMonitor extends EventEmitter {
30
+ private timer;
31
+ private readonly checkIntervalMs;
32
+ private readonly warnThresholdMs;
33
+ private readonly fatalThresholdMs;
34
+ private readonly heavyOpThresholdMs;
35
+ private lastCheckAt;
36
+ private maxDriftObserved;
37
+ private warnCount;
38
+ private heavyOpCount;
39
+ constructor(opts?: EventLoopMonitorOptions);
40
+ /**
41
+ * Start monitoring the event loop.
42
+ */
43
+ start(): void;
44
+ /**
45
+ * Stop monitoring.
46
+ */
47
+ stop(): void;
48
+ /**
49
+ * Whether monitoring is active.
50
+ */
51
+ isRunning(): boolean;
52
+ /**
53
+ * Signal the start of a heavy tool operation that may legitimately block the event loop.
54
+ * While active, the monitor uses heavyOpThresholdMs instead of fatalThresholdMs.
55
+ * Uses a reference counter so concurrent heavy tools are handled correctly.
56
+ */
57
+ beginHeavyOperation(): void;
58
+ /**
59
+ * Signal the end of a heavy tool operation, reverting to the normal fatal threshold
60
+ * once all concurrent heavy operations have completed.
61
+ */
62
+ endHeavyOperation(): void;
63
+ /**
64
+ * Get monitoring statistics.
65
+ */
66
+ getStats(): {
67
+ maxDriftMs: number;
68
+ warnCount: number;
69
+ isRunning: boolean;
70
+ };
71
+ /**
72
+ * Reset statistics.
73
+ */
74
+ resetStats(): void;
75
+ }
76
+ /**
77
+ * Register the global EventLoopMonitor singleton.
78
+ * Called once from src/index.ts after creating the monitor.
79
+ */
80
+ export declare function setGlobalEventLoopMonitor(monitor: EventLoopMonitor): void;
81
+ /**
82
+ * Retrieve the global EventLoopMonitor singleton.
83
+ * Returns null if the monitor has not been registered yet (e.g., in tests).
84
+ */
85
+ export declare function getGlobalEventLoopMonitor(): EventLoopMonitor | null;
86
+ //# sourceMappingURL=event-loop-monitor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-loop-monitor.d.ts","sourceRoot":"","sources":["../../src/watchdog/event-loop-monitor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAKtC,MAAM,WAAW,uBAAuB;IACtC,yCAAyC;IACzC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,+CAA+C;IAC/C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;OAIG;IACH,uBAAuB,CAAC,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,gBAAiB,SAAQ,YAAY;IAChD,OAAO,CAAC,KAAK,CAA+B;IAC5C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;IAC5C,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,YAAY,CAAK;gBAEb,IAAI,CAAC,EAAE,uBAAuB;IAQ1C;;OAEG;IACH,KAAK,IAAI,IAAI;IA8Bb;;OAEG;IACH,IAAI,IAAI,IAAI;IAOZ;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;;;OAIG;IACH,mBAAmB,IAAI,IAAI;IAI3B;;;OAGG;IACH,iBAAiB,IAAI,IAAI;IAIzB;;OAEG;IACH,QAAQ,IAAI;QACV,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,OAAO,CAAC;KACpB;IAQD;;OAEG;IACH,UAAU,IAAI,IAAI;CAInB;AAMD;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAEzE;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,IAAI,gBAAgB,GAAG,IAAI,CAEnE"}
@@ -0,0 +1,16 @@
1
+ import { EventEmitter } from 'events';
2
+ export declare class SimulatorMonitor extends EventEmitter {
3
+ private interval;
4
+ private warnMB;
5
+ private killMB;
6
+ private checkIntervalMs;
7
+ constructor(options?: {
8
+ warnMB?: number;
9
+ killMB?: number;
10
+ intervalMs?: number;
11
+ });
12
+ start(): void;
13
+ stop(): void;
14
+ private check;
15
+ }
16
+ //# sourceMappingURL=simulator-monitor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simulator-monitor.d.ts","sourceRoot":"","sources":["../../src/watchdog/simulator-monitor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAOtC,qBAAa,gBAAiB,SAAQ,YAAY;IAChD,OAAO,CAAC,QAAQ,CAA+C;IAC/D,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,eAAe,CAAS;gBAEpB,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE;IAO/E,KAAK,IAAI,IAAI;IAKb,IAAI,IAAI,IAAI;YAOE,KAAK;CAuBpB"}
@@ -0,0 +1,106 @@
1
+ import { EventEmitter } from 'events';
2
+ import { BrowserBackend, NavigateOptions, NavigateResult, ScreenshotOptions, ElementInfo, Cookie } from '../types/browser-backend';
3
+ export interface WebKitClientOptions {
4
+ host: string;
5
+ port: number;
6
+ targetIndex?: number;
7
+ connectTimeout?: number;
8
+ sendTimeout?: number;
9
+ heartbeatInterval?: number;
10
+ }
11
+ export interface WebKitTarget {
12
+ id: string;
13
+ title: string;
14
+ url: string;
15
+ webSocketDebuggerUrl: string;
16
+ type?: string;
17
+ }
18
+ export declare class WebKitClient extends EventEmitter implements BrowserBackend {
19
+ private options;
20
+ private ws;
21
+ private messageId;
22
+ private pendingRequests;
23
+ private enabledDomains;
24
+ private connected;
25
+ private heartbeatTimer;
26
+ private lastUrl;
27
+ private reconnecting;
28
+ private activeTargetId;
29
+ private innerMessageId;
30
+ private innerPendingRequests;
31
+ private targetReady;
32
+ private targetReadyResolve;
33
+ constructor(options: WebKitClientOptions);
34
+ connect(options?: {
35
+ retries?: number;
36
+ retryDelay?: number;
37
+ }): Promise<void>;
38
+ disconnect(): Promise<void>;
39
+ isConnected(): boolean;
40
+ listTargets(): Promise<WebKitTarget[]>;
41
+ send<T = unknown>(method: string, params?: Record<string, unknown>): Promise<T>;
42
+ private handleMessage;
43
+ enableDomain(domain: string): Promise<void>;
44
+ private startHeartbeat;
45
+ private stopHeartbeat;
46
+ private handleDisconnect;
47
+ navigate(options: NavigateOptions): Promise<NavigateResult>;
48
+ screenshot(options?: ScreenshotOptions): Promise<Buffer>;
49
+ evaluate<T = unknown>(expression: string): Promise<T>;
50
+ readPage(): Promise<string>;
51
+ getCookies(domain?: string): Promise<Cookie[]>;
52
+ setCookies(cookies: Cookie[]): Promise<void>;
53
+ clearCookies(): Promise<void>;
54
+ click(target: string | {
55
+ x: number;
56
+ y: number;
57
+ }): Promise<void>;
58
+ type(selector: string, text: string, options?: {
59
+ delay?: number;
60
+ }): Promise<void>;
61
+ scroll(direction: 'up' | 'down' | 'left' | 'right', amount: number): Promise<void>;
62
+ longPress(selector: string, duration?: number): Promise<void>;
63
+ swipe(direction: 'up' | 'down' | 'left' | 'right', speed?: number): Promise<void>;
64
+ press(key: string): Promise<void>;
65
+ dismissKeyboard(): Promise<void>;
66
+ selectOption(selector: string, value: string): Promise<void>;
67
+ querySelector(selector: string): Promise<ElementInfo | null>;
68
+ querySelectorAll(selector: string): Promise<ElementInfo[]>;
69
+ inspect(selector: string): Promise<Record<string, unknown>>;
70
+ waitFor(selector: string, options?: {
71
+ visible?: boolean;
72
+ timeout?: number;
73
+ }): Promise<void>;
74
+ onConsole(handler: (msg: {
75
+ type: string;
76
+ text: string;
77
+ }) => void): void;
78
+ onPageLoad(handler: () => void): void;
79
+ onRequest(handler: (request: {
80
+ url: string;
81
+ method: string;
82
+ }) => void): void;
83
+ onResponse(handler: (response: {
84
+ url: string;
85
+ status: number;
86
+ }) => void): void;
87
+ private getElementCenter;
88
+ private getViewportSize;
89
+ private connectToTarget;
90
+ private clearPendingRequests;
91
+ private httpGet;
92
+ }
93
+ export declare class ConnectionError extends Error {
94
+ constructor(message: string);
95
+ }
96
+ export declare class TimeoutError extends Error {
97
+ constructor(message: string);
98
+ }
99
+ export declare class ProtocolError extends Error {
100
+ readonly code?: number | undefined;
101
+ constructor(message: string, code?: number | undefined);
102
+ }
103
+ export declare class EvaluationError extends Error {
104
+ constructor(message: string);
105
+ }
106
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/webkit/client.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EACL,cAAc,EACd,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,WAAW,EACX,MAAM,EACP,MAAM,0BAA0B,CAAC;AAUlC,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,oBAAoB,EAAE,MAAM,CAAC;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,YAAa,SAAQ,YAAa,YAAW,cAAc;IA+B1D,OAAO,CAAC,OAAO;IA9B3B,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,eAAe,CAOT;IACd,OAAO,CAAC,cAAc,CAA0B;IAChD,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,cAAc,CAA+C;IACrE,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,YAAY,CAAS;IAG7B,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,oBAAoB,CAOd;IACd,OAAO,CAAC,WAAW,CAA8B;IACjD,OAAO,CAAC,kBAAkB,CAA6B;gBAEnC,OAAO,EAAE,mBAAmB;IAM1C,OAAO,CAAC,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA8B3E,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAiBjC,WAAW,IAAI,OAAO;IAMhB,WAAW,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAQtC,IAAI,CAAC,CAAC,GAAG,OAAO,EACpB,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,CAAC,CAAC;IAsDb,OAAO,CAAC,aAAa;IA8Ff,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASjD,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,aAAa;YASP,gBAAgB;IA+DxB,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;IAmE3D,UAAU,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC;IA8BxD,QAAQ,CAAC,CAAC,GAAG,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAuDrD,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC;IAwB3B,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAsC9C,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA6B5C,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAuB7B,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA6B/D,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAgEjF,MAAM,CAAC,SAAS,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUlF,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB7D,KAAK,CAAC,SAAS,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuCjF,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BjC,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAIhC,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuB5D,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAmC5D,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IA0B1D,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAuC3D,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBjG,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GAAG,IAAI;IAWvE,UAAU,CAAC,OAAO,EAAE,MAAM,IAAI,GAAG,IAAI;IAMrC,SAAS,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GAAG,IAAI;IAW5E,UAAU,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GAAG,IAAI;YAahE,gBAAgB;YAWhB,eAAe;YAIf,eAAe;IAiE7B,OAAO,CAAC,oBAAoB;IAc5B,OAAO,CAAC,OAAO;CAWhB;AAID,qBAAa,eAAgB,SAAQ,KAAK;gBAC5B,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,YAAa,SAAQ,KAAK;gBACzB,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,aAAc,SAAQ,KAAK;aAGpB,IAAI,CAAC,EAAE,MAAM;gBAD7B,OAAO,EAAE,MAAM,EACC,IAAI,CAAC,EAAE,MAAM,YAAA;CAKhC;AAED,qBAAa,eAAgB,SAAQ,KAAK;gBAC5B,OAAO,EAAE,MAAM;CAI5B"}
@@ -0,0 +1,3 @@
1
+ export { WebKitClient, ConnectionError, TimeoutError, ProtocolError, EvaluationError, } from './client';
2
+ export type { WebKitClientOptions, WebKitTarget } from './client';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/webkit/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,aAAa,EACb,eAAe,GAChB,MAAM,UAAU,CAAC;AAClB,YAAY,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC"}
package/package.json ADDED
@@ -0,0 +1,84 @@
1
+ {
2
+ "name": "opensafari-mcp",
3
+ "version": "0.1.1",
4
+ "description": "iOS Safari automation MCP server via Xcode Simulator + WebKit Remote Debugging Protocol",
5
+ "main": "dist/index.js",
6
+ "bin": {
7
+ "opensafari": "./dist/cli/index.js"
8
+ },
9
+ "engines": {
10
+ "node": ">=18.0.0"
11
+ },
12
+ "os": [
13
+ "darwin"
14
+ ],
15
+ "scripts": {
16
+ "build": "npm run clean && npm run build:src && npm run build:cli",
17
+ "build:src": "webpack --config webpack.config.js --config-name server",
18
+ "build:cli": "webpack --config webpack.config.js --config-name cli",
19
+ "clean": "rimraf dist",
20
+ "dev": "ts-node --esm src/index.ts",
21
+ "start": "node dist/index.js",
22
+ "test": "jest --config jest.config.js",
23
+ "test:unit": "jest --config jest.config.js",
24
+ "test:integration": "jest --preset ts-jest --testEnvironment node --roots tests/integration --testPathIgnorePatterns '/node_modules/' --testPathIgnorePatterns 'webkit-connection' --testTimeout=120000 --runInBand",
25
+ "test:ci": "jest --config jest.ci.config.js",
26
+ "test:coverage": "jest --coverage",
27
+ "lint": "eslint 'src/**/*.ts' 'cli/**/*.ts' 'tests/**/*.ts'",
28
+ "lint:fix": "eslint --fix 'src/**/*.ts' 'cli/**/*.ts' 'tests/**/*.ts'",
29
+ "prepare": "npm run build",
30
+ "prepublishOnly": "npm run build && npm test"
31
+ },
32
+ "repository": {
33
+ "type": "git",
34
+ "url": "git+https://github.com/shaun0927/opensafari.git"
35
+ },
36
+ "homepage": "https://github.com/shaun0927/opensafari#readme",
37
+ "bugs": {
38
+ "url": "https://github.com/shaun0927/opensafari/issues"
39
+ },
40
+ "types": "dist/index.d.ts",
41
+ "files": [
42
+ "dist/",
43
+ "!dist/src/",
44
+ "!dist/node_modules/",
45
+ "README.md",
46
+ "LICENSE"
47
+ ],
48
+ "license": "MIT",
49
+ "keywords": [
50
+ "safari",
51
+ "ios",
52
+ "simulator",
53
+ "mcp",
54
+ "webkit",
55
+ "automation",
56
+ "testing",
57
+ "xcode",
58
+ "mobile",
59
+ "qa"
60
+ ],
61
+ "dependencies": {
62
+ "commander": "^12.0.0",
63
+ "ws": "^8.16.0"
64
+ },
65
+ "devDependencies": {
66
+ "@types/jest": "^30.0.0",
67
+ "@types/node": "^20.11.0",
68
+ "@types/ws": "^8.5.10",
69
+ "@typescript-eslint/eslint-plugin": "^8.57.2",
70
+ "@typescript-eslint/parser": "^8.57.2",
71
+ "eslint": "^10.1.0",
72
+ "eslint-config-prettier": "^10.1.8",
73
+ "jest": "^30.3.0",
74
+ "prettier": "^3.8.1",
75
+ "rimraf": "^5.0.0",
76
+ "ts-jest": "^29.4.6",
77
+ "ts-loader": "^9.5.4",
78
+ "ts-node": "^10.9.0",
79
+ "typescript": "^5.3.0",
80
+ "webpack": "^5.105.4",
81
+ "webpack-cli": "^7.0.2",
82
+ "webpack-node-externals": "^3.0.0"
83
+ }
84
+ }