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
@@ -1,7 +1,9 @@
1
1
  "use strict";
2
+ var __create = Object.create;
2
3
  var __defProp = Object.defineProperty;
3
4
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
5
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
5
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
6
8
  var __export = (target, all) => {
7
9
  for (var name in all)
@@ -15,17 +17,75 @@ var __copyProps = (to, from, except, desc) => {
15
17
  }
16
18
  return to;
17
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
+ ));
18
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
29
  var videoRecorder_exports = {};
20
30
  __export(videoRecorder_exports, {
21
- VideoRecorder: () => VideoRecorder
31
+ VideoRecorder: () => VideoRecorder,
32
+ startAutomaticVideoRecording: () => startAutomaticVideoRecording
22
33
  });
23
34
  module.exports = __toCommonJS(videoRecorder_exports);
35
+ var import_path = __toESM(require("path"));
24
36
  var import_utils = require("../utils");
25
37
  var import_processLauncher = require("./utils/processLauncher");
38
+ var import_utilsBundle = require("../utilsBundle");
39
+ var import_artifact = require("./artifact");
40
+ var import__ = require(".");
26
41
  const fps = 25;
27
42
  class VideoRecorder {
28
- constructor(ffmpegPath, options) {
43
+ constructor(screencast) {
44
+ this._screencast = screencast;
45
+ }
46
+ start(options) {
47
+ (0, import_utils.assert)(!this._artifact);
48
+ const ffmpegPath = import__.registry.findExecutable("ffmpeg").executablePathOrDie(this._screencast.page.browserContext._browser.sdkLanguage());
49
+ const outputFile = options.fileName ?? import_path.default.join(this._screencast.page.browserContext._browser.options.artifactsDir, (0, import_utils.createGuid)() + ".webm");
50
+ this._client = {
51
+ onFrame: (frame) => this._videoRecorder.writeFrame(frame.buffer, frame.frameSwapWallTime / 1e3),
52
+ gracefulClose: () => this.stop(),
53
+ dispose: () => this.stop().catch((e) => import_utils.debugLogger.log("error", `Failed to stop video recorder: ${String(e)}`)),
54
+ size: options.size
55
+ };
56
+ const { size } = this._screencast.addClient(this._client);
57
+ const videoSize = options.size ?? size;
58
+ this._videoRecorder = new FfmpegVideoRecorder(ffmpegPath, videoSize, outputFile);
59
+ this._artifact = new import_artifact.Artifact(this._screencast.page.browserContext, outputFile);
60
+ return this._artifact;
61
+ }
62
+ async stop() {
63
+ if (!this._artifact)
64
+ return;
65
+ const artifact = this._artifact;
66
+ this._artifact = void 0;
67
+ const client = this._client;
68
+ this._client = void 0;
69
+ const videoRecorder = this._videoRecorder;
70
+ this._videoRecorder = void 0;
71
+ this._screencast.removeClient(client);
72
+ await videoRecorder.stop();
73
+ await artifact.reportFinished();
74
+ }
75
+ }
76
+ function startAutomaticVideoRecording(page) {
77
+ const recordVideo = page.browserContext._options.recordVideo;
78
+ if (!recordVideo)
79
+ return;
80
+ const recorder = new VideoRecorder(page.screencast);
81
+ if (page.browserContext._options.recordVideo?.showActions)
82
+ page.screencast.showActions(page.browserContext._options.recordVideo?.showActions);
83
+ const dir = recordVideo.dir ?? page.browserContext._browser.options.artifactsDir;
84
+ const artifact = recorder.start({ size: recordVideo.size, fileName: import_path.default.join(dir, page.guid + ".webm") });
85
+ page.video = artifact;
86
+ }
87
+ class FfmpegVideoRecorder {
88
+ constructor(ffmpegPath, size, outputFile) {
29
89
  this._process = null;
30
90
  this._gracefullyClose = null;
31
91
  this._lastWritePromise = Promise.resolve();
@@ -34,17 +94,19 @@ class VideoRecorder {
34
94
  this._lastWriteNodeTime = 0;
35
95
  this._frameQueue = [];
36
96
  this._isStopped = false;
37
- this._ffmpegPath = ffmpegPath;
38
- if (!options.outputFile.endsWith(".webm"))
97
+ if (!outputFile.endsWith(".webm"))
39
98
  throw new Error("File must have .webm extension");
40
- this._launchPromise = this._launch(options).catch((e) => e);
99
+ this._outputFile = outputFile;
100
+ this._ffmpegPath = ffmpegPath;
101
+ this._size = size;
102
+ this._launchPromise = this._launch().catch((e) => e);
41
103
  }
42
- async _launch(options) {
43
- await (0, import_utils.mkdirIfNeeded)(options.outputFile);
44
- const w = options.width;
45
- const h = options.height;
104
+ async _launch() {
105
+ await (0, import_utils.mkdirIfNeeded)(this._outputFile);
106
+ const w = this._size.width;
107
+ const h = this._size.height;
46
108
  const args = `-loglevel error -f image2pipe -avioflags direct -fpsprobesize 0 -probesize 32 -analyzeduration 0 -c:v mjpeg -i pipe:0 -y -an -r ${fps} -c:v vp8 -qmin 0 -qmax 50 -crf 8 -deadline realtime -speed 8 -b:v 1M -threads 1 -vf pad=${w}:${h}:0:0:gray,crop=${w}:${h}:0:0`.split(" ");
47
- args.push(options.outputFile);
109
+ args.push(this._outputFile);
48
110
  const { launchedProcess, gracefullyClose } = await (0, import_processLauncher.launchProcess)({
49
111
  command: this._ffmpegPath,
50
112
  args,
@@ -105,8 +167,11 @@ class VideoRecorder {
105
167
  const error = await this._launchPromise;
106
168
  if (error)
107
169
  throw error;
108
- if (this._isStopped || !this._lastFrame)
170
+ if (this._isStopped)
109
171
  return;
172
+ if (!this._lastFrame) {
173
+ this._writeFrame(createWhiteImage(this._size.width, this._size.height), (0, import_utils.monotonicTime)());
174
+ }
110
175
  const addTime = Math.max(((0, import_utils.monotonicTime)() - this._lastWriteNodeTime) / 1e3, 1);
111
176
  this._writeFrame(Buffer.from([]), this._lastFrame.timestamp + addTime);
112
177
  this._isStopped = true;
@@ -118,7 +183,12 @@ class VideoRecorder {
118
183
  }
119
184
  }
120
185
  }
186
+ function createWhiteImage(width, height) {
187
+ const data = Buffer.alloc(width * height * 4, 255);
188
+ return import_utilsBundle.jpegjs.encode({ data, width, height }, 80).data;
189
+ }
121
190
  // Annotate the CommonJS export names for ESM import in node:
122
191
  0 && (module.exports = {
123
- VideoRecorder
192
+ VideoRecorder,
193
+ startAutomaticVideoRecording
124
194
  });
@@ -38,9 +38,8 @@ var import_browserContext = require("../browserContext");
38
38
  var network = __toESM(require("../network"));
39
39
  var import_wkConnection = require("./wkConnection");
40
40
  var import_wkPage = require("./wkPage");
41
- var import_errors = require("../errors");
42
41
  var import_webkit = require("./webkit");
43
- const BROWSER_VERSION = "26.0";
42
+ const BROWSER_VERSION = "26.4";
44
43
  const DEFAULT_USER_AGENT = `Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/${BROWSER_VERSION} Safari/605.1.15`;
45
44
  class WKBrowser extends import_browser.Browser {
46
45
  constructor(parent, transport, options) {
@@ -77,9 +76,6 @@ class WKBrowser extends import_browser.Browser {
77
76
  for (const wkPage of this._wkPages.values())
78
77
  wkPage.didClose();
79
78
  this._wkPages.clear();
80
- for (const video of this._idToVideo.values())
81
- video.artifact.reportFinished(new import_errors.TargetClosedError(this.closeReason()));
82
- this._idToVideo.clear();
83
79
  this._didClose();
84
80
  }
85
81
  async doCreateNewContext(options) {
@@ -311,7 +307,6 @@ class WKBrowserContext extends import_browserContext.BrowserContext {
311
307
  }
312
308
  async doClose(reason) {
313
309
  if (!this._browserContextId) {
314
- await Promise.all(this._wkPages().map((wkPage) => wkPage._page.screencast.stopVideoRecording()));
315
310
  await this._browser.close({ reason });
316
311
  } else {
317
312
  await this._browser._browserSession.send("Playwright.deleteContext", { browserContextId: this._browserContextId });
@@ -37,6 +37,7 @@ var import_eventsHelper = require("../utils/eventsHelper");
37
37
  var import_hostPlatform = require("../utils/hostPlatform");
38
38
  var import_stackTrace = require("../../utils/isomorphic/stackTrace");
39
39
  var import_utilsBundle = require("../../utilsBundle");
40
+ var import_browserContext = require("../browserContext");
40
41
  var dialog = __toESM(require("../dialog"));
41
42
  var dom = __toESM(require("../dom"));
42
43
  var import_errors = require("../errors");
@@ -51,8 +52,9 @@ var import_wkProvisionalPage = require("./wkProvisionalPage");
51
52
  var import_wkWorkers = require("./wkWorkers");
52
53
  var import_webkit = require("./webkit");
53
54
  var import_registry = require("../registry");
55
+ var import_videoRecorder = require("../videoRecorder");
54
56
  const UTILITY_WORLD_NAME = "__playwright_utility_world__";
55
- const enableFrameSessions = !process.env.WK_DISABLE_FRAME_SESSIONS && parseInt(import_registry.registry.findExecutable("webkit").revision, 10) >= 2245;
57
+ const enableFrameSessions = !process.env.WK_DISABLE_FRAME_SESSIONS && parseInt(import_registry.registry.findExecutable("webkit").revision, 10) >= 2245 && parseInt(import_registry.registry.findExecutable("webkit").revision, 10) <= 2255;
56
58
  class WKPage {
57
59
  constructor(browserContext, pageProxySession, opener) {
58
60
  this._provisionalPage = null;
@@ -115,7 +117,7 @@ class WKPage {
115
117
  for (const [key, value] of this._browserContext._permissions)
116
118
  promises.push(this._grantPermissions(key, value));
117
119
  }
118
- promises.push(this._initializeVideoRecording());
120
+ (0, import_videoRecorder.startAutomaticVideoRecording)(this._page);
119
121
  await Promise.all(promises);
120
122
  }
121
123
  _setSession(session) {
@@ -518,7 +520,7 @@ class WKPage {
518
520
  columnNumber: (columnNumber || 1) - 1
519
521
  }
520
522
  };
521
- this._onConsoleRepeatCountUpdated({ count: 1 });
523
+ this._onConsoleRepeatCountUpdated({ count: 1, timestamp: event.message.timestamp });
522
524
  }
523
525
  _onConsoleRepeatCountUpdated(event) {
524
526
  if (this._lastConsoleMessage) {
@@ -529,8 +531,9 @@ class WKPage {
529
531
  count,
530
532
  location
531
533
  } = this._lastConsoleMessage;
534
+ const timestamp = event.timestamp ? event.timestamp * 1e3 : Date.now();
532
535
  for (let i = count; i < event.count; ++i)
533
- this._page.addConsoleMessage(null, derivedType, handles, location, handles.length ? void 0 : text);
536
+ this._page.addConsoleMessage(null, derivedType, handles, location, handles.length ? void 0 : text, timestamp);
534
537
  this._lastConsoleMessage.count = event.count;
535
538
  }
536
539
  }
@@ -645,9 +648,11 @@ class WKPage {
645
648
  async updateUserAgent() {
646
649
  const contextOptions = this._browserContext._options;
647
650
  this._updateState("Page.overrideUserAgent", { value: contextOptions.userAgent });
651
+ const { navigatorPlatform } = (0, import_browserContext.calculateUserAgentEmulation)(contextOptions);
652
+ this._updateState("Page.overridePlatform", navigatorPlatform ? { value: navigatorPlatform } : {});
648
653
  }
649
654
  async bringToFront() {
650
- this._pageProxySession.send("Target.activate", {
655
+ await this._pageProxySession.send("Target.activate", {
651
656
  targetId: this._session.sessionId
652
657
  });
653
658
  }
@@ -773,12 +778,6 @@ class WKPage {
773
778
  return import_hostPlatform.hostPlatform === "mac10.15" ? 55 : 59;
774
779
  return 0;
775
780
  }
776
- async _initializeVideoRecording() {
777
- const screencast = this._page.screencast;
778
- const videoOptions = screencast.launchVideoRecorder();
779
- if (videoOptions)
780
- await screencast.startVideoRecording(videoOptions);
781
- }
782
781
  validateScreenshotDimension(side, omitDeviceScaleFactor) {
783
782
  if (process.platform === "darwin")
784
783
  return;
@@ -845,29 +844,28 @@ class WKPage {
845
844
  throw e;
846
845
  });
847
846
  }
848
- async startScreencast(options) {
849
- const { generation } = await this._pageProxySession.send("Screencast.startScreencast", {
847
+ startScreencast(options) {
848
+ this._pageProxySession.send("Screencast.startScreencast", {
850
849
  quality: options.quality,
851
850
  width: options.width,
852
851
  height: options.height,
853
852
  toolbarHeight: this._toolbarHeight()
853
+ }).then(({ generation }) => this._screencastGeneration = generation).catch(() => {
854
854
  });
855
- this._screencastGeneration = generation;
856
855
  }
857
- async stopScreencast() {
858
- await this._pageProxySession.sendMayFail("Screencast.stopScreencast");
856
+ stopScreencast() {
857
+ this._pageProxySession.sendMayFail("Screencast.stopScreencast");
859
858
  }
860
859
  _onScreencastFrame(event) {
861
860
  const generation = this._screencastGeneration;
862
- this._page.screencast.throttleFrameAck(() => {
863
- this._pageProxySession.sendMayFail("Screencast.screencastFrameAck", { generation });
864
- });
865
861
  const buffer = Buffer.from(event.data, "base64");
866
- this._page.emit(import_page.Page.Events.ScreencastFrame, {
862
+ this._page.screencast.onScreencastFrame({
867
863
  buffer,
868
864
  frameSwapWallTime: event.timestamp ? event.timestamp * 1e3 : Date.now(),
869
- width: event.deviceWidth,
870
- height: event.deviceHeight
865
+ viewportWidth: event.deviceWidth,
866
+ viewportHeight: event.deviceHeight
867
+ }, () => {
868
+ this._pageProxySession.sendMayFail("Screencast.screencastFrameAck", { generation });
871
869
  });
872
870
  }
873
871
  rafCountForStablePosition() {
@@ -981,6 +979,7 @@ class WKPage {
981
979
  }
982
980
  _handleRequestRedirect(request, requestId, responsePayload, timestamp) {
983
981
  const response = request.createResponse(responsePayload);
982
+ response._setHttpVersion(null);
984
983
  response._securityDetailsFinished();
985
984
  response._serverAddrFinished();
986
985
  response.setResponseHeadersSize(null);
@@ -1033,8 +1032,7 @@ class WKPage {
1033
1032
  validFrom: responseReceivedPayload?.response.security?.certificate?.validFrom,
1034
1033
  validTo: responseReceivedPayload?.response.security?.certificate?.validUntil
1035
1034
  });
1036
- if (event.metrics?.protocol)
1037
- response._setHttpVersion(event.metrics.protocol);
1035
+ response._setHttpVersion(event.metrics?.protocol ?? null);
1038
1036
  response.setEncodedBodySize(event.metrics?.responseBodyBytesReceived ?? null);
1039
1037
  response.setResponseHeadersSize(event.metrics?.responseHeaderBytesReceived ?? null);
1040
1038
  response._requestFinished(import_helper.helper.secondsToRoundishMillis(event.timestamp - request._timestamp));
@@ -1058,6 +1056,7 @@ class WKPage {
1058
1056
  if (response) {
1059
1057
  response._serverAddrFinished();
1060
1058
  response._securityDetailsFinished();
1059
+ response._setHttpVersion(null);
1061
1060
  response.setResponseHeadersSize(null);
1062
1061
  response.setEncodedBodySize(null);
1063
1062
  response._requestFinished(import_helper.helper.secondsToRoundishMillis(event.timestamp - request._timestamp));
@@ -1072,7 +1071,8 @@ class WKPage {
1072
1071
  const webPermissionToProtocol = /* @__PURE__ */ new Map([
1073
1072
  ["geolocation", "geolocation"],
1074
1073
  ["notifications", "notifications"],
1075
- ["clipboard-read", "clipboard-read"]
1074
+ ["clipboard-read", "clipboard-read"],
1075
+ ["screen-wake-lock", "screen-wake-lock"]
1076
1076
  ]);
1077
1077
  const filtered = permissions.map((permission) => {
1078
1078
  const protocolPermission = webPermissionToProtocol.get(permission);
@@ -1088,6 +1088,8 @@ class WKPage {
1088
1088
  shouldToggleStyleSheetToSyncAnimations() {
1089
1089
  return true;
1090
1090
  }
1091
+ async setDockTile(image) {
1092
+ }
1091
1093
  }
1092
1094
  class WKFrame {
1093
1095
  constructor(page, session) {
@@ -96,7 +96,8 @@ class WKWorkers {
96
96
  lineNumber: (lineNumber || 1) - 1,
97
97
  columnNumber: (columnNumber || 1) - 1
98
98
  };
99
- this._page.addConsoleMessage(worker, derivedType, handles, location, handles.length ? void 0 : text);
99
+ const timestamp = event.message.timestamp ? event.message.timestamp * 1e3 : Date.now();
100
+ this._page.addConsoleMessage(worker, derivedType, handles, location, handles.length ? void 0 : text, timestamp);
100
101
  }
101
102
  }
102
103
  // Annotate the CommonJS export names for ESM import in node:
@@ -0,0 +1,156 @@
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 serverRegistry_exports = {};
30
+ __export(serverRegistry_exports, {
31
+ serverRegistry: () => serverRegistry
32
+ });
33
+ module.exports = __toCommonJS(serverRegistry_exports);
34
+ var import_fs = __toESM(require("fs"));
35
+ var import_net = __toESM(require("net"));
36
+ var import_path = __toESM(require("path"));
37
+ var import_os = __toESM(require("os"));
38
+ const packageVersion = require("../package.json").version;
39
+ class ServerRegistry {
40
+ async list() {
41
+ const files = await import_fs.default.promises.readdir(this._browsersDir()).catch(() => []);
42
+ const result = /* @__PURE__ */ new Map();
43
+ for (const file of files) {
44
+ try {
45
+ const filePath = import_path.default.join(this._browsersDir(), file);
46
+ const content = await import_fs.default.promises.readFile(filePath, "utf-8");
47
+ const descriptor = JSON.parse(content);
48
+ const key = descriptor.workspaceDir ?? "";
49
+ let list = result.get(key);
50
+ if (!list) {
51
+ list = [];
52
+ result.set(key, list);
53
+ }
54
+ list.push(canConnect(descriptor).then((connectable) => ({ ...descriptor, canConnect: connectable, file: filePath })));
55
+ } catch {
56
+ }
57
+ }
58
+ const resolvedResult = /* @__PURE__ */ new Map();
59
+ for (const [key, promises] of result) {
60
+ const entries = await Promise.all(promises);
61
+ const descriptors = [];
62
+ for (const entry of entries) {
63
+ if (!entry.canConnect && !entry.browser.userDataDir) {
64
+ await import_fs.default.promises.unlink(entry.file).catch(() => {
65
+ });
66
+ continue;
67
+ }
68
+ descriptors.push(entry);
69
+ }
70
+ if (descriptors.length)
71
+ resolvedResult.set(key, descriptors);
72
+ }
73
+ return resolvedResult;
74
+ }
75
+ async create(browser, endpoint) {
76
+ const file = import_path.default.join(this._browsersDir(), browser.guid);
77
+ await import_fs.default.promises.mkdir(this._browsersDir(), { recursive: true });
78
+ const descriptor = {
79
+ playwrightVersion: packageVersion,
80
+ playwrightLib: require.resolve(".."),
81
+ title: endpoint.title,
82
+ browser,
83
+ endpoint: endpoint.endpoint,
84
+ workspaceDir: endpoint.workspaceDir
85
+ };
86
+ await import_fs.default.promises.writeFile(file, JSON.stringify(descriptor), "utf-8");
87
+ }
88
+ async delete(guid) {
89
+ const file = import_path.default.join(this._browsersDir(), guid);
90
+ await import_fs.default.promises.unlink(file).catch(() => {
91
+ });
92
+ }
93
+ async deleteUserData(guid) {
94
+ const filePath = import_path.default.join(this._browsersDir(), guid);
95
+ const content = await import_fs.default.promises.readFile(filePath, "utf-8");
96
+ const descriptor = JSON.parse(content);
97
+ if (descriptor.browser.userDataDir)
98
+ await import_fs.default.promises.rm(descriptor.browser.userDataDir, { recursive: true, force: true });
99
+ await import_fs.default.promises.unlink(filePath);
100
+ }
101
+ readDescriptor(guid) {
102
+ const filePath = import_path.default.join(this._browsersDir(), guid);
103
+ const content = import_fs.default.readFileSync(filePath, "utf-8");
104
+ const descriptor = JSON.parse(content);
105
+ return descriptor;
106
+ }
107
+ async find(name) {
108
+ const entries = await this.list();
109
+ for (const [, browsers] of entries) {
110
+ for (const browser of browsers) {
111
+ if (browser.title === name)
112
+ return browser;
113
+ }
114
+ }
115
+ return null;
116
+ }
117
+ _browsersDir() {
118
+ return process.env.PLAYWRIGHT_SERVER_REGISTRY || registryDirectory;
119
+ }
120
+ }
121
+ async function canConnect(descriptor) {
122
+ if (!descriptor.endpoint)
123
+ return false;
124
+ if (descriptor.endpoint.startsWith("ws://") || descriptor.endpoint.startsWith("wss://")) {
125
+ return await new Promise((resolve) => {
126
+ const url = new URL(descriptor.endpoint);
127
+ const socket = import_net.default.createConnection(Number(url.port), url.hostname, () => {
128
+ socket.destroy();
129
+ resolve(true);
130
+ });
131
+ socket.on("error", () => resolve(false));
132
+ });
133
+ }
134
+ return await new Promise((resolve) => {
135
+ const socket = import_net.default.createConnection(descriptor.endpoint ?? descriptor.pipeName, () => {
136
+ socket.destroy();
137
+ resolve(true);
138
+ });
139
+ socket.on("error", () => resolve(false));
140
+ });
141
+ }
142
+ const defaultCacheDirectory = (() => {
143
+ if (process.platform === "linux")
144
+ return process.env.XDG_CACHE_HOME || import_path.default.join(import_os.default.homedir(), ".cache");
145
+ if (process.platform === "darwin")
146
+ return import_path.default.join(import_os.default.homedir(), "Library", "Caches");
147
+ if (process.platform === "win32")
148
+ return process.env.LOCALAPPDATA || import_path.default.join(import_os.default.homedir(), "AppData", "Local");
149
+ throw new Error("Unsupported platform: " + process.platform);
150
+ })();
151
+ const registryDirectory = import_path.default.join(defaultCacheDirectory, "ms-playwright", "b");
152
+ const serverRegistry = new ServerRegistry();
153
+ // Annotate the CommonJS export names for ESM import in node:
154
+ 0 && (module.exports = {
155
+ serverRegistry
156
+ });
@@ -0,0 +1,79 @@
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 browserBackend_exports = {};
20
+ __export(browserBackend_exports, {
21
+ BrowserBackend: () => BrowserBackend
22
+ });
23
+ module.exports = __toCommonJS(browserBackend_exports);
24
+ var import_context = require("./context");
25
+ var import_response = require("./response");
26
+ var import_sessionLog = require("./sessionLog");
27
+ var import_utilsBundle = require("../../utilsBundle");
28
+ class BrowserBackend {
29
+ constructor(config, browserContext, tools) {
30
+ this._config = config;
31
+ this._tools = tools;
32
+ this.browserContext = browserContext;
33
+ }
34
+ async initialize(clientInfo) {
35
+ this._sessionLog = this._config.saveSession ? await import_sessionLog.SessionLog.create(this._config, clientInfo.cwd) : void 0;
36
+ this._context = new import_context.Context(this.browserContext, {
37
+ config: this._config,
38
+ sessionLog: this._sessionLog,
39
+ cwd: clientInfo.cwd
40
+ });
41
+ }
42
+ async dispose() {
43
+ await this._context?.dispose().catch((e) => (0, import_utilsBundle.debug)("pw:tools:error")(e));
44
+ }
45
+ async callTool(name, rawArguments = {}) {
46
+ const tool = this._tools.find((tool2) => tool2.schema.name === name);
47
+ if (!tool) {
48
+ return {
49
+ content: [{ type: "text", text: `### Error
50
+ Tool "${name}" not found` }],
51
+ isError: true
52
+ };
53
+ }
54
+ const parsedArguments = tool.schema.inputSchema.parse(rawArguments);
55
+ const cwd = rawArguments._meta?.cwd;
56
+ const context = this._context;
57
+ const response = new import_response.Response(context, name, parsedArguments, cwd);
58
+ context.setRunningTool(name);
59
+ let responseObject;
60
+ try {
61
+ await tool.handle(context, parsedArguments, response);
62
+ responseObject = await response.serialize();
63
+ this._sessionLog?.logResponse(name, parsedArguments, responseObject);
64
+ } catch (error) {
65
+ return {
66
+ content: [{ type: "text", text: `### Error
67
+ ${String(error)}` }],
68
+ isError: true
69
+ };
70
+ } finally {
71
+ context.setRunningTool(void 0);
72
+ }
73
+ return responseObject;
74
+ }
75
+ }
76
+ // Annotate the CommonJS export names for ESM import in node:
77
+ 0 && (module.exports = {
78
+ BrowserBackend
79
+ });
@@ -0,0 +1,63 @@
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 common_exports = {};
20
+ __export(common_exports, {
21
+ default: () => common_default
22
+ });
23
+ module.exports = __toCommonJS(common_exports);
24
+ var import_zodBundle = require("../../zodBundle");
25
+ var import_tool = require("./tool");
26
+ var import_response = require("./response");
27
+ const close = (0, import_tool.defineTool)({
28
+ capability: "core",
29
+ schema: {
30
+ name: "browser_close",
31
+ title: "Close browser",
32
+ description: "Close the page",
33
+ inputSchema: import_zodBundle.z.object({}),
34
+ type: "action"
35
+ },
36
+ handle: async (context, params, response) => {
37
+ const result = (0, import_response.renderTabsMarkdown)([]);
38
+ response.addTextResult(result.join("\n"));
39
+ response.addCode(`await page.close()`);
40
+ response.setClose();
41
+ }
42
+ });
43
+ const resize = (0, import_tool.defineTabTool)({
44
+ capability: "core",
45
+ schema: {
46
+ name: "browser_resize",
47
+ title: "Resize browser window",
48
+ description: "Resize the browser window",
49
+ inputSchema: import_zodBundle.z.object({
50
+ width: import_zodBundle.z.number().describe("Width of the browser window"),
51
+ height: import_zodBundle.z.number().describe("Height of the browser window")
52
+ }),
53
+ type: "action"
54
+ },
55
+ handle: async (tab, params, response) => {
56
+ response.addCode(`await page.setViewportSize({ width: ${params.width}, height: ${params.height} });`);
57
+ await tab.page.setViewportSize({ width: params.width, height: params.height });
58
+ }
59
+ });
60
+ var common_default = [
61
+ close,
62
+ resize
63
+ ];
@@ -0,0 +1,41 @@
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 config_exports = {};
20
+ __export(config_exports, {
21
+ default: () => config_default
22
+ });
23
+ module.exports = __toCommonJS(config_exports);
24
+ var import_zodBundle = require("../../zodBundle");
25
+ var import_tool = require("./tool");
26
+ const configShow = (0, import_tool.defineTool)({
27
+ capability: "config",
28
+ schema: {
29
+ name: "browser_get_config",
30
+ title: "Get config",
31
+ description: "Get the final resolved config after merging CLI options, environment variables and config file.",
32
+ inputSchema: import_zodBundle.z.object({}),
33
+ type: "readOnly"
34
+ },
35
+ handle: async (context, params, response) => {
36
+ response.addTextResult(JSON.stringify(context.config, null, 2));
37
+ }
38
+ });
39
+ var config_default = [
40
+ configShow
41
+ ];