playwright-codegen-pro-core 1.0.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 (468) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +5 -0
  3. package/README.md +3 -0
  4. package/ThirdPartyNotices.txt +3552 -0
  5. package/bin/install_media_pack.ps1 +5 -0
  6. package/bin/install_webkit_wsl.ps1 +33 -0
  7. package/bin/reinstall_chrome_beta_linux.sh +42 -0
  8. package/bin/reinstall_chrome_beta_mac.sh +13 -0
  9. package/bin/reinstall_chrome_beta_win.ps1 +24 -0
  10. package/bin/reinstall_chrome_stable_linux.sh +42 -0
  11. package/bin/reinstall_chrome_stable_mac.sh +12 -0
  12. package/bin/reinstall_chrome_stable_win.ps1 +24 -0
  13. package/bin/reinstall_msedge_beta_linux.sh +48 -0
  14. package/bin/reinstall_msedge_beta_mac.sh +11 -0
  15. package/bin/reinstall_msedge_beta_win.ps1 +23 -0
  16. package/bin/reinstall_msedge_dev_linux.sh +48 -0
  17. package/bin/reinstall_msedge_dev_mac.sh +11 -0
  18. package/bin/reinstall_msedge_dev_win.ps1 +23 -0
  19. package/bin/reinstall_msedge_stable_linux.sh +48 -0
  20. package/bin/reinstall_msedge_stable_mac.sh +11 -0
  21. package/bin/reinstall_msedge_stable_win.ps1 +24 -0
  22. package/browsers.json +81 -0
  23. package/bundles/mcp/package-lock.json +1135 -0
  24. package/bundles/mcp/package.json +10 -0
  25. package/bundles/mcp/raw-body.ts +43 -0
  26. package/bundles/utils/package-lock.json +466 -0
  27. package/bundles/utils/package.json +40 -0
  28. package/bundles/zip/package-lock.json +257 -0
  29. package/bundles/zip/package.json +16 -0
  30. package/cli.js +18 -0
  31. package/index.d.ts +17 -0
  32. package/index.js +32 -0
  33. package/index.mjs +28 -0
  34. package/lib/androidServerImpl.js +65 -0
  35. package/lib/browserServerImpl.js +120 -0
  36. package/lib/cli/driver.js +98 -0
  37. package/lib/cli/program.js +599 -0
  38. package/lib/cli/programWithTestStub.js +74 -0
  39. package/lib/client/android.js +361 -0
  40. package/lib/client/api.js +137 -0
  41. package/lib/client/artifact.js +79 -0
  42. package/lib/client/browser.js +169 -0
  43. package/lib/client/browserContext.js +563 -0
  44. package/lib/client/browserType.js +153 -0
  45. package/lib/client/cdpSession.js +55 -0
  46. package/lib/client/channelOwner.js +194 -0
  47. package/lib/client/clientHelper.js +64 -0
  48. package/lib/client/clientInstrumentation.js +55 -0
  49. package/lib/client/clientStackTrace.js +69 -0
  50. package/lib/client/clock.js +68 -0
  51. package/lib/client/connect.js +143 -0
  52. package/lib/client/connection.js +322 -0
  53. package/lib/client/consoleMessage.js +61 -0
  54. package/lib/client/coverage.js +44 -0
  55. package/lib/client/debugger.js +57 -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 +281 -0
  61. package/lib/client/errors.js +77 -0
  62. package/lib/client/eventEmitter.js +314 -0
  63. package/lib/client/events.js +103 -0
  64. package/lib/client/fetch.js +367 -0
  65. package/lib/client/fileChooser.js +46 -0
  66. package/lib/client/fileUtils.js +34 -0
  67. package/lib/client/frame.js +404 -0
  68. package/lib/client/harRouter.js +99 -0
  69. package/lib/client/input.js +84 -0
  70. package/lib/client/jsHandle.js +105 -0
  71. package/lib/client/jsonPipe.js +39 -0
  72. package/lib/client/localUtils.js +60 -0
  73. package/lib/client/locator.js +367 -0
  74. package/lib/client/network.js +750 -0
  75. package/lib/client/page.js +729 -0
  76. package/lib/client/platform.js +77 -0
  77. package/lib/client/playwright.js +71 -0
  78. package/lib/client/screencast.js +48 -0
  79. package/lib/client/selectors.js +57 -0
  80. package/lib/client/stream.js +39 -0
  81. package/lib/client/timeoutSettings.js +79 -0
  82. package/lib/client/tracing.js +126 -0
  83. package/lib/client/types.js +28 -0
  84. package/lib/client/video.js +68 -0
  85. package/lib/client/waiter.js +142 -0
  86. package/lib/client/webError.js +39 -0
  87. package/lib/client/worker.js +85 -0
  88. package/lib/client/writableStream.js +39 -0
  89. package/lib/generated/bindingsControllerSource.js +28 -0
  90. package/lib/generated/clockSource.js +28 -0
  91. package/lib/generated/injectedScriptSource.js +28 -0
  92. package/lib/generated/pollingRecorderSource.js +28 -0
  93. package/lib/generated/storageScriptSource.js +28 -0
  94. package/lib/generated/utilityScriptSource.js +28 -0
  95. package/lib/generated/webSocketMockSource.js +336 -0
  96. package/lib/inProcessFactory.js +60 -0
  97. package/lib/inprocess.js +3 -0
  98. package/lib/mcpBundle.js +81 -0
  99. package/lib/mcpBundleImpl/index.js +91 -0
  100. package/lib/outofprocess.js +76 -0
  101. package/lib/protocol/serializers.js +197 -0
  102. package/lib/protocol/validator.js +3035 -0
  103. package/lib/protocol/validatorPrimitives.js +193 -0
  104. package/lib/remote/playwrightConnection.js +131 -0
  105. package/lib/remote/playwrightPipeServer.js +100 -0
  106. package/lib/remote/playwrightServer.js +339 -0
  107. package/lib/remote/playwrightWebSocketServer.js +73 -0
  108. package/lib/remote/serverTransport.js +96 -0
  109. package/lib/server/android/android.js +465 -0
  110. package/lib/server/android/backendAdb.js +177 -0
  111. package/lib/server/artifact.js +127 -0
  112. package/lib/server/bidi/bidiBrowser.js +571 -0
  113. package/lib/server/bidi/bidiChromium.js +162 -0
  114. package/lib/server/bidi/bidiConnection.js +213 -0
  115. package/lib/server/bidi/bidiDeserializer.js +116 -0
  116. package/lib/server/bidi/bidiExecutionContext.js +267 -0
  117. package/lib/server/bidi/bidiFirefox.js +128 -0
  118. package/lib/server/bidi/bidiInput.js +146 -0
  119. package/lib/server/bidi/bidiNetworkManager.js +411 -0
  120. package/lib/server/bidi/bidiOverCdp.js +102 -0
  121. package/lib/server/bidi/bidiPage.js +599 -0
  122. package/lib/server/bidi/bidiPdf.js +106 -0
  123. package/lib/server/bidi/third_party/bidiCommands.d.js +22 -0
  124. package/lib/server/bidi/third_party/bidiKeyboard.js +256 -0
  125. package/lib/server/bidi/third_party/bidiProtocol.js +24 -0
  126. package/lib/server/bidi/third_party/bidiProtocolCore.js +180 -0
  127. package/lib/server/bidi/third_party/bidiProtocolPermissions.js +42 -0
  128. package/lib/server/bidi/third_party/bidiSerializer.js +148 -0
  129. package/lib/server/bidi/third_party/firefoxPrefs.js +261 -0
  130. package/lib/server/browser.js +223 -0
  131. package/lib/server/browserContext.js +703 -0
  132. package/lib/server/browserType.js +338 -0
  133. package/lib/server/callLog.js +82 -0
  134. package/lib/server/chromium/appIcon.png +0 -0
  135. package/lib/server/chromium/chromium.js +399 -0
  136. package/lib/server/chromium/chromiumSwitches.js +104 -0
  137. package/lib/server/chromium/crBrowser.js +532 -0
  138. package/lib/server/chromium/crConnection.js +197 -0
  139. package/lib/server/chromium/crCoverage.js +235 -0
  140. package/lib/server/chromium/crDevTools.js +111 -0
  141. package/lib/server/chromium/crDragDrop.js +131 -0
  142. package/lib/server/chromium/crExecutionContext.js +146 -0
  143. package/lib/server/chromium/crInput.js +187 -0
  144. package/lib/server/chromium/crNetworkManager.js +711 -0
  145. package/lib/server/chromium/crPage.js +1004 -0
  146. package/lib/server/chromium/crPdf.js +121 -0
  147. package/lib/server/chromium/crProtocolHelper.js +145 -0
  148. package/lib/server/chromium/crServiceWorker.js +137 -0
  149. package/lib/server/chromium/defaultFontFamilies.js +162 -0
  150. package/lib/server/chromium/protocol.d.js +16 -0
  151. package/lib/server/clock.js +149 -0
  152. package/lib/server/codegen/csharp.js +327 -0
  153. package/lib/server/codegen/java.js +274 -0
  154. package/lib/server/codegen/javascript.js +247 -0
  155. package/lib/server/codegen/jsonl.js +52 -0
  156. package/lib/server/codegen/language.js +132 -0
  157. package/lib/server/codegen/languages.js +68 -0
  158. package/lib/server/codegen/python.js +279 -0
  159. package/lib/server/codegen/types.js +16 -0
  160. package/lib/server/console.js +61 -0
  161. package/lib/server/cookieStore.js +206 -0
  162. package/lib/server/debugController.js +197 -0
  163. package/lib/server/debugger.js +117 -0
  164. package/lib/server/deviceDescriptors.js +39 -0
  165. package/lib/server/deviceDescriptorsSource.json +1779 -0
  166. package/lib/server/dialog.js +116 -0
  167. package/lib/server/dispatchers/androidDispatcher.js +325 -0
  168. package/lib/server/dispatchers/artifactDispatcher.js +118 -0
  169. package/lib/server/dispatchers/browserContextDispatcher.js +381 -0
  170. package/lib/server/dispatchers/browserDispatcher.js +124 -0
  171. package/lib/server/dispatchers/browserTypeDispatcher.js +71 -0
  172. package/lib/server/dispatchers/cdpSessionDispatcher.js +47 -0
  173. package/lib/server/dispatchers/debugControllerDispatcher.js +78 -0
  174. package/lib/server/dispatchers/debuggerDispatcher.js +80 -0
  175. package/lib/server/dispatchers/dialogDispatcher.js +47 -0
  176. package/lib/server/dispatchers/dispatcher.js +364 -0
  177. package/lib/server/dispatchers/disposableDispatcher.js +39 -0
  178. package/lib/server/dispatchers/electronDispatcher.js +90 -0
  179. package/lib/server/dispatchers/elementHandlerDispatcher.js +181 -0
  180. package/lib/server/dispatchers/frameDispatcher.js +227 -0
  181. package/lib/server/dispatchers/jsHandleDispatcher.js +85 -0
  182. package/lib/server/dispatchers/jsonPipeDispatcher.js +58 -0
  183. package/lib/server/dispatchers/localUtilsDispatcher.js +185 -0
  184. package/lib/server/dispatchers/networkDispatchers.js +214 -0
  185. package/lib/server/dispatchers/pageDispatcher.js +430 -0
  186. package/lib/server/dispatchers/playwrightDispatcher.js +108 -0
  187. package/lib/server/dispatchers/streamDispatcher.js +67 -0
  188. package/lib/server/dispatchers/tracingDispatcher.js +68 -0
  189. package/lib/server/dispatchers/webSocketRouteDispatcher.js +164 -0
  190. package/lib/server/dispatchers/writableStreamDispatcher.js +79 -0
  191. package/lib/server/disposable.js +41 -0
  192. package/lib/server/dom.js +833 -0
  193. package/lib/server/download.js +71 -0
  194. package/lib/server/electron/electron.js +272 -0
  195. package/lib/server/electron/loader.js +29 -0
  196. package/lib/server/errors.js +69 -0
  197. package/lib/server/fetch.js +621 -0
  198. package/lib/server/fileChooser.js +43 -0
  199. package/lib/server/fileUploadUtils.js +84 -0
  200. package/lib/server/firefox/ffBrowser.js +415 -0
  201. package/lib/server/firefox/ffConnection.js +142 -0
  202. package/lib/server/firefox/ffExecutionContext.js +150 -0
  203. package/lib/server/firefox/ffInput.js +175 -0
  204. package/lib/server/firefox/ffNetworkManager.js +256 -0
  205. package/lib/server/firefox/ffPage.js +495 -0
  206. package/lib/server/firefox/firefox.js +114 -0
  207. package/lib/server/firefox/protocol.d.js +16 -0
  208. package/lib/server/formData.js +147 -0
  209. package/lib/server/frameSelectors.js +160 -0
  210. package/lib/server/frames.js +1495 -0
  211. package/lib/server/har/harRecorder.js +147 -0
  212. package/lib/server/har/harTracer.js +608 -0
  213. package/lib/server/harBackend.js +157 -0
  214. package/lib/server/helper.js +96 -0
  215. package/lib/server/index.js +58 -0
  216. package/lib/server/input.js +322 -0
  217. package/lib/server/instrumentation.js +72 -0
  218. package/lib/server/javascript.js +291 -0
  219. package/lib/server/launchApp.js +127 -0
  220. package/lib/server/localUtils.js +214 -0
  221. package/lib/server/macEditingCommands.js +143 -0
  222. package/lib/server/network.js +668 -0
  223. package/lib/server/page.js +884 -0
  224. package/lib/server/pipeTransport.js +89 -0
  225. package/lib/server/playwright.js +69 -0
  226. package/lib/server/progress.js +136 -0
  227. package/lib/server/protocolError.js +52 -0
  228. package/lib/server/recorder/chat.js +161 -0
  229. package/lib/server/recorder/networkCapture.js +282 -0
  230. package/lib/server/recorder/recorderApp.js +581 -0
  231. package/lib/server/recorder/recorderRunner.js +138 -0
  232. package/lib/server/recorder/recorderSignalProcessor.js +83 -0
  233. package/lib/server/recorder/recorderUtils.js +157 -0
  234. package/lib/server/recorder/sessionExporter.js +40 -0
  235. package/lib/server/recorder/sessionPromptBuilder.js +128 -0
  236. package/lib/server/recorder/sessionRedactor.js +74 -0
  237. package/lib/server/recorder/throttledFile.js +57 -0
  238. package/lib/server/recorder.js +538 -0
  239. package/lib/server/registry/browserFetcher.js +177 -0
  240. package/lib/server/registry/dependencies.js +371 -0
  241. package/lib/server/registry/index.js +1395 -0
  242. package/lib/server/registry/nativeDeps.js +1281 -0
  243. package/lib/server/registry/oopDownloadBrowserMain.js +127 -0
  244. package/lib/server/screencast.js +238 -0
  245. package/lib/server/screenshotter.js +333 -0
  246. package/lib/server/selectors.js +112 -0
  247. package/lib/server/socksClientCertificatesInterceptor.js +383 -0
  248. package/lib/server/socksInterceptor.js +95 -0
  249. package/lib/server/trace/recorder/snapshotter.js +147 -0
  250. package/lib/server/trace/recorder/snapshotterInjected.js +561 -0
  251. package/lib/server/trace/recorder/tracing.js +615 -0
  252. package/lib/server/trace/viewer/traceViewer.js +244 -0
  253. package/lib/server/transport.js +181 -0
  254. package/lib/server/types.js +28 -0
  255. package/lib/server/usKeyboardLayout.js +152 -0
  256. package/lib/server/utils/ascii.js +44 -0
  257. package/lib/server/utils/comparators.js +139 -0
  258. package/lib/server/utils/crypto.js +216 -0
  259. package/lib/server/utils/debug.js +42 -0
  260. package/lib/server/utils/debugLogger.js +122 -0
  261. package/lib/server/utils/disposable.js +32 -0
  262. package/lib/server/utils/env.js +73 -0
  263. package/lib/server/utils/eventsHelper.js +41 -0
  264. package/lib/server/utils/expectUtils.js +123 -0
  265. package/lib/server/utils/fileUtils.js +191 -0
  266. package/lib/server/utils/happyEyeballs.js +207 -0
  267. package/lib/server/utils/hostPlatform.js +123 -0
  268. package/lib/server/utils/httpServer.js +205 -0
  269. package/lib/server/utils/image_tools/colorUtils.js +89 -0
  270. package/lib/server/utils/image_tools/compare.js +109 -0
  271. package/lib/server/utils/image_tools/imageChannel.js +78 -0
  272. package/lib/server/utils/image_tools/stats.js +102 -0
  273. package/lib/server/utils/linuxUtils.js +71 -0
  274. package/lib/server/utils/network.js +243 -0
  275. package/lib/server/utils/nodePlatform.js +154 -0
  276. package/lib/server/utils/pipeTransport.js +84 -0
  277. package/lib/server/utils/processLauncher.js +243 -0
  278. package/lib/server/utils/profiler.js +65 -0
  279. package/lib/server/utils/socksProxy.js +511 -0
  280. package/lib/server/utils/spawnAsync.js +41 -0
  281. package/lib/server/utils/task.js +51 -0
  282. package/lib/server/utils/userAgent.js +98 -0
  283. package/lib/server/utils/wsServer.js +121 -0
  284. package/lib/server/utils/zipFile.js +74 -0
  285. package/lib/server/utils/zones.js +57 -0
  286. package/lib/server/videoRecorder.js +133 -0
  287. package/lib/server/webkit/protocol.d.js +16 -0
  288. package/lib/server/webkit/webkit.js +108 -0
  289. package/lib/server/webkit/wkBrowser.js +331 -0
  290. package/lib/server/webkit/wkConnection.js +144 -0
  291. package/lib/server/webkit/wkExecutionContext.js +154 -0
  292. package/lib/server/webkit/wkInput.js +181 -0
  293. package/lib/server/webkit/wkInterceptableRequest.js +197 -0
  294. package/lib/server/webkit/wkPage.js +1164 -0
  295. package/lib/server/webkit/wkProvisionalPage.js +83 -0
  296. package/lib/server/webkit/wkWorkers.js +106 -0
  297. package/lib/serverRegistry.js +147 -0
  298. package/lib/third_party/pixelmatch.js +255 -0
  299. package/lib/tools/backend/browserBackend.js +79 -0
  300. package/lib/tools/backend/common.js +63 -0
  301. package/lib/tools/backend/config.js +41 -0
  302. package/lib/tools/backend/console.js +66 -0
  303. package/lib/tools/backend/context.js +290 -0
  304. package/lib/tools/backend/cookies.js +152 -0
  305. package/lib/tools/backend/devtools.js +69 -0
  306. package/lib/tools/backend/dialogs.js +59 -0
  307. package/lib/tools/backend/evaluate.js +64 -0
  308. package/lib/tools/backend/files.js +60 -0
  309. package/lib/tools/backend/form.js +64 -0
  310. package/lib/tools/backend/keyboard.js +155 -0
  311. package/lib/tools/backend/logFile.js +95 -0
  312. package/lib/tools/backend/mouse.js +168 -0
  313. package/lib/tools/backend/navigate.js +106 -0
  314. package/lib/tools/backend/network.js +135 -0
  315. package/lib/tools/backend/pdf.js +48 -0
  316. package/lib/tools/backend/recorder.js +74 -0
  317. package/lib/tools/backend/response.js +302 -0
  318. package/lib/tools/backend/route.js +140 -0
  319. package/lib/tools/backend/runCode.js +76 -0
  320. package/lib/tools/backend/screenshot.js +88 -0
  321. package/lib/tools/backend/sessionLog.js +74 -0
  322. package/lib/tools/backend/snapshot.js +208 -0
  323. package/lib/tools/backend/storage.js +67 -0
  324. package/lib/tools/backend/tab.js +445 -0
  325. package/lib/tools/backend/tabs.js +67 -0
  326. package/lib/tools/backend/tool.js +47 -0
  327. package/lib/tools/backend/tools.js +104 -0
  328. package/lib/tools/backend/tracing.js +75 -0
  329. package/lib/tools/backend/utils.js +83 -0
  330. package/lib/tools/backend/verify.js +151 -0
  331. package/lib/tools/backend/video.js +89 -0
  332. package/lib/tools/backend/wait.js +63 -0
  333. package/lib/tools/backend/webstorage.js +223 -0
  334. package/lib/tools/cli-client/cli.js +6 -0
  335. package/lib/tools/cli-client/help.json +101 -0
  336. package/lib/tools/cli-client/minimist.js +128 -0
  337. package/lib/tools/cli-client/program.js +382 -0
  338. package/lib/tools/cli-client/registry.js +176 -0
  339. package/lib/tools/cli-client/session.js +289 -0
  340. package/lib/tools/cli-client/skill/SKILL.md +326 -0
  341. package/lib/tools/cli-client/skill/references/element-attributes.md +23 -0
  342. package/lib/tools/cli-client/skill/references/playwright-tests.md +39 -0
  343. package/lib/tools/cli-client/skill/references/request-mocking.md +87 -0
  344. package/lib/tools/cli-client/skill/references/running-code.md +231 -0
  345. package/lib/tools/cli-client/skill/references/session-management.md +169 -0
  346. package/lib/tools/cli-client/skill/references/storage-state.md +275 -0
  347. package/lib/tools/cli-client/skill/references/test-generation.md +88 -0
  348. package/lib/tools/cli-client/skill/references/tracing.md +139 -0
  349. package/lib/tools/cli-client/skill/references/video-recording.md +46 -0
  350. package/lib/tools/cli-daemon/command.js +73 -0
  351. package/lib/tools/cli-daemon/commands.js +933 -0
  352. package/lib/tools/cli-daemon/daemon.js +178 -0
  353. package/lib/tools/cli-daemon/helpGenerator.js +173 -0
  354. package/lib/tools/cli-daemon/program.js +118 -0
  355. package/lib/tools/dashboard/appIcon.png +0 -0
  356. package/lib/tools/dashboard/dashboardApp.js +286 -0
  357. package/lib/tools/dashboard/dashboardController.js +296 -0
  358. package/lib/tools/exports.js +60 -0
  359. package/lib/tools/mcp/browserFactory.js +233 -0
  360. package/lib/tools/mcp/cdpRelay.js +353 -0
  361. package/lib/tools/mcp/cli-stub.js +7 -0
  362. package/lib/tools/mcp/config.d.js +16 -0
  363. package/lib/tools/mcp/config.js +401 -0
  364. package/lib/tools/mcp/configIni.js +189 -0
  365. package/lib/tools/mcp/extensionContextFactory.js +59 -0
  366. package/lib/tools/mcp/index.js +62 -0
  367. package/lib/tools/mcp/log.js +35 -0
  368. package/lib/tools/mcp/program.js +107 -0
  369. package/lib/tools/mcp/protocol.js +28 -0
  370. package/lib/tools/mcp/watchdog.js +44 -0
  371. package/lib/tools/trace/SKILL.md +163 -0
  372. package/lib/tools/trace/installSkill.js +48 -0
  373. package/lib/tools/trace/traceActions.js +142 -0
  374. package/lib/tools/trace/traceAttachments.js +69 -0
  375. package/lib/tools/trace/traceCli.js +80 -0
  376. package/lib/tools/trace/traceConsole.js +97 -0
  377. package/lib/tools/trace/traceErrors.js +55 -0
  378. package/lib/tools/trace/traceOpen.js +69 -0
  379. package/lib/tools/trace/traceParser.js +96 -0
  380. package/lib/tools/trace/traceRequests.js +158 -0
  381. package/lib/tools/trace/traceScreenshot.js +68 -0
  382. package/lib/tools/trace/traceSnapshot.js +149 -0
  383. package/lib/tools/trace/traceUtils.js +135 -0
  384. package/lib/tools/utils/connect.js +32 -0
  385. package/lib/tools/utils/mcp/http.js +152 -0
  386. package/lib/tools/utils/mcp/server.js +230 -0
  387. package/lib/tools/utils/mcp/tool.js +47 -0
  388. package/lib/tools/utils/socketConnection.js +108 -0
  389. package/lib/utils/isomorphic/ariaSnapshot.js +455 -0
  390. package/lib/utils/isomorphic/assert.js +31 -0
  391. package/lib/utils/isomorphic/colors.js +72 -0
  392. package/lib/utils/isomorphic/cssParser.js +245 -0
  393. package/lib/utils/isomorphic/cssTokenizer.js +1051 -0
  394. package/lib/utils/isomorphic/formatUtils.js +64 -0
  395. package/lib/utils/isomorphic/headers.js +53 -0
  396. package/lib/utils/isomorphic/imageUtils.js +141 -0
  397. package/lib/utils/isomorphic/locatorGenerators.js +689 -0
  398. package/lib/utils/isomorphic/locatorParser.js +176 -0
  399. package/lib/utils/isomorphic/locatorUtils.js +81 -0
  400. package/lib/utils/isomorphic/lruCache.js +51 -0
  401. package/lib/utils/isomorphic/manualPromise.js +114 -0
  402. package/lib/utils/isomorphic/mimeType.js +464 -0
  403. package/lib/utils/isomorphic/multimap.js +80 -0
  404. package/lib/utils/isomorphic/protocolFormatter.js +81 -0
  405. package/lib/utils/isomorphic/protocolMetainfo.js +347 -0
  406. package/lib/utils/isomorphic/rtti.js +43 -0
  407. package/lib/utils/isomorphic/selectorParser.js +386 -0
  408. package/lib/utils/isomorphic/semaphore.js +54 -0
  409. package/lib/utils/isomorphic/stackTrace.js +158 -0
  410. package/lib/utils/isomorphic/stringUtils.js +204 -0
  411. package/lib/utils/isomorphic/time.js +49 -0
  412. package/lib/utils/isomorphic/timeoutRunner.js +66 -0
  413. package/lib/utils/isomorphic/trace/entries.js +16 -0
  414. package/lib/utils/isomorphic/trace/snapshotRenderer.js +492 -0
  415. package/lib/utils/isomorphic/trace/snapshotServer.js +120 -0
  416. package/lib/utils/isomorphic/trace/snapshotStorage.js +89 -0
  417. package/lib/utils/isomorphic/trace/traceLoader.js +131 -0
  418. package/lib/utils/isomorphic/trace/traceModel.js +366 -0
  419. package/lib/utils/isomorphic/trace/traceModernizer.js +401 -0
  420. package/lib/utils/isomorphic/trace/traceUtils.js +58 -0
  421. package/lib/utils/isomorphic/trace/versions/traceV3.js +16 -0
  422. package/lib/utils/isomorphic/trace/versions/traceV4.js +16 -0
  423. package/lib/utils/isomorphic/trace/versions/traceV5.js +16 -0
  424. package/lib/utils/isomorphic/trace/versions/traceV6.js +16 -0
  425. package/lib/utils/isomorphic/trace/versions/traceV7.js +16 -0
  426. package/lib/utils/isomorphic/trace/versions/traceV8.js +16 -0
  427. package/lib/utils/isomorphic/types.js +16 -0
  428. package/lib/utils/isomorphic/urlMatch.js +243 -0
  429. package/lib/utils/isomorphic/utilityScriptSerializers.js +262 -0
  430. package/lib/utils/isomorphic/yaml.js +84 -0
  431. package/lib/utils.js +113 -0
  432. package/lib/utilsBundle.js +91 -0
  433. package/lib/utilsBundleImpl/index.js +218 -0
  434. package/lib/utilsBundleImpl/xdg-open +1066 -0
  435. package/lib/vite/dashboard/assets/index-Bn2lDGZX.js +50 -0
  436. package/lib/vite/dashboard/assets/index-DDWrEWMc.css +1 -0
  437. package/lib/vite/dashboard/index.html +28 -0
  438. package/lib/vite/htmlReport/index.html +89 -0
  439. package/lib/vite/recorder/assets/codeMirrorModule-DYBRYzYX.css +1 -0
  440. package/lib/vite/recorder/assets/codeMirrorModule-RoSmqW0t.js +32 -0
  441. package/lib/vite/recorder/assets/codicon-DCmgc-ay.ttf +0 -0
  442. package/lib/vite/recorder/assets/index-CLrDthbi.js +193 -0
  443. package/lib/vite/recorder/assets/index-OFPIkgDs.css +1 -0
  444. package/lib/vite/recorder/index.html +29 -0
  445. package/lib/vite/recorder/playwright-logo.svg +9 -0
  446. package/lib/vite/traceViewer/assets/codeMirrorModule-Cigrr2OM.js +32 -0
  447. package/lib/vite/traceViewer/assets/defaultSettingsView-ConrJv9G.js +262 -0
  448. package/lib/vite/traceViewer/assets/xtermModule-CsJ4vdCR.js +9 -0
  449. package/lib/vite/traceViewer/codeMirrorModule.DYBRYzYX.css +1 -0
  450. package/lib/vite/traceViewer/codicon.DCmgc-ay.ttf +0 -0
  451. package/lib/vite/traceViewer/defaultSettingsView.B4dS75f0.css +1 -0
  452. package/lib/vite/traceViewer/index.CzXZzn5A.css +1 -0
  453. package/lib/vite/traceViewer/index.EVGp-u_4.js +2 -0
  454. package/lib/vite/traceViewer/index.html +43 -0
  455. package/lib/vite/traceViewer/manifest.webmanifest +16 -0
  456. package/lib/vite/traceViewer/playwright-logo.svg +9 -0
  457. package/lib/vite/traceViewer/snapshot.html +21 -0
  458. package/lib/vite/traceViewer/sw.bundle.js +5 -0
  459. package/lib/vite/traceViewer/uiMode.Bewj7-uD.js +6 -0
  460. package/lib/vite/traceViewer/uiMode.Btcz36p_.css +1 -0
  461. package/lib/vite/traceViewer/uiMode.html +17 -0
  462. package/lib/vite/traceViewer/xtermModule.DYP7pi_n.css +32 -0
  463. package/lib/zipBundle.js +34 -0
  464. package/lib/zipBundleImpl.js +5 -0
  465. package/package.json +46 -0
  466. package/types/protocol.d.ts +24365 -0
  467. package/types/structs.d.ts +45 -0
  468. package/types/types.d.ts +23498 -0
@@ -0,0 +1,106 @@
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 navigate_exports = {};
20
+ __export(navigate_exports, {
21
+ default: () => navigate_default
22
+ });
23
+ module.exports = __toCommonJS(navigate_exports);
24
+ var import_mcpBundle = require("../../mcpBundle");
25
+ var import_tool = require("./tool");
26
+ const navigate = (0, import_tool.defineTool)({
27
+ capability: "core-navigation",
28
+ schema: {
29
+ name: "browser_navigate",
30
+ title: "Navigate to a URL",
31
+ description: "Navigate to a URL",
32
+ inputSchema: import_mcpBundle.z.object({
33
+ url: import_mcpBundle.z.string().describe("The URL to navigate to")
34
+ }),
35
+ type: "action"
36
+ },
37
+ handle: async (context, params, response) => {
38
+ const tab = await context.ensureTab();
39
+ let url = params.url;
40
+ try {
41
+ new URL(url);
42
+ } catch (e) {
43
+ if (url.startsWith("localhost"))
44
+ url = "http://" + url;
45
+ else
46
+ url = "https://" + url;
47
+ }
48
+ context.checkUrlAllowed(url);
49
+ await tab.navigate(url);
50
+ response.setIncludeSnapshot();
51
+ response.addCode(`await page.goto('${url}');`);
52
+ }
53
+ });
54
+ const goBack = (0, import_tool.defineTabTool)({
55
+ capability: "core-navigation",
56
+ schema: {
57
+ name: "browser_navigate_back",
58
+ title: "Go back",
59
+ description: "Go back to the previous page in the history",
60
+ inputSchema: import_mcpBundle.z.object({}),
61
+ type: "action"
62
+ },
63
+ handle: async (tab, params, response) => {
64
+ await tab.page.goBack(tab.navigationTimeoutOptions);
65
+ response.setIncludeSnapshot();
66
+ response.addCode(`await page.goBack();`);
67
+ }
68
+ });
69
+ const goForward = (0, import_tool.defineTabTool)({
70
+ capability: "core-navigation",
71
+ skillOnly: true,
72
+ schema: {
73
+ name: "browser_navigate_forward",
74
+ title: "Go forward",
75
+ description: "Go forward to the next page in the history",
76
+ inputSchema: import_mcpBundle.z.object({}),
77
+ type: "action"
78
+ },
79
+ handle: async (tab, params, response) => {
80
+ await tab.page.goForward(tab.navigationTimeoutOptions);
81
+ response.setIncludeSnapshot();
82
+ response.addCode(`await page.goForward();`);
83
+ }
84
+ });
85
+ const reload = (0, import_tool.defineTabTool)({
86
+ capability: "core-navigation",
87
+ skillOnly: true,
88
+ schema: {
89
+ name: "browser_reload",
90
+ title: "Reload the page",
91
+ description: "Reload the current page",
92
+ inputSchema: import_mcpBundle.z.object({}),
93
+ type: "action"
94
+ },
95
+ handle: async (tab, params, response) => {
96
+ await tab.page.reload(tab.navigationTimeoutOptions);
97
+ response.setIncludeSnapshot();
98
+ response.addCode(`await page.reload();`);
99
+ }
100
+ });
101
+ var navigate_default = [
102
+ navigate,
103
+ goBack,
104
+ goForward,
105
+ reload
106
+ ];
@@ -0,0 +1,135 @@
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 network_exports = {};
20
+ __export(network_exports, {
21
+ default: () => network_default,
22
+ isFetch: () => isFetch,
23
+ renderRequest: () => renderRequest
24
+ });
25
+ module.exports = __toCommonJS(network_exports);
26
+ var import_mcpBundle = require("../../mcpBundle");
27
+ var import_tool = require("./tool");
28
+ const requests = (0, import_tool.defineTabTool)({
29
+ capability: "core",
30
+ schema: {
31
+ name: "browser_network_requests",
32
+ title: "List network requests",
33
+ description: "Returns all network requests since loading the page",
34
+ inputSchema: import_mcpBundle.z.object({
35
+ static: import_mcpBundle.z.boolean().default(false).describe("Whether to include successful static resources like images, fonts, scripts, etc. Defaults to false."),
36
+ requestBody: import_mcpBundle.z.boolean().default(false).describe("Whether to include request body. Defaults to false."),
37
+ requestHeaders: import_mcpBundle.z.boolean().default(false).describe("Whether to include request headers. Defaults to false."),
38
+ filter: import_mcpBundle.z.string().optional().describe('Only return requests whose URL matches this regexp (e.g. "/api/.*user").'),
39
+ filename: import_mcpBundle.z.string().optional().describe("Filename to save the network requests to. If not provided, requests are returned as text.")
40
+ }),
41
+ type: "readOnly"
42
+ },
43
+ handle: async (tab, params, response) => {
44
+ const requests2 = await tab.requests();
45
+ const filter = params.filter ? new RegExp(params.filter) : void 0;
46
+ const text = [];
47
+ for (const request of requests2) {
48
+ if (!params.static && !isFetch(request) && isSuccessfulResponse(request))
49
+ continue;
50
+ if (filter) {
51
+ filter.lastIndex = 0;
52
+ if (!filter.test(request.url()))
53
+ continue;
54
+ }
55
+ text.push(await renderRequest(request, params.requestBody, params.requestHeaders));
56
+ }
57
+ await response.addResult("Network", text.join("\n"), { prefix: "network", ext: "log", suggestedFilename: params.filename });
58
+ }
59
+ });
60
+ const networkClear = (0, import_tool.defineTabTool)({
61
+ capability: "core",
62
+ skillOnly: true,
63
+ schema: {
64
+ name: "browser_network_clear",
65
+ title: "Clear network requests",
66
+ description: "Clear all network requests",
67
+ inputSchema: import_mcpBundle.z.object({}),
68
+ type: "readOnly"
69
+ },
70
+ handle: async (tab, params, response) => {
71
+ await tab.clearRequests();
72
+ }
73
+ });
74
+ function isSuccessfulResponse(request) {
75
+ if (request.failure())
76
+ return false;
77
+ const response = request.existingResponse();
78
+ return !!response && response.status() < 400;
79
+ }
80
+ function isFetch(request) {
81
+ return ["fetch", "xhr"].includes(request.resourceType());
82
+ }
83
+ async function renderRequest(request, includeBody = false, includeHeaders = false) {
84
+ const response = request.existingResponse();
85
+ const result = [];
86
+ result.push(`[${request.method().toUpperCase()}] ${request.url()}`);
87
+ if (response)
88
+ result.push(` => [${response.status()}] ${response.statusText()}`);
89
+ else if (request.failure())
90
+ result.push(` => [FAILED] ${request.failure()?.errorText ?? "Unknown error"}`);
91
+ if (includeHeaders) {
92
+ const headers = request.headers();
93
+ const headerLines = Object.entries(headers).map(([k, v]) => ` ${k}: ${v}`).join("\n");
94
+ if (headerLines)
95
+ result.push(`
96
+ Request headers:
97
+ ${headerLines}`);
98
+ }
99
+ if (includeBody) {
100
+ const postData = request.postData();
101
+ if (postData)
102
+ result.push(`
103
+ Request body: ${postData}`);
104
+ }
105
+ return result.join("");
106
+ }
107
+ const networkStateSet = (0, import_tool.defineTool)({
108
+ capability: "network",
109
+ schema: {
110
+ name: "browser_network_state_set",
111
+ title: "Set network state",
112
+ description: "Sets the browser network state to online or offline. When offline, all network requests will fail.",
113
+ inputSchema: import_mcpBundle.z.object({
114
+ state: import_mcpBundle.z.enum(["online", "offline"]).describe('Set to "offline" to simulate offline mode, "online" to restore network connectivity')
115
+ }),
116
+ type: "action"
117
+ },
118
+ handle: async (context, params, response) => {
119
+ const browserContext = await context.ensureBrowserContext();
120
+ const offline = params.state === "offline";
121
+ await browserContext.setOffline(offline);
122
+ response.addTextResult(`Network is now ${params.state}`);
123
+ response.addCode(`await page.context().setOffline(${offline});`);
124
+ }
125
+ });
126
+ var network_default = [
127
+ requests,
128
+ networkClear,
129
+ networkStateSet
130
+ ];
131
+ // Annotate the CommonJS export names for ESM import in node:
132
+ 0 && (module.exports = {
133
+ isFetch,
134
+ renderRequest
135
+ });
@@ -0,0 +1,48 @@
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 pdf_exports = {};
20
+ __export(pdf_exports, {
21
+ default: () => pdf_default
22
+ });
23
+ module.exports = __toCommonJS(pdf_exports);
24
+ var import_mcpBundle = require("../../mcpBundle");
25
+ var import_stringUtils = require("../../utils/isomorphic/stringUtils");
26
+ var import_tool = require("./tool");
27
+ const pdfSchema = import_mcpBundle.z.object({
28
+ filename: import_mcpBundle.z.string().optional().describe("File name to save the pdf to. Defaults to `page-{timestamp}.pdf` if not specified. Prefer relative file names to stay within the output directory.")
29
+ });
30
+ const pdf = (0, import_tool.defineTabTool)({
31
+ capability: "pdf",
32
+ schema: {
33
+ name: "browser_pdf_save",
34
+ title: "Save as PDF",
35
+ description: "Save page as PDF",
36
+ inputSchema: pdfSchema,
37
+ type: "readOnly"
38
+ },
39
+ handle: async (tab, params, response) => {
40
+ const data = await tab.page.pdf();
41
+ const result = await response.resolveClientFile({ prefix: "page", ext: "pdf", suggestedFilename: params.filename }, "Page as pdf");
42
+ await response.addFileResult(result, data);
43
+ response.addCode(`await page.pdf(${(0, import_stringUtils.formatObject)({ path: result.relativeName })});`);
44
+ }
45
+ });
46
+ var pdf_default = [
47
+ pdf
48
+ ];
@@ -0,0 +1,74 @@
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 recorder_exports = {};
30
+ __export(recorder_exports, {
31
+ default: () => recorder_default
32
+ });
33
+ module.exports = __toCommonJS(recorder_exports);
34
+ var import_fs = __toESM(require("fs"));
35
+ var import_path = __toESM(require("path"));
36
+ var import_mcpBundle = require("../../mcpBundle");
37
+ var import_tool = require("./tool");
38
+ const recorderGetSession = (0, import_tool.defineTool)({
39
+ capability: "core",
40
+ schema: {
41
+ name: "recorder_get_session",
42
+ title: "Get recorder session prompt",
43
+ description: 'Read the Playwright recorder session prompt. Returns recorded actions, network events, and instructions for generating a Playwright test. Available live during recording (via .playwright-session.md) or after clicking "Generate Test" (via .playwright-prompt.md). Requires `npx playwright codegen --ai-codegen`.',
44
+ inputSchema: import_mcpBundle.z.object({
45
+ path: import_mcpBundle.z.string().optional().describe(
46
+ "Path to the prompt file. Defaults to checking .playwright-session.md (live) then .playwright-prompt.md in the current working directory."
47
+ )
48
+ }),
49
+ type: "readOnly"
50
+ },
51
+ handle: async (context, params, response) => {
52
+ const cwd = context.options.cwd;
53
+ if (params.path) {
54
+ try {
55
+ const content = await import_fs.default.promises.readFile(params.path, "utf-8");
56
+ response.addTextResult(content);
57
+ return;
58
+ } catch (err) {
59
+ response.addTextResult(err.code === "ENOENT" ? `File not found: ${params.path}` : `Failed to read: ${err.message}`);
60
+ return;
61
+ }
62
+ }
63
+ for (const file of [import_path.default.join(cwd, ".playwright-session.md"), import_path.default.join(cwd, ".playwright-prompt.md")]) {
64
+ try {
65
+ const content = await import_fs.default.promises.readFile(file, "utf-8");
66
+ response.addTextResult(content);
67
+ return;
68
+ } catch {
69
+ }
70
+ }
71
+ response.addTextResult("No recorder session found. Run `npx playwright codegen --ai-codegen`, record actions, and the session will be available here automatically.");
72
+ }
73
+ });
74
+ var recorder_default = [recorderGetSession];
@@ -0,0 +1,302 @@
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
+ _computRelativeTo(fileName) {
58
+ return import_path.default.relative(this._clientWorkspace, fileName);
59
+ }
60
+ async resolveClientFile(template, title) {
61
+ let fileName;
62
+ if (template.suggestedFilename)
63
+ fileName = await this.resolveClientFilename(template.suggestedFilename);
64
+ else
65
+ fileName = await this._context.outputFile(template, { origin: "llm" });
66
+ const relativeName = this._computRelativeTo(fileName);
67
+ const printableLink = `- [${title}](${relativeName})`;
68
+ return { fileName, relativeName, printableLink };
69
+ }
70
+ async resolveClientFilename(filename) {
71
+ return await this._context.workspaceFile(filename, this._clientWorkspace);
72
+ }
73
+ addTextResult(text) {
74
+ this._results.push(text);
75
+ }
76
+ async addResult(title, data, file) {
77
+ if (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 _writeFile(resolvedFile, data) {
85
+ if (typeof data === "string")
86
+ await import_fs.default.promises.writeFile(resolvedFile.fileName, this._redactSecrets(data), "utf-8");
87
+ else if (data)
88
+ await import_fs.default.promises.writeFile(resolvedFile.fileName, data);
89
+ }
90
+ async addFileResult(resolvedFile, data) {
91
+ await this._writeFile(resolvedFile, data);
92
+ this.addTextResult(resolvedFile.printableLink);
93
+ }
94
+ addFileLink(title, fileName) {
95
+ const relativeName = this._computRelativeTo(fileName);
96
+ this.addTextResult(`- [${title}](${relativeName})`);
97
+ }
98
+ async registerImageResult(data, imageType) {
99
+ this._imageResults.push({ data, imageType });
100
+ }
101
+ setClose() {
102
+ this._isClose = true;
103
+ }
104
+ addError(error) {
105
+ this._errors.push(error);
106
+ }
107
+ addCode(code) {
108
+ this._code.push(code);
109
+ }
110
+ setIncludeSnapshot() {
111
+ this._includeSnapshot = this._context.config.snapshot?.mode ?? "full";
112
+ }
113
+ setIncludeFullSnapshot(includeSnapshotFileName, selector, depth) {
114
+ this._includeSnapshot = "explicit";
115
+ this._includeSnapshotFileName = includeSnapshotFileName;
116
+ this._includeSnapshotDepth = depth;
117
+ this._includeSnapshotSelector = selector;
118
+ }
119
+ _redactSecrets(text) {
120
+ for (const [secretName, secretValue] of Object.entries(this._context.config.secrets ?? {}))
121
+ text = text.replaceAll(secretValue, `<secret>${secretName}</secret>`);
122
+ return text;
123
+ }
124
+ async serialize() {
125
+ const sections = await this._build();
126
+ const text = [];
127
+ for (const section of sections) {
128
+ if (!section.content.length)
129
+ continue;
130
+ text.push(`### ${section.title}`);
131
+ if (section.codeframe)
132
+ text.push(`\`\`\`${section.codeframe}`);
133
+ text.push(...section.content);
134
+ if (section.codeframe)
135
+ text.push("```");
136
+ }
137
+ const content = [
138
+ {
139
+ type: "text",
140
+ text: sanitizeUnicode(this._redactSecrets(text.join("\n")))
141
+ }
142
+ ];
143
+ if (this._context.config.imageResponses !== "omit") {
144
+ for (const imageResult of this._imageResults) {
145
+ const scaledData = (0, import_screenshot.scaleImageToFitMessage)(imageResult.data, imageResult.imageType);
146
+ content.push({ type: "image", data: scaledData.toString("base64"), mimeType: imageResult.imageType === "png" ? "image/png" : "image/jpeg" });
147
+ }
148
+ }
149
+ return {
150
+ content,
151
+ ...this._isClose ? { isClose: true } : {},
152
+ ...sections.some((section) => section.isError) ? { isError: true } : {}
153
+ };
154
+ }
155
+ async _build() {
156
+ const sections = [];
157
+ const addSection = (title, content, codeframe) => {
158
+ const section = { title, content, isError: title === "Error", codeframe };
159
+ sections.push(section);
160
+ return content;
161
+ };
162
+ if (this._errors.length)
163
+ addSection("Error", this._errors);
164
+ if (this._results.length)
165
+ addSection("Result", this._results);
166
+ if (this._context.config.codegen !== "none" && this._code.length)
167
+ addSection("Ran Playwright code", this._code, "js");
168
+ const tabSnapshot = this._context.currentTab() ? await this._context.currentTabOrDie().captureSnapshot(this._includeSnapshotSelector, this._includeSnapshotDepth, this._clientWorkspace) : void 0;
169
+ const tabHeaders = await Promise.all(this._context.tabs().map((tab) => tab.headerSnapshot()));
170
+ if (this._includeSnapshot !== "none" || tabHeaders.some((header) => header.changed)) {
171
+ if (tabHeaders.length !== 1)
172
+ addSection("Open tabs", renderTabsMarkdown(tabHeaders));
173
+ addSection("Page", renderTabMarkdown(tabHeaders.find((h) => h.current) ?? tabHeaders[0]));
174
+ }
175
+ if (this._context.tabs().length === 0)
176
+ this._isClose = true;
177
+ if (tabSnapshot?.modalStates.length)
178
+ addSection("Modal state", (0, import_tab.renderModalStates)(this._context.config, tabSnapshot.modalStates));
179
+ if (tabSnapshot && this._includeSnapshot !== "none") {
180
+ if (this._includeSnapshot !== "explicit" || this._includeSnapshotFileName) {
181
+ const suggestedFilename = this._includeSnapshotFileName === "<auto>" ? void 0 : this._includeSnapshotFileName;
182
+ const resolvedFile = await this.resolveClientFile({ prefix: "page", ext: "yml", suggestedFilename }, "Snapshot");
183
+ await this._writeFile(resolvedFile, tabSnapshot.ariaSnapshot);
184
+ addSection("Snapshot", [resolvedFile.printableLink]);
185
+ } else {
186
+ addSection("Snapshot", [tabSnapshot.ariaSnapshot], "yaml");
187
+ }
188
+ }
189
+ const text = [];
190
+ if (tabSnapshot?.consoleLink)
191
+ text.push(`- New console entries: ${tabSnapshot.consoleLink}`);
192
+ if (tabSnapshot?.events.filter((event) => event.type !== "request").length) {
193
+ for (const event of tabSnapshot.events) {
194
+ if (event.type === "download-start")
195
+ text.push(`- Downloading file ${event.download.download.suggestedFilename()} ...`);
196
+ else if (event.type === "download-finish")
197
+ text.push(`- Downloaded file ${event.download.download.suggestedFilename()} to "${this._computRelativeTo(event.download.outputFile)}"`);
198
+ }
199
+ }
200
+ if (text.length)
201
+ addSection("Events", text);
202
+ const pausedDetails = this._context.debugger().pausedDetails();
203
+ if (pausedDetails.length) {
204
+ addSection("Paused", [
205
+ ...pausedDetails.map((call) => `- ${call.title} at ${this._computRelativeTo(call.location.file)}${call.location.line ? ":" + call.location.line : ""}`),
206
+ "- Use any tools to explore and interact, resume by calling resume/step-over/pause-at"
207
+ ]);
208
+ }
209
+ return sections;
210
+ }
211
+ }
212
+ function renderTabMarkdown(tab) {
213
+ const lines = [`- Page URL: ${tab.url}`];
214
+ if (tab.title)
215
+ lines.push(`- Page Title: ${tab.title}`);
216
+ if (tab.console.errors || tab.console.warnings)
217
+ lines.push(`- Console: ${tab.console.errors} errors, ${tab.console.warnings} warnings`);
218
+ return lines;
219
+ }
220
+ function renderTabsMarkdown(tabs) {
221
+ if (!tabs.length)
222
+ return ["No open tabs. Navigate to a URL to create one."];
223
+ const lines = [];
224
+ for (let i = 0; i < tabs.length; i++) {
225
+ const tab = tabs[i];
226
+ const current = tab.current ? " (current)" : "";
227
+ lines.push(`- ${i}:${current} [${tab.title}](${tab.url})`);
228
+ }
229
+ return lines;
230
+ }
231
+ function sanitizeUnicode(text) {
232
+ return text.toWellFormed?.() ?? text;
233
+ }
234
+ function parseSections(text) {
235
+ const sections = /* @__PURE__ */ new Map();
236
+ const sectionHeaders = text.split(/^### /m).slice(1);
237
+ for (const section of sectionHeaders) {
238
+ const firstNewlineIndex = section.indexOf("\n");
239
+ if (firstNewlineIndex === -1)
240
+ continue;
241
+ const sectionName = section.substring(0, firstNewlineIndex);
242
+ const sectionContent = section.substring(firstNewlineIndex + 1).trim();
243
+ sections.set(sectionName, sectionContent);
244
+ }
245
+ return sections;
246
+ }
247
+ function parseResponse(response, cwd) {
248
+ if (response.content?.[0].type !== "text")
249
+ return void 0;
250
+ const text = response.content[0].text;
251
+ const sections = parseSections(text);
252
+ const error = sections.get("Error");
253
+ const result = sections.get("Result");
254
+ const code = sections.get("Ran Playwright code");
255
+ const tabs = sections.get("Open tabs");
256
+ const page = sections.get("Page");
257
+ const snapshotSection = sections.get("Snapshot");
258
+ const events = sections.get("Events");
259
+ const modalState = sections.get("Modal state");
260
+ const paused = sections.get("Paused");
261
+ const codeNoFrame = code?.replace(/^```js\n/, "").replace(/\n```$/, "");
262
+ const isError = response.isError;
263
+ const attachments = response.content.length > 1 ? response.content.slice(1) : void 0;
264
+ let snapshot;
265
+ let inlineSnapshot;
266
+ if (snapshotSection) {
267
+ const match = snapshotSection.match(/\[Snapshot\]\(([^)]+)\)/);
268
+ if (match) {
269
+ if (cwd) {
270
+ try {
271
+ snapshot = import_fs.default.readFileSync(import_path.default.resolve(cwd, match[1]), "utf-8");
272
+ } catch {
273
+ }
274
+ }
275
+ } else {
276
+ inlineSnapshot = snapshotSection.replace(/^```yaml\n?/, "").replace(/\n?```$/, "");
277
+ }
278
+ }
279
+ return {
280
+ result,
281
+ error,
282
+ code: codeNoFrame,
283
+ tabs,
284
+ page,
285
+ snapshot,
286
+ inlineSnapshot,
287
+ events,
288
+ modalState,
289
+ paused,
290
+ isError,
291
+ attachments,
292
+ text
293
+ };
294
+ }
295
+ // Annotate the CommonJS export names for ESM import in node:
296
+ 0 && (module.exports = {
297
+ Response,
298
+ parseResponse,
299
+ renderTabMarkdown,
300
+ renderTabsMarkdown,
301
+ requestDebug
302
+ });