@midscene/web 1.9.8 → 1.10.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 (79) hide show
  1. package/dist/es/{mcp-agent-init-args.mjs → agent-init-args.mjs} +2 -2
  2. package/dist/es/{mcp-agent-init-args.mjs.map → agent-init-args.mjs.map} +1 -1
  3. package/dist/es/{mcp-tools-cdp.mjs → agent-tools-cdp.mjs} +5 -5
  4. package/dist/es/agent-tools-cdp.mjs.map +1 -0
  5. package/dist/es/{mcp-tools-puppeteer.mjs → agent-tools-puppeteer.mjs} +7 -7
  6. package/dist/es/agent-tools-puppeteer.mjs.map +1 -0
  7. package/dist/es/{mcp-tools.mjs → agent-tools.mjs} +4 -4
  8. package/dist/es/agent-tools.mjs.map +1 -0
  9. package/dist/es/bridge-mode/io-client.mjs +1 -1
  10. package/dist/es/bridge-mode/io-server.mjs +2 -2
  11. package/dist/es/bridge-mode/io-server.mjs.map +1 -1
  12. package/dist/es/bridge-mode/page-browser-side.mjs +1 -1
  13. package/dist/es/bridge-mode/page-browser-side.mjs.map +1 -1
  14. package/dist/es/cdp-proxy-constants.mjs.map +1 -1
  15. package/dist/es/cdp-proxy-manager.mjs +1 -1
  16. package/dist/es/cdp-proxy-manager.mjs.map +1 -1
  17. package/dist/es/cdp-proxy.mjs.map +1 -1
  18. package/dist/es/cdp-target-store.mjs +1 -1
  19. package/dist/es/cdp-target-store.mjs.map +1 -1
  20. package/dist/es/cli.mjs +4 -4
  21. package/dist/es/cli.mjs.map +1 -1
  22. package/dist/es/index.mjs +2 -2
  23. package/dist/es/playwright/index.mjs +5 -3
  24. package/dist/es/playwright/index.mjs.map +1 -1
  25. package/dist/es/puppeteer/base-page.mjs +43 -44
  26. package/dist/es/puppeteer/base-page.mjs.map +1 -1
  27. package/dist/es/puppeteer/index.mjs +5 -3
  28. package/dist/es/puppeteer/index.mjs.map +1 -1
  29. package/dist/es/web-element.mjs.map +1 -1
  30. package/dist/lib/{mcp-agent-init-args.js → agent-init-args.js} +2 -2
  31. package/dist/lib/{mcp-agent-init-args.js.map → agent-init-args.js.map} +1 -1
  32. package/dist/lib/{mcp-tools-cdp.js → agent-tools-cdp.js} +7 -7
  33. package/dist/lib/agent-tools-cdp.js.map +1 -0
  34. package/dist/lib/{mcp-tools-puppeteer.js → agent-tools-puppeteer.js} +9 -9
  35. package/dist/lib/agent-tools-puppeteer.js.map +1 -0
  36. package/dist/lib/{mcp-tools.js → agent-tools.js} +6 -6
  37. package/dist/lib/agent-tools.js.map +1 -0
  38. package/dist/lib/bridge-mode/io-client.js +1 -1
  39. package/dist/lib/bridge-mode/io-server.js +2 -2
  40. package/dist/lib/bridge-mode/io-server.js.map +1 -1
  41. package/dist/lib/bridge-mode/page-browser-side.js +1 -1
  42. package/dist/lib/bridge-mode/page-browser-side.js.map +1 -1
  43. package/dist/lib/cdp-proxy-constants.js.map +1 -1
  44. package/dist/lib/cdp-proxy-manager.js +1 -1
  45. package/dist/lib/cdp-proxy-manager.js.map +1 -1
  46. package/dist/lib/cdp-proxy.js.map +1 -1
  47. package/dist/lib/cdp-target-store.js +1 -1
  48. package/dist/lib/cdp-target-store.js.map +1 -1
  49. package/dist/lib/cli.js +5 -5
  50. package/dist/lib/cli.js.map +1 -1
  51. package/dist/lib/index.js +4 -4
  52. package/dist/lib/playwright/index.js +5 -3
  53. package/dist/lib/playwright/index.js.map +1 -1
  54. package/dist/lib/puppeteer/base-page.js +43 -44
  55. package/dist/lib/puppeteer/base-page.js.map +1 -1
  56. package/dist/lib/puppeteer/index.js +5 -3
  57. package/dist/lib/puppeteer/index.js.map +1 -1
  58. package/dist/lib/web-element.js.map +1 -1
  59. package/dist/types/{mcp-agent-init-args.d.ts → agent-init-args.d.ts} +1 -1
  60. package/dist/types/{mcp-tools-cdp.d.ts → agent-tools-cdp.d.ts} +4 -4
  61. package/dist/types/{mcp-tools-puppeteer.d.ts → agent-tools-puppeteer.d.ts} +4 -4
  62. package/dist/types/{mcp-tools.d.ts → agent-tools.d.ts} +4 -4
  63. package/dist/types/cdp-proxy-manager.d.ts +1 -1
  64. package/dist/types/cdp-proxy.d.ts +1 -1
  65. package/dist/types/index.d.ts +2 -2
  66. package/dist/types/puppeteer/base-page.d.ts +2 -9
  67. package/dist/types/web-element.d.ts +3 -0
  68. package/package.json +4 -9
  69. package/dist/es/mcp-server.mjs +0 -35
  70. package/dist/es/mcp-server.mjs.map +0 -1
  71. package/dist/es/mcp-tools-cdp.mjs.map +0 -1
  72. package/dist/es/mcp-tools-puppeteer.mjs.map +0 -1
  73. package/dist/es/mcp-tools.mjs.map +0 -1
  74. package/dist/lib/mcp-server.js +0 -75
  75. package/dist/lib/mcp-server.js.map +0 -1
  76. package/dist/lib/mcp-tools-cdp.js.map +0 -1
  77. package/dist/lib/mcp-tools-puppeteer.js.map +0 -1
  78. package/dist/lib/mcp-tools.js.map +0 -1
  79. package/dist/types/mcp-server.d.ts +0 -26
@@ -1 +1 @@
1
- {"version":3,"file":"cdp-target-store.js","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../src/cdp-target-store.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};","/**\n * Persistent store for the CDP-mode \"current tab\" targetId.\n *\n * The Midscene CLI runs each command as a fresh Node process, so anything\n * the previous command knew about which tab was being driven must survive\n * across processes. This store writes the chosen targetId to a temp file\n * after `connect`/`act`/etc. succeed, and the next command reads it back\n * to bind to the exact same tab — even when Chrome holds 14 of them.\n *\n * Owns nothing else. The CDP proxy lifecycle and its own metadata files\n * live in `cdp-proxy-manager.ts`.\n */\n\nimport { existsSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';\nimport { getDebug } from '@midscene/shared/logger';\nimport { TARGET_ID_FILE } from './cdp-proxy-constants';\n\nconst debug = getDebug('mcp:cdp:target-store');\n\n/**\n * Read the saved targetId, or null if no command has stored one yet.\n */\nexport function readSavedTargetId(): string | null {\n if (!existsSync(TARGET_ID_FILE)) return null;\n try {\n return readFileSync(TARGET_ID_FILE, 'utf-8').trim() || null;\n } catch {\n return null;\n }\n}\n\n/**\n * Save a targetId so the next CLI command can rebind to the same tab.\n */\nexport function saveTargetId(targetId: string): void {\n try {\n writeFileSync(TARGET_ID_FILE, targetId, 'utf-8');\n debug('Saved targetId: %s', targetId);\n } catch (err) {\n debug('Failed to save targetId: %s', err);\n }\n}\n\n/**\n * Discard the saved targetId — call when disconnecting or when the\n * upstream Chrome changes (the targetId would point into the old\n * browser's tab list).\n */\nexport function cleanupTargetIdFile(): void {\n try {\n if (existsSync(TARGET_ID_FILE)) unlinkSync(TARGET_ID_FILE);\n } catch {}\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","debug","getDebug","readSavedTargetId","existsSync","TARGET_ID_FILE","readFileSync","saveTargetId","targetId","writeFileSync","err","cleanupTargetIdFile","unlinkSync"],"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;;;;;;;;;;;;ACWA,MAAMI,QAAQC,AAAAA,IAAAA,uBAAAA,QAAAA,AAAAA,EAAS;AAKhB,SAASC;IACd,IAAI,CAACC,AAAAA,IAAAA,iCAAAA,UAAAA,AAAAA,EAAWC,gDAAAA,cAAcA,GAAG,OAAO;IACxC,IAAI;QACF,OAAOC,AAAAA,IAAAA,iCAAAA,YAAAA,AAAAA,EAAaD,gDAAAA,cAAcA,EAAE,SAAS,IAAI,MAAM;IACzD,EAAE,OAAM;QACN,OAAO;IACT;AACF;AAKO,SAASE,aAAaC,QAAgB;IAC3C,IAAI;QACFC,IAAAA,iCAAAA,aAAAA,AAAAA,EAAcJ,gDAAAA,cAAcA,EAAEG,UAAU;QACxCP,MAAM,sBAAsBO;IAC9B,EAAE,OAAOE,KAAK;QACZT,MAAM,+BAA+BS;IACvC;AACF;AAOO,SAASC;IACd,IAAI;QACF,IAAIP,AAAAA,IAAAA,iCAAAA,UAAAA,AAAAA,EAAWC,gDAAAA,cAAcA,GAAGO,AAAAA,IAAAA,iCAAAA,UAAAA,AAAAA,EAAWP,gDAAAA,cAAcA;IAC3D,EAAE,OAAM,CAAC;AACX"}
1
+ {"version":3,"file":"cdp-target-store.js","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../src/cdp-target-store.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};","/**\n * Persistent store for the CDP-mode \"current tab\" targetId.\n *\n * The Midscene CLI runs each command as a fresh Node process, so anything\n * the previous command knew about which tab was being driven must survive\n * across processes. This store writes the chosen targetId to a temp file\n * after `connect`/`act`/etc. succeed, and the next command reads it back\n * to bind to the exact same tab — even when Chrome holds 14 of them.\n *\n * Owns nothing else. The CDP proxy lifecycle and its own metadata files\n * live in `cdp-proxy-manager.ts`.\n */\n\nimport { existsSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';\nimport { getDebug } from '@midscene/shared/logger';\nimport { TARGET_ID_FILE } from './cdp-proxy-constants';\n\nconst debug = getDebug('agent-tools:cdp:target-store');\n\n/**\n * Read the saved targetId, or null if no command has stored one yet.\n */\nexport function readSavedTargetId(): string | null {\n if (!existsSync(TARGET_ID_FILE)) return null;\n try {\n return readFileSync(TARGET_ID_FILE, 'utf-8').trim() || null;\n } catch {\n return null;\n }\n}\n\n/**\n * Save a targetId so the next CLI command can rebind to the same tab.\n */\nexport function saveTargetId(targetId: string): void {\n try {\n writeFileSync(TARGET_ID_FILE, targetId, 'utf-8');\n debug('Saved targetId: %s', targetId);\n } catch (err) {\n debug('Failed to save targetId: %s', err);\n }\n}\n\n/**\n * Discard the saved targetId — call when disconnecting or when the\n * upstream Chrome changes (the targetId would point into the old\n * browser's tab list).\n */\nexport function cleanupTargetIdFile(): void {\n try {\n if (existsSync(TARGET_ID_FILE)) unlinkSync(TARGET_ID_FILE);\n } catch {}\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","debug","getDebug","readSavedTargetId","existsSync","TARGET_ID_FILE","readFileSync","saveTargetId","targetId","writeFileSync","err","cleanupTargetIdFile","unlinkSync"],"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;;;;;;;;;;;;ACWA,MAAMI,QAAQC,AAAAA,IAAAA,uBAAAA,QAAAA,AAAAA,EAAS;AAKhB,SAASC;IACd,IAAI,CAACC,AAAAA,IAAAA,iCAAAA,UAAAA,AAAAA,EAAWC,gDAAAA,cAAcA,GAAG,OAAO;IACxC,IAAI;QACF,OAAOC,AAAAA,IAAAA,iCAAAA,YAAAA,AAAAA,EAAaD,gDAAAA,cAAcA,EAAE,SAAS,IAAI,MAAM;IACzD,EAAE,OAAM;QACN,OAAO;IACT;AACF;AAKO,SAASE,aAAaC,QAAgB;IAC3C,IAAI;QACFC,IAAAA,iCAAAA,aAAAA,AAAAA,EAAcJ,gDAAAA,cAAcA,EAAEG,UAAU;QACxCP,MAAM,sBAAsBO;IAC9B,EAAE,OAAOE,KAAK;QACZT,MAAM,+BAA+BS;IACvC;AACF;AAOO,SAASC;IACd,IAAI;QACF,IAAIP,AAAAA,IAAAA,iCAAAA,UAAAA,AAAAA,EAAWC,gDAAAA,cAAcA,GAAGO,AAAAA,IAAAA,iCAAAA,UAAAA,AAAAA,EAAWP,gDAAAA,cAAcA;IAC3D,EAAE,OAAM,CAAC;AACX"}
package/dist/lib/cli.js CHANGED
@@ -27,10 +27,10 @@ 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_agent_tools_js_namespaceObject = require("./agent-tools.js");
31
+ const external_agent_tools_cdp_js_namespaceObject = require("./agent-tools-cdp.js");
32
+ const external_agent_tools_puppeteer_js_namespaceObject = require("./agent-tools-puppeteer.js");
30
33
  const external_cli_options_js_namespaceObject = require("./cli-options.js");
31
- const external_mcp_tools_js_namespaceObject = require("./mcp-tools.js");
32
- const external_mcp_tools_cdp_js_namespaceObject = require("./mcp-tools-cdp.js");
33
- const external_mcp_tools_puppeteer_js_namespaceObject = require("./mcp-tools-puppeteer.js");
34
34
  const envFile = (0, external_node_path_namespaceObject.join)(process.cwd(), '.env');
35
35
  if ((0, external_node_fs_namespaceObject.existsSync)(envFile)) external_dotenv_default().config({
36
36
  path: envFile
@@ -38,11 +38,11 @@ if ((0, external_node_fs_namespaceObject.existsSync)(envFile)) external_dotenv_d
38
38
  Promise.resolve().then(()=>{
39
39
  const parsedOptions = (0, external_cli_options_js_namespaceObject.parseWebCliOptions)(process.argv.slice(2));
40
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);
41
+ tools = 'bridge' === parsedOptions.mode ? new external_agent_tools_js_namespaceObject.WebMidsceneTools() : 'cdp' === parsedOptions.mode ? new external_agent_tools_cdp_js_namespaceObject.WebCdpMidsceneTools(parsedOptions.cdpEndpoint) : new external_agent_tools_puppeteer_js_namespaceObject.WebPuppeteerMidsceneTools(parsedOptions.viewport);
42
42
  return (0, cli_namespaceObject.runToolsCLI)(tools, 'midscene-web', {
43
43
  stripPrefix: 'web_',
44
44
  argv: parsedOptions.argv,
45
- version: "1.9.8",
45
+ version: "1.10.0",
46
46
  extraCommands: (0, core_namespaceObject.createReportCliCommands)()
47
47
  });
48
48
  }).catch((e)=>{
@@ -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 { 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"}
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 './agent-tools';\nimport { WebCdpMidsceneTools } from './agent-tools-cdp';\nimport { WebPuppeteerMidsceneTools } from './agent-tools-puppeteer';\nimport { parseWebCliOptions } from './cli-options';\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,wCAAAA,gBAAgBA,KACnBH,AAAuB,UAAvBA,cAAc,IAAI,GACnB,IAAII,4CAAAA,mBAAmBA,CAACJ,cAAc,WAAW,IAEjD,IAAIK,kDAAAA,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"}
package/dist/lib/index.js CHANGED
@@ -31,16 +31,16 @@ __webpack_require__.d(__webpack_exports__, {
31
31
  StaticPage: ()=>external_static_index_js_namespaceObject.StaticPage,
32
32
  PageAgent: ()=>agent_namespaceObject.Agent,
33
33
  webPlaygroundPlatform: ()=>external_platform_js_namespaceObject.webPlaygroundPlatform,
34
- WebCdpMidsceneTools: ()=>external_mcp_tools_cdp_js_namespaceObject.WebCdpMidsceneTools,
35
- WebMidsceneTools: ()=>external_mcp_tools_js_namespaceObject.WebMidsceneTools
34
+ WebCdpMidsceneTools: ()=>external_agent_tools_cdp_js_namespaceObject.WebCdpMidsceneTools,
35
+ WebMidsceneTools: ()=>external_agent_tools_js_namespaceObject.WebMidsceneTools
36
36
  });
37
37
  const index_js_namespaceObject = require("./playwright/index.js");
38
38
  const agent_namespaceObject = require("@midscene/core/agent");
39
39
  const external_puppeteer_index_js_namespaceObject = require("./puppeteer/index.js");
40
40
  const external_static_index_js_namespaceObject = require("./static/index.js");
41
- const external_mcp_tools_js_namespaceObject = require("./mcp-tools.js");
41
+ const external_agent_tools_js_namespaceObject = require("./agent-tools.js");
42
42
  const external_platform_js_namespaceObject = require("./platform.js");
43
- const external_mcp_tools_cdp_js_namespaceObject = require("./mcp-tools-cdp.js");
43
+ const external_agent_tools_cdp_js_namespaceObject = require("./agent-tools-cdp.js");
44
44
  exports.PageAgent = __webpack_exports__.PageAgent;
45
45
  exports.PlaywrightAgent = __webpack_exports__.PlaywrightAgent;
46
46
  exports.PlaywrightAiFixture = __webpack_exports__.PlaywrightAiFixture;
@@ -65,11 +65,13 @@ class PlaywrightAgent extends agent_namespaceObject.Agent {
65
65
  if (!page) throw new Error('[midscene] PlaywrightAgent requires a valid Playwright page instance. Please make sure to pass a valid page object.');
66
66
  const webPage = new external_page_js_namespaceObject.WebPage(page, opts);
67
67
  super(webPage, opts);
68
- const { forceSameTabNavigation = true, forceChromeSelectRendering } = opts ?? {};
68
+ const { forceSameTabNavigation = true, forceChromeSelectRendering = true } = opts ?? {};
69
69
  if (forceSameTabNavigation) (0, base_page_js_namespaceObject.forceClosePopup)(page, debug);
70
70
  if (forceChromeSelectRendering) {
71
- const playwrightVersion = getPlaywrightVersion();
72
- if (playwrightVersion && !external_semver_default().gte(playwrightVersion, '1.52.0')) console.warn(`[midscene:error] forceChromeSelectRendering requires Playwright >= 1.52.0, but current version is ${playwrightVersion}. This feature may not work correctly.`);
71
+ if (opts?.forceChromeSelectRendering === true) {
72
+ const playwrightVersion = getPlaywrightVersion();
73
+ if (playwrightVersion && !external_semver_default().gte(playwrightVersion, '1.52.0')) console.warn(`[midscene:error] forceChromeSelectRendering requires Playwright >= 1.52.0, but current version is ${playwrightVersion}. This feature may not work correctly.`);
74
+ }
73
75
  (0, base_page_js_namespaceObject.forceChromeSelectRendering)(page);
74
76
  }
75
77
  }
@@ -1 +1 @@
1
- {"version":3,"file":"playwright/index.js","sources":["webpack/runtime/compat_get_default_export","webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../../src/playwright/index.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 { Agent as PageAgent } from '@midscene/core/agent';\nimport type { Page as PlaywrightPage } from 'playwright';\nimport { WebPage as PlaywrightWebPage } from './page';\n\nexport type {\n PlayWrightAiFixtureType,\n PlaywrightAiFixtureOptions,\n} from './ai-fixture';\nexport { PlaywrightAiFixture } from './ai-fixture';\nexport { overrideAIConfig } from '@midscene/shared/env';\nexport { WebPage as PlaywrightWebPage } from './page';\nexport type { WebPageAgentOpt } from '@/web-element';\nimport type { WebPageAgentOpt } from '@/web-element';\nimport { getDebug } from '@midscene/shared/logger';\nimport semver from 'semver';\nimport {\n BROWSER_NAVIGATION_ERROR_PATTERN,\n forceChromeSelectRendering as applyChromeSelectRendering,\n forceClosePopup,\n} from '../puppeteer/base-page';\nimport { getWebpackRequire } from '../utils';\n\nconst debug = getDebug('playwright:agent');\n\n/**\n * Get Playwright version from package.json\n */\nfunction getPlaywrightVersion(): string | null {\n try {\n const playwrightPkg = getWebpackRequire()('playwright/package.json');\n return playwrightPkg.version || null;\n } catch (error) {\n console.error('[midscene:error] Failed to get Playwright version', error);\n return null;\n }\n}\n\nexport class PlaywrightAgent extends PageAgent<PlaywrightWebPage> {\n protected isRetryableContextError(error: unknown): boolean {\n return (\n error instanceof Error &&\n BROWSER_NAVIGATION_ERROR_PATTERN.test(error.message)\n );\n }\n\n constructor(page: PlaywrightPage, opts?: WebPageAgentOpt) {\n if (!page) {\n throw new Error(\n '[midscene] PlaywrightAgent requires a valid Playwright page instance. Please make sure to pass a valid page object.',\n );\n }\n const webPage = new PlaywrightWebPage(page, opts);\n super(webPage, opts);\n\n const { forceSameTabNavigation = true, forceChromeSelectRendering } =\n opts ?? {};\n\n if (forceSameTabNavigation) {\n forceClosePopup(page, debug);\n }\n\n if (forceChromeSelectRendering) {\n // Check Playwright version requirement (>= 1.52)\n const playwrightVersion = getPlaywrightVersion();\n if (playwrightVersion && !semver.gte(playwrightVersion, '1.52.0')) {\n console.warn(\n `[midscene:error] forceChromeSelectRendering requires Playwright >= 1.52.0, but current version is ${playwrightVersion}. This feature may not work correctly.`,\n );\n }\n applyChromeSelectRendering(page);\n }\n }\n}\n"],"names":["__webpack_require__","module","getter","definition","key","Object","obj","prop","Symbol","debug","getDebug","getPlaywrightVersion","playwrightPkg","getWebpackRequire","error","console","PlaywrightAgent","PageAgent","Error","BROWSER_NAVIGATION_ERROR_PATTERN","page","opts","webPage","PlaywrightWebPage","forceSameTabNavigation","forceChromeSelectRendering","forceClosePopup","playwrightVersion","semver","applyChromeSelectRendering"],"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;;;ICClFP,oBAAoB,CAAC,GAAG,CAAC;QACxB,IAAG,AAAkB,eAAlB,OAAOQ,UAA0BA,OAAO,WAAW,EACrDH,OAAO,cAAc,CAAC,UAASG,OAAO,WAAW,EAAE;YAAE,OAAO;QAAS;QAEtEH,OAAO,cAAc,CAAC,UAAS,cAAc;YAAE,OAAO;QAAK;IAC5D;;;;;;;;;;;;;;;;;;;ACgBA,MAAMI,QAAQC,AAAAA,IAAAA,uBAAAA,QAAAA,AAAAA,EAAS;AAKvB,SAASC;IACP,IAAI;QACF,MAAMC,gBAAgBC,AAAAA,IAAAA,kCAAAA,iBAAAA,AAAAA,IAAoB;QAC1C,OAAOD,cAAc,OAAO,IAAI;IAClC,EAAE,OAAOE,OAAO;QACdC,QAAQ,KAAK,CAAC,qDAAqDD;QACnE,OAAO;IACT;AACF;AAEO,MAAME,wBAAwBC,sBAAAA,KAASA;IAClC,wBAAwBH,KAAc,EAAW;QACzD,OACEA,iBAAiBI,SACjBC,6BAAAA,gCAAAA,CAAAA,IAAqC,CAACL,MAAM,OAAO;IAEvD;IAEA,YAAYM,IAAoB,EAAEC,IAAsB,CAAE;QACxD,IAAI,CAACD,MACH,MAAM,IAAIF,MACR;QAGJ,MAAMI,UAAU,IAAIC,iCAAAA,OAAiBA,CAACH,MAAMC;QAC5C,KAAK,CAACC,SAASD;QAEf,MAAM,EAAEG,yBAAyB,IAAI,EAAEC,0BAA0B,EAAE,GACjEJ,QAAQ,CAAC;QAEX,IAAIG,wBACFE,AAAAA,IAAAA,6BAAAA,eAAAA,AAAAA,EAAgBN,MAAMX;QAGxB,IAAIgB,4BAA4B;YAE9B,MAAME,oBAAoBhB;YAC1B,IAAIgB,qBAAqB,CAACC,0BAAAA,GAAU,CAACD,mBAAmB,WACtDZ,QAAQ,IAAI,CACV,CAAC,kGAAkG,EAAEY,kBAAkB,sCAAsC,CAAC;YAGlKE,IAAAA,6BAAAA,0BAAAA,AAAAA,EAA2BT;QAC7B;IACF;AACF"}
1
+ {"version":3,"file":"playwright/index.js","sources":["webpack/runtime/compat_get_default_export","webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../../src/playwright/index.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 { Agent as PageAgent } from '@midscene/core/agent';\nimport type { Page as PlaywrightPage } from 'playwright';\nimport { WebPage as PlaywrightWebPage } from './page';\n\nexport type {\n PlayWrightAiFixtureType,\n PlaywrightAiFixtureOptions,\n} from './ai-fixture';\nexport { PlaywrightAiFixture } from './ai-fixture';\nexport { overrideAIConfig } from '@midscene/shared/env';\nexport { WebPage as PlaywrightWebPage } from './page';\nexport type { WebPageAgentOpt } from '@/web-element';\nimport type { WebPageAgentOpt } from '@/web-element';\nimport { getDebug } from '@midscene/shared/logger';\nimport semver from 'semver';\nimport {\n BROWSER_NAVIGATION_ERROR_PATTERN,\n forceChromeSelectRendering as applyChromeSelectRendering,\n forceClosePopup,\n} from '../puppeteer/base-page';\nimport { getWebpackRequire } from '../utils';\n\nconst debug = getDebug('playwright:agent');\n\n/**\n * Get Playwright version from package.json\n */\nfunction getPlaywrightVersion(): string | null {\n try {\n const playwrightPkg = getWebpackRequire()('playwright/package.json');\n return playwrightPkg.version || null;\n } catch (error) {\n console.error('[midscene:error] Failed to get Playwright version', error);\n return null;\n }\n}\n\nexport class PlaywrightAgent extends PageAgent<PlaywrightWebPage> {\n protected isRetryableContextError(error: unknown): boolean {\n return (\n error instanceof Error &&\n BROWSER_NAVIGATION_ERROR_PATTERN.test(error.message)\n );\n }\n\n constructor(page: PlaywrightPage, opts?: WebPageAgentOpt) {\n if (!page) {\n throw new Error(\n '[midscene] PlaywrightAgent requires a valid Playwright page instance. Please make sure to pass a valid page object.',\n );\n }\n const webPage = new PlaywrightWebPage(page, opts);\n super(webPage, opts);\n\n const { forceSameTabNavigation = true, forceChromeSelectRendering = true } =\n opts ?? {};\n\n if (forceSameTabNavigation) {\n forceClosePopup(page, debug);\n }\n\n if (forceChromeSelectRendering) {\n // Only warn about version requirements when the user explicitly opted in;\n // it is on by default, so we should not nag users on older Playwright.\n if (opts?.forceChromeSelectRendering === true) {\n const playwrightVersion = getPlaywrightVersion();\n if (playwrightVersion && !semver.gte(playwrightVersion, '1.52.0')) {\n console.warn(\n `[midscene:error] forceChromeSelectRendering requires Playwright >= 1.52.0, but current version is ${playwrightVersion}. This feature may not work correctly.`,\n );\n }\n }\n applyChromeSelectRendering(page);\n }\n }\n}\n"],"names":["__webpack_require__","module","getter","definition","key","Object","obj","prop","Symbol","debug","getDebug","getPlaywrightVersion","playwrightPkg","getWebpackRequire","error","console","PlaywrightAgent","PageAgent","Error","BROWSER_NAVIGATION_ERROR_PATTERN","page","opts","webPage","PlaywrightWebPage","forceSameTabNavigation","forceChromeSelectRendering","forceClosePopup","playwrightVersion","semver","applyChromeSelectRendering"],"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;;;ICClFP,oBAAoB,CAAC,GAAG,CAAC;QACxB,IAAG,AAAkB,eAAlB,OAAOQ,UAA0BA,OAAO,WAAW,EACrDH,OAAO,cAAc,CAAC,UAASG,OAAO,WAAW,EAAE;YAAE,OAAO;QAAS;QAEtEH,OAAO,cAAc,CAAC,UAAS,cAAc;YAAE,OAAO;QAAK;IAC5D;;;;;;;;;;;;;;;;;;;ACgBA,MAAMI,QAAQC,AAAAA,IAAAA,uBAAAA,QAAAA,AAAAA,EAAS;AAKvB,SAASC;IACP,IAAI;QACF,MAAMC,gBAAgBC,AAAAA,IAAAA,kCAAAA,iBAAAA,AAAAA,IAAoB;QAC1C,OAAOD,cAAc,OAAO,IAAI;IAClC,EAAE,OAAOE,OAAO;QACdC,QAAQ,KAAK,CAAC,qDAAqDD;QACnE,OAAO;IACT;AACF;AAEO,MAAME,wBAAwBC,sBAAAA,KAASA;IAClC,wBAAwBH,KAAc,EAAW;QACzD,OACEA,iBAAiBI,SACjBC,6BAAAA,gCAAAA,CAAAA,IAAqC,CAACL,MAAM,OAAO;IAEvD;IAEA,YAAYM,IAAoB,EAAEC,IAAsB,CAAE;QACxD,IAAI,CAACD,MACH,MAAM,IAAIF,MACR;QAGJ,MAAMI,UAAU,IAAIC,iCAAAA,OAAiBA,CAACH,MAAMC;QAC5C,KAAK,CAACC,SAASD;QAEf,MAAM,EAAEG,yBAAyB,IAAI,EAAEC,6BAA6B,IAAI,EAAE,GACxEJ,QAAQ,CAAC;QAEX,IAAIG,wBACFE,AAAAA,IAAAA,6BAAAA,eAAAA,AAAAA,EAAgBN,MAAMX;QAGxB,IAAIgB,4BAA4B;YAG9B,IAAIJ,MAAM,+BAA+B,MAAM;gBAC7C,MAAMM,oBAAoBhB;gBAC1B,IAAIgB,qBAAqB,CAACC,0BAAAA,GAAU,CAACD,mBAAmB,WACtDZ,QAAQ,IAAI,CACV,CAAC,kGAAkG,EAAEY,kBAAkB,sCAAsC,CAAC;YAGpK;YACAE,IAAAA,6BAAAA,0BAAAA,AAAAA,EAA2BT;QAC7B;IACF;AACF"}
@@ -211,17 +211,15 @@ class Page {
211
211
  const errorMsg = error instanceof Error ? error.message : String(error);
212
212
  console.warn(`[Midscene] Playwright screenshot failed: ${errorMsg}. Falling back to CDP screenshot.`);
213
213
  debugPage('playwright screenshot failed, trying CDP fallback: %s', error);
214
- base64 = await this.screenshotBase64ByPlaywrightCdp(page, imgType, quality);
214
+ base64 = await this.screenshotBase64ByPlaywrightCdp(imgType, quality);
215
215
  }
216
216
  } else throw new Error('Unsupported page type for screenshot');
217
217
  const endTime = Date.now();
218
218
  debugPage(`screenshotBase64 end, cost: ${endTime - startTime}ms`);
219
219
  return base64;
220
220
  }
221
- async screenshotBase64ByPlaywrightCdp(page, imgType, quality) {
222
- const browserName = page.context().browser()?.browserType().name();
223
- if (browserName && 'chromium' !== browserName) throw new Error(`CDP screenshot fallback requires Chromium-based browser, but current browser is "${browserName}".`);
224
- const client = await page.context().newCDPSession(page);
221
+ async screenshotBase64ByPlaywrightCdp(imgType, quality) {
222
+ const client = await this.createPageCdpSession('CDP screenshot fallback');
225
223
  try {
226
224
  const result = await new Promise((resolve, reject)=>{
227
225
  const timeoutId = setTimeout(()=>{
@@ -247,14 +245,18 @@ class Page {
247
245
  });
248
246
  }
249
247
  }
250
- async createScreencastCdpSession() {
248
+ async createPageCdpSession(featureName) {
251
249
  if ('puppeteer' === this.interfaceType) {
252
250
  const page = this.underlyingPage;
253
- return await page.target().createCDPSession();
251
+ const pageWithCdp = page;
252
+ if ('function' == typeof pageWithCdp.createCDPSession) return await pageWithCdp.createCDPSession();
253
+ const target = page.target?.();
254
+ if ('function' == typeof target?.createCDPSession) return await target.createCDPSession();
255
+ throw new Error(`${featureName} requires a browser page with CDP session support.`);
254
256
  }
255
257
  const page = this.underlyingPage;
256
258
  const browserName = page.context().browser()?.browserType().name();
257
- if (browserName && 'chromium' !== browserName) throw new Error(`CDP screencast requires Chromium-based browser, but current browser is "${browserName}".`);
259
+ if (browserName && 'chromium' !== browserName) throw new Error(`${featureName} requires Chromium-based browser, but current browser is "${browserName}".`);
258
260
  return await page.context().newCDPSession(page);
259
261
  }
260
262
  async waitForDomQuiet(opts) {
@@ -339,7 +341,7 @@ class Page {
339
341
  async startMjpegStream(options) {
340
342
  const { signal, onFrame, onError } = options;
341
343
  if ('function' == typeof this.underlyingPage.bringToFront) await this.underlyingPage.bringToFront();
342
- const client = await this.createScreencastCdpSession();
344
+ const client = await this.createPageCdpSession('CDP screencast');
343
345
  let stopped = false;
344
346
  const streamToken = Symbol('mjpeg-stream');
345
347
  const reportStreamError = (error)=>{
@@ -522,6 +524,22 @@ class Page {
522
524
  }
523
525
  };
524
526
  }
527
+ async selectAllByCdp() {
528
+ const client = await this.createPageCdpSession('clearInput');
529
+ try {
530
+ await client.send('Input.dispatchKeyEvent', {
531
+ type: 'rawKeyDown',
532
+ commands: [
533
+ 'selectAll'
534
+ ]
535
+ });
536
+ await client.send('Input.dispatchKeyEvent', {
537
+ type: 'keyUp'
538
+ });
539
+ } finally{
540
+ await client.detach().catch(()=>void 0);
541
+ }
542
+ }
525
543
  async clearInput(element) {
526
544
  const backspace = async ()=>{
527
545
  await (0, utils_namespaceObject.sleep)(100);
@@ -531,28 +549,17 @@ class Page {
531
549
  }
532
550
  ]);
533
551
  };
534
- const isMac = 'darwin' === process.platform;
535
552
  debugPage('clearInput begin');
536
- if (isMac) {
537
- if ('puppeteer' === this.interfaceType) {
538
- element && await this.mouse.click(element.center[0], element.center[1], {
539
- count: 3
540
- });
541
- await backspace();
542
- }
543
- element && await this.mouse.click(element.center[0], element.center[1]);
544
- await this.underlyingPage.keyboard.down('Meta');
545
- await this.underlyingPage.keyboard.press('a');
546
- await this.underlyingPage.keyboard.up('Meta');
547
- await backspace();
548
- } else {
549
- element && await this.mouse.click(element.center[0], element.center[1]);
550
- await this.underlyingPage.keyboard.down('Control');
551
- await this.underlyingPage.keyboard.press('a');
552
- await this.underlyingPage.keyboard.up('Control');
553
+ element && await this.mouse.click(element.center[0], element.center[1]);
554
+ try {
555
+ await this.selectAllByCdp();
553
556
  await backspace();
557
+ } catch (error) {
558
+ debugPage('clearInput cdp selectAll failed', error);
559
+ throw error;
560
+ } finally{
561
+ debugPage('clearInput end');
554
562
  }
555
- debugPage('clearInput end');
556
563
  }
557
564
  async moveToPointBeforeScroll(point) {
558
565
  if (point) await this.mouse.move(point.left, point.top);
@@ -630,7 +637,7 @@ class Page {
630
637
  async stopLoading() {
631
638
  debugPage('stop loading');
632
639
  if ('puppeteer' === this.interfaceType) {
633
- const client = await this.underlyingPage.target().createCDPSession();
640
+ const client = await this.createPageCdpSession('stopLoading');
634
641
  try {
635
642
  await client.send('Page.stopLoading');
636
643
  } finally{
@@ -736,17 +743,7 @@ class Page {
736
743
  const delay = duration / steps;
737
744
  const halfStart = startDistance / 2;
738
745
  const halfEnd = endDistance / 2;
739
- let client;
740
- if ('puppeteer' === this.interfaceType) {
741
- const page = this.underlyingPage;
742
- client = await page.target().createCDPSession();
743
- } else {
744
- if ('playwright' !== this.interfaceType) return;
745
- const page = this.underlyingPage;
746
- const browserName = page.context().browser()?.browserType().name();
747
- if (browserName && 'chromium' !== browserName) throw new Error(`Pinch gesture requires Chromium-based browser, but current browser is "${browserName}". CDP touch events are not supported in Firefox/WebKit.`);
748
- client = await page.context().newCDPSession(page);
749
- }
746
+ const client = await this.createPageCdpSession('Pinch gesture');
750
747
  try {
751
748
  await client.send('Input.dispatchTouchEvent', {
752
749
  type: 'touchStart',
@@ -790,9 +787,9 @@ class Page {
790
787
  await client.detach();
791
788
  }
792
789
  }
793
- async ensurePuppeteerFileChooserSession(page) {
790
+ async ensurePuppeteerFileChooserSession() {
794
791
  if (this.puppeteerFileChooserSession) return this.puppeteerFileChooserSession;
795
- const session = await page.target().createCDPSession();
792
+ const session = await this.createPageCdpSession('Puppeteer file chooser');
796
793
  await session.send('Page.enable');
797
794
  await session.send('DOM.enable');
798
795
  await session.send('Page.setInterceptFileChooserDialog', {
@@ -803,8 +800,7 @@ class Page {
803
800
  }
804
801
  async registerFileChooserListener(handler) {
805
802
  if ('puppeteer' !== this.interfaceType) throw new Error('registerFileChooserListener is only supported in Puppeteer');
806
- const page = this.underlyingPage;
807
- const session = await this.ensurePuppeteerFileChooserSession(page);
803
+ const session = await this.ensurePuppeteerFileChooserSession();
808
804
  if (this.puppeteerFileChooserHandler) session.off('Page.fileChooserOpened', this.puppeteerFileChooserHandler);
809
805
  let capturedError;
810
806
  this.puppeteerFileChooserHandler = async (event)=>{
@@ -890,7 +886,10 @@ function forceClosePopup(page, debugProfile) {
890
886
  }
891
887
  });
892
888
  }
889
+ const forceSelectRenderingPages = new WeakSet();
893
890
  function forceChromeSelectRendering(page) {
891
+ if (forceSelectRenderingPages.has(page)) return;
892
+ forceSelectRenderingPages.add(page);
894
893
  const styleContent = `
895
894
  /* Add by Midscene because of forceChromeSelectRendering is enabled*/
896
895
  select {