patchright-bun 1.58.1 → 1.59.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (183) hide show
  1. package/README.md +225 -225
  2. package/ThirdPartyNotices.txt +3918 -5041
  3. package/cli.js +19 -19
  4. package/index.d.ts +17 -17
  5. package/index.js +17 -17
  6. package/index.mjs +18 -18
  7. package/jsx-runtime.js +42 -42
  8. package/jsx-runtime.mjs +21 -21
  9. package/lib/agents/agentParser.js +89 -89
  10. package/lib/agents/copilot-setup-steps.yml +34 -34
  11. package/lib/agents/generateAgents.js +346 -348
  12. package/lib/agents/playwright-test-coverage.prompt.md +31 -31
  13. package/lib/agents/playwright-test-generate.prompt.md +8 -8
  14. package/lib/agents/playwright-test-generator.agent.md +88 -88
  15. package/lib/agents/playwright-test-heal.prompt.md +6 -6
  16. package/lib/agents/playwright-test-healer.agent.md +55 -55
  17. package/lib/agents/playwright-test-plan.prompt.md +9 -9
  18. package/lib/agents/playwright-test-planner.agent.md +73 -73
  19. package/lib/common/config.js +281 -282
  20. package/lib/common/configLoader.js +344 -344
  21. package/lib/common/esmLoaderHost.js +104 -104
  22. package/lib/common/expectBundle.js +28 -28
  23. package/lib/common/expectBundleImpl.js +407 -407
  24. package/lib/common/fixtures.js +302 -302
  25. package/lib/common/globals.js +58 -58
  26. package/lib/common/ipc.js +60 -60
  27. package/lib/common/poolBuilder.js +85 -85
  28. package/lib/common/process.js +133 -132
  29. package/lib/common/suiteUtils.js +140 -140
  30. package/lib/common/test.js +330 -321
  31. package/lib/common/testLoader.js +101 -101
  32. package/lib/common/testType.js +301 -298
  33. package/lib/common/validators.js +68 -68
  34. package/lib/errorContext.js +121 -0
  35. package/lib/fsWatcher.js +67 -67
  36. package/lib/index.js +764 -726
  37. package/lib/internalsForTest.js +42 -42
  38. package/lib/isomorphic/events.js +77 -77
  39. package/lib/isomorphic/folders.js +30 -30
  40. package/lib/isomorphic/stringInternPool.js +69 -69
  41. package/lib/isomorphic/teleReceiver.js +538 -521
  42. package/lib/isomorphic/teleSuiteUpdater.js +157 -157
  43. package/lib/isomorphic/testServerConnection.js +223 -225
  44. package/lib/isomorphic/testServerInterface.js +16 -16
  45. package/lib/isomorphic/testTree.js +329 -329
  46. package/lib/isomorphic/types.d.js +16 -16
  47. package/lib/loader/loaderMain.js +59 -59
  48. package/lib/matchers/expect.js +311 -311
  49. package/lib/matchers/matcherHint.js +44 -44
  50. package/lib/matchers/matchers.js +385 -383
  51. package/lib/matchers/toBeTruthy.js +75 -75
  52. package/lib/matchers/toEqual.js +100 -100
  53. package/lib/matchers/toHaveURL.js +101 -101
  54. package/lib/matchers/toMatchAriaSnapshot.js +163 -159
  55. package/lib/matchers/toMatchSnapshot.js +349 -342
  56. package/lib/matchers/toMatchText.js +99 -99
  57. package/lib/mcp/test/browserBackend.js +121 -98
  58. package/lib/mcp/test/generatorTools.js +122 -122
  59. package/lib/mcp/test/plannerTools.js +145 -145
  60. package/lib/mcp/test/seed.js +82 -82
  61. package/lib/mcp/test/streams.js +44 -44
  62. package/lib/mcp/test/testBackend.js +99 -99
  63. package/lib/mcp/test/testContext.js +283 -285
  64. package/lib/mcp/test/testTool.js +30 -30
  65. package/lib/mcp/test/testTools.js +108 -108
  66. package/lib/plugins/gitCommitInfoPlugin.js +198 -198
  67. package/lib/plugins/index.js +28 -28
  68. package/lib/plugins/webServerPlugin.js +238 -237
  69. package/lib/program.js +239 -417
  70. package/lib/reportActions.js +80 -0
  71. package/lib/reporters/base.js +633 -634
  72. package/lib/reporters/blob.js +138 -138
  73. package/lib/reporters/dot.js +99 -99
  74. package/lib/reporters/empty.js +32 -32
  75. package/lib/reporters/github.js +127 -128
  76. package/lib/reporters/html.js +666 -633
  77. package/lib/reporters/internalReporter.js +138 -138
  78. package/lib/reporters/json.js +254 -254
  79. package/lib/reporters/junit.js +321 -232
  80. package/lib/reporters/line.js +131 -131
  81. package/lib/reporters/list.js +252 -253
  82. package/lib/reporters/listModeReporter.js +69 -69
  83. package/lib/reporters/markdown.js +144 -144
  84. package/lib/reporters/merge.js +579 -558
  85. package/lib/reporters/multiplexer.js +116 -112
  86. package/lib/reporters/reporterV2.js +102 -102
  87. package/lib/reporters/teleEmitter.js +319 -317
  88. package/lib/reporters/versions/blobV1.js +16 -16
  89. package/lib/runner/dispatcher.js +522 -530
  90. package/lib/runner/failureTracker.js +72 -72
  91. package/lib/runner/lastRun.js +77 -77
  92. package/lib/runner/loadUtils.js +340 -334
  93. package/lib/runner/loaderHost.js +89 -89
  94. package/lib/runner/processHost.js +180 -180
  95. package/lib/runner/projectUtils.js +241 -241
  96. package/lib/runner/rebase.js +189 -189
  97. package/lib/runner/reporters.js +143 -138
  98. package/lib/runner/sigIntWatcher.js +96 -96
  99. package/lib/runner/taskRunner.js +127 -127
  100. package/lib/runner/tasks.js +413 -410
  101. package/lib/runner/testGroups.js +125 -125
  102. package/lib/runner/testRunner.js +398 -398
  103. package/lib/runner/testServer.js +269 -269
  104. package/lib/runner/uiModeReporter.js +30 -30
  105. package/lib/runner/vcs.js +72 -72
  106. package/lib/runner/watchMode.js +396 -396
  107. package/lib/runner/workerHost.js +101 -104
  108. package/lib/testActions.js +220 -0
  109. package/lib/third_party/pirates.js +62 -62
  110. package/lib/third_party/tsconfig-loader.js +103 -103
  111. package/lib/transform/babelBundle.js +43 -46
  112. package/lib/transform/babelBundleImpl.js +461 -461
  113. package/lib/transform/compilationCache.js +272 -274
  114. package/lib/transform/esmLoader.js +105 -103
  115. package/lib/transform/portTransport.js +67 -67
  116. package/lib/transform/transform.js +296 -303
  117. package/lib/util.js +400 -400
  118. package/lib/utilsBundle.js +43 -50
  119. package/lib/utilsBundleImpl.js +100 -103
  120. package/lib/worker/fixtureRunner.js +262 -262
  121. package/lib/worker/testInfo.js +532 -536
  122. package/lib/worker/testTracing.js +351 -345
  123. package/lib/worker/timeoutManager.js +185 -174
  124. package/lib/worker/util.js +31 -31
  125. package/lib/worker/workerMain.js +533 -530
  126. package/package.json +2 -6
  127. package/test.d.ts +18 -18
  128. package/test.js +24 -24
  129. package/test.mjs +34 -34
  130. package/types/test.d.ts +10322 -10251
  131. package/types/testReporter.d.ts +822 -822
  132. package/lib/mcp/browser/browserContextFactory.js +0 -329
  133. package/lib/mcp/browser/browserServerBackend.js +0 -84
  134. package/lib/mcp/browser/config.js +0 -421
  135. package/lib/mcp/browser/context.js +0 -244
  136. package/lib/mcp/browser/response.js +0 -278
  137. package/lib/mcp/browser/sessionLog.js +0 -75
  138. package/lib/mcp/browser/tab.js +0 -343
  139. package/lib/mcp/browser/tools/common.js +0 -65
  140. package/lib/mcp/browser/tools/console.js +0 -46
  141. package/lib/mcp/browser/tools/dialogs.js +0 -60
  142. package/lib/mcp/browser/tools/evaluate.js +0 -61
  143. package/lib/mcp/browser/tools/files.js +0 -58
  144. package/lib/mcp/browser/tools/form.js +0 -63
  145. package/lib/mcp/browser/tools/install.js +0 -72
  146. package/lib/mcp/browser/tools/keyboard.js +0 -107
  147. package/lib/mcp/browser/tools/mouse.js +0 -107
  148. package/lib/mcp/browser/tools/navigate.js +0 -71
  149. package/lib/mcp/browser/tools/network.js +0 -63
  150. package/lib/mcp/browser/tools/open.js +0 -57
  151. package/lib/mcp/browser/tools/pdf.js +0 -49
  152. package/lib/mcp/browser/tools/runCode.js +0 -78
  153. package/lib/mcp/browser/tools/screenshot.js +0 -93
  154. package/lib/mcp/browser/tools/snapshot.js +0 -173
  155. package/lib/mcp/browser/tools/tabs.js +0 -67
  156. package/lib/mcp/browser/tools/tool.js +0 -47
  157. package/lib/mcp/browser/tools/tracing.js +0 -74
  158. package/lib/mcp/browser/tools/utils.js +0 -94
  159. package/lib/mcp/browser/tools/verify.js +0 -143
  160. package/lib/mcp/browser/tools/wait.js +0 -63
  161. package/lib/mcp/browser/tools.js +0 -84
  162. package/lib/mcp/browser/watchdog.js +0 -44
  163. package/lib/mcp/config.d.js +0 -16
  164. package/lib/mcp/extension/cdpRelay.js +0 -351
  165. package/lib/mcp/extension/extensionContextFactory.js +0 -76
  166. package/lib/mcp/extension/protocol.js +0 -28
  167. package/lib/mcp/index.js +0 -61
  168. package/lib/mcp/log.js +0 -35
  169. package/lib/mcp/program.js +0 -111
  170. package/lib/mcp/sdk/exports.js +0 -28
  171. package/lib/mcp/sdk/http.js +0 -152
  172. package/lib/mcp/sdk/inProcessTransport.js +0 -71
  173. package/lib/mcp/sdk/server.js +0 -223
  174. package/lib/mcp/sdk/tool.js +0 -47
  175. package/lib/mcp/terminal/cli.js +0 -296
  176. package/lib/mcp/terminal/command.js +0 -56
  177. package/lib/mcp/terminal/commands.js +0 -333
  178. package/lib/mcp/terminal/daemon.js +0 -129
  179. package/lib/mcp/terminal/help.json +0 -32
  180. package/lib/mcp/terminal/helpGenerator.js +0 -88
  181. package/lib/mcp/terminal/socketConnection.js +0 -80
  182. package/lib/runner/storage.js +0 -91
  183. package/lib/transform/md.js +0 -221
@@ -1,71 +0,0 @@
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("patchright-core/lib/mcpBundle");
25
- var import_tool = require("./tool");
26
- const navigate = (0, import_tool.defineTool)({
27
- capability: "core",
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
- await tab.navigate(url);
49
- response.setIncludeSnapshot();
50
- response.addCode(`await page.goto('${params.url}');`);
51
- }
52
- });
53
- const goBack = (0, import_tool.defineTabTool)({
54
- capability: "core",
55
- schema: {
56
- name: "browser_navigate_back",
57
- title: "Go back",
58
- description: "Go back to the previous page",
59
- inputSchema: import_mcpBundle.z.object({}),
60
- type: "action"
61
- },
62
- handle: async (tab, params, response) => {
63
- await tab.page.goBack();
64
- response.setIncludeSnapshot();
65
- response.addCode(`await page.goBack();`);
66
- }
67
- });
68
- var navigate_default = [
69
- navigate,
70
- goBack
71
- ];
@@ -1,63 +0,0 @@
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
- });
23
- module.exports = __toCommonJS(network_exports);
24
- var import_mcpBundle = require("patchright-core/lib/mcpBundle");
25
- var import_tool = require("./tool");
26
- const requests = (0, import_tool.defineTabTool)({
27
- capability: "core",
28
- schema: {
29
- name: "browser_network_requests",
30
- title: "List network requests",
31
- description: "Returns all network requests since loading the page",
32
- inputSchema: import_mcpBundle.z.object({
33
- includeStatic: import_mcpBundle.z.boolean().default(false).describe("Whether to include successful static resources like images, fonts, scripts, etc. Defaults to false."),
34
- filename: import_mcpBundle.z.string().optional().describe("Filename to save the network requests to. If not provided, requests are returned as text.")
35
- }),
36
- type: "readOnly"
37
- },
38
- handle: async (tab, params, response) => {
39
- const requests2 = await tab.requests();
40
- const text = [];
41
- for (const request of requests2) {
42
- const rendered = await renderRequest(request, params.includeStatic);
43
- if (rendered)
44
- text.push(rendered);
45
- }
46
- await response.addResult({ text: text.join("\n"), suggestedFilename: params.filename });
47
- }
48
- });
49
- async function renderRequest(request, includeStatic) {
50
- const response = request._hasResponse ? await request.response() : void 0;
51
- const isStaticRequest = ["document", "stylesheet", "image", "media", "font", "script", "manifest"].includes(request.resourceType());
52
- const isSuccessfulRequest = !response || response.status() < 400;
53
- if (isStaticRequest && isSuccessfulRequest && !includeStatic)
54
- return void 0;
55
- const result = [];
56
- result.push(`[${request.method().toUpperCase()}] ${request.url()}`);
57
- if (response)
58
- result.push(`=> [${response.status()}] ${response.statusText()}`);
59
- return result.join(" ");
60
- }
61
- var network_default = [
62
- requests
63
- ];
@@ -1,57 +0,0 @@
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 open_exports = {};
20
- __export(open_exports, {
21
- default: () => open_default
22
- });
23
- module.exports = __toCommonJS(open_exports);
24
- var import_mcpBundle = require("patchright-core/lib/mcpBundle");
25
- var import_tool = require("./tool");
26
- const open = (0, import_tool.defineTool)({
27
- capability: "internal",
28
- schema: {
29
- name: "browser_open",
30
- title: "Open URL",
31
- description: "Open a URL in the browser",
32
- inputSchema: import_mcpBundle.z.object({
33
- url: import_mcpBundle.z.string().describe("The URL to open"),
34
- headed: import_mcpBundle.z.boolean().optional().describe("Run browser in headed mode")
35
- }),
36
- type: "action"
37
- },
38
- handle: async (context, params, response) => {
39
- const forceHeadless = params.headed ? "headed" : "headless";
40
- const tab = await context.ensureTab({ forceHeadless });
41
- let url = params.url;
42
- try {
43
- new URL(url);
44
- } catch (e) {
45
- if (url.startsWith("localhost"))
46
- url = "http://" + url;
47
- else
48
- url = "https://" + url;
49
- }
50
- await tab.navigate(url);
51
- response.setIncludeSnapshot();
52
- response.addCode(`await page.goto('${params.url}');`);
53
- }
54
- });
55
- var open_default = [
56
- open
57
- ];
@@ -1,49 +0,0 @@
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("patchright-core/lib/mcpBundle");
25
- var import_utils = require("patchright-core/lib/utils");
26
- var import_tool = require("./tool");
27
- var import_utils2 = require("./utils");
28
- const pdfSchema = import_mcpBundle.z.object({
29
- 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.")
30
- });
31
- const pdf = (0, import_tool.defineTabTool)({
32
- capability: "pdf",
33
- schema: {
34
- name: "browser_pdf_save",
35
- title: "Save as PDF",
36
- description: "Save page as PDF",
37
- inputSchema: pdfSchema,
38
- type: "readOnly"
39
- },
40
- handle: async (tab, params, response) => {
41
- const data = await tab.page.pdf();
42
- const suggestedFilename = params.filename ?? (0, import_utils2.dateAsFileName)("pdf");
43
- await response.addResult({ data, title: "Page as pdf", suggestedFilename });
44
- response.addCode(`await page.pdf(${(0, import_utils.formatObject)({ path: suggestedFilename })});`);
45
- }
46
- });
47
- var pdf_default = [
48
- pdf
49
- ];
@@ -1,78 +0,0 @@
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_utils = require("patchright-core/lib/utils");
36
- var import_mcpBundle = require("patchright-core/lib/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
- filename: import_mcpBundle.z.string().optional().describe("Filename to save the result to. If not provided, result is returned as JSON string.")
41
- });
42
- const runCode = (0, import_tool.defineTabTool)({
43
- capability: "core",
44
- schema: {
45
- name: "browser_run_code",
46
- title: "Run Playwright code",
47
- description: "Run Playwright code snippet",
48
- inputSchema: codeSchema,
49
- type: "action"
50
- },
51
- handle: async (tab, params, response) => {
52
- response.setIncludeSnapshot();
53
- response.addCode(`await (${params.code})(page);`);
54
- const __end__ = new import_utils.ManualPromise();
55
- const context = {
56
- page: tab.page,
57
- __end__
58
- };
59
- import_vm.default.createContext(context);
60
- await tab.waitForCompletion(async () => {
61
- const snippet = `(async () => {
62
- try {
63
- const result = await (${params.code})(page);
64
- __end__.resolve(JSON.stringify(result));
65
- } catch (e) {
66
- __end__.reject(e);
67
- }
68
- })()`;
69
- await import_vm.default.runInContext(snippet, context);
70
- const result = await __end__;
71
- if (typeof result === "string")
72
- await response.addResult({ text: result, suggestedFilename: params.filename });
73
- });
74
- }
75
- });
76
- var runCode_default = [
77
- runCode
78
- ];
@@ -1,93 +0,0 @@
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_utils = require("patchright-core/lib/utils");
26
- var import_utilsBundle = require("patchright-core/lib/utilsBundle");
27
- var import_utils2 = require("patchright-core/lib/utils");
28
- var import_mcpBundle = require("patchright-core/lib/mcpBundle");
29
- var import_tool = require("./tool");
30
- var import_utils3 = require("./utils");
31
- const screenshotSchema = import_mcpBundle.z.object({
32
- type: import_mcpBundle.z.enum(["png", "jpeg"]).default("png").describe("Image format for the screenshot. Default is png."),
33
- 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."),
34
- 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."),
35
- 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."),
36
- 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.")
37
- });
38
- const screenshot = (0, import_tool.defineTabTool)({
39
- capability: "core",
40
- schema: {
41
- name: "browser_take_screenshot",
42
- title: "Take a screenshot",
43
- description: `Take a screenshot of the current page. You can't perform actions based on the screenshot, use browser_snapshot for actions.`,
44
- inputSchema: screenshotSchema,
45
- type: "readOnly"
46
- },
47
- handle: async (tab, params, response) => {
48
- if (!!params.element !== !!params.ref)
49
- throw new Error("Both element and ref must be provided or neither.");
50
- if (params.fullPage && params.ref)
51
- throw new Error("fullPage cannot be used with element screenshots.");
52
- const fileType = params.type || "png";
53
- const options = {
54
- type: fileType,
55
- quality: fileType === "png" ? void 0 : 90,
56
- scale: "css",
57
- ...params.fullPage !== void 0 && { fullPage: params.fullPage }
58
- };
59
- const isElementScreenshot = params.element && params.ref;
60
- const screenshotTarget = isElementScreenshot ? params.element : params.fullPage ? "full page" : "viewport";
61
- const ref = params.ref ? await tab.refLocator({ element: params.element || "", ref: params.ref }) : null;
62
- const data = ref ? await ref.locator.screenshot(options) : await tab.page.screenshot(options);
63
- const fileName = params.filename || (0, import_utils3.dateAsFileName)(fileType);
64
- response.addCode(`// Screenshot ${screenshotTarget} and save it as ${fileName}`);
65
- if (ref)
66
- response.addCode(`await page.${ref.resolved}.screenshot(${(0, import_utils2.formatObject)({ ...options, path: fileName })});`);
67
- else
68
- response.addCode(`await page.screenshot(${(0, import_utils2.formatObject)({ ...options, path: fileName })});`);
69
- await response.addResult({ data, title: `Screenshot of ${screenshotTarget}`, suggestedFilename: fileName });
70
- response.addImage({
71
- contentType: fileType === "png" ? "image/png" : "image/jpeg",
72
- data: scaleImageToFitMessage(data, fileType)
73
- });
74
- }
75
- });
76
- function scaleImageToFitMessage(buffer, imageType) {
77
- const image = imageType === "png" ? import_utilsBundle.PNG.sync.read(buffer) : import_utilsBundle.jpegjs.decode(buffer, { maxMemoryUsageInMB: 512 });
78
- const pixels = image.width * image.height;
79
- const shrink = Math.min(1568 / image.width, 1568 / image.height, Math.sqrt(1.15 * 1024 * 1024 / pixels));
80
- if (shrink > 1)
81
- return buffer;
82
- const width = image.width * shrink | 0;
83
- const height = image.height * shrink | 0;
84
- const scaledImage = (0, import_utils.scaleImageToSize)(image, { width, height });
85
- return imageType === "png" ? import_utilsBundle.PNG.sync.write(scaledImage) : import_utilsBundle.jpegjs.encode(scaledImage, 80).data;
86
- }
87
- var screenshot_default = [
88
- screenshot
89
- ];
90
- // Annotate the CommonJS export names for ESM import in node:
91
- 0 && (module.exports = {
92
- scaleImageToFitMessage
93
- });
@@ -1,173 +0,0 @@
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 snapshot_exports = {};
20
- __export(snapshot_exports, {
21
- default: () => snapshot_default,
22
- elementSchema: () => elementSchema
23
- });
24
- module.exports = __toCommonJS(snapshot_exports);
25
- var import_mcpBundle = require("patchright-core/lib/mcpBundle");
26
- var import_utils = require("patchright-core/lib/utils");
27
- var import_tool = require("./tool");
28
- const snapshot = (0, import_tool.defineTool)({
29
- capability: "core",
30
- schema: {
31
- name: "browser_snapshot",
32
- title: "Page snapshot",
33
- description: "Capture accessibility snapshot of the current page, this is better than screenshot",
34
- inputSchema: import_mcpBundle.z.object({
35
- filename: import_mcpBundle.z.string().optional().describe("Save snapshot to markdown file instead of returning it in the response.")
36
- }),
37
- type: "readOnly"
38
- },
39
- handle: async (context, params, response) => {
40
- await context.ensureTab();
41
- response.setIncludeFullSnapshot(params.filename);
42
- }
43
- });
44
- const elementSchema = import_mcpBundle.z.object({
45
- element: import_mcpBundle.z.string().optional().describe("Human-readable element description used to obtain permission to interact with the element"),
46
- ref: import_mcpBundle.z.string().describe("Exact target element reference from the page snapshot")
47
- });
48
- const clickSchema = elementSchema.extend({
49
- doubleClick: import_mcpBundle.z.boolean().optional().describe("Whether to perform a double click instead of a single click"),
50
- button: import_mcpBundle.z.enum(["left", "right", "middle"]).optional().describe("Button to click, defaults to left"),
51
- modifiers: import_mcpBundle.z.array(import_mcpBundle.z.enum(["Alt", "Control", "ControlOrMeta", "Meta", "Shift"])).optional().describe("Modifier keys to press")
52
- });
53
- const click = (0, import_tool.defineTabTool)({
54
- capability: "core",
55
- schema: {
56
- name: "browser_click",
57
- title: "Click",
58
- description: "Perform click on a web page",
59
- inputSchema: clickSchema,
60
- type: "input"
61
- },
62
- handle: async (tab, params, response) => {
63
- response.setIncludeSnapshot();
64
- const { locator, resolved } = await tab.refLocator(params);
65
- const options = {
66
- button: params.button,
67
- modifiers: params.modifiers
68
- };
69
- const formatted = (0, import_utils.formatObject)(options, " ", "oneline");
70
- const optionsAttr = formatted !== "{}" ? formatted : "";
71
- if (params.doubleClick)
72
- response.addCode(`await page.${resolved}.dblclick(${optionsAttr});`);
73
- else
74
- response.addCode(`await page.${resolved}.click(${optionsAttr});`);
75
- await tab.waitForCompletion(async () => {
76
- if (params.doubleClick)
77
- await locator.dblclick(options);
78
- else
79
- await locator.click(options);
80
- });
81
- }
82
- });
83
- const drag = (0, import_tool.defineTabTool)({
84
- capability: "core",
85
- schema: {
86
- name: "browser_drag",
87
- title: "Drag mouse",
88
- description: "Perform drag and drop between two elements",
89
- inputSchema: import_mcpBundle.z.object({
90
- startElement: import_mcpBundle.z.string().describe("Human-readable source element description used to obtain the permission to interact with the element"),
91
- startRef: import_mcpBundle.z.string().describe("Exact source element reference from the page snapshot"),
92
- endElement: import_mcpBundle.z.string().describe("Human-readable target element description used to obtain the permission to interact with the element"),
93
- endRef: import_mcpBundle.z.string().describe("Exact target element reference from the page snapshot")
94
- }),
95
- type: "input"
96
- },
97
- handle: async (tab, params, response) => {
98
- response.setIncludeSnapshot();
99
- const [start, end] = await tab.refLocators([
100
- { ref: params.startRef, element: params.startElement },
101
- { ref: params.endRef, element: params.endElement }
102
- ]);
103
- await tab.waitForCompletion(async () => {
104
- await start.locator.dragTo(end.locator);
105
- });
106
- response.addCode(`await page.${start.resolved}.dragTo(page.${end.resolved});`);
107
- }
108
- });
109
- const hover = (0, import_tool.defineTabTool)({
110
- capability: "core",
111
- schema: {
112
- name: "browser_hover",
113
- title: "Hover mouse",
114
- description: "Hover over element on page",
115
- inputSchema: elementSchema,
116
- type: "input"
117
- },
118
- handle: async (tab, params, response) => {
119
- response.setIncludeSnapshot();
120
- const { locator, resolved } = await tab.refLocator(params);
121
- response.addCode(`await page.${resolved}.hover();`);
122
- await tab.waitForCompletion(async () => {
123
- await locator.hover();
124
- });
125
- }
126
- });
127
- const selectOptionSchema = elementSchema.extend({
128
- values: import_mcpBundle.z.array(import_mcpBundle.z.string()).describe("Array of values to select in the dropdown. This can be a single value or multiple values.")
129
- });
130
- const selectOption = (0, import_tool.defineTabTool)({
131
- capability: "core",
132
- schema: {
133
- name: "browser_select_option",
134
- title: "Select option",
135
- description: "Select an option in a dropdown",
136
- inputSchema: selectOptionSchema,
137
- type: "input"
138
- },
139
- handle: async (tab, params, response) => {
140
- response.setIncludeSnapshot();
141
- const { locator, resolved } = await tab.refLocator(params);
142
- response.addCode(`await page.${resolved}.selectOption(${(0, import_utils.formatObject)(params.values)});`);
143
- await tab.waitForCompletion(async () => {
144
- await locator.selectOption(params.values);
145
- });
146
- }
147
- });
148
- const pickLocator = (0, import_tool.defineTabTool)({
149
- capability: "testing",
150
- schema: {
151
- name: "browser_generate_locator",
152
- title: "Create locator for element",
153
- description: "Generate locator for the given element to use in tests",
154
- inputSchema: elementSchema,
155
- type: "readOnly"
156
- },
157
- handle: async (tab, params, response) => {
158
- const { resolved } = await tab.refLocator(params);
159
- response.addTextResult(resolved);
160
- }
161
- });
162
- var snapshot_default = [
163
- snapshot,
164
- click,
165
- drag,
166
- hover,
167
- selectOption,
168
- pickLocator
169
- ];
170
- // Annotate the CommonJS export names for ESM import in node:
171
- 0 && (module.exports = {
172
- elementSchema
173
- });
@@ -1,67 +0,0 @@
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 tabs_exports = {};
20
- __export(tabs_exports, {
21
- default: () => tabs_default
22
- });
23
- module.exports = __toCommonJS(tabs_exports);
24
- var import_mcpBundle = require("patchright-core/lib/mcpBundle");
25
- var import_tool = require("./tool");
26
- var import_response = require("../response");
27
- const browserTabs = (0, import_tool.defineTool)({
28
- capability: "core-tabs",
29
- schema: {
30
- name: "browser_tabs",
31
- title: "Manage tabs",
32
- description: "List, create, close, or select a browser tab.",
33
- inputSchema: import_mcpBundle.z.object({
34
- action: import_mcpBundle.z.enum(["list", "new", "close", "select"]).describe("Operation to perform"),
35
- index: import_mcpBundle.z.number().optional().describe("Tab index, used for close/select. If omitted for close, current tab is closed.")
36
- }),
37
- type: "action"
38
- },
39
- handle: async (context, params, response) => {
40
- switch (params.action) {
41
- case "list": {
42
- await context.ensureTab();
43
- break;
44
- }
45
- case "new": {
46
- await context.newTab();
47
- break;
48
- }
49
- case "close": {
50
- await context.closeTab(params.index);
51
- break;
52
- }
53
- case "select": {
54
- if (params.index === void 0)
55
- throw new Error("Tab index is required");
56
- await context.selectTab(params.index);
57
- break;
58
- }
59
- }
60
- const tabHeaders = await Promise.all(context.tabs().map((tab) => tab.headerSnapshot()));
61
- const result = (0, import_response.renderTabsMarkdown)(tabHeaders);
62
- response.addTextResult(result.join("\n"));
63
- }
64
- });
65
- var tabs_default = [
66
- browserTabs
67
- ];