@godscene/web 1.7.11

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 (129) hide show
  1. package/README.md +7 -0
  2. package/bin/midscene-playground +3 -0
  3. package/bin/midscene-web +2 -0
  4. package/dist/es/bin.mjs +14 -0
  5. package/dist/es/bridge-mode/agent-cli-side.mjs +135 -0
  6. package/dist/es/bridge-mode/browser.mjs +2 -0
  7. package/dist/es/bridge-mode/common.mjs +41 -0
  8. package/dist/es/bridge-mode/index.mjs +4 -0
  9. package/dist/es/bridge-mode/io-client.mjs +99 -0
  10. package/dist/es/bridge-mode/io-server.mjs +218 -0
  11. package/dist/es/bridge-mode/page-browser-side.mjs +119 -0
  12. package/dist/es/cdp-proxy-constants.mjs +7 -0
  13. package/dist/es/cdp-proxy-manager.mjs +217 -0
  14. package/dist/es/cdp-proxy.mjs +151 -0
  15. package/dist/es/cdp-target-store.mjs +26 -0
  16. package/dist/es/chrome-extension/agent.mjs +8 -0
  17. package/dist/es/chrome-extension/cdpInput.mjs +172 -0
  18. package/dist/es/chrome-extension/cdpInput.mjs.LICENSE.txt +5 -0
  19. package/dist/es/chrome-extension/dynamic-scripts.mjs +36 -0
  20. package/dist/es/chrome-extension/index.mjs +5 -0
  21. package/dist/es/chrome-extension/page.mjs +733 -0
  22. package/dist/es/cli-options.mjs +97 -0
  23. package/dist/es/cli.mjs +26 -0
  24. package/dist/es/common/cache-helper.mjs +26 -0
  25. package/dist/es/common/viewport.mjs +36 -0
  26. package/dist/es/index.mjs +8 -0
  27. package/dist/es/mcp-server.mjs +33 -0
  28. package/dist/es/mcp-tools-cdp.mjs +164 -0
  29. package/dist/es/mcp-tools-puppeteer.mjs +246 -0
  30. package/dist/es/mcp-tools.mjs +81 -0
  31. package/dist/es/platform.mjs +37 -0
  32. package/dist/es/playwright/ai-fixture.mjs +364 -0
  33. package/dist/es/playwright/index.mjs +36 -0
  34. package/dist/es/playwright/page.mjs +42 -0
  35. package/dist/es/playwright/reporter/index.mjs +178 -0
  36. package/dist/es/puppeteer/agent-launcher.mjs +172 -0
  37. package/dist/es/puppeteer/base-page.mjs +830 -0
  38. package/dist/es/puppeteer/index.mjs +35 -0
  39. package/dist/es/puppeteer/page.mjs +7 -0
  40. package/dist/es/static/index.mjs +3 -0
  41. package/dist/es/static/static-agent.mjs +10 -0
  42. package/dist/es/static/static-page.mjs +123 -0
  43. package/dist/es/utils.mjs +6 -0
  44. package/dist/es/web-element.mjs +57 -0
  45. package/dist/es/web-page.mjs +272 -0
  46. package/dist/lib/bin.js +20 -0
  47. package/dist/lib/bridge-mode/agent-cli-side.js +172 -0
  48. package/dist/lib/bridge-mode/browser.js +36 -0
  49. package/dist/lib/bridge-mode/common.js +105 -0
  50. package/dist/lib/bridge-mode/index.js +44 -0
  51. package/dist/lib/bridge-mode/io-client.js +133 -0
  52. package/dist/lib/bridge-mode/io-server.js +255 -0
  53. package/dist/lib/bridge-mode/page-browser-side.js +163 -0
  54. package/dist/lib/cdp-proxy-constants.js +50 -0
  55. package/dist/lib/cdp-proxy-manager.js +273 -0
  56. package/dist/lib/cdp-proxy.js +179 -0
  57. package/dist/lib/cdp-target-store.js +66 -0
  58. package/dist/lib/chrome-extension/agent.js +42 -0
  59. package/dist/lib/chrome-extension/cdpInput.js +206 -0
  60. package/dist/lib/chrome-extension/cdpInput.js.LICENSE.txt +5 -0
  61. package/dist/lib/chrome-extension/dynamic-scripts.js +86 -0
  62. package/dist/lib/chrome-extension/index.js +58 -0
  63. package/dist/lib/chrome-extension/page.js +767 -0
  64. package/dist/lib/cli-options.js +131 -0
  65. package/dist/lib/cli.js +54 -0
  66. package/dist/lib/common/cache-helper.js +66 -0
  67. package/dist/lib/common/viewport.js +88 -0
  68. package/dist/lib/index.js +66 -0
  69. package/dist/lib/mcp-server.js +73 -0
  70. package/dist/lib/mcp-tools-cdp.js +208 -0
  71. package/dist/lib/mcp-tools-puppeteer.js +296 -0
  72. package/dist/lib/mcp-tools.js +115 -0
  73. package/dist/lib/platform.js +71 -0
  74. package/dist/lib/playwright/ai-fixture.js +401 -0
  75. package/dist/lib/playwright/index.js +89 -0
  76. package/dist/lib/playwright/page.js +76 -0
  77. package/dist/lib/playwright/reporter/index.js +212 -0
  78. package/dist/lib/puppeteer/agent-launcher.js +240 -0
  79. package/dist/lib/puppeteer/base-page.js +876 -0
  80. package/dist/lib/puppeteer/index.js +85 -0
  81. package/dist/lib/puppeteer/page.js +41 -0
  82. package/dist/lib/static/index.js +50 -0
  83. package/dist/lib/static/static-agent.js +44 -0
  84. package/dist/lib/static/static-page.js +157 -0
  85. package/dist/lib/utils.js +38 -0
  86. package/dist/lib/web-element.js +94 -0
  87. package/dist/lib/web-page.js +322 -0
  88. package/dist/types/bin.d.ts +1 -0
  89. package/dist/types/bridge-mode/agent-cli-side.d.ts +49 -0
  90. package/dist/types/bridge-mode/browser.d.ts +2 -0
  91. package/dist/types/bridge-mode/common.d.ts +74 -0
  92. package/dist/types/bridge-mode/index.d.ts +4 -0
  93. package/dist/types/bridge-mode/io-client.d.ts +10 -0
  94. package/dist/types/bridge-mode/io-server.d.ts +27 -0
  95. package/dist/types/bridge-mode/page-browser-side.d.ts +21 -0
  96. package/dist/types/cdp-proxy-constants.d.ts +4 -0
  97. package/dist/types/cdp-proxy-manager.d.ts +53 -0
  98. package/dist/types/cdp-proxy.d.ts +37 -0
  99. package/dist/types/cdp-target-store.d.ts +26 -0
  100. package/dist/types/chrome-extension/agent.d.ts +4 -0
  101. package/dist/types/chrome-extension/cdpInput.d.ts +52 -0
  102. package/dist/types/chrome-extension/dynamic-scripts.d.ts +3 -0
  103. package/dist/types/chrome-extension/index.d.ts +5 -0
  104. package/dist/types/chrome-extension/page.d.ts +120 -0
  105. package/dist/types/cli-options.d.ts +8 -0
  106. package/dist/types/cli.d.ts +1 -0
  107. package/dist/types/common/cache-helper.d.ts +20 -0
  108. package/dist/types/common/viewport.d.ts +17 -0
  109. package/dist/types/index.d.ts +9 -0
  110. package/dist/types/mcp-server.d.ts +26 -0
  111. package/dist/types/mcp-tools-cdp.d.ts +23 -0
  112. package/dist/types/mcp-tools-puppeteer.d.ts +23 -0
  113. package/dist/types/mcp-tools.d.ts +14 -0
  114. package/dist/types/platform.d.ts +10 -0
  115. package/dist/types/playwright/ai-fixture.d.ts +133 -0
  116. package/dist/types/playwright/index.d.ts +13 -0
  117. package/dist/types/playwright/page.d.ts +11 -0
  118. package/dist/types/playwright/reporter/index.d.ts +28 -0
  119. package/dist/types/puppeteer/agent-launcher.d.ts +59 -0
  120. package/dist/types/puppeteer/base-page.d.ts +123 -0
  121. package/dist/types/puppeteer/index.d.ts +11 -0
  122. package/dist/types/puppeteer/page.d.ts +6 -0
  123. package/dist/types/static/index.d.ts +2 -0
  124. package/dist/types/static/static-agent.d.ts +5 -0
  125. package/dist/types/static/static-page.d.ts +46 -0
  126. package/dist/types/utils.d.ts +6 -0
  127. package/dist/types/web-element.d.ts +48 -0
  128. package/dist/types/web-page.d.ts +69 -0
  129. package/package.json +173 -0
@@ -0,0 +1,212 @@
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 ("u" > 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
+ default: ()=>reporter
28
+ });
29
+ const external_node_fs_namespaceObject = require("node:fs");
30
+ const external_node_path_namespaceObject = require("node:path");
31
+ const agent_namespaceObject = require("@godscene/core/agent");
32
+ const report_namespaceObject = require("@godscene/core/report");
33
+ const common_namespaceObject = require("@godscene/shared/common");
34
+ const utils_namespaceObject = require("@godscene/shared/utils");
35
+ function _define_property(obj, key, value) {
36
+ if (key in obj) Object.defineProperty(obj, key, {
37
+ value: value,
38
+ enumerable: true,
39
+ configurable: true,
40
+ writable: true
41
+ });
42
+ else obj[key] = value;
43
+ return obj;
44
+ }
45
+ class MidsceneReporter {
46
+ static getMode(reporterType) {
47
+ if (!reporterType) return 'merged';
48
+ if ('merged' !== reporterType && 'separate' !== reporterType) throw new Error(`Unknown reporter type in playwright config: ${reporterType}, only support 'merged' or 'separate'`);
49
+ return reporterType;
50
+ }
51
+ getSeparatedFilename(testTitle) {
52
+ if (!this.testTitleToFilename.has(testTitle)) {
53
+ const baseTag = `playwright-${(0, utils_namespaceObject.replaceIllegalPathCharsAndSpace)(testTitle)}`;
54
+ const generatedFilename = (0, agent_namespaceObject.getReportFileName)(baseTag);
55
+ this.testTitleToFilename.set(testTitle, generatedFilename);
56
+ }
57
+ return this.testTitleToFilename.get(testTitle);
58
+ }
59
+ getReportFilename(testTitle) {
60
+ if ('merged' === this.mode) {
61
+ if (!this.mergedFilename) this.mergedFilename = (0, agent_namespaceObject.getReportFileName)('playwright-merged');
62
+ return this.mergedFilename;
63
+ }
64
+ if ('separate' === this.mode) {
65
+ if (!testTitle) throw new Error('testTitle is required in separate mode');
66
+ return this.getSeparatedFilename(testTitle);
67
+ }
68
+ throw new Error(`Unknown mode: ${this.mode}`);
69
+ }
70
+ getReportPath(testTitle) {
71
+ const fileName = this.getReportFilename(testTitle);
72
+ if ('html-and-external-assets' === this.outputFormat) return (0, external_node_path_namespaceObject.join)((0, common_namespaceObject.getMidsceneRunSubDir)('report'), fileName, 'index.html');
73
+ return (0, external_node_path_namespaceObject.join)((0, common_namespaceObject.getMidsceneRunSubDir)('report'), `${fileName}.html`);
74
+ }
75
+ ensureOutputRoot() {
76
+ (0, external_node_fs_namespaceObject.mkdirSync)((0, common_namespaceObject.getMidsceneRunSubDir)('report'), {
77
+ recursive: true
78
+ });
79
+ }
80
+ copyReport(reportFilePath, targetPath) {
81
+ if ((0, report_namespaceObject.isDirectoryModeReport)(reportFilePath)) {
82
+ const targetDir = (0, external_node_path_namespaceObject.dirname)(targetPath);
83
+ (0, external_node_fs_namespaceObject.mkdirSync)(targetDir, {
84
+ recursive: true
85
+ });
86
+ (0, external_node_fs_namespaceObject.cpSync)((0, external_node_path_namespaceObject.dirname)(reportFilePath), targetDir, {
87
+ recursive: true,
88
+ force: true
89
+ });
90
+ return;
91
+ }
92
+ (0, external_node_fs_namespaceObject.mkdirSync)((0, external_node_path_namespaceObject.dirname)(targetPath), {
93
+ recursive: true
94
+ });
95
+ (0, external_node_fs_namespaceObject.copyFileSync)(reportFilePath, targetPath);
96
+ }
97
+ collectReportInfo(test, result) {
98
+ const reportAnnotations = test.annotations.filter((annotation)=>'MIDSCENE_DUMP_ANNOTATION' === annotation.type && annotation.description);
99
+ if (0 === reportAnnotations.length || !this.mode) return;
100
+ const retry = result.retry ? `(retry #${result.retry})` : '';
101
+ const testId = `${test.id}${retry}`;
102
+ const projectName = this.hasMultipleProjects ? test.parent?.project()?.name : void 0;
103
+ const projectSuffix = projectName ? ` [${projectName}]` : '';
104
+ const testTitle = `${test.title}${projectSuffix}${retry}`;
105
+ const reports = reportAnnotations.map((annotation)=>annotation.description).filter((reportFilePath)=>{
106
+ if ((0, external_node_fs_namespaceObject.existsSync)(reportFilePath)) return true;
107
+ (0, utils_namespaceObject.logMsg)(`Failed to read Midscene report file: ${reportFilePath}`, new Error('Report file does not exist'));
108
+ return false;
109
+ }).map((reportFilePath)=>({
110
+ reportFilePath,
111
+ reportAttributes: {
112
+ testDuration: result.duration,
113
+ testStatus: result.status,
114
+ testTitle,
115
+ testId,
116
+ testDescription: test.parent?.title || ''
117
+ }
118
+ }));
119
+ if (0 === reports.length) return;
120
+ this.reportsByTestId.set(testId, {
121
+ testTitle,
122
+ reports
123
+ });
124
+ }
125
+ finalizeMergedReport() {
126
+ this.ensureOutputRoot();
127
+ const tool = new report_namespaceObject.ReportMergingTool();
128
+ let reportCount = 0;
129
+ for (const entry of this.reportsByTestId.values())for (const report of entry.reports){
130
+ tool.append(report);
131
+ reportCount += 1;
132
+ }
133
+ if (0 === reportCount) return;
134
+ const targetName = this.getReportFilename();
135
+ if (1 === reportCount) {
136
+ const firstReport = Array.from(this.reportsByTestId.values())[0]?.reports[0];
137
+ if (!firstReport) return;
138
+ if (firstReport.reportFilePath) {
139
+ const targetPath = this.getReportPath();
140
+ this.copyReport(firstReport.reportFilePath, targetPath);
141
+ (0, agent_namespaceObject.printReportMsg)(targetPath);
142
+ return;
143
+ }
144
+ const mergedReportPath = tool.mergeReports(targetName, {
145
+ overwrite: true
146
+ });
147
+ if (mergedReportPath) (0, agent_namespaceObject.printReportMsg)(mergedReportPath);
148
+ return;
149
+ }
150
+ const mergedReportPath = tool.mergeReports(targetName, {
151
+ overwrite: true
152
+ });
153
+ if (mergedReportPath) (0, agent_namespaceObject.printReportMsg)(mergedReportPath);
154
+ }
155
+ finalizeSeparateReports() {
156
+ this.ensureOutputRoot();
157
+ for (const entry of this.reportsByTestId.values()){
158
+ const targetName = this.getReportFilename(entry.testTitle);
159
+ if (1 === entry.reports.length) {
160
+ const firstReport = entry.reports[0];
161
+ if (firstReport.reportFilePath) {
162
+ const targetPath = this.getReportPath(entry.testTitle);
163
+ this.copyReport(firstReport.reportFilePath, targetPath);
164
+ (0, agent_namespaceObject.printReportMsg)(targetPath);
165
+ continue;
166
+ }
167
+ const tool = new report_namespaceObject.ReportMergingTool();
168
+ tool.append(firstReport);
169
+ const reportPath = tool.mergeReports(targetName, {
170
+ overwrite: true
171
+ });
172
+ if (reportPath) (0, agent_namespaceObject.printReportMsg)(reportPath);
173
+ continue;
174
+ }
175
+ const tool = new report_namespaceObject.ReportMergingTool();
176
+ for (const report of entry.reports)tool.append(report);
177
+ const reportPath = tool.mergeReports(targetName, {
178
+ overwrite: true
179
+ });
180
+ if (reportPath) (0, agent_namespaceObject.printReportMsg)(reportPath);
181
+ }
182
+ }
183
+ async onBegin(config, _suite) {
184
+ this.hasMultipleProjects = (config.projects?.length || 0) > 1;
185
+ }
186
+ onTestBegin(_test, _result) {}
187
+ onTestEnd(test, result) {
188
+ this.collectReportInfo(test, result);
189
+ }
190
+ async onEnd() {
191
+ if ('merged' === this.mode) return void this.finalizeMergedReport();
192
+ if ('separate' === this.mode) this.finalizeSeparateReports();
193
+ }
194
+ constructor(options = {}){
195
+ _define_property(this, "mergedFilename", void 0);
196
+ _define_property(this, "testTitleToFilename", new Map());
197
+ _define_property(this, "reportsByTestId", new Map());
198
+ _define_property(this, "mode", void 0);
199
+ _define_property(this, "outputFormat", void 0);
200
+ _define_property(this, "hasMultipleProjects", false);
201
+ this.mode = MidsceneReporter.getMode(options.type ?? 'merged');
202
+ this.outputFormat = options.outputFormat ?? 'single-html';
203
+ }
204
+ }
205
+ const reporter = MidsceneReporter;
206
+ exports["default"] = __webpack_exports__["default"];
207
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
208
+ "default"
209
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
210
+ Object.defineProperty(exports, '__esModule', {
211
+ value: true
212
+ });
@@ -0,0 +1,240 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.n = (module)=>{
5
+ var getter = module && module.__esModule ? ()=>module['default'] : ()=>module;
6
+ __webpack_require__.d(getter, {
7
+ a: getter
8
+ });
9
+ return getter;
10
+ };
11
+ })();
12
+ (()=>{
13
+ __webpack_require__.d = (exports1, definition)=>{
14
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
15
+ enumerable: true,
16
+ get: definition[key]
17
+ });
18
+ };
19
+ })();
20
+ (()=>{
21
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
22
+ })();
23
+ (()=>{
24
+ __webpack_require__.r = (exports1)=>{
25
+ if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
26
+ value: 'Module'
27
+ });
28
+ Object.defineProperty(exports1, '__esModule', {
29
+ value: true
30
+ });
31
+ };
32
+ })();
33
+ var __webpack_exports__ = {};
34
+ __webpack_require__.r(__webpack_exports__);
35
+ __webpack_require__.d(__webpack_exports__, {
36
+ defaultViewportScale: ()=>defaultViewportScale,
37
+ launchPuppeteerPage: ()=>launchPuppeteerPage,
38
+ defaultUA: ()=>defaultUA,
39
+ buildChromeArgs: ()=>buildChromeArgs,
40
+ defaultViewportHeight: ()=>viewport_js_namespaceObject.defaultViewportHeight,
41
+ defaultWaitForNetworkIdleTimeout: ()=>defaultWaitForNetworkIdleTimeout,
42
+ resolveAiActionContext: ()=>resolveAiActionContext,
43
+ defaultViewportWidth: ()=>viewport_js_namespaceObject.defaultViewportWidth,
44
+ puppeteerAgentForTarget: ()=>puppeteerAgentForTarget
45
+ });
46
+ const external_node_fs_namespaceObject = require("node:fs");
47
+ const logger_namespaceObject = require("@godscene/shared/logger");
48
+ const utils_namespaceObject = require("@godscene/shared/utils");
49
+ const viewport_js_namespaceObject = require("../common/viewport.js");
50
+ const external_index_js_namespaceObject = require("./index.js");
51
+ const constants_namespaceObject = require("@godscene/shared/constants");
52
+ const external_puppeteer_namespaceObject = require("puppeteer");
53
+ var external_puppeteer_default = /*#__PURE__*/ __webpack_require__.n(external_puppeteer_namespaceObject);
54
+ const defaultUA = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36';
55
+ const defaultViewportScale = 0;
56
+ const defaultWaitForNetworkIdleTimeout = constants_namespaceObject.DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT;
57
+ function resolveAiActionContext(target, preference) {
58
+ const data = preference?.aiActContext ?? preference?.aiActionContext ?? target.aiActionContext;
59
+ return data;
60
+ }
61
+ const DANGEROUS_ARGS = [
62
+ '--no-sandbox',
63
+ '--disable-setuid-sandbox',
64
+ '--disable-web-security',
65
+ '--ignore-certificate-errors',
66
+ '--disable-features=IsolateOrigins',
67
+ '--disable-site-isolation-trials',
68
+ '--allow-running-insecure-content'
69
+ ];
70
+ function validateChromeArgs(args, baseArgs) {
71
+ const newArgs = args.filter((arg)=>!baseArgs.some((baseArg)=>{
72
+ const argFlag = arg.split('=')[0];
73
+ const baseFlag = baseArg.split('=')[0];
74
+ return argFlag === baseFlag;
75
+ }));
76
+ const dangerousArgs = newArgs.filter((arg)=>DANGEROUS_ARGS.some((dangerous)=>arg.startsWith(dangerous)));
77
+ if (dangerousArgs.length > 0) console.warn(`Warning: Dangerous Chrome arguments detected: ${dangerousArgs.join(', ')}.\nThese arguments may reduce browser security. Use only in controlled testing environments.`);
78
+ }
79
+ const launcherDebug = (0, logger_namespaceObject.getDebug)('puppeteer:launcher');
80
+ function buildChromeArgs(options) {
81
+ const isWindows = 'win32' === process.platform;
82
+ const sandboxArgs = isWindows ? [] : [
83
+ '--no-sandbox',
84
+ '--disable-setuid-sandbox'
85
+ ];
86
+ const featureArgs = [
87
+ '--disable-features=HttpsFirstBalancedModeAutoEnable',
88
+ '--disable-features=PasswordLeakDetection',
89
+ '--disable-save-password-bubble'
90
+ ];
91
+ const userAgentArg = options?.userAgent ? [
92
+ `--user-agent="${options.userAgent}"`
93
+ ] : [];
94
+ const windowSizeArg = options?.windowSize ? [
95
+ `--window-size=${options.windowSize.width},${options.windowSize.height}`
96
+ ] : [];
97
+ const baseArgs = [
98
+ ...sandboxArgs,
99
+ ...featureArgs,
100
+ ...userAgentArg,
101
+ ...windowSizeArg
102
+ ];
103
+ if (options?.chromeArgs?.length) {
104
+ validateChromeArgs(options.chromeArgs, baseArgs);
105
+ return [
106
+ ...baseArgs,
107
+ ...options.chromeArgs
108
+ ];
109
+ }
110
+ return baseArgs;
111
+ }
112
+ async function launchPuppeteerPage(target, preference, browser, existingPage) {
113
+ (0, utils_namespaceObject.assert)(target.url, 'url is required');
114
+ const freeFn = [];
115
+ const ua = target.userAgent || defaultUA;
116
+ const { width, height } = (0, viewport_js_namespaceObject.resolveWebViewportSize)(target);
117
+ let dpr = defaultViewportScale;
118
+ if (void 0 !== target.deviceScaleFactor && null !== target.deviceScaleFactor) {
119
+ (0, utils_namespaceObject.assert)('number' == typeof target.deviceScaleFactor, 'deviceScaleFactor must be a number');
120
+ dpr = target.deviceScaleFactor;
121
+ (0, utils_namespaceObject.assert)(dpr > 0, `deviceScaleFactor must be > 0, but got ${dpr}`);
122
+ }
123
+ const viewportConfig = {
124
+ width,
125
+ height,
126
+ deviceScaleFactor: dpr
127
+ };
128
+ const headed = preference?.headed || preference?.keepWindow;
129
+ const defaultViewportConfig = headed ? null : viewportConfig;
130
+ if (headed && '1' === process.env.CI) console.warn('you are probably running headed mode in CI, this will usually fail.');
131
+ const browserUIHeight = 100;
132
+ const args = buildChromeArgs({
133
+ userAgent: ua,
134
+ windowSize: headed ? {
135
+ width,
136
+ height: height + browserUIHeight
137
+ } : void 0,
138
+ chromeArgs: target.chromeArgs
139
+ });
140
+ launcherDebug('launching browser with viewport, headed', headed, 'viewport', viewportConfig, 'args', args, 'preference', preference);
141
+ let page;
142
+ let browserInstance = browser;
143
+ if (existingPage) {
144
+ page = existingPage;
145
+ launcherDebug('reusing existing page for shared browser context');
146
+ if (!browserInstance) browserInstance = page.browser();
147
+ } else {
148
+ if (!browserInstance) {
149
+ browserInstance = await external_puppeteer_default().launch({
150
+ headless: !preference?.headed,
151
+ defaultViewport: defaultViewportConfig,
152
+ args,
153
+ acceptInsecureCerts: target.acceptInsecureCerts,
154
+ ignoreDefaultArgs: preference?.ignoreDefaultArgs
155
+ });
156
+ freeFn.push({
157
+ name: 'puppeteer_browser',
158
+ fn: ()=>{
159
+ if (!preference?.keepWindow) if ('win32' === process.platform) setTimeout(()=>{
160
+ browserInstance?.close();
161
+ }, 800);
162
+ else browserInstance?.close();
163
+ }
164
+ });
165
+ }
166
+ page = await browserInstance.newPage();
167
+ }
168
+ if (target.cookie) {
169
+ const cookieFileContent = (0, external_node_fs_namespaceObject.readFileSync)(target.cookie, 'utf-8');
170
+ await browserInstance.setCookie(...JSON.parse(cookieFileContent));
171
+ }
172
+ if (ua) await page.setUserAgent(ua);
173
+ if (viewportConfig) await page.setViewport(viewportConfig);
174
+ const waitForNetworkIdleTimeout = 'number' == typeof target.waitForNetworkIdle?.timeout ? target.waitForNetworkIdle.timeout : defaultWaitForNetworkIdleTimeout;
175
+ try {
176
+ launcherDebug('goto', target.url);
177
+ await page.goto(target.url);
178
+ if (waitForNetworkIdleTimeout > 0) {
179
+ launcherDebug('waitForNetworkIdle', waitForNetworkIdleTimeout);
180
+ await page.waitForNetworkIdle({
181
+ timeout: waitForNetworkIdleTimeout
182
+ });
183
+ }
184
+ } catch (e) {
185
+ if ('boolean' == typeof target.waitForNetworkIdle?.continueOnNetworkIdleError && !target.waitForNetworkIdle?.continueOnNetworkIdleError) {
186
+ const newError = new Error(`failed to wait for network idle: ${e}`, {
187
+ cause: e
188
+ });
189
+ throw newError;
190
+ }
191
+ const newMessage = `failed to wait for network idle after ${waitForNetworkIdleTimeout}ms, but the script will continue.`;
192
+ console.warn(newMessage);
193
+ }
194
+ return {
195
+ page,
196
+ freeFn
197
+ };
198
+ }
199
+ async function puppeteerAgentForTarget(target, preference, browser, existingPage) {
200
+ const { page, freeFn } = await launchPuppeteerPage(target, preference, browser, existingPage);
201
+ const aiActContext = resolveAiActionContext(target, preference);
202
+ const { aiActionContext, ...preferenceToUse } = preference ?? {};
203
+ const agent = new external_index_js_namespaceObject.PuppeteerAgent(page, {
204
+ ...preferenceToUse,
205
+ aiActContext,
206
+ waitForNetworkIdleTimeout: 'number' == typeof target.waitForNetworkIdle?.timeout ? target.waitForNetworkIdle.timeout : void 0,
207
+ forceSameTabNavigation: void 0 !== target.forceSameTabNavigation ? target.forceSameTabNavigation : true
208
+ });
209
+ freeFn.push({
210
+ name: 'midscene_puppeteer_agent',
211
+ fn: ()=>agent.destroy()
212
+ });
213
+ return {
214
+ agent,
215
+ freeFn
216
+ };
217
+ }
218
+ exports.buildChromeArgs = __webpack_exports__.buildChromeArgs;
219
+ exports.defaultUA = __webpack_exports__.defaultUA;
220
+ exports.defaultViewportHeight = __webpack_exports__.defaultViewportHeight;
221
+ exports.defaultViewportScale = __webpack_exports__.defaultViewportScale;
222
+ exports.defaultViewportWidth = __webpack_exports__.defaultViewportWidth;
223
+ exports.defaultWaitForNetworkIdleTimeout = __webpack_exports__.defaultWaitForNetworkIdleTimeout;
224
+ exports.launchPuppeteerPage = __webpack_exports__.launchPuppeteerPage;
225
+ exports.puppeteerAgentForTarget = __webpack_exports__.puppeteerAgentForTarget;
226
+ exports.resolveAiActionContext = __webpack_exports__.resolveAiActionContext;
227
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
228
+ "buildChromeArgs",
229
+ "defaultUA",
230
+ "defaultViewportHeight",
231
+ "defaultViewportScale",
232
+ "defaultViewportWidth",
233
+ "defaultWaitForNetworkIdleTimeout",
234
+ "launchPuppeteerPage",
235
+ "puppeteerAgentForTarget",
236
+ "resolveAiActionContext"
237
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
238
+ Object.defineProperty(exports, '__esModule', {
239
+ value: true
240
+ });