@midscene/web 1.7.7 → 1.7.10-beta-20260507030203.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 (45) hide show
  1. package/dist/es/bridge-mode/io-client.mjs +1 -1
  2. package/dist/es/bridge-mode/io-server.mjs +2 -2
  3. package/dist/es/bridge-mode/io-server.mjs.map +1 -1
  4. package/dist/es/bridge-mode/page-browser-side.mjs +1 -1
  5. package/dist/es/bridge-mode/page-browser-side.mjs.map +1 -1
  6. package/dist/es/cli-options.mjs +99 -0
  7. package/dist/es/cli-options.mjs.map +1 -0
  8. package/dist/es/cli.mjs +11 -32
  9. package/dist/es/cli.mjs.map +1 -1
  10. package/dist/es/common/viewport.mjs +38 -0
  11. package/dist/es/common/viewport.mjs.map +1 -0
  12. package/dist/es/mcp-server.mjs +1 -1
  13. package/dist/es/mcp-tools-cdp.mjs +2 -4
  14. package/dist/es/mcp-tools-cdp.mjs.map +1 -1
  15. package/dist/es/mcp-tools-puppeteer.mjs +48 -24
  16. package/dist/es/mcp-tools-puppeteer.mjs.map +1 -1
  17. package/dist/es/mcp-tools.mjs +2 -4
  18. package/dist/es/mcp-tools.mjs.map +1 -1
  19. package/dist/es/puppeteer/agent-launcher.mjs +2 -14
  20. package/dist/es/puppeteer/agent-launcher.mjs.map +1 -1
  21. package/dist/lib/bridge-mode/io-client.js +1 -1
  22. package/dist/lib/bridge-mode/io-server.js +2 -2
  23. package/dist/lib/bridge-mode/io-server.js.map +1 -1
  24. package/dist/lib/bridge-mode/page-browser-side.js +1 -1
  25. package/dist/lib/bridge-mode/page-browser-side.js.map +1 -1
  26. package/dist/lib/cli-options.js +133 -0
  27. package/dist/lib/cli-options.js.map +1 -0
  28. package/dist/lib/cli.js +11 -32
  29. package/dist/lib/cli.js.map +1 -1
  30. package/dist/lib/common/viewport.js +90 -0
  31. package/dist/lib/common/viewport.js.map +1 -0
  32. package/dist/lib/mcp-server.js +1 -1
  33. package/dist/lib/mcp-tools-cdp.js +2 -4
  34. package/dist/lib/mcp-tools-cdp.js.map +1 -1
  35. package/dist/lib/mcp-tools-puppeteer.js +55 -25
  36. package/dist/lib/mcp-tools-puppeteer.js.map +1 -1
  37. package/dist/lib/mcp-tools.js +2 -4
  38. package/dist/lib/mcp-tools.js.map +1 -1
  39. package/dist/lib/puppeteer/agent-launcher.js +4 -16
  40. package/dist/lib/puppeteer/agent-launcher.js.map +1 -1
  41. package/dist/types/cli-options.d.ts +8 -0
  42. package/dist/types/common/viewport.d.ts +17 -0
  43. package/dist/types/mcp-tools-puppeteer.d.ts +8 -0
  44. package/dist/types/puppeteer/agent-launcher.d.ts +1 -3
  45. package/package.json +4 -4
@@ -0,0 +1,133 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, definition)=>{
5
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
6
+ enumerable: true,
7
+ get: definition[key]
8
+ });
9
+ };
10
+ })();
11
+ (()=>{
12
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
13
+ })();
14
+ (()=>{
15
+ __webpack_require__.r = (exports1)=>{
16
+ if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
17
+ value: 'Module'
18
+ });
19
+ Object.defineProperty(exports1, '__esModule', {
20
+ value: true
21
+ });
22
+ };
23
+ })();
24
+ var __webpack_exports__ = {};
25
+ __webpack_require__.r(__webpack_exports__);
26
+ __webpack_require__.d(__webpack_exports__, {
27
+ parseWebCliOptions: ()=>parseWebCliOptions
28
+ });
29
+ const cli_namespaceObject = require("@midscene/shared/cli");
30
+ const viewport_js_namespaceObject = require("./common/viewport.js");
31
+ const viewportWidthFlag = '--viewport-width';
32
+ const viewportHeightFlag = '--viewport-height';
33
+ function isLikelyCdpEndpoint(value) {
34
+ return !!value && /^(wss?):\/\//.test(value);
35
+ }
36
+ function parsePositiveIntegerOption(flag, rawValue) {
37
+ const value = Number(rawValue);
38
+ if (!Number.isInteger(value) || value <= 0) throw new cli_namespaceObject.CLIError(`Invalid value for "${flag}": expected a positive integer, got "${rawValue}".`);
39
+ return value;
40
+ }
41
+ function readRequiredOptionValue(args, index, flag) {
42
+ const currentArg = args[index];
43
+ const inlinePrefix = `${flag}=`;
44
+ if (currentArg.startsWith(inlinePrefix)) return {
45
+ value: currentArg.slice(inlinePrefix.length),
46
+ nextIndex: index
47
+ };
48
+ const nextArg = args[index + 1];
49
+ if (!nextArg || nextArg.startsWith('--')) throw new cli_namespaceObject.CLIError(`Option "${flag}" requires a value.`);
50
+ return {
51
+ value: nextArg,
52
+ nextIndex: index + 1
53
+ };
54
+ }
55
+ function readOptionalCdpEndpoint(args, index) {
56
+ const currentArg = args[index];
57
+ const inlinePrefix = '--cdp=';
58
+ if (currentArg.startsWith(inlinePrefix)) return {
59
+ value: currentArg.slice(inlinePrefix.length),
60
+ nextIndex: index
61
+ };
62
+ const nextArg = args[index + 1];
63
+ if (!isLikelyCdpEndpoint(nextArg)) return {
64
+ nextIndex: index
65
+ };
66
+ return {
67
+ value: nextArg,
68
+ nextIndex: index + 1
69
+ };
70
+ }
71
+ function parseWebCliOptions(rawArgs, env = process.env) {
72
+ const argv = [];
73
+ let isBridge = false;
74
+ let isCdp = false;
75
+ let viewportWidth;
76
+ let viewportHeight;
77
+ let cdpEndpoint;
78
+ for(let index = 0; index < rawArgs.length; index += 1){
79
+ const arg = rawArgs[index];
80
+ if ('--bridge' === arg) {
81
+ isBridge = true;
82
+ continue;
83
+ }
84
+ if ('--cdp' === arg || arg.startsWith('--cdp=')) {
85
+ isCdp = true;
86
+ const parsed = readOptionalCdpEndpoint(rawArgs, index);
87
+ cdpEndpoint = parsed.value ?? cdpEndpoint;
88
+ index = parsed.nextIndex;
89
+ continue;
90
+ }
91
+ if (arg === viewportWidthFlag || arg.startsWith(`${viewportWidthFlag}=`)) {
92
+ const parsed = readRequiredOptionValue(rawArgs, index, viewportWidthFlag);
93
+ viewportWidth = parsePositiveIntegerOption(viewportWidthFlag, parsed.value);
94
+ index = parsed.nextIndex;
95
+ continue;
96
+ }
97
+ if (arg === viewportHeightFlag || arg.startsWith(`${viewportHeightFlag}=`)) {
98
+ const parsed = readRequiredOptionValue(rawArgs, index, viewportHeightFlag);
99
+ viewportHeight = parsePositiveIntegerOption(viewportHeightFlag, parsed.value);
100
+ index = parsed.nextIndex;
101
+ continue;
102
+ }
103
+ argv.push(arg);
104
+ }
105
+ if (isBridge && isCdp) throw new cli_namespaceObject.CLIError('--bridge and --cdp are mutually exclusive. Please specify only one.');
106
+ const mode = isBridge ? 'bridge' : isCdp ? 'cdp' : 'puppeteer';
107
+ if ('puppeteer' !== mode) {
108
+ if (void 0 !== viewportWidth || void 0 !== viewportHeight) throw new cli_namespaceObject.CLIError('Viewport options are only supported in the default Puppeteer mode.');
109
+ }
110
+ if ('cdp' === mode) {
111
+ cdpEndpoint = cdpEndpoint ?? env.MIDSCENE_CDP_ENDPOINT;
112
+ if (!cdpEndpoint) throw new cli_namespaceObject.CLIError('CDP endpoint is required. Provide it as: --cdp <ws-endpoint> or set MIDSCENE_CDP_ENDPOINT environment variable.');
113
+ }
114
+ const hasViewportOverride = void 0 !== viewportWidth || void 0 !== viewportHeight;
115
+ return {
116
+ argv,
117
+ mode,
118
+ cdpEndpoint,
119
+ viewport: hasViewportOverride ? (0, viewport_js_namespaceObject.resolveViewportSize)({
120
+ width: viewportWidth,
121
+ height: viewportHeight
122
+ }, viewport_js_namespaceObject.defaultPuppeteerWindowViewportSize) : void 0
123
+ };
124
+ }
125
+ exports.parseWebCliOptions = __webpack_exports__.parseWebCliOptions;
126
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
127
+ "parseWebCliOptions"
128
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
129
+ Object.defineProperty(exports, '__esModule', {
130
+ value: true
131
+ });
132
+
133
+ //# sourceMappingURL=cli-options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-options.js","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../src/cli-options.ts"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import { CLIError } from '@midscene/shared/cli';\nimport {\n type ViewportSize,\n defaultPuppeteerWindowViewportSize,\n resolveViewportSize,\n} from './common/viewport';\n\nconst viewportWidthFlag = '--viewport-width';\nconst viewportHeightFlag = '--viewport-height';\n\nexport interface ParsedWebCliOptions {\n argv: string[];\n mode: 'bridge' | 'cdp' | 'puppeteer';\n cdpEndpoint?: string;\n viewport?: ViewportSize;\n}\n\nfunction isLikelyCdpEndpoint(value: string | undefined): boolean {\n return !!value && /^(wss?):\\/\\//.test(value);\n}\n\nfunction parsePositiveIntegerOption(flag: string, rawValue: string): number {\n const value = Number(rawValue);\n if (!Number.isInteger(value) || value <= 0) {\n throw new CLIError(\n `Invalid value for \"${flag}\": expected a positive integer, got \"${rawValue}\".`,\n );\n }\n\n return value;\n}\n\nfunction readRequiredOptionValue(\n args: string[],\n index: number,\n flag: string,\n): { value: string; nextIndex: number } {\n const currentArg = args[index];\n const inlinePrefix = `${flag}=`;\n if (currentArg.startsWith(inlinePrefix)) {\n return {\n value: currentArg.slice(inlinePrefix.length),\n nextIndex: index,\n };\n }\n\n const nextArg = args[index + 1];\n if (!nextArg || nextArg.startsWith('--')) {\n throw new CLIError(`Option \"${flag}\" requires a value.`);\n }\n\n return {\n value: nextArg,\n nextIndex: index + 1,\n };\n}\n\nfunction readOptionalCdpEndpoint(\n args: string[],\n index: number,\n): { value?: string; nextIndex: number } {\n const currentArg = args[index];\n const inlinePrefix = '--cdp=';\n if (currentArg.startsWith(inlinePrefix)) {\n return {\n value: currentArg.slice(inlinePrefix.length),\n nextIndex: index,\n };\n }\n\n const nextArg = args[index + 1];\n if (!isLikelyCdpEndpoint(nextArg)) {\n return { nextIndex: index };\n }\n\n return {\n value: nextArg,\n nextIndex: index + 1,\n };\n}\n\nexport function parseWebCliOptions(\n rawArgs: string[],\n env: NodeJS.ProcessEnv = process.env,\n): ParsedWebCliOptions {\n const argv: string[] = [];\n let isBridge = false;\n let isCdp = false;\n let viewportWidth: number | undefined;\n let viewportHeight: number | undefined;\n let cdpEndpoint: string | undefined;\n\n for (let index = 0; index < rawArgs.length; index += 1) {\n const arg = rawArgs[index];\n\n if (arg === '--bridge') {\n isBridge = true;\n continue;\n }\n\n if (arg === '--cdp' || arg.startsWith('--cdp=')) {\n isCdp = true;\n const parsed = readOptionalCdpEndpoint(rawArgs, index);\n cdpEndpoint = parsed.value ?? cdpEndpoint;\n index = parsed.nextIndex;\n continue;\n }\n\n if (arg === viewportWidthFlag || arg.startsWith(`${viewportWidthFlag}=`)) {\n const parsed = readRequiredOptionValue(rawArgs, index, viewportWidthFlag);\n viewportWidth = parsePositiveIntegerOption(\n viewportWidthFlag,\n parsed.value,\n );\n index = parsed.nextIndex;\n continue;\n }\n\n if (\n arg === viewportHeightFlag ||\n arg.startsWith(`${viewportHeightFlag}=`)\n ) {\n const parsed = readRequiredOptionValue(\n rawArgs,\n index,\n viewportHeightFlag,\n );\n viewportHeight = parsePositiveIntegerOption(\n viewportHeightFlag,\n parsed.value,\n );\n index = parsed.nextIndex;\n continue;\n }\n\n argv.push(arg);\n }\n\n if (isBridge && isCdp) {\n throw new CLIError(\n '--bridge and --cdp are mutually exclusive. Please specify only one.',\n );\n }\n\n const mode = isBridge ? 'bridge' : isCdp ? 'cdp' : 'puppeteer';\n\n if (mode !== 'puppeteer') {\n if (viewportWidth !== undefined || viewportHeight !== undefined) {\n throw new CLIError(\n 'Viewport options are only supported in the default Puppeteer mode.',\n );\n }\n }\n\n if (mode === 'cdp') {\n cdpEndpoint = cdpEndpoint ?? env.MIDSCENE_CDP_ENDPOINT;\n if (!cdpEndpoint) {\n throw new CLIError(\n 'CDP endpoint is required. Provide it as: --cdp <ws-endpoint> or set MIDSCENE_CDP_ENDPOINT environment variable.',\n );\n }\n }\n\n const hasViewportOverride =\n viewportWidth !== undefined || viewportHeight !== undefined;\n\n return {\n argv,\n mode,\n cdpEndpoint,\n viewport: hasViewportOverride\n ? resolveViewportSize(\n {\n width: viewportWidth,\n height: viewportHeight,\n },\n defaultPuppeteerWindowViewportSize,\n )\n : undefined,\n };\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","viewportWidthFlag","viewportHeightFlag","isLikelyCdpEndpoint","value","parsePositiveIntegerOption","flag","rawValue","Number","CLIError","readRequiredOptionValue","args","index","currentArg","inlinePrefix","nextArg","readOptionalCdpEndpoint","parseWebCliOptions","rawArgs","env","process","argv","isBridge","isCdp","viewportWidth","viewportHeight","cdpEndpoint","arg","parsed","mode","undefined","hasViewportOverride","resolveViewportSize","defaultPuppeteerWindowViewportSize"],"mappings":"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"}
package/dist/lib/cli.js CHANGED
@@ -27,6 +27,7 @@ const core_namespaceObject = require("@midscene/core");
27
27
  const cli_namespaceObject = require("@midscene/shared/cli");
28
28
  const external_dotenv_namespaceObject = require("dotenv");
29
29
  var external_dotenv_default = /*#__PURE__*/ __webpack_require__.n(external_dotenv_namespaceObject);
30
+ const external_cli_options_js_namespaceObject = require("./cli-options.js");
30
31
  const external_mcp_tools_js_namespaceObject = require("./mcp-tools.js");
31
32
  const external_mcp_tools_cdp_js_namespaceObject = require("./mcp-tools-cdp.js");
32
33
  const external_mcp_tools_puppeteer_js_namespaceObject = require("./mcp-tools-puppeteer.js");
@@ -34,38 +35,16 @@ const envFile = (0, external_node_path_namespaceObject.join)(process.cwd(), '.en
34
35
  if ((0, external_node_fs_namespaceObject.existsSync)(envFile)) external_dotenv_default().config({
35
36
  path: envFile
36
37
  });
37
- const isBridge = process.argv.includes('--bridge');
38
- const cdpIdx = process.argv.indexOf('--cdp');
39
- const isCdp = -1 !== cdpIdx;
40
- if (isBridge && isCdp) {
41
- console.error('--bridge and --cdp are mutually exclusive. Please specify only one.');
42
- process.exit(1);
43
- }
44
- let cdpEndpoint;
45
- if (isCdp) {
46
- const next = process.argv[cdpIdx + 1];
47
- if (next && !next.startsWith('-')) cdpEndpoint = next;
48
- if (!cdpEndpoint) cdpEndpoint = process.env.MIDSCENE_CDP_ENDPOINT;
49
- if (!cdpEndpoint) {
50
- console.error('CDP endpoint is required. Provide it as: --cdp <ws-endpoint> or set MIDSCENE_CDP_ENDPOINT environment variable.');
51
- process.exit(1);
52
- }
53
- }
54
- const bridgeIdx = process.argv.indexOf('--bridge');
55
- const cdpValueIdx = -1 !== cdpIdx && cdpIdx + 1 < process.argv.length && !process.argv[cdpIdx + 1].startsWith('-') ? cdpIdx + 1 : -1;
56
- const skipIndices = new Set([
57
- bridgeIdx,
58
- cdpIdx,
59
- cdpValueIdx
60
- ].filter((i)=>-1 !== i));
61
- const argv = process.argv.slice(2).filter((_, idx)=>!skipIndices.has(idx + 2));
62
- let tools;
63
- tools = isBridge ? new external_mcp_tools_js_namespaceObject.WebMidsceneTools() : isCdp ? new external_mcp_tools_cdp_js_namespaceObject.WebCdpMidsceneTools(cdpEndpoint) : new external_mcp_tools_puppeteer_js_namespaceObject.WebPuppeteerMidsceneTools();
64
- (0, cli_namespaceObject.runToolsCLI)(tools, 'midscene-web', {
65
- stripPrefix: 'web_',
66
- argv,
67
- version: "1.7.7",
68
- extraCommands: (0, core_namespaceObject.createReportCliCommands)()
38
+ Promise.resolve().then(()=>{
39
+ const parsedOptions = (0, external_cli_options_js_namespaceObject.parseWebCliOptions)(process.argv.slice(2));
40
+ let tools;
41
+ tools = 'bridge' === parsedOptions.mode ? new external_mcp_tools_js_namespaceObject.WebMidsceneTools() : 'cdp' === parsedOptions.mode ? new external_mcp_tools_cdp_js_namespaceObject.WebCdpMidsceneTools(parsedOptions.cdpEndpoint) : new external_mcp_tools_puppeteer_js_namespaceObject.WebPuppeteerMidsceneTools(parsedOptions.viewport);
42
+ return (0, cli_namespaceObject.runToolsCLI)(tools, 'midscene-web', {
43
+ stripPrefix: 'web_',
44
+ argv: parsedOptions.argv,
45
+ version: "1.7.10-beta-20260507030203.0",
46
+ extraCommands: (0, core_namespaceObject.createReportCliCommands)()
47
+ });
69
48
  }).catch((e)=>{
70
49
  process.exit((0, cli_namespaceObject.reportCLIError)(e));
71
50
  });
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sources":["webpack/runtime/compat_get_default_export","webpack/runtime/define_property_getters","webpack/runtime/has_own_property","../../src/cli.ts"],"sourcesContent":["// getDefaultExport function for compatibility with non-ESM modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};\n","__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","import { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { createReportCliCommands } from '@midscene/core';\nimport { reportCLIError, runToolsCLI } from '@midscene/shared/cli';\nimport dotenv from 'dotenv';\nimport { WebMidsceneTools } from './mcp-tools';\nimport { WebCdpMidsceneTools } from './mcp-tools-cdp';\nimport { WebPuppeteerMidsceneTools } from './mcp-tools-puppeteer';\n\n// Load .env early so MIDSCENE_CDP_ENDPOINT is available during arg parsing\nconst envFile = join(process.cwd(), '.env');\nif (existsSync(envFile)) {\n dotenv.config({ path: envFile });\n}\n\ndeclare const __VERSION__: string;\nconst isBridge = process.argv.includes('--bridge');\nconst cdpIdx = process.argv.indexOf('--cdp');\nconst isCdp = cdpIdx !== -1;\n\n// Fail-fast: mutually exclusive flags\nif (isBridge && isCdp) {\n console.error(\n '--bridge and --cdp are mutually exclusive. Please specify only one.',\n );\n process.exit(1);\n}\n\n// Parse --cdp endpoint value\nlet cdpEndpoint: string | undefined;\nif (isCdp) {\n const next = process.argv[cdpIdx + 1];\n if (next && !next.startsWith('-')) {\n cdpEndpoint = next;\n }\n if (!cdpEndpoint) {\n cdpEndpoint = process.env.MIDSCENE_CDP_ENDPOINT;\n }\n if (!cdpEndpoint) {\n console.error(\n 'CDP endpoint is required. Provide it as: --cdp <ws-endpoint> or set MIDSCENE_CDP_ENDPOINT environment variable.',\n );\n process.exit(1);\n }\n}\n\n// Filter out --bridge, --cdp, and cdp endpoint from argv using absolute indices\nconst bridgeIdx = process.argv.indexOf('--bridge');\nconst cdpValueIdx =\n cdpIdx !== -1 &&\n cdpIdx + 1 < process.argv.length &&\n !process.argv[cdpIdx + 1].startsWith('-')\n ? cdpIdx + 1\n : -1;\nconst skipIndices = new Set(\n [bridgeIdx, cdpIdx, cdpValueIdx].filter((i) => i !== -1),\n);\nconst argv = process.argv\n .slice(2)\n .filter((_, idx) => !skipIndices.has(idx + 2));\n\nlet tools: WebMidsceneTools | WebPuppeteerMidsceneTools | WebCdpMidsceneTools;\nif (isBridge) {\n tools = new WebMidsceneTools();\n} else if (isCdp) {\n tools = new WebCdpMidsceneTools(cdpEndpoint!);\n} else {\n tools = new WebPuppeteerMidsceneTools();\n}\n\nrunToolsCLI(tools, 'midscene-web', {\n stripPrefix: 'web_',\n argv,\n version: __VERSION__,\n extraCommands: createReportCliCommands(),\n}).catch((e) => {\n process.exit(reportCLIError(e));\n});\n"],"names":["__webpack_require__","module","getter","definition","key","Object","obj","prop","envFile","join","process","existsSync","dotenv","isBridge","cdpIdx","isCdp","console","cdpEndpoint","next","bridgeIdx","cdpValueIdx","skipIndices","Set","i","argv","_","idx","tools","WebMidsceneTools","WebCdpMidsceneTools","WebPuppeteerMidsceneTools","runToolsCLI","__VERSION__","createReportCliCommands","e","reportCLIError"],"mappings":";;;IACAA,oBAAoB,CAAC,GAAG,CAACC;QACxB,IAAIC,SAASD,UAAUA,OAAO,UAAU,GACvC,IAAOA,MAAM,CAAC,UAAU,GACxB,IAAOA;QACRD,oBAAoB,CAAC,CAACE,QAAQ;YAAE,GAAGA;QAAO;QAC1C,OAAOA;IACR;;;ICPAF,oBAAoB,CAAC,GAAG,CAAC,UAASG;QACjC,IAAI,IAAIC,OAAOD,WACR,IAAGH,oBAAoB,CAAC,CAACG,YAAYC,QAAQ,CAACJ,oBAAoB,CAAC,CAAC,UAASI,MACzEC,OAAO,cAAc,CAAC,UAASD,KAAK;YAAE,YAAY;YAAM,KAAKD,UAAU,CAACC,IAAI;QAAC;IAGzF;;;ICNAJ,oBAAoB,CAAC,GAAG,CAACM,KAAKC,OAAUF,OAAO,SAAS,CAAC,cAAc,CAAC,IAAI,CAACC,KAAKC;;;;;;;;;;;;ACUlF,MAAMC,UAAUC,AAAAA,IAAAA,mCAAAA,IAAAA,AAAAA,EAAKC,QAAQ,GAAG,IAAI;AACpC,IAAIC,AAAAA,IAAAA,iCAAAA,UAAAA,AAAAA,EAAWH,UACbI,0BAAAA,MAAa,CAAC;IAAE,MAAMJ;AAAQ;AAIhC,MAAMK,WAAWH,QAAQ,IAAI,CAAC,QAAQ,CAAC;AACvC,MAAMI,SAASJ,QAAQ,IAAI,CAAC,OAAO,CAAC;AACpC,MAAMK,QAAQD,AAAW,OAAXA;AAGd,IAAID,YAAYE,OAAO;IACrBC,QAAQ,KAAK,CACX;IAEFN,QAAQ,IAAI,CAAC;AACf;AAGA,IAAIO;AACJ,IAAIF,OAAO;IACT,MAAMG,OAAOR,QAAQ,IAAI,CAACI,SAAS,EAAE;IACrC,IAAII,QAAQ,CAACA,KAAK,UAAU,CAAC,MAC3BD,cAAcC;IAEhB,IAAI,CAACD,aACHA,cAAcP,QAAQ,GAAG,CAAC,qBAAqB;IAEjD,IAAI,CAACO,aAAa;QAChBD,QAAQ,KAAK,CACX;QAEFN,QAAQ,IAAI,CAAC;IACf;AACF;AAGA,MAAMS,YAAYT,QAAQ,IAAI,CAAC,OAAO,CAAC;AACvC,MAAMU,cACJN,AAAW,OAAXA,UACAA,SAAS,IAAIJ,QAAQ,IAAI,CAAC,MAAM,IAChC,CAACA,QAAQ,IAAI,CAACI,SAAS,EAAE,CAAC,UAAU,CAAC,OACjCA,SAAS,IACT;AACN,MAAMO,cAAc,IAAIC,IACtB;IAACH;IAAWL;IAAQM;CAAY,CAAC,MAAM,CAAC,CAACG,IAAMA,AAAM,OAANA;AAEjD,MAAMC,OAAOd,QAAQ,IAAI,CACtB,KAAK,CAAC,GACN,MAAM,CAAC,CAACe,GAAGC,MAAQ,CAACL,YAAY,GAAG,CAACK,MAAM;AAE7C,IAAIC;AAEFA,QADEd,WACM,IAAIe,sCAAAA,gBAAgBA,KACnBb,QACD,IAAIc,0CAAAA,mBAAmBA,CAACZ,eAExB,IAAIa,gDAAAA,yBAAyBA;AAGvCC,IAAAA,oBAAAA,WAAAA,AAAAA,EAAYJ,OAAO,gBAAgB;IACjC,aAAa;IACbH;IACA,SAASQ;IACT,eAAeC,AAAAA,IAAAA,qBAAAA,uBAAAA,AAAAA;AACjB,GAAG,KAAK,CAAC,CAACC;IACRxB,QAAQ,IAAI,CAACyB,AAAAA,IAAAA,oBAAAA,cAAAA,AAAAA,EAAeD;AAC9B"}
1
+ {"version":3,"file":"cli.js","sources":["webpack/runtime/compat_get_default_export","webpack/runtime/define_property_getters","webpack/runtime/has_own_property","../../src/cli.ts"],"sourcesContent":["// getDefaultExport function for compatibility with non-ESM modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};\n","__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","import { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { createReportCliCommands } from '@midscene/core';\nimport { reportCLIError, runToolsCLI } from '@midscene/shared/cli';\nimport dotenv from 'dotenv';\nimport { parseWebCliOptions } from './cli-options';\nimport { WebMidsceneTools } from './mcp-tools';\nimport { WebCdpMidsceneTools } from './mcp-tools-cdp';\nimport { WebPuppeteerMidsceneTools } from './mcp-tools-puppeteer';\n\n// Load .env early so MIDSCENE_CDP_ENDPOINT is available during arg parsing\nconst envFile = join(process.cwd(), '.env');\nif (existsSync(envFile)) {\n dotenv.config({ path: envFile });\n}\n\ndeclare const __VERSION__: string;\n\nPromise.resolve()\n .then(() => {\n const parsedOptions = parseWebCliOptions(process.argv.slice(2));\n\n let tools:\n | WebMidsceneTools\n | WebPuppeteerMidsceneTools\n | WebCdpMidsceneTools;\n if (parsedOptions.mode === 'bridge') {\n tools = new WebMidsceneTools();\n } else if (parsedOptions.mode === 'cdp') {\n tools = new WebCdpMidsceneTools(parsedOptions.cdpEndpoint!);\n } else {\n tools = new WebPuppeteerMidsceneTools(parsedOptions.viewport);\n }\n\n return runToolsCLI(tools, 'midscene-web', {\n stripPrefix: 'web_',\n argv: parsedOptions.argv,\n version: __VERSION__,\n extraCommands: createReportCliCommands(),\n });\n })\n .catch((e) => {\n process.exit(reportCLIError(e));\n });\n"],"names":["__webpack_require__","module","getter","definition","key","Object","obj","prop","envFile","join","process","existsSync","dotenv","Promise","parsedOptions","parseWebCliOptions","tools","WebMidsceneTools","WebCdpMidsceneTools","WebPuppeteerMidsceneTools","runToolsCLI","__VERSION__","createReportCliCommands","e","reportCLIError"],"mappings":";;;IACAA,oBAAoB,CAAC,GAAG,CAACC;QACxB,IAAIC,SAASD,UAAUA,OAAO,UAAU,GACvC,IAAOA,MAAM,CAAC,UAAU,GACxB,IAAOA;QACRD,oBAAoB,CAAC,CAACE,QAAQ;YAAE,GAAGA;QAAO;QAC1C,OAAOA;IACR;;;ICPAF,oBAAoB,CAAC,GAAG,CAAC,UAASG;QACjC,IAAI,IAAIC,OAAOD,WACR,IAAGH,oBAAoB,CAAC,CAACG,YAAYC,QAAQ,CAACJ,oBAAoB,CAAC,CAAC,UAASI,MACzEC,OAAO,cAAc,CAAC,UAASD,KAAK;YAAE,YAAY;YAAM,KAAKD,UAAU,CAACC,IAAI;QAAC;IAGzF;;;ICNAJ,oBAAoB,CAAC,GAAG,CAACM,KAAKC,OAAUF,OAAO,SAAS,CAAC,cAAc,CAAC,IAAI,CAACC,KAAKC;;;;;;;;;;;;;ACWlF,MAAMC,UAAUC,AAAAA,IAAAA,mCAAAA,IAAAA,AAAAA,EAAKC,QAAQ,GAAG,IAAI;AACpC,IAAIC,AAAAA,IAAAA,iCAAAA,UAAAA,AAAAA,EAAWH,UACbI,0BAAAA,MAAa,CAAC;IAAE,MAAMJ;AAAQ;AAKhCK,QAAQ,OAAO,GACZ,IAAI,CAAC;IACJ,MAAMC,gBAAgBC,AAAAA,IAAAA,wCAAAA,kBAAAA,AAAAA,EAAmBL,QAAQ,IAAI,CAAC,KAAK,CAAC;IAE5D,IAAIM;IAKFA,QADEF,AAAuB,aAAvBA,cAAc,IAAI,GACZ,IAAIG,sCAAAA,gBAAgBA,KACnBH,AAAuB,UAAvBA,cAAc,IAAI,GACnB,IAAII,0CAAAA,mBAAmBA,CAACJ,cAAc,WAAW,IAEjD,IAAIK,gDAAAA,yBAAyBA,CAACL,cAAc,QAAQ;IAG9D,OAAOM,AAAAA,IAAAA,oBAAAA,WAAAA,AAAAA,EAAYJ,OAAO,gBAAgB;QACxC,aAAa;QACb,MAAMF,cAAc,IAAI;QACxB,SAASO;QACT,eAAeC,AAAAA,IAAAA,qBAAAA,uBAAAA,AAAAA;IACjB;AACF,GACC,KAAK,CAAC,CAACC;IACNb,QAAQ,IAAI,CAACc,AAAAA,IAAAA,oBAAAA,cAAAA,AAAAA,EAAeD;AAC9B"}
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, definition)=>{
5
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
6
+ enumerable: true,
7
+ get: definition[key]
8
+ });
9
+ };
10
+ })();
11
+ (()=>{
12
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
13
+ })();
14
+ (()=>{
15
+ __webpack_require__.r = (exports1)=>{
16
+ if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
17
+ value: 'Module'
18
+ });
19
+ Object.defineProperty(exports1, '__esModule', {
20
+ value: true
21
+ });
22
+ };
23
+ })();
24
+ var __webpack_exports__ = {};
25
+ __webpack_require__.r(__webpack_exports__);
26
+ __webpack_require__.d(__webpack_exports__, {
27
+ defaultViewportSize: ()=>defaultViewportSize,
28
+ defaultStaticPageViewportSize: ()=>defaultStaticPageViewportSize,
29
+ defaultViewportWidth: ()=>defaultViewportWidth,
30
+ resolveViewportSize: ()=>resolveViewportSize,
31
+ resolveWebViewportSize: ()=>resolveWebViewportSize,
32
+ defaultPuppeteerWindowViewportSize: ()=>defaultPuppeteerWindowViewportSize,
33
+ defaultViewportHeight: ()=>defaultViewportHeight
34
+ });
35
+ const utils_namespaceObject = require("@midscene/shared/utils");
36
+ const defaultViewportWidth = 1440;
37
+ const defaultViewportHeight = 800;
38
+ const defaultViewportSize = {
39
+ width: defaultViewportWidth,
40
+ height: defaultViewportHeight
41
+ };
42
+ const defaultPuppeteerWindowViewportSize = {
43
+ width: defaultViewportWidth,
44
+ height: defaultViewportHeight
45
+ };
46
+ const defaultStaticPageViewportSize = {
47
+ width: defaultViewportWidth,
48
+ height: defaultViewportHeight
49
+ };
50
+ function parseViewportDimension(rawValue, name) {
51
+ const parsedValue = 'number' == typeof rawValue ? rawValue : Number(rawValue);
52
+ (0, utils_namespaceObject.assert)(Number.isInteger(parsedValue), `${name} must be a positive integer, but got ${rawValue}`);
53
+ (0, utils_namespaceObject.assert)(parsedValue > 0, `${name} must be greater than 0, but got ${rawValue}`);
54
+ return parsedValue;
55
+ }
56
+ function resolveViewportSize(viewport, fallback = defaultViewportSize) {
57
+ const width = viewport?.width === void 0 || null === viewport.width ? fallback.width : parseViewportDimension(viewport.width, 'viewportWidth');
58
+ const height = viewport?.height === void 0 || null === viewport.height ? fallback.height : parseViewportDimension(viewport.height, 'viewportHeight');
59
+ return {
60
+ width,
61
+ height
62
+ };
63
+ }
64
+ function resolveWebViewportSize(viewport, fallback = defaultViewportSize) {
65
+ return resolveViewportSize({
66
+ width: viewport?.viewportWidth,
67
+ height: viewport?.viewportHeight
68
+ }, fallback);
69
+ }
70
+ exports.defaultPuppeteerWindowViewportSize = __webpack_exports__.defaultPuppeteerWindowViewportSize;
71
+ exports.defaultStaticPageViewportSize = __webpack_exports__.defaultStaticPageViewportSize;
72
+ exports.defaultViewportHeight = __webpack_exports__.defaultViewportHeight;
73
+ exports.defaultViewportSize = __webpack_exports__.defaultViewportSize;
74
+ exports.defaultViewportWidth = __webpack_exports__.defaultViewportWidth;
75
+ exports.resolveViewportSize = __webpack_exports__.resolveViewportSize;
76
+ exports.resolveWebViewportSize = __webpack_exports__.resolveWebViewportSize;
77
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
78
+ "defaultPuppeteerWindowViewportSize",
79
+ "defaultStaticPageViewportSize",
80
+ "defaultViewportHeight",
81
+ "defaultViewportSize",
82
+ "defaultViewportWidth",
83
+ "resolveViewportSize",
84
+ "resolveWebViewportSize"
85
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
86
+ Object.defineProperty(exports, '__esModule', {
87
+ value: true
88
+ });
89
+
90
+ //# sourceMappingURL=viewport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common/viewport.js","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../../src/common/viewport.ts"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import { assert } from '@midscene/shared/utils';\n\nexport interface ViewportSize {\n width: number;\n height: number;\n}\n\nexport const defaultViewportWidth = 1440;\nexport const defaultViewportHeight = 800;\nexport const defaultViewportSize: ViewportSize = {\n width: defaultViewportWidth,\n height: defaultViewportHeight,\n};\nexport const defaultPuppeteerWindowViewportSize: ViewportSize = {\n width: defaultViewportWidth,\n height: defaultViewportHeight,\n};\nexport const defaultStaticPageViewportSize: ViewportSize = {\n width: defaultViewportWidth,\n height: defaultViewportHeight,\n};\n\nfunction parseViewportDimension(\n rawValue: number | string,\n name: 'viewportWidth' | 'viewportHeight',\n): number {\n const parsedValue =\n typeof rawValue === 'number' ? rawValue : Number(rawValue);\n\n assert(\n Number.isInteger(parsedValue),\n `${name} must be a positive integer, but got ${rawValue}`,\n );\n assert(\n parsedValue > 0,\n `${name} must be greater than 0, but got ${rawValue}`,\n );\n\n return parsedValue;\n}\n\nexport function resolveViewportSize(\n viewport?: {\n width?: number | string | null;\n height?: number | string | null;\n },\n fallback: ViewportSize = defaultViewportSize,\n): ViewportSize {\n const width =\n viewport?.width === undefined || viewport.width === null\n ? fallback.width\n : parseViewportDimension(viewport.width, 'viewportWidth');\n const height =\n viewport?.height === undefined || viewport.height === null\n ? fallback.height\n : parseViewportDimension(viewport.height, 'viewportHeight');\n\n return { width, height };\n}\n\nexport function resolveWebViewportSize(\n viewport?: {\n viewportWidth?: number | string | null;\n viewportHeight?: number | string | null;\n },\n fallback: ViewportSize = defaultViewportSize,\n): ViewportSize {\n return resolveViewportSize(\n {\n width: viewport?.viewportWidth,\n height: viewport?.viewportHeight,\n },\n fallback,\n );\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","defaultViewportWidth","defaultViewportHeight","defaultViewportSize","defaultPuppeteerWindowViewportSize","defaultStaticPageViewportSize","parseViewportDimension","rawValue","name","parsedValue","Number","assert","resolveViewportSize","viewport","fallback","width","undefined","height","resolveWebViewportSize"],"mappings":";;;IAAAA,oBAAoB,CAAC,GAAG,CAAC,UAASC;QACjC,IAAI,IAAIC,OAAOD,WACR,IAAGD,oBAAoB,CAAC,CAACC,YAAYC,QAAQ,CAACF,oBAAoB,CAAC,CAAC,UAASE,MACzEC,OAAO,cAAc,CAAC,UAASD,KAAK;YAAE,YAAY;YAAM,KAAKD,UAAU,CAACC,IAAI;QAAC;IAGzF;;;ICNAF,oBAAoB,CAAC,GAAG,CAACI,KAAKC,OAAUF,OAAO,SAAS,CAAC,cAAc,CAAC,IAAI,CAACC,KAAKC;;;ICClFL,oBAAoB,CAAC,GAAG,CAAC;QACxB,IAAG,AAAkB,eAAlB,OAAOM,UAA0BA,OAAO,WAAW,EACrDH,OAAO,cAAc,CAAC,UAASG,OAAO,WAAW,EAAE;YAAE,OAAO;QAAS;QAEtEH,OAAO,cAAc,CAAC,UAAS,cAAc;YAAE,OAAO;QAAK;IAC5D;;;;;;;;;;;;;;ACCO,MAAMI,uBAAuB;AAC7B,MAAMC,wBAAwB;AAC9B,MAAMC,sBAAoC;IAC/C,OAAOF;IACP,QAAQC;AACV;AACO,MAAME,qCAAmD;IAC9D,OAAOH;IACP,QAAQC;AACV;AACO,MAAMG,gCAA8C;IACzD,OAAOJ;IACP,QAAQC;AACV;AAEA,SAASI,uBACPC,QAAyB,EACzBC,IAAwC;IAExC,MAAMC,cACJ,AAAoB,YAApB,OAAOF,WAAwBA,WAAWG,OAAOH;IAEnDI,IAAAA,sBAAAA,MAAAA,AAAAA,EACED,OAAO,SAAS,CAACD,cACjB,GAAGD,KAAK,qCAAqC,EAAED,UAAU;IAE3DI,IAAAA,sBAAAA,MAAAA,AAAAA,EACEF,cAAc,GACd,GAAGD,KAAK,iCAAiC,EAAED,UAAU;IAGvD,OAAOE;AACT;AAEO,SAASG,oBACdC,QAGC,EACDC,WAAyBX,mBAAmB;IAE5C,MAAMY,QACJF,UAAU,UAAUG,UAAaH,AAAmB,SAAnBA,SAAS,KAAK,GAC3CC,SAAS,KAAK,GACdR,uBAAuBO,SAAS,KAAK,EAAE;IAC7C,MAAMI,SACJJ,UAAU,WAAWG,UAAaH,AAAoB,SAApBA,SAAS,MAAM,GAC7CC,SAAS,MAAM,GACfR,uBAAuBO,SAAS,MAAM,EAAE;IAE9C,OAAO;QAAEE;QAAOE;IAAO;AACzB;AAEO,SAASC,uBACdL,QAGC,EACDC,WAAyBX,mBAAmB;IAE5C,OAAOS,oBACL;QACE,OAAOC,UAAU;QACjB,QAAQA,UAAU;IACpB,GACAC;AAEJ"}
@@ -37,7 +37,7 @@ class WebMCPServer extends mcp_namespaceObject.BaseMCPServer {
37
37
  constructor(toolsManager){
38
38
  super({
39
39
  name: '@midscene/web-bridge-mcp',
40
- version: "1.7.7",
40
+ version: "1.7.10-beta-20260507030203.0",
41
41
  description: 'Control the browser using natural language commands'
42
42
  }, toolsManager);
43
43
  }
@@ -42,6 +42,7 @@ const external_puppeteer_core_namespaceObject = require("puppeteer-core");
42
42
  var external_puppeteer_core_default = /*#__PURE__*/ __webpack_require__.n(external_puppeteer_core_namespaceObject);
43
43
  const external_cdp_proxy_manager_js_namespaceObject = require("./cdp-proxy-manager.js");
44
44
  const external_cdp_target_store_js_namespaceObject = require("./cdp-target-store.js");
45
+ const viewport_js_namespaceObject = require("./common/viewport.js");
45
46
  const index_js_namespaceObject = require("./puppeteer/index.js");
46
47
  const external_static_index_js_namespaceObject = require("./static/index.js");
47
48
  function _define_property(obj, key, value) {
@@ -66,10 +67,7 @@ class WebCdpMidsceneTools extends base_tools_namespaceObject.BaseMidsceneTools {
66
67
  createTemporaryDevice() {
67
68
  return new external_static_index_js_namespaceObject.StaticPage({
68
69
  screenshot: core_namespaceObject.ScreenshotItem.create('', Date.now()),
69
- shotSize: {
70
- width: 1920,
71
- height: 1080
72
- },
70
+ shotSize: viewport_js_namespaceObject.defaultStaticPageViewportSize,
73
71
  shrunkShotToLogicalRatio: 1
74
72
  });
75
73
  }
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-tools-cdp.js","sources":["webpack/runtime/compat_get_default_export","webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../src/mcp-tools-cdp.ts"],"sourcesContent":["// getDefaultExport function for compatibility with non-ESM modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};\n","__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import { ScreenshotItem, z } from '@midscene/core';\nimport { getDebug } from '@midscene/shared/logger';\nimport { BaseMidsceneTools } from '@midscene/shared/mcp/base-tools';\nimport type { ToolDefinition } from '@midscene/shared/mcp/types';\nimport type { Page as PuppeteerPage } from 'puppeteer';\nimport puppeteer from 'puppeteer-core';\nimport type { Browser, Page } from 'puppeteer-core';\nimport { getProxyEndpoint } from './cdp-proxy-manager';\nimport {\n cleanupTargetIdFile,\n readSavedTargetId,\n saveTargetId,\n} from './cdp-target-store';\nimport { PuppeteerAgent } from './puppeteer';\nimport { StaticPage } from './static';\n\nconst debug = getDebug('mcp:cdp');\n\n/** CDP target discovery may need a brief moment after WebSocket open. */\nconst CDP_TARGET_DISCOVERY_DELAY_MS = 500;\n\n/**\n * puppeteer-core does not expose a public method for the underlying CDP\n * target id, so we reach into `_targetId`. Centralised here so a future\n * puppeteer release exposing this properly only requires one change.\n * Callers must treat the result as optional.\n */\nfunction getTargetId(page: Page): string | undefined {\n return (page.target() as unknown as { _targetId?: string })._targetId;\n}\n\n/**\n * Tools manager for Web CDP-mode MCP.\n * Connects to an existing Chrome browser via CDP (Chrome DevTools Protocol) endpoint.\n * Unlike WebPuppeteerMidsceneTools which launches its own Chrome, this connects\n * to a browser that is already running with remote debugging enabled.\n *\n * Uses a persistent WebSocket proxy to avoid repeated Chrome permission popups\n * when Chrome's settings-based remote debugging is used.\n */\nexport class WebCdpMidsceneTools extends BaseMidsceneTools<PuppeteerAgent> {\n protected getCliReportSessionName() {\n return 'midscene-web';\n }\n private cdpEndpoint: string;\n private activeBrowser: Browser | null = null;\n\n constructor(cdpEndpoint: string) {\n super();\n this.cdpEndpoint = cdpEndpoint;\n }\n\n protected createTemporaryDevice() {\n return new StaticPage({\n screenshot: ScreenshotItem.create('', Date.now()),\n shotSize: { width: 1920, height: 1080 },\n shrunkShotToLogicalRatio: 1,\n });\n }\n\n protected async ensureAgent(navigateToUrl?: string): Promise<PuppeteerAgent> {\n // Re-init if URL provided\n if (this.agent && navigateToUrl) {\n try {\n await this.agent?.destroy?.();\n } catch (error) {\n console.debug('Failed to destroy agent during re-init:', error);\n }\n this.agent = undefined;\n }\n\n if (this.agent) return this.agent;\n\n // Connect via proxy to avoid repeated Chrome permission popups\n if (!this.activeBrowser) {\n const endpoint = await getProxyEndpoint(this.cdpEndpoint);\n this.activeBrowser = await puppeteer.connect({\n browserWSEndpoint: endpoint,\n defaultViewport: null,\n });\n }\n\n const browser = this.activeBrowser;\n let pages = await browser.pages();\n\n // If no pages discovered, wait briefly and retry — some CDP targets\n // need a moment to appear after the WebSocket connection is established.\n if (pages.length === 0) {\n await new Promise((r) => setTimeout(r, CDP_TARGET_DISCOVERY_DELAY_MS));\n pages = await browser.pages();\n }\n\n const webPages = pages.filter((p) => /^https?:\\/\\//.test(p.url()));\n debug(\n 'Found %d page(s), %d web page(s): %o',\n pages.length,\n webPages.length,\n pages.map((p) => p.url()),\n );\n let page: Page;\n\n if (navigateToUrl) {\n if (webPages.length > 0) {\n // Reuse an existing page and navigate it — avoids creating invisible\n // tabs when Chrome uses settings-based remote debugging (no HTTP\n // discovery endpoints, /devtools/page/* returns 403).\n page = webPages[webPages.length - 1];\n await page.bringToFront();\n await page.goto(navigateToUrl, {\n timeout: 30000,\n waitUntil: 'domcontentloaded',\n });\n } else {\n // No existing web pages — fall back to creating a new tab\n page = await browser.newPage();\n await page.goto(navigateToUrl, {\n timeout: 30000,\n waitUntil: 'domcontentloaded',\n });\n }\n } else {\n // Try to find the exact tab from a previous `connect` command via saved targetId.\n const savedTargetId = readSavedTargetId();\n let matchedPage: Page | undefined;\n\n if (savedTargetId && pages.length > 0) {\n matchedPage = pages.find((p) => getTargetId(p) === savedTargetId);\n if (matchedPage) {\n debug('Matched saved targetId %s', savedTargetId);\n } else {\n debug(\n 'Saved targetId %s not found among %d pages, falling back',\n savedTargetId,\n pages.length,\n );\n }\n }\n\n if (matchedPage) {\n page = matchedPage;\n } else if (webPages.length > 0) {\n page = webPages[webPages.length - 1];\n } else if (pages.length > 0) {\n page = pages[pages.length - 1];\n } else {\n page = await browser.newPage();\n }\n\n await page.bringToFront();\n }\n\n // Persist the targetId so subsequent CLI commands can find this exact tab\n const targetId = getTargetId(page);\n if (targetId) {\n saveTargetId(targetId);\n } else {\n // If puppeteer ever drops the private _targetId field, this branch\n // makes the regression visible instead of silently disabling the\n // cross-command tab reuse path.\n debug(\n 'No targetId on page.target(); cross-command tab reuse disabled until puppeteer integration is updated.',\n );\n }\n\n const reportOptions = this.readCliReportAgentOptions();\n this.agent = new PuppeteerAgent(page as unknown as PuppeteerPage, {\n ...(reportOptions ?? {}),\n });\n return this.agent;\n }\n\n public async destroy(): Promise<void> {\n await super.destroy();\n if (this.activeBrowser) {\n this.activeBrowser.disconnect();\n this.activeBrowser = null;\n }\n }\n\n protected preparePlatformTools(): ToolDefinition[] {\n return [\n {\n name: 'web_connect',\n description:\n 'Connect to a web page via CDP. Opens a new tab with the given URL, or reuses the current page.',\n schema: {\n url: z\n .string()\n .url()\n .optional()\n .describe('URL to open in new tab (omit to use current page)'),\n },\n handler: async (args) => {\n const { url } = args as { url?: string };\n\n // Destroy existing agent\n if (this.agent) {\n try {\n await this.agent.destroy?.();\n } catch (e) {\n console.debug('Failed to destroy agent during connect:', e);\n }\n this.agent = undefined;\n }\n\n const reportSession = this.createNewCliReportSession(\n url ?? 'current-page',\n );\n this.commitCliReportSession(reportSession);\n this.agent = await this.ensureAgent(url);\n\n const screenshot = await this.agent.page?.screenshotBase64();\n const label = url ?? 'current page';\n\n return {\n content: [\n { type: 'text', text: `Connected via CDP to: ${label}` },\n ...(screenshot ? this.buildScreenshotContent(screenshot) : []),\n ],\n };\n },\n },\n {\n name: 'web_disconnect',\n description:\n 'Disconnect from current web page. The browser stays running (managed externally).',\n schema: {},\n handler: async () => {\n if (this.agent) {\n try {\n await this.agent.destroy?.();\n } catch (e) {\n console.debug('Failed to destroy agent during disconnect:', e);\n }\n this.agent = undefined;\n }\n if (this.activeBrowser) {\n this.activeBrowser.disconnect();\n this.activeBrowser = null;\n }\n cleanupTargetIdFile();\n return this.buildTextResult(\n 'Disconnected from web page (browser still running externally)',\n );\n },\n },\n ];\n }\n}\n"],"names":["__webpack_require__","module","getter","definition","key","Object","obj","prop","Symbol","debug","getDebug","CDP_TARGET_DISCOVERY_DELAY_MS","getTargetId","page","WebCdpMidsceneTools","BaseMidsceneTools","StaticPage","ScreenshotItem","Date","navigateToUrl","error","console","undefined","endpoint","getProxyEndpoint","puppeteer","browser","pages","Promise","r","setTimeout","webPages","p","savedTargetId","readSavedTargetId","matchedPage","targetId","saveTargetId","reportOptions","PuppeteerAgent","z","args","url","e","reportSession","screenshot","label","cleanupTargetIdFile","cdpEndpoint"],"mappings":"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"}
1
+ {"version":3,"file":"mcp-tools-cdp.js","sources":["webpack/runtime/compat_get_default_export","webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../src/mcp-tools-cdp.ts"],"sourcesContent":["// getDefaultExport function for compatibility with non-ESM modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};\n","__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import { ScreenshotItem, z } from '@midscene/core';\nimport { getDebug } from '@midscene/shared/logger';\nimport { BaseMidsceneTools } from '@midscene/shared/mcp/base-tools';\nimport type { ToolDefinition } from '@midscene/shared/mcp/types';\nimport type { Page as PuppeteerPage } from 'puppeteer';\nimport puppeteer from 'puppeteer-core';\nimport type { Browser, Page } from 'puppeteer-core';\nimport { getProxyEndpoint } from './cdp-proxy-manager';\nimport {\n cleanupTargetIdFile,\n readSavedTargetId,\n saveTargetId,\n} from './cdp-target-store';\nimport { defaultStaticPageViewportSize } from './common/viewport';\nimport { PuppeteerAgent } from './puppeteer';\nimport { StaticPage } from './static';\n\nconst debug = getDebug('mcp:cdp');\n\n/** CDP target discovery may need a brief moment after WebSocket open. */\nconst CDP_TARGET_DISCOVERY_DELAY_MS = 500;\n\n/**\n * puppeteer-core does not expose a public method for the underlying CDP\n * target id, so we reach into `_targetId`. Centralised here so a future\n * puppeteer release exposing this properly only requires one change.\n * Callers must treat the result as optional.\n */\nfunction getTargetId(page: Page): string | undefined {\n return (page.target() as unknown as { _targetId?: string })._targetId;\n}\n\n/**\n * Tools manager for Web CDP-mode MCP.\n * Connects to an existing Chrome browser via CDP (Chrome DevTools Protocol) endpoint.\n * Unlike WebPuppeteerMidsceneTools which launches its own Chrome, this connects\n * to a browser that is already running with remote debugging enabled.\n *\n * Uses a persistent WebSocket proxy to avoid repeated Chrome permission popups\n * when Chrome's settings-based remote debugging is used.\n */\nexport class WebCdpMidsceneTools extends BaseMidsceneTools<PuppeteerAgent> {\n protected getCliReportSessionName() {\n return 'midscene-web';\n }\n private cdpEndpoint: string;\n private activeBrowser: Browser | null = null;\n\n constructor(cdpEndpoint: string) {\n super();\n this.cdpEndpoint = cdpEndpoint;\n }\n\n protected createTemporaryDevice() {\n return new StaticPage({\n screenshot: ScreenshotItem.create('', Date.now()),\n shotSize: defaultStaticPageViewportSize,\n shrunkShotToLogicalRatio: 1,\n });\n }\n\n protected async ensureAgent(navigateToUrl?: string): Promise<PuppeteerAgent> {\n // Re-init if URL provided\n if (this.agent && navigateToUrl) {\n try {\n await this.agent?.destroy?.();\n } catch (error) {\n console.debug('Failed to destroy agent during re-init:', error);\n }\n this.agent = undefined;\n }\n\n if (this.agent) return this.agent;\n\n // Connect via proxy to avoid repeated Chrome permission popups\n if (!this.activeBrowser) {\n const endpoint = await getProxyEndpoint(this.cdpEndpoint);\n this.activeBrowser = await puppeteer.connect({\n browserWSEndpoint: endpoint,\n defaultViewport: null,\n });\n }\n\n const browser = this.activeBrowser;\n let pages = await browser.pages();\n\n // If no pages discovered, wait briefly and retry — some CDP targets\n // need a moment to appear after the WebSocket connection is established.\n if (pages.length === 0) {\n await new Promise((r) => setTimeout(r, CDP_TARGET_DISCOVERY_DELAY_MS));\n pages = await browser.pages();\n }\n\n const webPages = pages.filter((p) => /^https?:\\/\\//.test(p.url()));\n debug(\n 'Found %d page(s), %d web page(s): %o',\n pages.length,\n webPages.length,\n pages.map((p) => p.url()),\n );\n let page: Page;\n\n if (navigateToUrl) {\n if (webPages.length > 0) {\n // Reuse an existing page and navigate it — avoids creating invisible\n // tabs when Chrome uses settings-based remote debugging (no HTTP\n // discovery endpoints, /devtools/page/* returns 403).\n page = webPages[webPages.length - 1];\n await page.bringToFront();\n await page.goto(navigateToUrl, {\n timeout: 30000,\n waitUntil: 'domcontentloaded',\n });\n } else {\n // No existing web pages — fall back to creating a new tab\n page = await browser.newPage();\n await page.goto(navigateToUrl, {\n timeout: 30000,\n waitUntil: 'domcontentloaded',\n });\n }\n } else {\n // Try to find the exact tab from a previous `connect` command via saved targetId.\n const savedTargetId = readSavedTargetId();\n let matchedPage: Page | undefined;\n\n if (savedTargetId && pages.length > 0) {\n matchedPage = pages.find((p) => getTargetId(p) === savedTargetId);\n if (matchedPage) {\n debug('Matched saved targetId %s', savedTargetId);\n } else {\n debug(\n 'Saved targetId %s not found among %d pages, falling back',\n savedTargetId,\n pages.length,\n );\n }\n }\n\n if (matchedPage) {\n page = matchedPage;\n } else if (webPages.length > 0) {\n page = webPages[webPages.length - 1];\n } else if (pages.length > 0) {\n page = pages[pages.length - 1];\n } else {\n page = await browser.newPage();\n }\n\n await page.bringToFront();\n }\n\n // Persist the targetId so subsequent CLI commands can find this exact tab\n const targetId = getTargetId(page);\n if (targetId) {\n saveTargetId(targetId);\n } else {\n // If puppeteer ever drops the private _targetId field, this branch\n // makes the regression visible instead of silently disabling the\n // cross-command tab reuse path.\n debug(\n 'No targetId on page.target(); cross-command tab reuse disabled until puppeteer integration is updated.',\n );\n }\n\n const reportOptions = this.readCliReportAgentOptions();\n this.agent = new PuppeteerAgent(page as unknown as PuppeteerPage, {\n ...(reportOptions ?? {}),\n });\n return this.agent;\n }\n\n public async destroy(): Promise<void> {\n await super.destroy();\n if (this.activeBrowser) {\n this.activeBrowser.disconnect();\n this.activeBrowser = null;\n }\n }\n\n protected preparePlatformTools(): ToolDefinition[] {\n return [\n {\n name: 'web_connect',\n description:\n 'Connect to a web page via CDP. Opens a new tab with the given URL, or reuses the current page.',\n schema: {\n url: z\n .string()\n .url()\n .optional()\n .describe('URL to open in new tab (omit to use current page)'),\n },\n handler: async (args) => {\n const { url } = args as { url?: string };\n\n // Destroy existing agent\n if (this.agent) {\n try {\n await this.agent.destroy?.();\n } catch (e) {\n console.debug('Failed to destroy agent during connect:', e);\n }\n this.agent = undefined;\n }\n\n const reportSession = this.createNewCliReportSession(\n url ?? 'current-page',\n );\n this.commitCliReportSession(reportSession);\n this.agent = await this.ensureAgent(url);\n\n const screenshot = await this.agent.page?.screenshotBase64();\n const label = url ?? 'current page';\n\n return {\n content: [\n { type: 'text', text: `Connected via CDP to: ${label}` },\n ...(screenshot ? this.buildScreenshotContent(screenshot) : []),\n ],\n };\n },\n },\n {\n name: 'web_disconnect',\n description:\n 'Disconnect from current web page. The browser stays running (managed externally).',\n schema: {},\n handler: async () => {\n if (this.agent) {\n try {\n await this.agent.destroy?.();\n } catch (e) {\n console.debug('Failed to destroy agent during disconnect:', e);\n }\n this.agent = undefined;\n }\n if (this.activeBrowser) {\n this.activeBrowser.disconnect();\n this.activeBrowser = null;\n }\n cleanupTargetIdFile();\n return this.buildTextResult(\n 'Disconnected from web page (browser still running externally)',\n );\n },\n },\n ];\n }\n}\n"],"names":["__webpack_require__","module","getter","definition","key","Object","obj","prop","Symbol","debug","getDebug","CDP_TARGET_DISCOVERY_DELAY_MS","getTargetId","page","WebCdpMidsceneTools","BaseMidsceneTools","StaticPage","ScreenshotItem","Date","defaultStaticPageViewportSize","navigateToUrl","error","console","undefined","endpoint","getProxyEndpoint","puppeteer","browser","pages","Promise","r","setTimeout","webPages","p","savedTargetId","readSavedTargetId","matchedPage","targetId","saveTargetId","reportOptions","PuppeteerAgent","z","args","url","e","reportSession","screenshot","label","cleanupTargetIdFile","cdpEndpoint"],"mappings":"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"}
@@ -33,7 +33,9 @@ var __webpack_require__ = {};
33
33
  var __webpack_exports__ = {};
34
34
  __webpack_require__.r(__webpack_exports__);
35
35
  __webpack_require__.d(__webpack_exports__, {
36
- WebPuppeteerMidsceneTools: ()=>WebPuppeteerMidsceneTools
36
+ PUPPETEER_ENDPOINT_FILE: ()=>PUPPETEER_ENDPOINT_FILE,
37
+ WebPuppeteerMidsceneTools: ()=>WebPuppeteerMidsceneTools,
38
+ buildDetachedChromeArgs: ()=>buildDetachedChromeArgs
37
39
  });
38
40
  const external_node_child_process_namespaceObject = require("node:child_process");
39
41
  const external_node_fs_namespaceObject = require("node:fs");
@@ -45,13 +47,43 @@ const base_tools_namespaceObject = require("@midscene/shared/mcp/base-tools");
45
47
  const chrome_path_namespaceObject = require("@midscene/shared/mcp/chrome-path");
46
48
  const external_puppeteer_core_namespaceObject = require("puppeteer-core");
47
49
  var external_puppeteer_core_default = /*#__PURE__*/ __webpack_require__.n(external_puppeteer_core_namespaceObject);
50
+ const viewport_js_namespaceObject = require("./common/viewport.js");
48
51
  const index_js_namespaceObject = require("./puppeteer/index.js");
49
52
  const external_static_index_js_namespaceObject = require("./static/index.js");
53
+ function _define_property(obj, key, value) {
54
+ if (key in obj) Object.defineProperty(obj, key, {
55
+ value: value,
56
+ enumerable: true,
57
+ configurable: true,
58
+ writable: true
59
+ });
60
+ else obj[key] = value;
61
+ return obj;
62
+ }
50
63
  const ENDPOINT_FILE = (0, external_node_path_namespaceObject.join)((0, external_node_os_namespaceObject.tmpdir)(), 'midscene-puppeteer-endpoint');
51
64
  const USER_DATA_DIR = (0, external_node_path_namespaceObject.join)((0, external_node_os_namespaceObject.tmpdir)(), 'midscene-puppeteer-profile');
65
+ const PUPPETEER_ENDPOINT_FILE = ENDPOINT_FILE;
66
+ function buildDetachedChromeArgs(options) {
67
+ const viewport = options.viewport ?? viewport_js_namespaceObject.defaultPuppeteerWindowViewportSize;
68
+ return [
69
+ '--headless=new',
70
+ `--user-data-dir=${options.userDataDir}`,
71
+ '--remote-debugging-port=0',
72
+ '--no-first-run',
73
+ '--no-default-browser-check',
74
+ '--disable-extensions',
75
+ '--disable-default-apps',
76
+ '--disable-sync',
77
+ '--disable-background-networking',
78
+ '--password-store=basic',
79
+ '--use-mock-keychain',
80
+ `--window-size=${viewport.width},${viewport.height}`,
81
+ '--force-color-profile=srgb'
82
+ ];
83
+ }
52
84
  const browserManager = {
53
85
  activeBrowser: null,
54
- async getOrLaunch () {
86
+ async getOrLaunch (viewport) {
55
87
  if ((0, external_node_fs_namespaceObject.existsSync)(ENDPOINT_FILE)) try {
56
88
  const endpoint = (await (0, promises_namespaceObject.readFile)(ENDPOINT_FILE, 'utf-8')).trim();
57
89
  const browser = await external_puppeteer_core_default().connect({
@@ -67,7 +99,7 @@ const browserManager = {
67
99
  await (0, promises_namespaceObject.unlink)(ENDPOINT_FILE);
68
100
  } catch {}
69
101
  }
70
- const wsEndpoint = await this.launchDetachedChrome();
102
+ const wsEndpoint = await this.launchDetachedChrome(viewport);
71
103
  await (0, promises_namespaceObject.writeFile)(ENDPOINT_FILE, wsEndpoint);
72
104
  const browser = await external_puppeteer_core_default().connect({
73
105
  browserWSEndpoint: wsEndpoint,
@@ -97,26 +129,15 @@ const browserManager = {
97
129
  this.activeBrowser = null;
98
130
  }
99
131
  },
100
- async launchDetachedChrome () {
132
+ async launchDetachedChrome (viewport) {
101
133
  const chromePath = (0, chrome_path_namespaceObject.resolveChromePath)();
102
134
  await (0, promises_namespaceObject.mkdir)(USER_DATA_DIR, {
103
135
  recursive: true
104
136
  });
105
- const args = [
106
- '--headless=new',
107
- `--user-data-dir=${USER_DATA_DIR}`,
108
- '--remote-debugging-port=0',
109
- '--no-first-run',
110
- '--no-default-browser-check',
111
- '--disable-extensions',
112
- '--disable-default-apps',
113
- '--disable-sync',
114
- '--disable-background-networking',
115
- '--password-store=basic',
116
- '--use-mock-keychain',
117
- '--window-size=1280,800',
118
- '--force-color-profile=srgb'
119
- ];
137
+ const args = buildDetachedChromeArgs({
138
+ userDataDir: USER_DATA_DIR,
139
+ viewport
140
+ });
120
141
  const proc = (0, external_node_child_process_namespaceObject.spawn)(chromePath, args, {
121
142
  detached: true,
122
143
  stdio: [
@@ -152,10 +173,7 @@ class WebPuppeteerMidsceneTools extends base_tools_namespaceObject.BaseMidsceneT
152
173
  createTemporaryDevice() {
153
174
  return new external_static_index_js_namespaceObject.StaticPage({
154
175
  screenshot: core_namespaceObject.ScreenshotItem.create('', Date.now()),
155
- shotSize: {
156
- width: 1920,
157
- height: 1080
158
- },
176
+ shotSize: this.viewport ?? viewport_js_namespaceObject.defaultStaticPageViewportSize,
159
177
  shrunkShotToLogicalRatio: 1
160
178
  });
161
179
  }
@@ -167,12 +185,13 @@ class WebPuppeteerMidsceneTools extends base_tools_namespaceObject.BaseMidsceneT
167
185
  this.agent = void 0;
168
186
  }
169
187
  if (this.agent) return this.agent;
170
- const { browser, reused } = await browserManager.getOrLaunch();
188
+ const { browser, reused } = await browserManager.getOrLaunch(this.viewport);
171
189
  browserManager.activeBrowser = browser;
172
190
  const pages = await browser.pages();
173
191
  let page;
174
192
  if (navigateToUrl) {
175
193
  page = await browser.newPage();
194
+ if (this.viewport) await page.setViewport(this.viewport);
176
195
  await page.goto(navigateToUrl, {
177
196
  timeout: 30000,
178
197
  waitUntil: 'domcontentloaded'
@@ -181,6 +200,7 @@ class WebPuppeteerMidsceneTools extends base_tools_namespaceObject.BaseMidsceneT
181
200
  const webPages = pages.filter((p)=>/^https?:\/\//.test(p.url()));
182
201
  page = webPages.length > 0 ? webPages[webPages.length - 1] : pages[pages.length - 1] || await browser.newPage();
183
202
  if (reused) await page.bringToFront();
203
+ if (this.viewport) await page.setViewport(this.viewport);
184
204
  }
185
205
  const reportOptions = this.readCliReportAgentOptions();
186
206
  this.agent = new index_js_namespaceObject.PuppeteerAgent(page, {
@@ -256,10 +276,20 @@ class WebPuppeteerMidsceneTools extends base_tools_namespaceObject.BaseMidsceneT
256
276
  }
257
277
  ];
258
278
  }
279
+ constructor(viewport){
280
+ super(), _define_property(this, "viewport", void 0);
281
+ this.viewport = viewport ? {
282
+ ...viewport
283
+ } : void 0;
284
+ }
259
285
  }
286
+ exports.PUPPETEER_ENDPOINT_FILE = __webpack_exports__.PUPPETEER_ENDPOINT_FILE;
260
287
  exports.WebPuppeteerMidsceneTools = __webpack_exports__.WebPuppeteerMidsceneTools;
288
+ exports.buildDetachedChromeArgs = __webpack_exports__.buildDetachedChromeArgs;
261
289
  for(var __rspack_i in __webpack_exports__)if (-1 === [
262
- "WebPuppeteerMidsceneTools"
290
+ "PUPPETEER_ENDPOINT_FILE",
291
+ "WebPuppeteerMidsceneTools",
292
+ "buildDetachedChromeArgs"
263
293
  ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
264
294
  Object.defineProperty(exports, '__esModule', {
265
295
  value: true