@treegress.com/treegress-browser-core 1.59.0-treegress.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (439) hide show
  1. package/README.md +60 -0
  2. package/ThirdPartyNotices.txt +3759 -0
  3. package/bin/install_media_pack.ps1 +5 -0
  4. package/bin/install_webkit_wsl.ps1 +33 -0
  5. package/bin/reinstall_chrome_beta_linux.sh +42 -0
  6. package/bin/reinstall_chrome_beta_mac.sh +13 -0
  7. package/bin/reinstall_chrome_beta_win.ps1 +24 -0
  8. package/bin/reinstall_chrome_stable_linux.sh +42 -0
  9. package/bin/reinstall_chrome_stable_mac.sh +12 -0
  10. package/bin/reinstall_chrome_stable_win.ps1 +24 -0
  11. package/bin/reinstall_msedge_beta_linux.sh +48 -0
  12. package/bin/reinstall_msedge_beta_mac.sh +11 -0
  13. package/bin/reinstall_msedge_beta_win.ps1 +23 -0
  14. package/bin/reinstall_msedge_dev_linux.sh +48 -0
  15. package/bin/reinstall_msedge_dev_mac.sh +11 -0
  16. package/bin/reinstall_msedge_dev_win.ps1 +23 -0
  17. package/bin/reinstall_msedge_stable_linux.sh +48 -0
  18. package/bin/reinstall_msedge_stable_mac.sh +11 -0
  19. package/bin/reinstall_msedge_stable_win.ps1 +24 -0
  20. package/browsers.json +81 -0
  21. package/cli.js +18 -0
  22. package/index.d.ts +17 -0
  23. package/index.js +32 -0
  24. package/index.mjs +28 -0
  25. package/lib/androidServerImpl.js +65 -0
  26. package/lib/browserServerImpl.js +120 -0
  27. package/lib/cli/client/cli.js +6 -0
  28. package/lib/cli/client/program.js +375 -0
  29. package/lib/cli/client/registry.js +171 -0
  30. package/lib/cli/client/session.js +282 -0
  31. package/lib/cli/client/socketConnection.js +108 -0
  32. package/lib/cli/daemon/command.js +73 -0
  33. package/lib/cli/daemon/commands.js +879 -0
  34. package/lib/cli/daemon/daemon.js +179 -0
  35. package/lib/cli/daemon/helpGenerator.js +173 -0
  36. package/lib/cli/daemon/program.js +123 -0
  37. package/lib/cli/driver.js +98 -0
  38. package/lib/cli/program.js +598 -0
  39. package/lib/cli/programWithTestStub.js +74 -0
  40. package/lib/client/android.js +361 -0
  41. package/lib/client/api.js +137 -0
  42. package/lib/client/artifact.js +79 -0
  43. package/lib/client/browser.js +169 -0
  44. package/lib/client/browserContext.js +590 -0
  45. package/lib/client/browserType.js +153 -0
  46. package/lib/client/cdpSession.js +55 -0
  47. package/lib/client/channelOwner.js +194 -0
  48. package/lib/client/clientHelper.js +64 -0
  49. package/lib/client/clientInstrumentation.js +55 -0
  50. package/lib/client/clientStackTrace.js +69 -0
  51. package/lib/client/clock.js +68 -0
  52. package/lib/client/connect.js +152 -0
  53. package/lib/client/connection.js +322 -0
  54. package/lib/client/consoleMessage.js +61 -0
  55. package/lib/client/coverage.js +44 -0
  56. package/lib/client/dialog.js +56 -0
  57. package/lib/client/disposable.js +76 -0
  58. package/lib/client/download.js +62 -0
  59. package/lib/client/electron.js +138 -0
  60. package/lib/client/elementHandle.js +284 -0
  61. package/lib/client/errors.js +77 -0
  62. package/lib/client/eventEmitter.js +327 -0
  63. package/lib/client/events.js +103 -0
  64. package/lib/client/fetch.js +368 -0
  65. package/lib/client/fileChooser.js +46 -0
  66. package/lib/client/fileUtils.js +34 -0
  67. package/lib/client/frame.js +409 -0
  68. package/lib/client/harRouter.js +99 -0
  69. package/lib/client/input.js +84 -0
  70. package/lib/client/inspector.js +48 -0
  71. package/lib/client/jsHandle.js +109 -0
  72. package/lib/client/jsonPipe.js +39 -0
  73. package/lib/client/localUtils.js +60 -0
  74. package/lib/client/locator.js +373 -0
  75. package/lib/client/network.js +750 -0
  76. package/lib/client/page.js +750 -0
  77. package/lib/client/pageAgent.js +64 -0
  78. package/lib/client/platform.js +77 -0
  79. package/lib/client/playwright.js +71 -0
  80. package/lib/client/selectors.js +55 -0
  81. package/lib/client/stream.js +39 -0
  82. package/lib/client/timeoutSettings.js +79 -0
  83. package/lib/client/tracing.js +124 -0
  84. package/lib/client/types.js +28 -0
  85. package/lib/client/video.js +65 -0
  86. package/lib/client/waiter.js +142 -0
  87. package/lib/client/webError.js +39 -0
  88. package/lib/client/worker.js +85 -0
  89. package/lib/client/writableStream.js +39 -0
  90. package/lib/devtools/appIcon.png +0 -0
  91. package/lib/devtools/devtoolsApp.js +275 -0
  92. package/lib/devtools/devtoolsController.js +289 -0
  93. package/lib/generated/bindingsControllerSource.js +28 -0
  94. package/lib/generated/clockSource.js +28 -0
  95. package/lib/generated/injectedScriptSource.js +28 -0
  96. package/lib/generated/pollingRecorderSource.js +28 -0
  97. package/lib/generated/storageScriptSource.js +28 -0
  98. package/lib/generated/utilityScriptSource.js +28 -0
  99. package/lib/generated/webSocketMockSource.js +336 -0
  100. package/lib/inProcessFactory.js +60 -0
  101. package/lib/inprocess.js +3 -0
  102. package/lib/mcp/browserFactory.js +196 -0
  103. package/lib/mcp/cdpRelay.js +353 -0
  104. package/lib/mcp/config.d.js +16 -0
  105. package/lib/mcp/config.js +399 -0
  106. package/lib/mcp/configIni.js +190 -0
  107. package/lib/mcp/exports.js +42 -0
  108. package/lib/mcp/extensionContextFactory.js +59 -0
  109. package/lib/mcp/index.js +62 -0
  110. package/lib/mcp/log.js +35 -0
  111. package/lib/mcp/program.js +111 -0
  112. package/lib/mcp/protocol.js +28 -0
  113. package/lib/mcp/sdk/http.js +152 -0
  114. package/lib/mcp/sdk/server.js +230 -0
  115. package/lib/mcp/sdk/tool.js +47 -0
  116. package/lib/mcp/watchdog.js +44 -0
  117. package/lib/mcpBundle.js +84 -0
  118. package/lib/mcpBundleImpl/index.js +147 -0
  119. package/lib/outofprocess.js +76 -0
  120. package/lib/protocol/serializers.js +197 -0
  121. package/lib/protocol/validator.js +3064 -0
  122. package/lib/protocol/validatorPrimitives.js +193 -0
  123. package/lib/remote/playwrightConnection.js +129 -0
  124. package/lib/remote/playwrightPipeServer.js +100 -0
  125. package/lib/remote/playwrightServer.js +339 -0
  126. package/lib/remote/playwrightWebSocketServer.js +73 -0
  127. package/lib/remote/serverTransport.js +96 -0
  128. package/lib/server/agent/actionRunner.js +341 -0
  129. package/lib/server/agent/actions.js +128 -0
  130. package/lib/server/agent/codegen.js +111 -0
  131. package/lib/server/agent/context.js +161 -0
  132. package/lib/server/agent/expectTools.js +156 -0
  133. package/lib/server/agent/pageAgent.js +204 -0
  134. package/lib/server/agent/performTools.js +262 -0
  135. package/lib/server/agent/tool.js +109 -0
  136. package/lib/server/android/android.js +465 -0
  137. package/lib/server/android/backendAdb.js +177 -0
  138. package/lib/server/artifact.js +127 -0
  139. package/lib/server/bidi/bidiBrowser.js +560 -0
  140. package/lib/server/bidi/bidiChromium.js +162 -0
  141. package/lib/server/bidi/bidiConnection.js +213 -0
  142. package/lib/server/bidi/bidiDeserializer.js +116 -0
  143. package/lib/server/bidi/bidiExecutionContext.js +267 -0
  144. package/lib/server/bidi/bidiFirefox.js +128 -0
  145. package/lib/server/bidi/bidiInput.js +146 -0
  146. package/lib/server/bidi/bidiNetworkManager.js +411 -0
  147. package/lib/server/bidi/bidiOverCdp.js +102 -0
  148. package/lib/server/bidi/bidiPage.js +598 -0
  149. package/lib/server/bidi/bidiPdf.js +106 -0
  150. package/lib/server/bidi/third_party/bidiCommands.d.js +22 -0
  151. package/lib/server/bidi/third_party/bidiKeyboard.js +256 -0
  152. package/lib/server/bidi/third_party/bidiProtocol.js +24 -0
  153. package/lib/server/bidi/third_party/bidiProtocolCore.js +180 -0
  154. package/lib/server/bidi/third_party/bidiProtocolPermissions.js +42 -0
  155. package/lib/server/bidi/third_party/bidiSerializer.js +148 -0
  156. package/lib/server/bidi/third_party/firefoxPrefs.js +261 -0
  157. package/lib/server/browser.js +217 -0
  158. package/lib/server/browserContext.js +699 -0
  159. package/lib/server/browserType.js +337 -0
  160. package/lib/server/callLog.js +82 -0
  161. package/lib/server/chromium/appIcon.png +0 -0
  162. package/lib/server/chromium/chromium.js +399 -0
  163. package/lib/server/chromium/chromiumSwitches.js +104 -0
  164. package/lib/server/chromium/crBrowser.js +532 -0
  165. package/lib/server/chromium/crConnection.js +197 -0
  166. package/lib/server/chromium/crCoverage.js +235 -0
  167. package/lib/server/chromium/crDevTools.js +111 -0
  168. package/lib/server/chromium/crDragDrop.js +131 -0
  169. package/lib/server/chromium/crExecutionContext.js +146 -0
  170. package/lib/server/chromium/crInput.js +187 -0
  171. package/lib/server/chromium/crNetworkManager.js +708 -0
  172. package/lib/server/chromium/crPage.js +1004 -0
  173. package/lib/server/chromium/crPdf.js +121 -0
  174. package/lib/server/chromium/crProtocolHelper.js +145 -0
  175. package/lib/server/chromium/crServiceWorker.js +136 -0
  176. package/lib/server/chromium/defaultFontFamilies.js +162 -0
  177. package/lib/server/chromium/protocol.d.js +16 -0
  178. package/lib/server/clock.js +149 -0
  179. package/lib/server/codegen/csharp.js +327 -0
  180. package/lib/server/codegen/java.js +274 -0
  181. package/lib/server/codegen/javascript.js +247 -0
  182. package/lib/server/codegen/jsonl.js +52 -0
  183. package/lib/server/codegen/language.js +132 -0
  184. package/lib/server/codegen/languages.js +68 -0
  185. package/lib/server/codegen/python.js +279 -0
  186. package/lib/server/codegen/types.js +16 -0
  187. package/lib/server/console.js +61 -0
  188. package/lib/server/cookieStore.js +206 -0
  189. package/lib/server/debugController.js +197 -0
  190. package/lib/server/debugger.js +119 -0
  191. package/lib/server/deviceDescriptors.js +39 -0
  192. package/lib/server/deviceDescriptorsSource.json +1779 -0
  193. package/lib/server/dialog.js +116 -0
  194. package/lib/server/dispatchers/androidDispatcher.js +325 -0
  195. package/lib/server/dispatchers/artifactDispatcher.js +118 -0
  196. package/lib/server/dispatchers/browserContextDispatcher.js +377 -0
  197. package/lib/server/dispatchers/browserDispatcher.js +124 -0
  198. package/lib/server/dispatchers/browserTypeDispatcher.js +71 -0
  199. package/lib/server/dispatchers/cdpSessionDispatcher.js +47 -0
  200. package/lib/server/dispatchers/debugControllerDispatcher.js +78 -0
  201. package/lib/server/dispatchers/dialogDispatcher.js +47 -0
  202. package/lib/server/dispatchers/dispatcher.js +364 -0
  203. package/lib/server/dispatchers/disposableDispatcher.js +39 -0
  204. package/lib/server/dispatchers/electronDispatcher.js +90 -0
  205. package/lib/server/dispatchers/elementHandlerDispatcher.js +181 -0
  206. package/lib/server/dispatchers/frameDispatcher.js +227 -0
  207. package/lib/server/dispatchers/jsHandleDispatcher.js +85 -0
  208. package/lib/server/dispatchers/jsonPipeDispatcher.js +58 -0
  209. package/lib/server/dispatchers/localUtilsDispatcher.js +185 -0
  210. package/lib/server/dispatchers/networkDispatchers.js +214 -0
  211. package/lib/server/dispatchers/pageAgentDispatcher.js +106 -0
  212. package/lib/server/dispatchers/pageDispatcher.js +441 -0
  213. package/lib/server/dispatchers/playwrightDispatcher.js +108 -0
  214. package/lib/server/dispatchers/streamDispatcher.js +67 -0
  215. package/lib/server/dispatchers/tracingDispatcher.js +68 -0
  216. package/lib/server/dispatchers/webSocketRouteDispatcher.js +164 -0
  217. package/lib/server/dispatchers/writableStreamDispatcher.js +79 -0
  218. package/lib/server/disposable.js +41 -0
  219. package/lib/server/dom.js +815 -0
  220. package/lib/server/download.js +71 -0
  221. package/lib/server/electron/electron.js +272 -0
  222. package/lib/server/electron/loader.js +30 -0
  223. package/lib/server/errors.js +69 -0
  224. package/lib/server/fetch.js +621 -0
  225. package/lib/server/fileChooser.js +43 -0
  226. package/lib/server/fileUploadUtils.js +84 -0
  227. package/lib/server/firefox/ffBrowser.js +415 -0
  228. package/lib/server/firefox/ffConnection.js +142 -0
  229. package/lib/server/firefox/ffExecutionContext.js +150 -0
  230. package/lib/server/firefox/ffInput.js +159 -0
  231. package/lib/server/firefox/ffNetworkManager.js +256 -0
  232. package/lib/server/firefox/ffPage.js +495 -0
  233. package/lib/server/firefox/firefox.js +114 -0
  234. package/lib/server/firefox/protocol.d.js +16 -0
  235. package/lib/server/formData.js +147 -0
  236. package/lib/server/frameSelectors.js +160 -0
  237. package/lib/server/frames.js +1476 -0
  238. package/lib/server/har/harRecorder.js +147 -0
  239. package/lib/server/har/harTracer.js +608 -0
  240. package/lib/server/harBackend.js +157 -0
  241. package/lib/server/helper.js +96 -0
  242. package/lib/server/index.js +58 -0
  243. package/lib/server/input.js +277 -0
  244. package/lib/server/instrumentation.js +72 -0
  245. package/lib/server/javascript.js +291 -0
  246. package/lib/server/launchApp.js +127 -0
  247. package/lib/server/localUtils.js +214 -0
  248. package/lib/server/macEditingCommands.js +143 -0
  249. package/lib/server/network.js +668 -0
  250. package/lib/server/page.js +915 -0
  251. package/lib/server/pipeTransport.js +89 -0
  252. package/lib/server/playwright.js +69 -0
  253. package/lib/server/progress.js +136 -0
  254. package/lib/server/protocolError.js +52 -0
  255. package/lib/server/recorder/chat.js +161 -0
  256. package/lib/server/recorder/recorderApp.js +367 -0
  257. package/lib/server/recorder/recorderRunner.js +138 -0
  258. package/lib/server/recorder/recorderSignalProcessor.js +83 -0
  259. package/lib/server/recorder/recorderUtils.js +157 -0
  260. package/lib/server/recorder/throttledFile.js +57 -0
  261. package/lib/server/recorder.js +533 -0
  262. package/lib/server/registry/browserFetcher.js +177 -0
  263. package/lib/server/registry/dependencies.js +371 -0
  264. package/lib/server/registry/index.js +1395 -0
  265. package/lib/server/registry/nativeDeps.js +1281 -0
  266. package/lib/server/registry/oopDownloadBrowserMain.js +127 -0
  267. package/lib/server/screencast.js +214 -0
  268. package/lib/server/screenshotter.js +333 -0
  269. package/lib/server/selectors.js +112 -0
  270. package/lib/server/socksClientCertificatesInterceptor.js +383 -0
  271. package/lib/server/socksInterceptor.js +95 -0
  272. package/lib/server/trace/recorder/snapshotter.js +147 -0
  273. package/lib/server/trace/recorder/snapshotterInjected.js +561 -0
  274. package/lib/server/trace/recorder/tracing.js +607 -0
  275. package/lib/server/trace/viewer/traceParser.js +72 -0
  276. package/lib/server/trace/viewer/traceViewer.js +244 -0
  277. package/lib/server/transport.js +181 -0
  278. package/lib/server/types.js +28 -0
  279. package/lib/server/usKeyboardLayout.js +145 -0
  280. package/lib/server/utils/ascii.js +44 -0
  281. package/lib/server/utils/comparators.js +139 -0
  282. package/lib/server/utils/crypto.js +216 -0
  283. package/lib/server/utils/debug.js +42 -0
  284. package/lib/server/utils/debugLogger.js +122 -0
  285. package/lib/server/utils/env.js +73 -0
  286. package/lib/server/utils/eventsHelper.js +39 -0
  287. package/lib/server/utils/expectUtils.js +123 -0
  288. package/lib/server/utils/fileUtils.js +191 -0
  289. package/lib/server/utils/happyEyeballs.js +207 -0
  290. package/lib/server/utils/hostPlatform.js +123 -0
  291. package/lib/server/utils/httpServer.js +205 -0
  292. package/lib/server/utils/image_tools/colorUtils.js +89 -0
  293. package/lib/server/utils/image_tools/compare.js +109 -0
  294. package/lib/server/utils/image_tools/imageChannel.js +78 -0
  295. package/lib/server/utils/image_tools/stats.js +102 -0
  296. package/lib/server/utils/linuxUtils.js +71 -0
  297. package/lib/server/utils/network.js +244 -0
  298. package/lib/server/utils/nodePlatform.js +154 -0
  299. package/lib/server/utils/pipeTransport.js +84 -0
  300. package/lib/server/utils/processLauncher.js +243 -0
  301. package/lib/server/utils/profiler.js +65 -0
  302. package/lib/server/utils/socksProxy.js +511 -0
  303. package/lib/server/utils/spawnAsync.js +41 -0
  304. package/lib/server/utils/task.js +51 -0
  305. package/lib/server/utils/userAgent.js +98 -0
  306. package/lib/server/utils/wsServer.js +121 -0
  307. package/lib/server/utils/zipFile.js +74 -0
  308. package/lib/server/utils/zones.js +57 -0
  309. package/lib/server/videoRecorder.js +133 -0
  310. package/lib/server/webkit/protocol.d.js +16 -0
  311. package/lib/server/webkit/webkit.js +108 -0
  312. package/lib/server/webkit/wkBrowser.js +331 -0
  313. package/lib/server/webkit/wkConnection.js +144 -0
  314. package/lib/server/webkit/wkExecutionContext.js +154 -0
  315. package/lib/server/webkit/wkInput.js +181 -0
  316. package/lib/server/webkit/wkInterceptableRequest.js +197 -0
  317. package/lib/server/webkit/wkPage.js +1164 -0
  318. package/lib/server/webkit/wkProvisionalPage.js +83 -0
  319. package/lib/server/webkit/wkWorkers.js +106 -0
  320. package/lib/serverRegistry.js +136 -0
  321. package/lib/third_party/pixelmatch.js +255 -0
  322. package/lib/tools/browserServerBackend.js +79 -0
  323. package/lib/tools/common.js +63 -0
  324. package/lib/tools/config.js +41 -0
  325. package/lib/tools/console.js +65 -0
  326. package/lib/tools/context.js +282 -0
  327. package/lib/tools/cookies.js +152 -0
  328. package/lib/tools/customDomLocatorCompiler.js +239 -0
  329. package/lib/tools/customDomResolverDiagnostics.js +100 -0
  330. package/lib/tools/customDomSnapshotFormatter.js +658 -0
  331. package/lib/tools/devtools.js +42 -0
  332. package/lib/tools/dialogs.js +59 -0
  333. package/lib/tools/evaluate.js +61 -0
  334. package/lib/tools/exports.js +57 -0
  335. package/lib/tools/files.js +58 -0
  336. package/lib/tools/form.js +63 -0
  337. package/lib/tools/keyboard.js +151 -0
  338. package/lib/tools/logFile.js +95 -0
  339. package/lib/tools/mouse.js +170 -0
  340. package/lib/tools/navigate.js +105 -0
  341. package/lib/tools/network.js +112 -0
  342. package/lib/tools/pdf.js +48 -0
  343. package/lib/tools/response.js +278 -0
  344. package/lib/tools/route.js +140 -0
  345. package/lib/tools/runCode.js +76 -0
  346. package/lib/tools/screenshot.js +87 -0
  347. package/lib/tools/sessionLog.js +75 -0
  348. package/lib/tools/snapshot.js +209 -0
  349. package/lib/tools/storage.js +67 -0
  350. package/lib/tools/tab.js +596 -0
  351. package/lib/tools/tabs.js +67 -0
  352. package/lib/tools/tool.js +47 -0
  353. package/lib/tools/tools.js +94 -0
  354. package/lib/tools/tracing.js +75 -0
  355. package/lib/tools/utils.js +88 -0
  356. package/lib/tools/verify.js +149 -0
  357. package/lib/tools/video.js +89 -0
  358. package/lib/tools/wait.js +63 -0
  359. package/lib/tools/webstorage.js +223 -0
  360. package/lib/utils/isomorphic/aiSnapshotTypes.js +16 -0
  361. package/lib/utils/isomorphic/ariaSnapshot.js +455 -0
  362. package/lib/utils/isomorphic/assert.js +31 -0
  363. package/lib/utils/isomorphic/colors.js +72 -0
  364. package/lib/utils/isomorphic/cssParser.js +245 -0
  365. package/lib/utils/isomorphic/cssTokenizer.js +1051 -0
  366. package/lib/utils/isomorphic/headers.js +53 -0
  367. package/lib/utils/isomorphic/imageUtils.js +141 -0
  368. package/lib/utils/isomorphic/locatorGenerators.js +689 -0
  369. package/lib/utils/isomorphic/locatorParser.js +176 -0
  370. package/lib/utils/isomorphic/locatorUtils.js +81 -0
  371. package/lib/utils/isomorphic/lruCache.js +51 -0
  372. package/lib/utils/isomorphic/manualPromise.js +114 -0
  373. package/lib/utils/isomorphic/mimeType.js +464 -0
  374. package/lib/utils/isomorphic/multimap.js +80 -0
  375. package/lib/utils/isomorphic/protocolFormatter.js +81 -0
  376. package/lib/utils/isomorphic/protocolMetainfo.js +345 -0
  377. package/lib/utils/isomorphic/rtti.js +43 -0
  378. package/lib/utils/isomorphic/selectorParser.js +386 -0
  379. package/lib/utils/isomorphic/semaphore.js +54 -0
  380. package/lib/utils/isomorphic/stackTrace.js +158 -0
  381. package/lib/utils/isomorphic/stringUtils.js +204 -0
  382. package/lib/utils/isomorphic/time.js +49 -0
  383. package/lib/utils/isomorphic/timeoutRunner.js +66 -0
  384. package/lib/utils/isomorphic/trace/entries.js +16 -0
  385. package/lib/utils/isomorphic/trace/snapshotRenderer.js +502 -0
  386. package/lib/utils/isomorphic/trace/snapshotServer.js +120 -0
  387. package/lib/utils/isomorphic/trace/snapshotStorage.js +89 -0
  388. package/lib/utils/isomorphic/trace/traceLoader.js +131 -0
  389. package/lib/utils/isomorphic/trace/traceModel.js +366 -0
  390. package/lib/utils/isomorphic/trace/traceModernizer.js +401 -0
  391. package/lib/utils/isomorphic/trace/versions/traceV3.js +16 -0
  392. package/lib/utils/isomorphic/trace/versions/traceV4.js +16 -0
  393. package/lib/utils/isomorphic/trace/versions/traceV5.js +16 -0
  394. package/lib/utils/isomorphic/trace/versions/traceV6.js +16 -0
  395. package/lib/utils/isomorphic/trace/versions/traceV7.js +16 -0
  396. package/lib/utils/isomorphic/trace/versions/traceV8.js +16 -0
  397. package/lib/utils/isomorphic/traceUtils.js +58 -0
  398. package/lib/utils/isomorphic/types.js +16 -0
  399. package/lib/utils/isomorphic/urlMatch.js +243 -0
  400. package/lib/utils/isomorphic/utilityScriptSerializers.js +262 -0
  401. package/lib/utils/isomorphic/yaml.js +84 -0
  402. package/lib/utils.js +111 -0
  403. package/lib/utilsBundle.js +112 -0
  404. package/lib/utilsBundleImpl/index.js +218 -0
  405. package/lib/utilsBundleImpl/xdg-open +1066 -0
  406. package/lib/vite/devtools/assets/index-D3CVnoLM.css +1 -0
  407. package/lib/vite/devtools/assets/index-wqccfruE.js +50 -0
  408. package/lib/vite/devtools/index.html +28 -0
  409. package/lib/vite/htmlReport/index.html +84 -0
  410. package/lib/vite/recorder/assets/codeMirrorModule-4NapTJOb.js +32 -0
  411. package/lib/vite/recorder/assets/codeMirrorModule-DYBRYzYX.css +1 -0
  412. package/lib/vite/recorder/assets/codicon-DCmgc-ay.ttf +0 -0
  413. package/lib/vite/recorder/assets/index-BSjZa4pk.css +1 -0
  414. package/lib/vite/recorder/assets/index-CD9lKVjM.js +193 -0
  415. package/lib/vite/recorder/index.html +29 -0
  416. package/lib/vite/recorder/playwright-logo.svg +9 -0
  417. package/lib/vite/traceViewer/assets/codeMirrorModule-RgXeHFoQ.js +32 -0
  418. package/lib/vite/traceViewer/assets/defaultSettingsView-DP6vvJEM.js +269 -0
  419. package/lib/vite/traceViewer/assets/xtermModule-CsJ4vdCR.js +9 -0
  420. package/lib/vite/traceViewer/codeMirrorModule.DYBRYzYX.css +1 -0
  421. package/lib/vite/traceViewer/codicon.DCmgc-ay.ttf +0 -0
  422. package/lib/vite/traceViewer/defaultSettingsView.DQ9U-ctL.css +1 -0
  423. package/lib/vite/traceViewer/index.BVu7tZDe.css +1 -0
  424. package/lib/vite/traceViewer/index.D8YUXFVt.js +2 -0
  425. package/lib/vite/traceViewer/index.html +43 -0
  426. package/lib/vite/traceViewer/manifest.webmanifest +16 -0
  427. package/lib/vite/traceViewer/playwright-logo.svg +9 -0
  428. package/lib/vite/traceViewer/snapshot.html +21 -0
  429. package/lib/vite/traceViewer/sw.bundle.js +5 -0
  430. package/lib/vite/traceViewer/uiMode.BIQFTUME.js +6 -0
  431. package/lib/vite/traceViewer/uiMode.Btcz36p_.css +1 -0
  432. package/lib/vite/traceViewer/uiMode.html +17 -0
  433. package/lib/vite/traceViewer/xtermModule.DYP7pi_n.css +32 -0
  434. package/lib/zipBundle.js +34 -0
  435. package/lib/zipBundleImpl.js +5 -0
  436. package/package.json +52 -0
  437. package/types/protocol.d.ts +24365 -0
  438. package/types/structs.d.ts +45 -0
  439. package/types/types.d.ts +23724 -0
@@ -0,0 +1,278 @@
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 response_exports = {};
30
+ __export(response_exports, {
31
+ Response: () => Response,
32
+ parseResponse: () => parseResponse,
33
+ renderTabMarkdown: () => renderTabMarkdown,
34
+ renderTabsMarkdown: () => renderTabsMarkdown,
35
+ requestDebug: () => requestDebug
36
+ });
37
+ module.exports = __toCommonJS(response_exports);
38
+ var import_fs = __toESM(require("fs"));
39
+ var import_path = __toESM(require("path"));
40
+ var import_utilsBundle = require("../utilsBundle");
41
+ var import_tab = require("./tab");
42
+ var import_screenshot = require("./screenshot");
43
+ const requestDebug = (0, import_utilsBundle.debug)("pw:mcp:request");
44
+ class Response {
45
+ constructor(context, toolName, toolArgs, relativeTo) {
46
+ this._results = [];
47
+ this._errors = [];
48
+ this._code = [];
49
+ this._includeSnapshot = "none";
50
+ this._isClose = false;
51
+ this._imageResults = [];
52
+ this._context = context;
53
+ this.toolName = toolName;
54
+ this.toolArgs = toolArgs;
55
+ this._clientWorkspace = relativeTo ?? context.options.cwd;
56
+ }
57
+ setSnapshotBackend(backend) {
58
+ this._snapshotBackend = backend;
59
+ }
60
+ _computRelativeTo(fileName) {
61
+ return import_path.default.relative(this._clientWorkspace, fileName);
62
+ }
63
+ async resolveClientFile(template, title) {
64
+ let fileName;
65
+ if (template.suggestedFilename)
66
+ fileName = await this._context.workspaceFile(template.suggestedFilename, this._clientWorkspace);
67
+ else
68
+ fileName = await this._context.outputFile(template, { origin: "llm" });
69
+ const relativeName = this._computRelativeTo(fileName);
70
+ const printableLink = `- [${title}](${relativeName})`;
71
+ return { fileName, relativeName, printableLink };
72
+ }
73
+ addTextResult(text) {
74
+ this._results.push(text);
75
+ }
76
+ async addResult(title, data, file) {
77
+ if (this._context.config.outputMode === "file" || file.suggestedFilename || typeof data !== "string") {
78
+ const resolvedFile = await this.resolveClientFile(file, title);
79
+ await this.addFileResult(resolvedFile, data);
80
+ } else {
81
+ this.addTextResult(data);
82
+ }
83
+ }
84
+ async addFileResult(resolvedFile, data) {
85
+ if (typeof data === "string")
86
+ await import_fs.default.promises.writeFile(resolvedFile.fileName, data, "utf-8");
87
+ else if (data)
88
+ await import_fs.default.promises.writeFile(resolvedFile.fileName, data);
89
+ this.addTextResult(resolvedFile.printableLink);
90
+ }
91
+ addFileLink(title, fileName) {
92
+ const relativeName = this._computRelativeTo(fileName);
93
+ this.addTextResult(`- [${title}](${relativeName})`);
94
+ }
95
+ async registerImageResult(data, imageType) {
96
+ this._imageResults.push({ data, imageType });
97
+ }
98
+ setClose() {
99
+ this._isClose = true;
100
+ }
101
+ addError(error) {
102
+ this._errors.push(error);
103
+ }
104
+ addCode(code) {
105
+ this._code.push(code);
106
+ }
107
+ setIncludeSnapshot() {
108
+ this._includeSnapshot = this._context.config.snapshot?.mode || "incremental";
109
+ }
110
+ setIncludeFullSnapshot(includeSnapshotFileName) {
111
+ this._includeSnapshot = "full";
112
+ this._includeSnapshotFileName = includeSnapshotFileName;
113
+ }
114
+ async serialize() {
115
+ const redactText = (text2) => {
116
+ for (const [secretName, secretValue] of Object.entries(this._context.config.secrets ?? {}))
117
+ text2 = text2.replaceAll(secretValue, `<secret>${secretName}</secret>`);
118
+ return text2;
119
+ };
120
+ const sections = await this._build();
121
+ const text = [];
122
+ for (const section of sections) {
123
+ if (!section.content.length)
124
+ continue;
125
+ text.push(`### ${section.title}`);
126
+ if (section.codeframe)
127
+ text.push(`\`\`\`${section.codeframe}`);
128
+ text.push(...section.content);
129
+ if (section.codeframe)
130
+ text.push("```");
131
+ }
132
+ const content = [
133
+ {
134
+ type: "text",
135
+ text: redactText(text.join("\n"))
136
+ }
137
+ ];
138
+ if (this._context.config.imageResponses !== "omit") {
139
+ for (const imageResult of this._imageResults) {
140
+ const scaledData = (0, import_screenshot.scaleImageToFitMessage)(imageResult.data, imageResult.imageType);
141
+ content.push({ type: "image", data: scaledData.toString("base64"), mimeType: imageResult.imageType === "png" ? "image/png" : "image/jpeg" });
142
+ }
143
+ }
144
+ return {
145
+ content,
146
+ ...this._isClose ? { isClose: true } : {},
147
+ ...sections.some((section) => section.isError) ? { isError: true } : {}
148
+ };
149
+ }
150
+ async _build() {
151
+ const sections = [];
152
+ const addSection = (title, content, codeframe) => {
153
+ const section = { title, content, isError: title === "Error", codeframe };
154
+ sections.push(section);
155
+ return content;
156
+ };
157
+ if (this._errors.length)
158
+ addSection("Error", this._errors);
159
+ if (this._results.length)
160
+ addSection("Result", this._results);
161
+ if (this._context.config.codegen !== "none" && this._code.length)
162
+ addSection("Ran Playwright code", this._code, "js");
163
+ const tabSnapshot = this._context.currentTab() ? await this._context.currentTabOrDie().captureSnapshot(this._clientWorkspace, this._snapshotBackend) : void 0;
164
+ const tabHeaders = await Promise.all(this._context.tabs().map((tab) => tab.headerSnapshot()));
165
+ if (this._includeSnapshot !== "none" || tabHeaders.some((header) => header.changed)) {
166
+ if (tabHeaders.length !== 1)
167
+ addSection("Open tabs", renderTabsMarkdown(tabHeaders));
168
+ addSection("Page", renderTabMarkdown(tabHeaders.find((h) => h.current) ?? tabHeaders[0]));
169
+ }
170
+ if (this._context.tabs().length === 0)
171
+ this._isClose = true;
172
+ if (tabSnapshot?.modalStates.length)
173
+ addSection("Modal state", (0, import_tab.renderModalStates)(this._context.config, tabSnapshot.modalStates));
174
+ if (tabSnapshot && this._includeSnapshot !== "none") {
175
+ const snapshot = this._includeSnapshot === "full" ? tabSnapshot.ariaSnapshot : tabSnapshot.ariaSnapshotDiff ?? tabSnapshot.ariaSnapshot;
176
+ if (this._context.config.outputMode === "file" || this._includeSnapshotFileName) {
177
+ const resolvedFile = await this.resolveClientFile({ prefix: "page", ext: "yml", suggestedFilename: this._includeSnapshotFileName }, "Snapshot");
178
+ await import_fs.default.promises.writeFile(resolvedFile.fileName, snapshot, "utf-8");
179
+ addSection("Snapshot", [resolvedFile.printableLink]);
180
+ } else {
181
+ addSection("Snapshot", [snapshot], "yaml");
182
+ }
183
+ }
184
+ const text = [];
185
+ if (tabSnapshot?.consoleLink)
186
+ text.push(`- New console entries: ${tabSnapshot.consoleLink}`);
187
+ if (tabSnapshot?.events.filter((event) => event.type !== "request").length) {
188
+ for (const event of tabSnapshot.events) {
189
+ if (event.type === "console" && this._context.config.outputMode !== "file" && this._context.config.snapshot?.mode !== "none") {
190
+ if ((0, import_tab.shouldIncludeMessage)(this._context.config.console?.level, event.message.type))
191
+ text.push(`- ${trimMiddle(event.message.toString(), 100)}`);
192
+ } else if (event.type === "download-start") {
193
+ text.push(`- Downloading file ${event.download.download.suggestedFilename()} ...`);
194
+ } else if (event.type === "download-finish") {
195
+ text.push(`- Downloaded file ${event.download.download.suggestedFilename()} to "${this._computRelativeTo(event.download.outputFile)}"`);
196
+ }
197
+ }
198
+ }
199
+ if (text.length)
200
+ addSection("Events", text);
201
+ return sections;
202
+ }
203
+ }
204
+ function renderTabMarkdown(tab) {
205
+ const lines = [`- Page URL: ${tab.url}`];
206
+ if (tab.title)
207
+ lines.push(`- Page Title: ${tab.title}`);
208
+ if (tab.console.errors || tab.console.warnings)
209
+ lines.push(`- Console: ${tab.console.errors} errors, ${tab.console.warnings} warnings`);
210
+ return lines;
211
+ }
212
+ function renderTabsMarkdown(tabs) {
213
+ if (!tabs.length)
214
+ return ["No open tabs. Navigate to a URL to create one."];
215
+ const lines = [];
216
+ for (let i = 0; i < tabs.length; i++) {
217
+ const tab = tabs[i];
218
+ const current = tab.current ? " (current)" : "";
219
+ lines.push(`- ${i}:${current} [${tab.title}](${tab.url})`);
220
+ }
221
+ return lines;
222
+ }
223
+ function trimMiddle(text, maxLength) {
224
+ if (text.length <= maxLength)
225
+ return text;
226
+ return text.slice(0, Math.floor(maxLength / 2)) + "..." + text.slice(-3 - Math.floor(maxLength / 2));
227
+ }
228
+ function parseSections(text) {
229
+ const sections = /* @__PURE__ */ new Map();
230
+ const sectionHeaders = text.split(/^### /m).slice(1);
231
+ for (const section of sectionHeaders) {
232
+ const firstNewlineIndex = section.indexOf("\n");
233
+ if (firstNewlineIndex === -1)
234
+ continue;
235
+ const sectionName = section.substring(0, firstNewlineIndex);
236
+ const sectionContent = section.substring(firstNewlineIndex + 1).trim();
237
+ sections.set(sectionName, sectionContent);
238
+ }
239
+ return sections;
240
+ }
241
+ function parseResponse(response) {
242
+ if (response.content?.[0].type !== "text")
243
+ return void 0;
244
+ const text = response.content[0].text;
245
+ const sections = parseSections(text);
246
+ const error = sections.get("Error");
247
+ const result = sections.get("Result");
248
+ const code = sections.get("Ran Playwright code");
249
+ const tabs = sections.get("Open tabs");
250
+ const page = sections.get("Page");
251
+ const snapshot = sections.get("Snapshot");
252
+ const events = sections.get("Events");
253
+ const modalState = sections.get("Modal state");
254
+ const codeNoFrame = code?.replace(/^```js\n/, "").replace(/\n```$/, "");
255
+ const isError = response.isError;
256
+ const attachments = response.content.length > 1 ? response.content.slice(1) : void 0;
257
+ return {
258
+ result,
259
+ error,
260
+ code: codeNoFrame,
261
+ tabs,
262
+ page,
263
+ snapshot,
264
+ events,
265
+ modalState,
266
+ isError,
267
+ attachments,
268
+ text
269
+ };
270
+ }
271
+ // Annotate the CommonJS export names for ESM import in node:
272
+ 0 && (module.exports = {
273
+ Response,
274
+ parseResponse,
275
+ renderTabMarkdown,
276
+ renderTabsMarkdown,
277
+ requestDebug
278
+ });
@@ -0,0 +1,140 @@
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 route_exports = {};
20
+ __export(route_exports, {
21
+ default: () => route_default
22
+ });
23
+ module.exports = __toCommonJS(route_exports);
24
+ var import_mcpBundle = require("../mcpBundle");
25
+ var import_tool = require("./tool");
26
+ const route = (0, import_tool.defineTool)({
27
+ capability: "network",
28
+ schema: {
29
+ name: "browser_route",
30
+ title: "Mock network requests",
31
+ description: "Set up a route to mock network requests matching a URL pattern",
32
+ inputSchema: import_mcpBundle.z.object({
33
+ pattern: import_mcpBundle.z.string().describe('URL pattern to match (e.g., "**/api/users", "**/*.{png,jpg}")'),
34
+ status: import_mcpBundle.z.number().optional().describe("HTTP status code to return (default: 200)"),
35
+ body: import_mcpBundle.z.string().optional().describe("Response body (text or JSON string)"),
36
+ contentType: import_mcpBundle.z.string().optional().describe('Content-Type header (e.g., "application/json", "text/html")'),
37
+ headers: import_mcpBundle.z.array(import_mcpBundle.z.string()).optional().describe('Headers to add in "Name: Value" format'),
38
+ removeHeaders: import_mcpBundle.z.string().optional().describe("Comma-separated list of header names to remove from request")
39
+ }),
40
+ type: "action"
41
+ },
42
+ handle: async (context, params, response) => {
43
+ const addHeaders = params.headers ? Object.fromEntries(params.headers.map((h) => {
44
+ const colonIndex = h.indexOf(":");
45
+ return [h.substring(0, colonIndex).trim(), h.substring(colonIndex + 1).trim()];
46
+ })) : void 0;
47
+ const removeHeaders = params.removeHeaders ? params.removeHeaders.split(",").map((h) => h.trim()) : void 0;
48
+ const handler = async (route2) => {
49
+ if (params.body !== void 0 || params.status !== void 0) {
50
+ await route2.fulfill({
51
+ status: params.status ?? 200,
52
+ contentType: params.contentType,
53
+ body: params.body
54
+ });
55
+ return;
56
+ }
57
+ const headers = { ...route2.request().headers() };
58
+ if (addHeaders) {
59
+ for (const [key, value] of Object.entries(addHeaders))
60
+ headers[key] = value;
61
+ }
62
+ if (removeHeaders) {
63
+ for (const header of removeHeaders)
64
+ delete headers[header.toLowerCase()];
65
+ }
66
+ await route2.continue({ headers });
67
+ };
68
+ const entry = {
69
+ pattern: params.pattern,
70
+ status: params.status,
71
+ body: params.body,
72
+ contentType: params.contentType,
73
+ addHeaders,
74
+ removeHeaders,
75
+ handler
76
+ };
77
+ await context.addRoute(entry);
78
+ response.addTextResult(`Route added for pattern: ${params.pattern}`);
79
+ response.addCode(`await page.context().route('${params.pattern}', async route => { /* route handler */ });`);
80
+ }
81
+ });
82
+ const routeList = (0, import_tool.defineTool)({
83
+ capability: "network",
84
+ schema: {
85
+ name: "browser_route_list",
86
+ title: "List network routes",
87
+ description: "List all active network routes",
88
+ inputSchema: import_mcpBundle.z.object({}),
89
+ type: "readOnly"
90
+ },
91
+ handle: async (context, params, response) => {
92
+ const routes = context.routes();
93
+ if (routes.length === 0) {
94
+ response.addTextResult("No active routes");
95
+ return;
96
+ }
97
+ const lines = [];
98
+ for (let i = 0; i < routes.length; i++) {
99
+ const route2 = routes[i];
100
+ const details = [];
101
+ if (route2.status !== void 0)
102
+ details.push(`status=${route2.status}`);
103
+ if (route2.body !== void 0)
104
+ details.push(`body=${route2.body.length > 50 ? route2.body.substring(0, 50) + "..." : route2.body}`);
105
+ if (route2.contentType)
106
+ details.push(`contentType=${route2.contentType}`);
107
+ if (route2.addHeaders)
108
+ details.push(`addHeaders=${JSON.stringify(route2.addHeaders)}`);
109
+ if (route2.removeHeaders)
110
+ details.push(`removeHeaders=${route2.removeHeaders.join(",")}`);
111
+ const detailsStr = details.length ? ` (${details.join(", ")})` : "";
112
+ lines.push(`${i + 1}. ${route2.pattern}${detailsStr}`);
113
+ }
114
+ response.addTextResult(lines.join("\n"));
115
+ }
116
+ });
117
+ const unroute = (0, import_tool.defineTool)({
118
+ capability: "network",
119
+ schema: {
120
+ name: "browser_unroute",
121
+ title: "Remove network routes",
122
+ description: "Remove network routes matching a pattern (or all routes if no pattern specified)",
123
+ inputSchema: import_mcpBundle.z.object({
124
+ pattern: import_mcpBundle.z.string().optional().describe("URL pattern to unroute (omit to remove all routes)")
125
+ }),
126
+ type: "action"
127
+ },
128
+ handle: async (context, params, response) => {
129
+ const removed = await context.removeRoute(params.pattern);
130
+ if (params.pattern)
131
+ response.addTextResult(`Removed ${removed} route(s) for pattern: ${params.pattern}`);
132
+ else
133
+ response.addTextResult(`Removed all ${removed} route(s)`);
134
+ }
135
+ });
136
+ var route_default = [
137
+ route,
138
+ routeList,
139
+ unroute
140
+ ];
@@ -0,0 +1,76 @@
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 runCode_exports = {};
30
+ __export(runCode_exports, {
31
+ default: () => runCode_default
32
+ });
33
+ module.exports = __toCommonJS(runCode_exports);
34
+ var import_vm = __toESM(require("vm"));
35
+ var import_manualPromise = require("../utils/isomorphic/manualPromise");
36
+ var import_mcpBundle = require("../mcpBundle");
37
+ var import_tool = require("./tool");
38
+ const codeSchema = import_mcpBundle.z.object({
39
+ code: import_mcpBundle.z.string().describe(`A JavaScript function containing Playwright code to execute. It will be invoked with a single argument, page, which you can use for any page interaction. For example: \`async (page) => { await page.getByRole('button', { name: 'Submit' }).click(); return await page.title(); }\``)
40
+ });
41
+ const runCode = (0, import_tool.defineTabTool)({
42
+ capability: "core",
43
+ schema: {
44
+ name: "browser_run_code",
45
+ title: "Run Playwright code",
46
+ description: "Run Playwright code snippet",
47
+ inputSchema: codeSchema,
48
+ type: "action"
49
+ },
50
+ handle: async (tab, params, response) => {
51
+ response.addCode(`await (${params.code})(page);`);
52
+ const __end__ = new import_manualPromise.ManualPromise();
53
+ const context = {
54
+ page: tab.page,
55
+ __end__
56
+ };
57
+ import_vm.default.createContext(context);
58
+ await tab.waitForCompletion(async () => {
59
+ const snippet = `(async () => {
60
+ try {
61
+ const result = await (${params.code})(page);
62
+ __end__.resolve(JSON.stringify(result));
63
+ } catch (e) {
64
+ __end__.reject(e);
65
+ }
66
+ })()`;
67
+ await import_vm.default.runInContext(snippet, context);
68
+ const result = await __end__;
69
+ if (typeof result === "string")
70
+ response.addTextResult(result);
71
+ });
72
+ }
73
+ });
74
+ var runCode_default = [
75
+ runCode
76
+ ];
@@ -0,0 +1,87 @@
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 screenshot_exports = {};
20
+ __export(screenshot_exports, {
21
+ default: () => screenshot_default,
22
+ scaleImageToFitMessage: () => scaleImageToFitMessage
23
+ });
24
+ module.exports = __toCommonJS(screenshot_exports);
25
+ var import_imageUtils = require("../utils/isomorphic/imageUtils");
26
+ var import_utilsBundle = require("../utilsBundle");
27
+ var import_stringUtils = require("../utils/isomorphic/stringUtils");
28
+ var import_mcpBundle = require("../mcpBundle");
29
+ var import_tool = require("./tool");
30
+ const screenshotSchema = import_mcpBundle.z.object({
31
+ type: import_mcpBundle.z.enum(["png", "jpeg"]).default("png").describe("Image format for the screenshot. Default is png."),
32
+ filename: import_mcpBundle.z.string().optional().describe("File name to save the screenshot to. Defaults to `page-{timestamp}.{png|jpeg}` if not specified. Prefer relative file names to stay within the output directory."),
33
+ element: import_mcpBundle.z.string().optional().describe("Human-readable element description used to obtain permission to screenshot the element. If not provided, the screenshot will be taken of viewport. If element is provided, ref must be provided too."),
34
+ ref: import_mcpBundle.z.string().optional().describe("Exact target element reference from the page snapshot. If not provided, the screenshot will be taken of viewport. If ref is provided, element must be provided too."),
35
+ fullPage: import_mcpBundle.z.boolean().optional().describe("When true, takes a screenshot of the full scrollable page, instead of the currently visible viewport. Cannot be used with element screenshots.")
36
+ });
37
+ const screenshot = (0, import_tool.defineTabTool)({
38
+ capability: "core",
39
+ schema: {
40
+ name: "browser_take_screenshot",
41
+ title: "Take a screenshot",
42
+ description: `Take a screenshot of the current page. You can't perform actions based on the screenshot, use browser_snapshot for actions.`,
43
+ inputSchema: screenshotSchema,
44
+ type: "readOnly"
45
+ },
46
+ handle: async (tab, params, response) => {
47
+ if (params.fullPage && params.ref)
48
+ throw new Error("fullPage cannot be used with element screenshots.");
49
+ const fileType = params.type || "png";
50
+ const options = {
51
+ type: fileType,
52
+ quality: fileType === "png" ? void 0 : 90,
53
+ scale: "css",
54
+ ...tab.actionTimeoutOptions,
55
+ ...params.fullPage !== void 0 && { fullPage: params.fullPage }
56
+ };
57
+ const screenshotTarget = params.ref ? params.element || "element" : params.fullPage ? "full page" : "viewport";
58
+ const ref = params.ref ? await tab.refLocator({ element: params.element || "", ref: params.ref }) : null;
59
+ const data = ref ? await ref.locator.screenshot(options) : await tab.page.screenshot(options);
60
+ const resolvedFile = await response.resolveClientFile({ prefix: ref ? "element" : "page", ext: fileType, suggestedFilename: params.filename }, `Screenshot of ${screenshotTarget}`);
61
+ response.addCode(`// Screenshot ${screenshotTarget} and save it as ${resolvedFile.relativeName}`);
62
+ if (ref)
63
+ response.addCode(`await page.${ref.resolved}.screenshot(${(0, import_stringUtils.formatObject)({ ...options, path: resolvedFile.relativeName })});`);
64
+ else
65
+ response.addCode(`await page.screenshot(${(0, import_stringUtils.formatObject)({ ...options, path: resolvedFile.relativeName })});`);
66
+ await response.addFileResult(resolvedFile, data);
67
+ await response.registerImageResult(data, fileType);
68
+ }
69
+ });
70
+ function scaleImageToFitMessage(buffer, imageType) {
71
+ const image = imageType === "png" ? import_utilsBundle.PNG.sync.read(buffer) : import_utilsBundle.jpegjs.decode(buffer, { maxMemoryUsageInMB: 512 });
72
+ const pixels = image.width * image.height;
73
+ const shrink = Math.min(1568 / image.width, 1568 / image.height, Math.sqrt(1.15 * 1024 * 1024 / pixels));
74
+ if (shrink > 1)
75
+ return buffer;
76
+ const width = image.width * shrink | 0;
77
+ const height = image.height * shrink | 0;
78
+ const scaledImage = (0, import_imageUtils.scaleImageToSize)(image, { width, height });
79
+ return imageType === "png" ? import_utilsBundle.PNG.sync.write(scaledImage) : import_utilsBundle.jpegjs.encode(scaledImage, 80).data;
80
+ }
81
+ var screenshot_default = [
82
+ screenshot
83
+ ];
84
+ // Annotate the CommonJS export names for ESM import in node:
85
+ 0 && (module.exports = {
86
+ scaleImageToFitMessage
87
+ });
@@ -0,0 +1,75 @@
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 sessionLog_exports = {};
30
+ __export(sessionLog_exports, {
31
+ SessionLog: () => SessionLog
32
+ });
33
+ module.exports = __toCommonJS(sessionLog_exports);
34
+ var import_fs = __toESM(require("fs"));
35
+ var import_path = __toESM(require("path"));
36
+ var import_context = require("./context");
37
+ var import_response = require("./response");
38
+ class SessionLog {
39
+ constructor(sessionFolder) {
40
+ this._sessionFileQueue = Promise.resolve();
41
+ this._folder = sessionFolder;
42
+ this._file = import_path.default.join(this._folder, "session.md");
43
+ }
44
+ static async create(config, cwd) {
45
+ const sessionFolder = await (0, import_context.outputFile)({ config, cwd }, `session-${Date.now()}`, { origin: "code" });
46
+ await import_fs.default.promises.mkdir(sessionFolder, { recursive: true });
47
+ console.error(`Session: ${sessionFolder}`);
48
+ return new SessionLog(sessionFolder);
49
+ }
50
+ logResponse(toolName, toolArgs, responseObject) {
51
+ const parsed = (0, import_response.parseResponse)(responseObject);
52
+ if (parsed)
53
+ delete parsed.text;
54
+ const lines = [""];
55
+ lines.push(
56
+ `### Tool call: ${toolName}`,
57
+ `- Args`,
58
+ "```json",
59
+ JSON.stringify(toolArgs, null, 2),
60
+ "```"
61
+ );
62
+ if (parsed) {
63
+ lines.push(`- Result`);
64
+ lines.push("```json");
65
+ lines.push(JSON.stringify(parsed, null, 2));
66
+ lines.push("```");
67
+ }
68
+ lines.push("");
69
+ this._sessionFileQueue = this._sessionFileQueue.then(() => import_fs.default.promises.appendFile(this._file, lines.join("\n")));
70
+ }
71
+ }
72
+ // Annotate the CommonJS export names for ESM import in node:
73
+ 0 && (module.exports = {
74
+ SessionLog
75
+ });