@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,208 @@
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
+ WebCdpMidsceneTools: ()=>WebCdpMidsceneTools
37
+ });
38
+ const core_namespaceObject = require("@godscene/core");
39
+ const logger_namespaceObject = require("@godscene/shared/logger");
40
+ const base_tools_namespaceObject = require("@godscene/shared/mcp/base-tools");
41
+ const external_puppeteer_core_namespaceObject = require("puppeteer-core");
42
+ var external_puppeteer_core_default = /*#__PURE__*/ __webpack_require__.n(external_puppeteer_core_namespaceObject);
43
+ const external_cdp_proxy_manager_js_namespaceObject = require("./cdp-proxy-manager.js");
44
+ const external_cdp_target_store_js_namespaceObject = require("./cdp-target-store.js");
45
+ const viewport_js_namespaceObject = require("./common/viewport.js");
46
+ const index_js_namespaceObject = require("./puppeteer/index.js");
47
+ const external_static_index_js_namespaceObject = require("./static/index.js");
48
+ function _define_property(obj, key, value) {
49
+ if (key in obj) Object.defineProperty(obj, key, {
50
+ value: value,
51
+ enumerable: true,
52
+ configurable: true,
53
+ writable: true
54
+ });
55
+ else obj[key] = value;
56
+ return obj;
57
+ }
58
+ const debug = (0, logger_namespaceObject.getDebug)('mcp:cdp');
59
+ const CDP_TARGET_DISCOVERY_DELAY_MS = 500;
60
+ function getTargetId(page) {
61
+ return page.target()._targetId;
62
+ }
63
+ class WebCdpMidsceneTools extends base_tools_namespaceObject.BaseMidsceneTools {
64
+ getCliReportSessionName() {
65
+ return 'midscene-web';
66
+ }
67
+ createTemporaryDevice() {
68
+ return new external_static_index_js_namespaceObject.StaticPage({
69
+ screenshot: core_namespaceObject.ScreenshotItem.create('', Date.now()),
70
+ shotSize: viewport_js_namespaceObject.defaultStaticPageViewportSize,
71
+ shrunkShotToLogicalRatio: 1
72
+ });
73
+ }
74
+ async ensureAgent(navigateToUrl) {
75
+ if (this.agent && navigateToUrl) {
76
+ try {
77
+ await this.agent?.destroy?.();
78
+ } catch (error) {
79
+ console.debug('Failed to destroy agent during re-init:', error);
80
+ }
81
+ this.agent = void 0;
82
+ }
83
+ if (this.agent) return this.agent;
84
+ if (!this.activeBrowser) {
85
+ const endpoint = await (0, external_cdp_proxy_manager_js_namespaceObject.getProxyEndpoint)(this.cdpEndpoint);
86
+ this.activeBrowser = await external_puppeteer_core_default().connect({
87
+ browserWSEndpoint: endpoint,
88
+ defaultViewport: null
89
+ });
90
+ }
91
+ const browser = this.activeBrowser;
92
+ let pages = await browser.pages();
93
+ if (0 === pages.length) {
94
+ await new Promise((r)=>setTimeout(r, CDP_TARGET_DISCOVERY_DELAY_MS));
95
+ pages = await browser.pages();
96
+ }
97
+ const webPages = pages.filter((p)=>/^https?:\/\//.test(p.url()));
98
+ debug('Found %d page(s), %d web page(s): %o', pages.length, webPages.length, pages.map((p)=>p.url()));
99
+ let page;
100
+ if (navigateToUrl) if (webPages.length > 0) {
101
+ page = webPages[webPages.length - 1];
102
+ await page.bringToFront();
103
+ await page.goto(navigateToUrl, {
104
+ timeout: 30000,
105
+ waitUntil: 'domcontentloaded'
106
+ });
107
+ } else {
108
+ page = await browser.newPage();
109
+ await page.goto(navigateToUrl, {
110
+ timeout: 30000,
111
+ waitUntil: 'domcontentloaded'
112
+ });
113
+ }
114
+ else {
115
+ const savedTargetId = (0, external_cdp_target_store_js_namespaceObject.readSavedTargetId)();
116
+ let matchedPage;
117
+ if (savedTargetId && pages.length > 0) {
118
+ matchedPage = pages.find((p)=>getTargetId(p) === savedTargetId);
119
+ matchedPage ? debug('Matched saved targetId %s', savedTargetId) : debug('Saved targetId %s not found among %d pages, falling back', savedTargetId, pages.length);
120
+ }
121
+ page = matchedPage ? matchedPage : webPages.length > 0 ? webPages[webPages.length - 1] : pages.length > 0 ? pages[pages.length - 1] : await browser.newPage();
122
+ await page.bringToFront();
123
+ }
124
+ const targetId = getTargetId(page);
125
+ if (targetId) (0, external_cdp_target_store_js_namespaceObject.saveTargetId)(targetId);
126
+ else debug('No targetId on page.target(); cross-command tab reuse disabled until puppeteer integration is updated.');
127
+ const reportOptions = this.readCliReportAgentOptions();
128
+ this.agent = new index_js_namespaceObject.PuppeteerAgent(page, {
129
+ ...reportOptions ?? {}
130
+ });
131
+ return this.agent;
132
+ }
133
+ async destroy() {
134
+ await super.destroy();
135
+ if (this.activeBrowser) {
136
+ this.activeBrowser.disconnect();
137
+ this.activeBrowser = null;
138
+ }
139
+ }
140
+ preparePlatformTools() {
141
+ return [
142
+ {
143
+ name: 'web_connect',
144
+ description: 'Connect to a web page via CDP. Opens a new tab with the given URL, or reuses the current page.',
145
+ schema: {
146
+ url: core_namespaceObject.z.string().url().optional().describe('URL to open in new tab (omit to use current page)')
147
+ },
148
+ handler: async (args)=>{
149
+ const { url } = args;
150
+ if (this.agent) {
151
+ try {
152
+ await this.agent.destroy?.();
153
+ } catch (e) {
154
+ console.debug('Failed to destroy agent during connect:', e);
155
+ }
156
+ this.agent = void 0;
157
+ }
158
+ const reportSession = this.createNewCliReportSession(url ?? 'current-page');
159
+ this.commitCliReportSession(reportSession);
160
+ this.agent = await this.ensureAgent(url);
161
+ const screenshot = await this.agent.page?.screenshotBase64();
162
+ const label = url ?? 'current page';
163
+ return {
164
+ content: [
165
+ {
166
+ type: 'text',
167
+ text: `Connected via CDP to: ${label}`
168
+ },
169
+ ...screenshot ? this.buildScreenshotContent(screenshot) : []
170
+ ]
171
+ };
172
+ }
173
+ },
174
+ {
175
+ name: 'web_disconnect',
176
+ description: 'Disconnect from current web page. The browser stays running (managed externally).',
177
+ schema: {},
178
+ handler: async ()=>{
179
+ if (this.agent) {
180
+ try {
181
+ await this.agent.destroy?.();
182
+ } catch (e) {
183
+ console.debug('Failed to destroy agent during disconnect:', e);
184
+ }
185
+ this.agent = void 0;
186
+ }
187
+ if (this.activeBrowser) {
188
+ this.activeBrowser.disconnect();
189
+ this.activeBrowser = null;
190
+ }
191
+ (0, external_cdp_target_store_js_namespaceObject.cleanupTargetIdFile)();
192
+ return this.buildTextResult('Disconnected from web page (browser still running externally)');
193
+ }
194
+ }
195
+ ];
196
+ }
197
+ constructor(cdpEndpoint){
198
+ super(), _define_property(this, "cdpEndpoint", void 0), _define_property(this, "activeBrowser", null);
199
+ this.cdpEndpoint = cdpEndpoint;
200
+ }
201
+ }
202
+ exports.WebCdpMidsceneTools = __webpack_exports__.WebCdpMidsceneTools;
203
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
204
+ "WebCdpMidsceneTools"
205
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
206
+ Object.defineProperty(exports, '__esModule', {
207
+ value: true
208
+ });
@@ -0,0 +1,296 @@
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
+ PUPPETEER_ENDPOINT_FILE: ()=>PUPPETEER_ENDPOINT_FILE,
37
+ WebPuppeteerMidsceneTools: ()=>WebPuppeteerMidsceneTools,
38
+ buildDetachedChromeArgs: ()=>buildDetachedChromeArgs
39
+ });
40
+ const external_node_child_process_namespaceObject = require("node:child_process");
41
+ const external_node_fs_namespaceObject = require("node:fs");
42
+ const promises_namespaceObject = require("node:fs/promises");
43
+ const external_node_os_namespaceObject = require("node:os");
44
+ const external_node_path_namespaceObject = require("node:path");
45
+ const core_namespaceObject = require("@godscene/core");
46
+ const base_tools_namespaceObject = require("@godscene/shared/mcp/base-tools");
47
+ const chrome_path_namespaceObject = require("@godscene/shared/mcp/chrome-path");
48
+ const external_puppeteer_core_namespaceObject = require("puppeteer-core");
49
+ var external_puppeteer_core_default = /*#__PURE__*/ __webpack_require__.n(external_puppeteer_core_namespaceObject);
50
+ const viewport_js_namespaceObject = require("./common/viewport.js");
51
+ const index_js_namespaceObject = require("./puppeteer/index.js");
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
+ }
63
+ const ENDPOINT_FILE = (0, external_node_path_namespaceObject.join)((0, external_node_os_namespaceObject.tmpdir)(), 'midscene-puppeteer-endpoint');
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
+ }
84
+ const browserManager = {
85
+ activeBrowser: null,
86
+ async getOrLaunch (viewport) {
87
+ if ((0, external_node_fs_namespaceObject.existsSync)(ENDPOINT_FILE)) try {
88
+ const endpoint = (await (0, promises_namespaceObject.readFile)(ENDPOINT_FILE, 'utf-8')).trim();
89
+ const browser = await external_puppeteer_core_default().connect({
90
+ browserWSEndpoint: endpoint,
91
+ defaultViewport: null
92
+ });
93
+ return {
94
+ browser,
95
+ reused: true
96
+ };
97
+ } catch {
98
+ try {
99
+ await (0, promises_namespaceObject.unlink)(ENDPOINT_FILE);
100
+ } catch {}
101
+ }
102
+ const wsEndpoint = await this.launchDetachedChrome(viewport);
103
+ await (0, promises_namespaceObject.writeFile)(ENDPOINT_FILE, wsEndpoint);
104
+ const browser = await external_puppeteer_core_default().connect({
105
+ browserWSEndpoint: wsEndpoint,
106
+ defaultViewport: null
107
+ });
108
+ return {
109
+ browser,
110
+ reused: false
111
+ };
112
+ },
113
+ async closeBrowser () {
114
+ if (!(0, external_node_fs_namespaceObject.existsSync)(ENDPOINT_FILE)) return;
115
+ try {
116
+ const endpoint = (await (0, promises_namespaceObject.readFile)(ENDPOINT_FILE, 'utf-8')).trim();
117
+ const browser = await external_puppeteer_core_default().connect({
118
+ browserWSEndpoint: endpoint
119
+ });
120
+ await browser.close();
121
+ } catch {}
122
+ try {
123
+ await (0, promises_namespaceObject.unlink)(ENDPOINT_FILE);
124
+ } catch {}
125
+ },
126
+ disconnect () {
127
+ if (this.activeBrowser) {
128
+ this.activeBrowser.disconnect();
129
+ this.activeBrowser = null;
130
+ }
131
+ },
132
+ async launchDetachedChrome (viewport) {
133
+ const chromePath = (0, chrome_path_namespaceObject.resolveChromePath)();
134
+ await (0, promises_namespaceObject.mkdir)(USER_DATA_DIR, {
135
+ recursive: true
136
+ });
137
+ const args = buildDetachedChromeArgs({
138
+ userDataDir: USER_DATA_DIR,
139
+ viewport
140
+ });
141
+ const proc = (0, external_node_child_process_namespaceObject.spawn)(chromePath, args, {
142
+ detached: true,
143
+ stdio: [
144
+ 'ignore',
145
+ 'ignore',
146
+ 'pipe'
147
+ ]
148
+ });
149
+ proc.unref();
150
+ return new Promise((resolve, reject)=>{
151
+ let output = '';
152
+ const onData = (data)=>{
153
+ output += data.toString();
154
+ const match = output.match(/DevTools listening on (ws:\/\/[^\s]+)/);
155
+ if (match) {
156
+ proc.stderr.removeListener('data', onData);
157
+ resolve(match[1]);
158
+ }
159
+ };
160
+ proc.stderr.on('data', onData);
161
+ proc.on('exit', (code)=>{
162
+ proc.stderr.removeListener('data', onData);
163
+ reject(new Error(`Chrome exited with code ${code} before DevTools was ready.\nChrome stderr: ${output}\nTip: try setting MIDSCENE_MCP_NO_SANDBOX=1 if running in a container.`));
164
+ });
165
+ setTimeout(()=>reject(new Error(`Chrome launch timeout.\nChrome stderr: ${output}\nTip: try setting MIDSCENE_MCP_NO_SANDBOX=1 if running in a container.`)), 15000);
166
+ });
167
+ }
168
+ };
169
+ class WebPuppeteerMidsceneTools extends base_tools_namespaceObject.BaseMidsceneTools {
170
+ getCliReportSessionName() {
171
+ return 'midscene-web';
172
+ }
173
+ createTemporaryDevice() {
174
+ return new external_static_index_js_namespaceObject.StaticPage({
175
+ screenshot: core_namespaceObject.ScreenshotItem.create('', Date.now()),
176
+ shotSize: this.viewport ?? viewport_js_namespaceObject.defaultStaticPageViewportSize,
177
+ shrunkShotToLogicalRatio: 1
178
+ });
179
+ }
180
+ async ensureAgent(navigateToUrl) {
181
+ if (this.agent && navigateToUrl) {
182
+ try {
183
+ await this.agent?.destroy?.();
184
+ } catch {}
185
+ this.agent = void 0;
186
+ }
187
+ if (this.agent) return this.agent;
188
+ const { browser, reused } = await browserManager.getOrLaunch(this.viewport);
189
+ browserManager.activeBrowser = browser;
190
+ const pages = await browser.pages();
191
+ let page;
192
+ if (navigateToUrl) {
193
+ page = await browser.newPage();
194
+ if (this.viewport) await page.setViewport(this.viewport);
195
+ await page.goto(navigateToUrl, {
196
+ timeout: 30000,
197
+ waitUntil: 'domcontentloaded'
198
+ });
199
+ } else {
200
+ const webPages = pages.filter((p)=>/^https?:\/\//.test(p.url()));
201
+ page = webPages.length > 0 ? webPages[webPages.length - 1] : pages[pages.length - 1] || await browser.newPage();
202
+ if (reused) await page.bringToFront();
203
+ if (this.viewport) await page.setViewport(this.viewport);
204
+ }
205
+ const reportOptions = this.readCliReportAgentOptions();
206
+ this.agent = new index_js_namespaceObject.PuppeteerAgent(page, {
207
+ ...reportOptions ?? {}
208
+ });
209
+ return this.agent;
210
+ }
211
+ async destroy() {
212
+ await super.destroy();
213
+ browserManager.disconnect();
214
+ }
215
+ preparePlatformTools() {
216
+ return [
217
+ {
218
+ name: 'web_connect',
219
+ description: 'Connect to a web page. Opens a new tab with the given URL, or reuses the current page.',
220
+ schema: {
221
+ url: core_namespaceObject.z.string().url().optional().describe('URL to open in new tab (omit to use current page)')
222
+ },
223
+ handler: async (args)=>{
224
+ const { url } = args;
225
+ if (this.agent) {
226
+ try {
227
+ await this.agent.destroy?.();
228
+ } catch {}
229
+ this.agent = void 0;
230
+ }
231
+ const reportSession = this.createNewCliReportSession(url ?? 'current-page');
232
+ this.commitCliReportSession(reportSession);
233
+ this.agent = await this.ensureAgent(url);
234
+ const screenshot = await this.agent.page?.screenshotBase64();
235
+ const label = url ?? 'current page';
236
+ return {
237
+ content: [
238
+ {
239
+ type: 'text',
240
+ text: `Connected to: ${label}`
241
+ },
242
+ ...screenshot ? this.buildScreenshotContent(screenshot) : []
243
+ ]
244
+ };
245
+ }
246
+ },
247
+ {
248
+ name: 'web_disconnect',
249
+ description: 'Disconnect from current web page. The browser stays running for future calls.',
250
+ schema: {},
251
+ handler: async ()=>{
252
+ if (this.agent) {
253
+ try {
254
+ await this.agent.destroy?.();
255
+ } catch {}
256
+ this.agent = void 0;
257
+ }
258
+ browserManager.disconnect();
259
+ return this.buildTextResult('Disconnected from web page (browser still running)');
260
+ }
261
+ },
262
+ {
263
+ name: 'web_close',
264
+ description: 'Close the browser completely and release all resources.',
265
+ schema: {},
266
+ handler: async ()=>{
267
+ if (this.agent) {
268
+ try {
269
+ await this.agent.destroy?.();
270
+ } catch {}
271
+ this.agent = void 0;
272
+ }
273
+ await browserManager.closeBrowser();
274
+ return this.buildTextResult('Browser closed');
275
+ }
276
+ }
277
+ ];
278
+ }
279
+ constructor(viewport){
280
+ super(), _define_property(this, "viewport", void 0);
281
+ this.viewport = viewport ? {
282
+ ...viewport
283
+ } : void 0;
284
+ }
285
+ }
286
+ exports.PUPPETEER_ENDPOINT_FILE = __webpack_exports__.PUPPETEER_ENDPOINT_FILE;
287
+ exports.WebPuppeteerMidsceneTools = __webpack_exports__.WebPuppeteerMidsceneTools;
288
+ exports.buildDetachedChromeArgs = __webpack_exports__.buildDetachedChromeArgs;
289
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
290
+ "PUPPETEER_ENDPOINT_FILE",
291
+ "WebPuppeteerMidsceneTools",
292
+ "buildDetachedChromeArgs"
293
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
294
+ Object.defineProperty(exports, '__esModule', {
295
+ value: true
296
+ });
@@ -0,0 +1,115 @@
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
+ WebMidsceneTools: ()=>WebMidsceneTools
28
+ });
29
+ const core_namespaceObject = require("@godscene/core");
30
+ const base_tools_namespaceObject = require("@godscene/shared/mcp/base-tools");
31
+ const index_js_namespaceObject = require("./bridge-mode/index.js");
32
+ const viewport_js_namespaceObject = require("./common/viewport.js");
33
+ const external_static_index_js_namespaceObject = require("./static/index.js");
34
+ class WebMidsceneTools extends base_tools_namespaceObject.BaseMidsceneTools {
35
+ getCliReportSessionName() {
36
+ return 'midscene-web';
37
+ }
38
+ createTemporaryDevice() {
39
+ return new external_static_index_js_namespaceObject.StaticPage({
40
+ screenshot: core_namespaceObject.ScreenshotItem.create('', Date.now()),
41
+ shotSize: viewport_js_namespaceObject.defaultStaticPageViewportSize,
42
+ shrunkShotToLogicalRatio: 1
43
+ });
44
+ }
45
+ async ensureAgent(openNewTabWithUrl) {
46
+ if (this.agent && openNewTabWithUrl) {
47
+ try {
48
+ await this.agent?.destroy?.();
49
+ } catch (error) {
50
+ console.debug('Failed to destroy agent during re-init:', error);
51
+ }
52
+ this.agent = void 0;
53
+ }
54
+ if (this.agent) return this.agent;
55
+ this.agent = await this.initBridgeModeAgent(openNewTabWithUrl);
56
+ return this.agent;
57
+ }
58
+ async initBridgeModeAgent(url) {
59
+ const reportOptions = this.readCliReportAgentOptions();
60
+ const agent = new index_js_namespaceObject.AgentOverChromeBridge({
61
+ closeConflictServer: true,
62
+ ...reportOptions ?? {}
63
+ });
64
+ if (url) await agent.connectNewTabWithUrl(url);
65
+ else await agent.connectCurrentTab();
66
+ return agent;
67
+ }
68
+ preparePlatformTools() {
69
+ return [
70
+ {
71
+ name: 'web_connect',
72
+ description: 'Connect to web page. If URL provided, opens new tab; otherwise connects to current tab.',
73
+ schema: {
74
+ url: core_namespaceObject.z.string().url().optional().describe('URL to open in new tab (omit to connect current tab)')
75
+ },
76
+ handler: async (args)=>{
77
+ const { url } = args;
78
+ if (this.agent) {
79
+ try {
80
+ await this.agent.destroy?.();
81
+ } catch {}
82
+ this.agent = void 0;
83
+ }
84
+ const reportSession = this.createNewCliReportSession(url ?? 'current-tab');
85
+ this.commitCliReportSession(reportSession);
86
+ this.agent = await this.initBridgeModeAgent(url);
87
+ const screenshot = await this.agent.page?.screenshotBase64();
88
+ const label = url ?? 'current tab';
89
+ return {
90
+ content: [
91
+ {
92
+ type: 'text',
93
+ text: `Connected to: ${label}`
94
+ },
95
+ ...screenshot ? this.buildScreenshotContent(screenshot) : []
96
+ ]
97
+ };
98
+ }
99
+ },
100
+ {
101
+ name: 'web_disconnect',
102
+ description: 'Disconnect from current web page and release browser resources',
103
+ schema: {},
104
+ handler: this.createDisconnectHandler('web page')
105
+ }
106
+ ];
107
+ }
108
+ }
109
+ exports.WebMidsceneTools = __webpack_exports__.WebMidsceneTools;
110
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
111
+ "WebMidsceneTools"
112
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
113
+ Object.defineProperty(exports, '__esModule', {
114
+ value: true
115
+ });
@@ -0,0 +1,71 @@
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
+ webPlaygroundPlatform: ()=>webPlaygroundPlatform
28
+ });
29
+ const core_namespaceObject = require("@godscene/core");
30
+ const playground_namespaceObject = require("@godscene/playground");
31
+ const index_js_namespaceObject = require("./static/index.js");
32
+ function createDefaultWebAgent() {
33
+ const page = new index_js_namespaceObject.StaticPage({
34
+ shotSize: {
35
+ width: 800,
36
+ height: 600
37
+ },
38
+ screenshot: core_namespaceObject.ScreenshotItem.create('', Date.now()),
39
+ shrunkShotToLogicalRatio: 1
40
+ });
41
+ return new index_js_namespaceObject.StaticPageAgent(page);
42
+ }
43
+ const webPlaygroundPlatform = (0, playground_namespaceObject.definePlaygroundPlatform)({
44
+ id: 'web',
45
+ title: 'Midscene Web Playground',
46
+ description: "Web playground platform descriptor",
47
+ async prepare (options) {
48
+ const agent = options?.agent;
49
+ const agentFactory = options?.agentFactory || (options?.agent || options?.agentFactory ? void 0 : ()=>createDefaultWebAgent());
50
+ return {
51
+ platformId: 'web',
52
+ title: options?.title || 'Midscene Web Playground',
53
+ agent: agent || (agentFactory ? void 0 : createDefaultWebAgent()),
54
+ agentFactory,
55
+ launchOptions: options?.launchOptions,
56
+ preview: options?.preview || (0, playground_namespaceObject.createMjpegPreviewDescriptor)({
57
+ title: 'Web page preview'
58
+ }),
59
+ metadata: {
60
+ interfaceType: agent?.interface?.interfaceType || 'web'
61
+ }
62
+ };
63
+ }
64
+ });
65
+ exports.webPlaygroundPlatform = __webpack_exports__.webPlaygroundPlatform;
66
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
67
+ "webPlaygroundPlatform"
68
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
69
+ Object.defineProperty(exports, '__esModule', {
70
+ value: true
71
+ });