patchright-core 1.58.2 → 1.59.0

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 (285) hide show
  1. package/ThirdPartyNotices.txt +126 -650
  2. package/browsers.json +16 -14
  3. package/lib/bootstrap.js +77 -0
  4. package/lib/cli/browserActions.js +308 -0
  5. package/lib/cli/driver.js +3 -2
  6. package/lib/cli/installActions.js +171 -0
  7. package/lib/cli/program.js +47 -411
  8. package/lib/client/android.js +4 -4
  9. package/lib/client/api.js +3 -3
  10. package/lib/client/browser.js +8 -0
  11. package/lib/client/browserContext.js +22 -61
  12. package/lib/client/browserType.js +19 -51
  13. package/lib/client/cdpSession.js +6 -2
  14. package/lib/client/channelOwner.js +1 -1
  15. package/lib/client/clientHelper.js +2 -1
  16. package/lib/client/clock.js +0 -1
  17. package/lib/client/{webSocket.js → connect.js} +57 -7
  18. package/lib/client/connection.js +8 -4
  19. package/lib/client/consoleMessage.js +3 -0
  20. package/lib/client/debugger.js +57 -0
  21. package/lib/client/dialog.js +8 -1
  22. package/lib/client/disposable.js +76 -0
  23. package/lib/client/electron.js +1 -0
  24. package/lib/client/elementHandle.js +1 -4
  25. package/lib/client/events.js +3 -3
  26. package/lib/client/fetch.js +0 -1
  27. package/lib/client/frame.js +10 -23
  28. package/lib/client/harRouter.js +13 -1
  29. package/lib/client/jsHandle.js +4 -8
  30. package/lib/client/locator.js +13 -44
  31. package/lib/client/network.js +15 -16
  32. package/lib/client/page.js +41 -75
  33. package/lib/client/platform.js +0 -3
  34. package/lib/client/screencast.js +88 -0
  35. package/lib/client/selectors.js +3 -1
  36. package/lib/client/tracing.js +11 -5
  37. package/lib/client/video.js +13 -20
  38. package/lib/client/worker.js +6 -6
  39. package/lib/generated/bindingsControllerSource.js +1 -1
  40. package/lib/generated/clockSource.js +1 -1
  41. package/lib/generated/injectedScriptSource.js +1 -1
  42. package/lib/generated/pollingRecorderSource.js +1 -1
  43. package/lib/generated/storageScriptSource.js +1 -1
  44. package/lib/generated/utilityScriptSource.js +1 -1
  45. package/lib/mcpBundle.js +0 -6
  46. package/lib/mcpBundleImpl.js +91 -0
  47. package/lib/protocol/validator.js +224 -138
  48. package/lib/protocol/validatorPrimitives.js +1 -1
  49. package/lib/remote/playwrightConnection.js +10 -8
  50. package/lib/remote/playwrightPipeServer.js +100 -0
  51. package/lib/remote/playwrightServer.js +13 -8
  52. package/lib/remote/playwrightWebSocketServer.js +73 -0
  53. package/lib/remote/serverTransport.js +96 -0
  54. package/lib/server/android/android.js +2 -2
  55. package/lib/server/bidi/bidiBrowser.js +30 -8
  56. package/lib/server/bidi/bidiChromium.js +18 -5
  57. package/lib/server/bidi/bidiNetworkManager.js +39 -11
  58. package/lib/server/bidi/bidiPage.js +31 -15
  59. package/lib/server/bidi/third_party/firefoxPrefs.js +3 -1
  60. package/lib/server/browser.js +84 -21
  61. package/lib/server/browserContext.js +110 -58
  62. package/lib/server/browserType.js +14 -12
  63. package/lib/server/chromium/chromium.js +15 -12
  64. package/lib/server/chromium/chromiumSwitches.js +14 -2
  65. package/lib/server/chromium/crBrowser.js +20 -17
  66. package/lib/server/chromium/crCoverage.js +1 -13
  67. package/lib/server/chromium/crDevTools.js +1 -0
  68. package/lib/server/chromium/crNetworkManager.js +12 -267
  69. package/lib/server/chromium/crPage.js +67 -199
  70. package/lib/server/chromium/crServiceWorker.js +7 -14
  71. package/lib/server/clock.js +33 -41
  72. package/lib/server/console.js +5 -1
  73. package/lib/server/debugController.js +12 -6
  74. package/lib/server/debugger.js +40 -47
  75. package/lib/server/deviceDescriptorsSource.json +137 -137
  76. package/lib/server/dispatchers/browserContextDispatcher.js +29 -30
  77. package/lib/server/dispatchers/browserDispatcher.js +11 -5
  78. package/lib/server/dispatchers/browserTypeDispatcher.js +7 -0
  79. package/lib/server/dispatchers/cdpSessionDispatcher.js +4 -1
  80. package/lib/server/dispatchers/debuggerDispatcher.js +84 -0
  81. package/lib/server/dispatchers/dispatcher.js +1 -1
  82. package/lib/server/dispatchers/disposableDispatcher.js +39 -0
  83. package/lib/server/dispatchers/electronDispatcher.js +2 -1
  84. package/lib/server/dispatchers/frameDispatcher.js +6 -6
  85. package/lib/server/dispatchers/jsHandleDispatcher.js +2 -2
  86. package/lib/server/dispatchers/localUtilsDispatcher.js +37 -1
  87. package/lib/server/dispatchers/networkDispatchers.js +6 -5
  88. package/lib/server/dispatchers/pageDispatcher.js +101 -38
  89. package/lib/server/dispatchers/webSocketRouteDispatcher.js +4 -5
  90. package/lib/server/disposable.js +41 -0
  91. package/lib/server/dom.js +44 -26
  92. package/lib/server/download.js +3 -2
  93. package/lib/server/electron/electron.js +12 -7
  94. package/lib/server/firefox/ffBrowser.js +9 -19
  95. package/lib/server/firefox/ffInput.js +21 -5
  96. package/lib/server/firefox/ffNetworkManager.js +2 -2
  97. package/lib/server/firefox/ffPage.js +24 -27
  98. package/lib/server/frameSelectors.js +5 -172
  99. package/lib/server/frames.js +234 -687
  100. package/lib/server/har/harRecorder.js +2 -2
  101. package/lib/server/har/harTracer.js +5 -4
  102. package/lib/server/input.js +49 -4
  103. package/lib/server/instrumentation.js +5 -0
  104. package/lib/server/javascript.js +6 -26
  105. package/lib/server/launchApp.js +1 -3
  106. package/lib/server/localUtils.js +6 -6
  107. package/lib/server/network.js +9 -8
  108. package/lib/server/overlay.js +138 -0
  109. package/lib/server/page.js +157 -105
  110. package/lib/server/progress.js +6 -0
  111. package/lib/server/recorder/recorderApp.js +9 -8
  112. package/lib/server/recorder.js +76 -40
  113. package/lib/server/registry/index.js +55 -82
  114. package/lib/server/registry/nativeDeps.js +1 -0
  115. package/lib/server/screencast.js +90 -143
  116. package/lib/server/screenshotter.js +0 -6
  117. package/lib/server/trace/recorder/snapshotter.js +8 -17
  118. package/lib/server/trace/recorder/snapshotterInjected.js +82 -20
  119. package/lib/server/trace/recorder/tracing.js +87 -44
  120. package/lib/server/trace/viewer/traceViewer.js +3 -4
  121. package/lib/server/usKeyboardLayout.js +7 -0
  122. package/lib/server/utils/comparators.js +1 -1
  123. package/lib/server/utils/disposable.js +32 -0
  124. package/lib/server/utils/eventsHelper.js +3 -1
  125. package/lib/server/utils/fileUtils.js +16 -2
  126. package/lib/server/utils/happyEyeballs.js +15 -12
  127. package/lib/server/utils/hostPlatform.js +0 -15
  128. package/lib/server/utils/httpServer.js +5 -3
  129. package/lib/server/utils/network.js +2 -1
  130. package/lib/server/utils/nodePlatform.js +0 -6
  131. package/lib/server/utils/processLauncher.js +8 -6
  132. package/lib/server/utils/zipFile.js +2 -2
  133. package/lib/server/videoRecorder.js +82 -12
  134. package/lib/server/webkit/wkBrowser.js +1 -6
  135. package/lib/server/webkit/wkPage.js +27 -25
  136. package/lib/server/webkit/wkWorkers.js +2 -1
  137. package/lib/serverRegistry.js +156 -0
  138. package/lib/tools/backend/browserBackend.js +79 -0
  139. package/lib/tools/backend/common.js +63 -0
  140. package/lib/tools/backend/config.js +41 -0
  141. package/lib/tools/backend/console.js +66 -0
  142. package/lib/tools/backend/context.js +296 -0
  143. package/lib/tools/backend/cookies.js +152 -0
  144. package/lib/tools/backend/devtools.js +69 -0
  145. package/lib/tools/backend/dialogs.js +59 -0
  146. package/lib/tools/backend/evaluate.js +64 -0
  147. package/lib/tools/backend/files.js +60 -0
  148. package/lib/tools/backend/form.js +64 -0
  149. package/lib/tools/backend/keyboard.js +155 -0
  150. package/lib/tools/backend/logFile.js +95 -0
  151. package/lib/tools/backend/mouse.js +168 -0
  152. package/lib/tools/backend/navigate.js +106 -0
  153. package/lib/tools/backend/network.js +135 -0
  154. package/lib/tools/backend/pdf.js +48 -0
  155. package/lib/tools/backend/response.js +305 -0
  156. package/lib/tools/backend/route.js +140 -0
  157. package/lib/tools/backend/runCode.js +77 -0
  158. package/lib/tools/backend/screenshot.js +88 -0
  159. package/lib/tools/backend/sessionLog.js +74 -0
  160. package/lib/tools/backend/snapshot.js +208 -0
  161. package/lib/tools/backend/storage.js +68 -0
  162. package/lib/tools/backend/tab.js +445 -0
  163. package/lib/tools/backend/tabs.js +67 -0
  164. package/lib/tools/backend/tool.js +47 -0
  165. package/lib/tools/backend/tools.js +102 -0
  166. package/lib/tools/backend/tracing.js +78 -0
  167. package/lib/tools/backend/utils.js +83 -0
  168. package/lib/tools/backend/verify.js +151 -0
  169. package/lib/tools/backend/video.js +98 -0
  170. package/lib/tools/backend/wait.js +63 -0
  171. package/lib/tools/backend/webstorage.js +223 -0
  172. package/lib/tools/cli-client/cli.js +6 -0
  173. package/lib/tools/cli-client/help.json +399 -0
  174. package/lib/tools/cli-client/minimist.js +128 -0
  175. package/lib/tools/cli-client/program.js +350 -0
  176. package/lib/tools/cli-client/registry.js +176 -0
  177. package/lib/tools/cli-client/session.js +289 -0
  178. package/lib/tools/cli-client/skill/SKILL.md +328 -0
  179. package/lib/tools/cli-client/skill/references/element-attributes.md +23 -0
  180. package/lib/tools/cli-client/skill/references/playwright-tests.md +39 -0
  181. package/lib/tools/cli-client/skill/references/request-mocking.md +87 -0
  182. package/lib/tools/cli-client/skill/references/running-code.md +231 -0
  183. package/lib/tools/cli-client/skill/references/session-management.md +169 -0
  184. package/lib/tools/cli-client/skill/references/storage-state.md +275 -0
  185. package/lib/tools/cli-client/skill/references/test-generation.md +88 -0
  186. package/lib/tools/cli-client/skill/references/tracing.md +139 -0
  187. package/lib/tools/cli-client/skill/references/video-recording.md +143 -0
  188. package/lib/tools/cli-daemon/command.js +73 -0
  189. package/lib/tools/cli-daemon/commands.js +956 -0
  190. package/lib/tools/cli-daemon/daemon.js +157 -0
  191. package/lib/tools/cli-daemon/helpGenerator.js +177 -0
  192. package/lib/tools/cli-daemon/program.js +129 -0
  193. package/lib/tools/dashboard/appIcon.png +0 -0
  194. package/lib/tools/dashboard/dashboardApp.js +284 -0
  195. package/lib/tools/dashboard/dashboardController.js +296 -0
  196. package/lib/tools/exports.js +60 -0
  197. package/lib/tools/mcp/browserFactory.js +233 -0
  198. package/lib/tools/mcp/cdpRelay.js +352 -0
  199. package/lib/tools/mcp/cli-stub.js +7 -0
  200. package/lib/tools/mcp/config.d.js +16 -0
  201. package/lib/tools/mcp/config.js +446 -0
  202. package/lib/tools/mcp/configIni.js +189 -0
  203. package/lib/tools/mcp/extensionContextFactory.js +55 -0
  204. package/lib/tools/mcp/index.js +62 -0
  205. package/lib/tools/mcp/log.js +35 -0
  206. package/lib/tools/mcp/program.js +107 -0
  207. package/lib/tools/mcp/protocol.js +28 -0
  208. package/lib/tools/mcp/watchdog.js +44 -0
  209. package/lib/tools/trace/SKILL.md +171 -0
  210. package/lib/{server/trace/viewer/traceParser.js → tools/trace/installSkill.js} +15 -39
  211. package/lib/tools/trace/traceActions.js +142 -0
  212. package/lib/tools/trace/traceAttachments.js +69 -0
  213. package/lib/tools/trace/traceCli.js +87 -0
  214. package/lib/tools/trace/traceConsole.js +97 -0
  215. package/lib/tools/trace/traceErrors.js +55 -0
  216. package/lib/tools/trace/traceOpen.js +69 -0
  217. package/lib/tools/trace/traceParser.js +96 -0
  218. package/lib/tools/trace/traceRequests.js +182 -0
  219. package/lib/tools/trace/traceScreenshot.js +68 -0
  220. package/lib/tools/trace/traceSnapshot.js +149 -0
  221. package/lib/tools/trace/traceUtils.js +153 -0
  222. package/lib/tools/utils/connect.js +32 -0
  223. package/lib/tools/utils/mcp/http.js +152 -0
  224. package/lib/tools/utils/mcp/server.js +230 -0
  225. package/lib/tools/utils/mcp/tool.js +47 -0
  226. package/lib/tools/utils/socketConnection.js +108 -0
  227. package/lib/utils/isomorphic/formatUtils.js +64 -0
  228. package/lib/utils/isomorphic/jsonSchema.js +89 -0
  229. package/lib/utils/isomorphic/mimeType.js +7 -2
  230. package/lib/utils/isomorphic/protocolFormatter.js +2 -2
  231. package/lib/utils/isomorphic/protocolMetainfo.js +127 -106
  232. package/lib/utils/isomorphic/stringUtils.js +3 -3
  233. package/lib/utils/isomorphic/timeoutRunner.js +3 -3
  234. package/lib/utils/isomorphic/trace/snapshotRenderer.js +35 -42
  235. package/lib/utils/isomorphic/trace/traceLoader.js +15 -14
  236. package/lib/utils/isomorphic/trace/traceModel.js +3 -2
  237. package/lib/utils/isomorphic/trace/traceModernizer.js +1 -0
  238. package/lib/utils/isomorphic/urlMatch.js +54 -1
  239. package/lib/utils/isomorphic/utilityScriptSerializers.js +11 -0
  240. package/lib/utils.js +6 -2
  241. package/lib/utilsBundle.js +3 -21
  242. package/lib/utilsBundleImpl/index.js +132 -133
  243. package/lib/vite/dashboard/assets/index-BAOybkp8.js +50 -0
  244. package/lib/vite/dashboard/assets/index-CZAYOG76.css +1 -0
  245. package/lib/vite/dashboard/index.html +28 -0
  246. package/lib/vite/htmlReport/index.html +2 -70
  247. package/lib/vite/htmlReport/report.css +1 -0
  248. package/lib/vite/htmlReport/report.js +72 -0
  249. package/lib/vite/recorder/assets/{codeMirrorModule-CFUTFUO7.js → codeMirrorModule-C8KMvO9L.js} +20 -20
  250. package/lib/vite/recorder/assets/index-CqAYX1I3.js +193 -0
  251. package/lib/vite/recorder/index.html +1 -1
  252. package/lib/vite/traceViewer/assets/{codeMirrorModule-BVA4h_ZY.js → codeMirrorModule-DS0FLvoc.js} +20 -20
  253. package/lib/vite/traceViewer/assets/defaultSettingsView-GTWI-W_B.js +262 -0
  254. package/lib/vite/traceViewer/defaultSettingsView.B4dS75f0.css +1 -0
  255. package/lib/vite/traceViewer/{index.BVu7tZDe.css → index.CzXZzn5A.css} +1 -1
  256. package/lib/vite/traceViewer/{index.BtyWtaE-.js → index.Dtstcb7U.js} +1 -1
  257. package/lib/vite/traceViewer/index.html +4 -4
  258. package/lib/vite/traceViewer/sw.bundle.js +4 -4
  259. package/lib/vite/traceViewer/uiMode.Vipi55dB.js +6 -0
  260. package/lib/vite/traceViewer/uiMode.html +3 -3
  261. package/lib/zipBundleImpl.js +2 -2
  262. package/lib/zodBundle.js +39 -0
  263. package/lib/zodBundleImpl.js +40 -0
  264. package/package.json +6 -1
  265. package/types/protocol.d.ts +947 -51
  266. package/types/types.d.ts +854 -74
  267. package/lib/client/pageAgent.js +0 -64
  268. package/lib/mcpBundleImpl/index.js +0 -147
  269. package/lib/server/agent/actionRunner.js +0 -335
  270. package/lib/server/agent/actions.js +0 -128
  271. package/lib/server/agent/codegen.js +0 -111
  272. package/lib/server/agent/context.js +0 -150
  273. package/lib/server/agent/expectTools.js +0 -156
  274. package/lib/server/agent/pageAgent.js +0 -204
  275. package/lib/server/agent/performTools.js +0 -262
  276. package/lib/server/agent/tool.js +0 -109
  277. package/lib/server/dispatchers/pageAgentDispatcher.js +0 -96
  278. package/lib/server/pageBinding.js +0 -87
  279. package/lib/utils/isomorphic/oldUtilityScriptSerializers.js +0 -248
  280. package/lib/vite/recorder/assets/index-CVkBxsGf.js +0 -193
  281. package/lib/vite/traceViewer/assets/defaultSettingsView-CjfmcdOz.js +0 -266
  282. package/lib/vite/traceViewer/defaultSettingsView.7ch9cixO.css +0 -1
  283. package/lib/vite/traceViewer/uiMode.fyrXARf2.js +0 -5
  284. /package/lib/{server/utils → utils/isomorphic}/imageUtils.js +0 -0
  285. /package/lib/utils/isomorphic/{traceUtils.js → trace/traceUtils.js} +0 -0
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var traceScreenshot_exports = {};
20
+ __export(traceScreenshot_exports, {
21
+ traceScreenshot: () => traceScreenshot
22
+ });
23
+ module.exports = __toCommonJS(traceScreenshot_exports);
24
+ var import_traceUtils = require("./traceUtils");
25
+ async function traceScreenshot(actionId, options) {
26
+ const trace = await (0, import_traceUtils.loadTrace)();
27
+ const action = trace.resolveActionId(actionId);
28
+ if (!action) {
29
+ console.error(`Action '${actionId}' not found.`);
30
+ process.exitCode = 1;
31
+ return;
32
+ }
33
+ const pageId = action.pageId;
34
+ if (!pageId) {
35
+ console.error(`Action '${actionId}' has no associated page.`);
36
+ process.exitCode = 1;
37
+ return;
38
+ }
39
+ const callId = action.callId;
40
+ const storage = trace.loader.storage();
41
+ const snapshotNames = ["input", "before", "after"];
42
+ let sha1;
43
+ for (const name of snapshotNames) {
44
+ const renderer = storage.snapshotByName(pageId, `${name}@${callId}`);
45
+ sha1 = renderer?.closestScreenshot();
46
+ if (sha1)
47
+ break;
48
+ }
49
+ if (!sha1) {
50
+ console.error(`No screenshot found for action '${actionId}'.`);
51
+ process.exitCode = 1;
52
+ return;
53
+ }
54
+ const blob = await trace.loader.resourceForSha1(sha1);
55
+ if (!blob) {
56
+ console.error(`Screenshot resource not found.`);
57
+ process.exitCode = 1;
58
+ return;
59
+ }
60
+ const defaultName = `screenshot-${actionId}.png`;
61
+ const buffer = Buffer.from(await blob.arrayBuffer());
62
+ const outFile = await (0, import_traceUtils.saveOutputFile)(defaultName, buffer, options.output);
63
+ console.log(` Screenshot saved to ${outFile}`);
64
+ }
65
+ // Annotate the CommonJS export names for ESM import in node:
66
+ 0 && (module.exports = {
67
+ traceScreenshot
68
+ });
@@ -0,0 +1,149 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var traceSnapshot_exports = {};
30
+ __export(traceSnapshot_exports, {
31
+ traceSnapshot: () => traceSnapshot
32
+ });
33
+ module.exports = __toCommonJS(traceSnapshot_exports);
34
+ var import_browserBackend = require("../backend/browserBackend");
35
+ var import_tools = require("../backend/tools");
36
+ var playwright = __toESM(require("../../.."));
37
+ var import_utils = require("../../utils");
38
+ var import_command = require("../cli-daemon/command");
39
+ var import_minimist = require("../cli-client/minimist");
40
+ var import_commands = require("../cli-daemon/commands");
41
+ var import_traceUtils = require("./traceUtils");
42
+ async function traceSnapshot(actionId, options) {
43
+ const trace = await (0, import_traceUtils.loadTrace)();
44
+ const action = trace.resolveActionId(actionId);
45
+ if (!action) {
46
+ console.error(`Action '${actionId}' not found.`);
47
+ process.exitCode = 1;
48
+ return;
49
+ }
50
+ const pageId = action.pageId;
51
+ if (!pageId) {
52
+ console.error(`Action '${actionId}' has no associated page.`);
53
+ process.exitCode = 1;
54
+ return;
55
+ }
56
+ const callId = action.callId;
57
+ const storage = trace.loader.storage();
58
+ let snapshotName;
59
+ let renderer;
60
+ if (options.name) {
61
+ snapshotName = options.name;
62
+ renderer = storage.snapshotByName(pageId, `${snapshotName}@${callId}`);
63
+ } else {
64
+ for (const candidate of ["input", "before", "after"]) {
65
+ renderer = storage.snapshotByName(pageId, `${candidate}@${callId}`);
66
+ if (renderer) {
67
+ snapshotName = candidate;
68
+ break;
69
+ }
70
+ }
71
+ }
72
+ if (!renderer || !snapshotName) {
73
+ console.error(`No snapshot found for action '${actionId}'.`);
74
+ process.exitCode = 1;
75
+ return;
76
+ }
77
+ const snapshotKey = `${snapshotName}@${callId}`;
78
+ const server = await serveTraceSnapshot(storage, trace.loader, pageId, snapshotKey);
79
+ if (options.serve) {
80
+ console.log(`Serving snapshot at ${server.url}`);
81
+ await new Promise(() => {
82
+ });
83
+ return;
84
+ }
85
+ await runCommandOnSnapshot(server, options.browserArgs || []);
86
+ }
87
+ async function serveTraceSnapshot(storage, loader, pageId, snapshotKey) {
88
+ const { SnapshotServer } = require("../../utils/isomorphic/trace/snapshotServer");
89
+ const { HttpServer } = require("../../server/utils/httpServer");
90
+ const snapshotServer = new SnapshotServer(storage, (sha1) => loader.resourceForSha1(sha1));
91
+ const httpServer = new HttpServer();
92
+ httpServer.routePrefix("/snapshot", (request, response) => {
93
+ const url = new URL("http://localhost" + request.url);
94
+ const searchParams = url.searchParams;
95
+ searchParams.set("name", snapshotKey);
96
+ const snapshotResponse = snapshotServer.serveSnapshot(pageId, searchParams, "/snapshot");
97
+ response.statusCode = snapshotResponse.status;
98
+ snapshotResponse.headers.forEach((value, key) => response.setHeader(key, value));
99
+ snapshotResponse.text().then((text) => response.end(text));
100
+ return true;
101
+ });
102
+ httpServer.routePrefix("/", (_request, response) => {
103
+ response.statusCode = 302;
104
+ response.setHeader("Location", "/snapshot");
105
+ response.end();
106
+ return true;
107
+ });
108
+ await httpServer.start({ preferredPort: 0 });
109
+ return { url: httpServer.urlPrefix("human-readable"), stop: () => httpServer.stop() };
110
+ }
111
+ async function runCommandOnSnapshot(server, browserArgs) {
112
+ const browser = await playwright.chromium.launch({ headless: true });
113
+ const context = await browser.newContext();
114
+ const page = await context.newPage();
115
+ await page.goto(server.url);
116
+ const backend = new import_browserBackend.BrowserBackend({
117
+ snapshot: { mode: "full" },
118
+ outputMode: "file",
119
+ skillMode: true
120
+ }, context, import_tools.browserTools);
121
+ await backend.initialize({ cwd: process.cwd() });
122
+ try {
123
+ if (!browserArgs.length)
124
+ browserArgs = ["snapshot"];
125
+ const args = (0, import_minimist.minimist)(browserArgs, { string: ["_"] });
126
+ const command = import_commands.commands[args._[0]];
127
+ if (!command)
128
+ throw new Error(`Unknown command: ${args._[0]}`);
129
+ const { toolName, toolParams } = (0, import_command.parseCommand)(command, args);
130
+ const result = await backend.callTool(toolName, toolParams);
131
+ const text = result.content[0]?.type === "text" ? result.content[0].text : void 0;
132
+ if (text)
133
+ console.log(text);
134
+ if (result.isError) {
135
+ console.error("Command failed.");
136
+ process.exitCode = 1;
137
+ }
138
+ } catch (e) {
139
+ console.error(e.message);
140
+ process.exitCode = 1;
141
+ } finally {
142
+ await server.stop().catch((e) => console.error(e));
143
+ await (0, import_utils.gracefullyCloseAll)();
144
+ }
145
+ }
146
+ // Annotate the CommonJS export names for ESM import in node:
147
+ 0 && (module.exports = {
148
+ traceSnapshot
149
+ });
@@ -0,0 +1,153 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var traceUtils_exports = {};
30
+ __export(traceUtils_exports, {
31
+ LoadedTrace: () => LoadedTrace,
32
+ actionTitle: () => actionTitle,
33
+ closeTrace: () => closeTrace,
34
+ formatTimestamp: () => formatTimestamp,
35
+ loadTrace: () => loadTrace,
36
+ openTrace: () => openTrace,
37
+ saveOutputFile: () => saveOutputFile
38
+ });
39
+ module.exports = __toCommonJS(traceUtils_exports);
40
+ var import_fs = __toESM(require("fs"));
41
+ var import_path = __toESM(require("path"));
42
+ var import_traceModel = require("../../utils/isomorphic/trace/traceModel");
43
+ var import_traceLoader = require("../../utils/isomorphic/trace/traceLoader");
44
+ var import_protocolFormatter = require("../../utils/isomorphic/protocolFormatter");
45
+ var import_traceParser = require("./traceParser");
46
+ const traceDir = import_path.default.join(".playwright-cli", "trace");
47
+ const cliOutputDir = ".playwright-cli";
48
+ class LoadedTrace {
49
+ constructor(model, loader, ordinals) {
50
+ this.model = model;
51
+ this.loader = loader;
52
+ this.ordinalToCallId = ordinals.ordinalToCallId;
53
+ this.callIdToOrdinal = ordinals.callIdToOrdinal;
54
+ }
55
+ resolveActionId(actionId) {
56
+ const ordinal = parseInt(actionId, 10);
57
+ if (!isNaN(ordinal)) {
58
+ const callId = this.ordinalToCallId.get(ordinal);
59
+ if (callId)
60
+ return this.model.actions.find((a) => a.callId === callId);
61
+ }
62
+ return this.model.actions.find((a) => a.callId === actionId);
63
+ }
64
+ }
65
+ function ensureTraceOpen() {
66
+ if (!import_fs.default.existsSync(traceDir))
67
+ throw new Error(`No trace opened. Run 'npx playwright trace open <file>' first.`);
68
+ return traceDir;
69
+ }
70
+ async function closeTrace() {
71
+ if (import_fs.default.existsSync(traceDir))
72
+ await import_fs.default.promises.rm(traceDir, { recursive: true });
73
+ }
74
+ async function openTrace(traceFile) {
75
+ const filePath = import_path.default.resolve(traceFile);
76
+ if (!import_fs.default.existsSync(filePath))
77
+ throw new Error(`Trace file not found: ${filePath}`);
78
+ await closeTrace();
79
+ await import_fs.default.promises.mkdir(traceDir, { recursive: true });
80
+ if (filePath.endsWith(".zip"))
81
+ await (0, import_traceParser.extractTrace)(filePath, traceDir);
82
+ else
83
+ await import_fs.default.promises.writeFile(import_path.default.join(traceDir, ".link"), filePath, "utf-8");
84
+ }
85
+ async function loadTrace() {
86
+ const dir = ensureTraceOpen();
87
+ const linkFile = import_path.default.join(dir, ".link");
88
+ let traceDir2;
89
+ let traceFile;
90
+ if (import_fs.default.existsSync(linkFile)) {
91
+ const tracePath = await import_fs.default.promises.readFile(linkFile, "utf-8");
92
+ traceDir2 = import_path.default.dirname(tracePath);
93
+ traceFile = import_path.default.basename(tracePath);
94
+ } else {
95
+ traceDir2 = dir;
96
+ }
97
+ const backend = new import_traceParser.DirTraceLoaderBackend(traceDir2);
98
+ const loader = new import_traceLoader.TraceLoader();
99
+ await loader.load(backend, traceFile);
100
+ const model = new import_traceModel.TraceModel(traceDir2, loader.contextEntries);
101
+ return new LoadedTrace(model, loader, buildOrdinalMap(model));
102
+ }
103
+ function formatTimestamp(ms, base) {
104
+ const relative = ms - base;
105
+ if (relative < 0)
106
+ return "0:00.000";
107
+ const totalMs = Math.floor(relative);
108
+ const minutes = Math.floor(totalMs / 6e4);
109
+ const seconds = Math.floor(totalMs % 6e4 / 1e3);
110
+ const millis = totalMs % 1e3;
111
+ return `${minutes}:${seconds.toString().padStart(2, "0")}.${millis.toString().padStart(3, "0")}`;
112
+ }
113
+ function actionTitle(action) {
114
+ return (0, import_protocolFormatter.renderTitleForCall)({ ...action, type: action.class }) || `${action.class}.${action.method}`;
115
+ }
116
+ async function saveOutputFile(fileName, content, explicitOutput) {
117
+ let outFile;
118
+ if (explicitOutput) {
119
+ outFile = explicitOutput;
120
+ } else {
121
+ await import_fs.default.promises.mkdir(cliOutputDir, { recursive: true });
122
+ outFile = import_path.default.join(cliOutputDir, fileName);
123
+ }
124
+ await import_fs.default.promises.writeFile(outFile, content);
125
+ return outFile;
126
+ }
127
+ function buildOrdinalMap(model) {
128
+ const actions = model.actions.filter((a) => a.group !== "configuration");
129
+ const { rootItem } = (0, import_traceModel.buildActionTree)(actions);
130
+ const ordinalToCallId = /* @__PURE__ */ new Map();
131
+ const callIdToOrdinal = /* @__PURE__ */ new Map();
132
+ let ordinal = 1;
133
+ const visit = (item) => {
134
+ ordinalToCallId.set(ordinal, item.action.callId);
135
+ callIdToOrdinal.set(item.action.callId, ordinal);
136
+ ordinal++;
137
+ for (const child of item.children)
138
+ visit(child);
139
+ };
140
+ for (const child of rootItem.children)
141
+ visit(child);
142
+ return { ordinalToCallId, callIdToOrdinal };
143
+ }
144
+ // Annotate the CommonJS export names for ESM import in node:
145
+ 0 && (module.exports = {
146
+ LoadedTrace,
147
+ actionTitle,
148
+ closeTrace,
149
+ formatTimestamp,
150
+ loadTrace,
151
+ openTrace,
152
+ saveOutputFile
153
+ });
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var connect_exports = {};
20
+ __export(connect_exports, {
21
+ connectToBrowserAcrossVersions: () => connectToBrowserAcrossVersions
22
+ });
23
+ module.exports = __toCommonJS(connect_exports);
24
+ async function connectToBrowserAcrossVersions(descriptor) {
25
+ const pw = require(descriptor.playwrightLib);
26
+ const browserType = pw[descriptor.browser.browserName];
27
+ return await browserType.connect(descriptor.endpoint ?? descriptor.pipeName);
28
+ }
29
+ // Annotate the CommonJS export names for ESM import in node:
30
+ 0 && (module.exports = {
31
+ connectToBrowserAcrossVersions
32
+ });
@@ -0,0 +1,152 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var http_exports = {};
30
+ __export(http_exports, {
31
+ addressToString: () => addressToString,
32
+ startMcpHttpServer: () => startMcpHttpServer
33
+ });
34
+ module.exports = __toCommonJS(http_exports);
35
+ var import_assert = __toESM(require("assert"));
36
+ var import_crypto = __toESM(require("crypto"));
37
+ var import_utilsBundle = require("../../../utilsBundle");
38
+ var mcpBundle = __toESM(require("../../../mcpBundle"));
39
+ var import_network = require("../../../server/utils/network");
40
+ var mcpServer = __toESM(require("./server"));
41
+ const testDebug = (0, import_utilsBundle.debug)("pw:mcp:test");
42
+ async function startMcpHttpServer(config, serverBackendFactory, allowedHosts) {
43
+ const httpServer = (0, import_network.createHttpServer)();
44
+ await (0, import_network.startHttpServer)(httpServer, config);
45
+ return await installHttpTransport(httpServer, serverBackendFactory, allowedHosts);
46
+ }
47
+ function addressToString(address, options) {
48
+ (0, import_assert.default)(address, "Could not bind server socket");
49
+ if (typeof address === "string")
50
+ throw new Error("Unexpected address type: " + address);
51
+ let host = address.family === "IPv4" ? address.address : `[${address.address}]`;
52
+ if (options.normalizeLoopback && (host === "0.0.0.0" || host === "[::]" || host === "[::1]" || host === "127.0.0.1"))
53
+ host = "localhost";
54
+ return `${options.protocol}://${host}:${address.port}`;
55
+ }
56
+ async function installHttpTransport(httpServer, serverBackendFactory, allowedHosts) {
57
+ const url = addressToString(httpServer.address(), { protocol: "http", normalizeLoopback: true });
58
+ const host = new URL(url).host;
59
+ allowedHosts = (allowedHosts || [host]).map((h) => h.toLowerCase());
60
+ const allowAnyHost = allowedHosts.includes("*");
61
+ const sseSessions = /* @__PURE__ */ new Map();
62
+ const streamableSessions = /* @__PURE__ */ new Map();
63
+ httpServer.on("request", async (req, res) => {
64
+ if (!allowAnyHost) {
65
+ const host2 = req.headers.host?.toLowerCase();
66
+ if (!host2) {
67
+ res.statusCode = 400;
68
+ return res.end("Missing host");
69
+ }
70
+ if (!allowedHosts.includes(host2)) {
71
+ res.statusCode = 403;
72
+ return res.end("Access is only allowed at " + allowedHosts.join(", "));
73
+ }
74
+ }
75
+ const url2 = new URL(`http://localhost${req.url}`);
76
+ if (url2.pathname === "/killkillkill" && req.method === "GET") {
77
+ res.statusCode = 200;
78
+ res.end("Killing process");
79
+ process.emit("SIGINT");
80
+ return;
81
+ }
82
+ if (url2.pathname.startsWith("/sse"))
83
+ await handleSSE(serverBackendFactory, req, res, url2, sseSessions);
84
+ else
85
+ await handleStreamable(serverBackendFactory, req, res, streamableSessions);
86
+ });
87
+ return url;
88
+ }
89
+ async function handleSSE(serverBackendFactory, req, res, url, sessions) {
90
+ if (req.method === "POST") {
91
+ const sessionId = url.searchParams.get("sessionId");
92
+ if (!sessionId) {
93
+ res.statusCode = 400;
94
+ return res.end("Missing sessionId");
95
+ }
96
+ const transport = sessions.get(sessionId);
97
+ if (!transport) {
98
+ res.statusCode = 404;
99
+ return res.end("Session not found");
100
+ }
101
+ return await transport.handlePostMessage(req, res);
102
+ } else if (req.method === "GET") {
103
+ const transport = new mcpBundle.SSEServerTransport("/sse", res);
104
+ sessions.set(transport.sessionId, transport);
105
+ testDebug(`create SSE session`);
106
+ await mcpServer.connect(serverBackendFactory, transport, false);
107
+ res.on("close", () => {
108
+ testDebug(`delete SSE session`);
109
+ sessions.delete(transport.sessionId);
110
+ });
111
+ return;
112
+ }
113
+ res.statusCode = 405;
114
+ res.end("Method not allowed");
115
+ }
116
+ async function handleStreamable(serverBackendFactory, req, res, sessions) {
117
+ const sessionId = req.headers["mcp-session-id"];
118
+ if (sessionId) {
119
+ const transport = sessions.get(sessionId);
120
+ if (!transport) {
121
+ res.statusCode = 404;
122
+ res.end("Session not found");
123
+ return;
124
+ }
125
+ return await transport.handleRequest(req, res);
126
+ }
127
+ if (req.method === "POST") {
128
+ const transport = new mcpBundle.StreamableHTTPServerTransport({
129
+ sessionIdGenerator: () => import_crypto.default.randomUUID(),
130
+ onsessioninitialized: async (sessionId2) => {
131
+ testDebug(`create http session`);
132
+ await mcpServer.connect(serverBackendFactory, transport, true);
133
+ sessions.set(sessionId2, transport);
134
+ }
135
+ });
136
+ transport.onclose = () => {
137
+ if (!transport.sessionId)
138
+ return;
139
+ sessions.delete(transport.sessionId);
140
+ testDebug(`delete http session`);
141
+ };
142
+ await transport.handleRequest(req, res);
143
+ return;
144
+ }
145
+ res.statusCode = 400;
146
+ res.end("Invalid request");
147
+ }
148
+ // Annotate the CommonJS export names for ESM import in node:
149
+ 0 && (module.exports = {
150
+ addressToString,
151
+ startMcpHttpServer
152
+ });