@midscene/web 1.15.4 → 1.15.5
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.
- package/dist/es/agent-tools-puppeteer.mjs +26 -2
- package/dist/es/agent-tools-puppeteer.mjs.map +1 -1
- package/dist/es/bridge-mode/io-client.mjs +1 -1
- package/dist/es/bridge-mode/io-server.mjs +2 -2
- package/dist/es/bridge-mode/page-browser-side.mjs +1 -1
- package/dist/es/cli.mjs +1 -1
- package/dist/es/{playwright → common}/test-runner/cookies.mjs +56 -79
- package/dist/es/common/test-runner/cookies.mjs.map +1 -0
- package/dist/es/common/test-runner/driver.mjs +0 -0
- package/dist/es/common/test-runner/nodes.mjs +139 -0
- package/dist/es/common/test-runner/nodes.mjs.map +1 -0
- package/dist/es/common/test-runner/utils.mjs +24 -0
- package/dist/es/common/test-runner/utils.mjs.map +1 -0
- package/dist/es/playwright/test-runner/agent-nodes.mjs +3 -10
- package/dist/es/playwright/test-runner/agent-nodes.mjs.map +1 -1
- package/dist/es/playwright/test-runner/driver.mjs +42 -0
- package/dist/es/playwright/test-runner/driver.mjs.map +1 -0
- package/dist/es/playwright/test-runner/index.mjs +1 -4
- package/dist/es/playwright/test-runner/utils.mjs +1 -21
- package/dist/es/playwright/test-runner/utils.mjs.map +1 -1
- package/dist/es/puppeteer/browser-agent.mjs +9 -1
- package/dist/es/puppeteer/browser-agent.mjs.map +1 -1
- package/dist/es/puppeteer/page-agent.mjs +19 -1
- package/dist/es/puppeteer/page-agent.mjs.map +1 -1
- package/dist/es/puppeteer/test-runner/agent-nodes.mjs +6 -0
- package/dist/es/puppeteer/test-runner/agent-nodes.mjs.map +1 -0
- package/dist/es/puppeteer/test-runner/driver.mjs +62 -0
- package/dist/es/puppeteer/test-runner/driver.mjs.map +1 -0
- package/dist/es/puppeteer/test-runner/index.mjs +3 -0
- package/dist/es/puppeteer/test-runner/types.mjs +0 -0
- package/dist/es/puppeteer/test-runner/utils.mjs +8 -0
- package/dist/es/puppeteer/test-runner/utils.mjs.map +1 -0
- package/dist/lib/agent-tools-puppeteer.js +26 -2
- package/dist/lib/agent-tools-puppeteer.js.map +1 -1
- package/dist/lib/bridge-mode/io-client.js +1 -1
- package/dist/lib/bridge-mode/io-server.js +2 -2
- package/dist/lib/bridge-mode/page-browser-side.js +1 -1
- package/dist/lib/cli.js +1 -1
- package/dist/lib/{playwright → common}/test-runner/cookies.js +58 -81
- package/dist/lib/common/test-runner/cookies.js.map +1 -0
- package/dist/lib/common/test-runner/driver.js +20 -0
- package/dist/lib/common/test-runner/driver.js.map +1 -0
- package/dist/lib/common/test-runner/nodes.js +185 -0
- package/dist/lib/common/test-runner/nodes.js.map +1 -0
- package/dist/lib/common/test-runner/utils.js +61 -0
- package/dist/lib/common/test-runner/utils.js.map +1 -0
- package/dist/lib/playwright/test-runner/agent-nodes.js +3 -10
- package/dist/lib/playwright/test-runner/agent-nodes.js.map +1 -1
- package/dist/lib/playwright/test-runner/driver.js +76 -0
- package/dist/lib/playwright/test-runner/driver.js.map +1 -0
- package/dist/lib/playwright/test-runner/index.js +5 -8
- package/dist/lib/playwright/test-runner/utils.js +4 -24
- package/dist/lib/playwright/test-runner/utils.js.map +1 -1
- package/dist/lib/puppeteer/browser-agent.js +9 -1
- package/dist/lib/puppeteer/browser-agent.js.map +1 -1
- package/dist/lib/puppeteer/page-agent.js +19 -1
- package/dist/lib/puppeteer/page-agent.js.map +1 -1
- package/dist/lib/puppeteer/test-runner/agent-nodes.js +40 -0
- package/dist/lib/puppeteer/test-runner/agent-nodes.js.map +1 -0
- package/dist/lib/puppeteer/test-runner/driver.js +96 -0
- package/dist/lib/puppeteer/test-runner/driver.js.map +1 -0
- package/dist/lib/puppeteer/test-runner/index.js +51 -0
- package/dist/lib/puppeteer/test-runner/index.js.map +1 -0
- package/dist/lib/puppeteer/test-runner/types.js +20 -0
- package/dist/lib/puppeteer/test-runner/types.js.map +1 -0
- package/dist/lib/puppeteer/test-runner/utils.js +48 -0
- package/dist/lib/puppeteer/test-runner/utils.js.map +1 -0
- package/dist/types/agent-tools-puppeteer.d.ts +1 -0
- package/dist/types/agent-tools-puppeteer.d.ts.map +1 -1
- package/dist/types/common/test-runner/cookies.d.ts +52 -0
- package/dist/types/common/test-runner/cookies.d.ts.map +1 -0
- package/dist/types/common/test-runner/driver.d.ts +38 -0
- package/dist/types/common/test-runner/driver.d.ts.map +1 -0
- package/dist/types/common/test-runner/nodes.d.ts +38 -0
- package/dist/types/common/test-runner/nodes.d.ts.map +1 -0
- package/dist/types/common/test-runner/utils.d.ts +3 -0
- package/dist/types/common/test-runner/utils.d.ts.map +1 -0
- package/dist/types/playwright/test-runner/agent-nodes.d.ts +1 -2
- package/dist/types/playwright/test-runner/agent-nodes.d.ts.map +1 -1
- package/dist/types/playwright/test-runner/driver.d.ts +4 -0
- package/dist/types/playwright/test-runner/driver.d.ts.map +1 -0
- package/dist/types/playwright/test-runner/index.d.ts +2 -8
- package/dist/types/playwright/test-runner/index.d.ts.map +1 -1
- package/dist/types/playwright/test-runner/types.d.ts +5 -14
- package/dist/types/playwright/test-runner/types.d.ts.map +1 -1
- package/dist/types/playwright/test-runner/utils.d.ts +1 -2
- package/dist/types/playwright/test-runner/utils.d.ts.map +1 -1
- package/dist/types/puppeteer/browser-agent.d.ts +5 -0
- package/dist/types/puppeteer/browser-agent.d.ts.map +1 -1
- package/dist/types/puppeteer/index.d.ts +1 -1
- package/dist/types/puppeteer/index.d.ts.map +1 -1
- package/dist/types/puppeteer/page-agent.d.ts +8 -1
- package/dist/types/puppeteer/page-agent.d.ts.map +1 -1
- package/dist/types/puppeteer/test-runner/agent-nodes.d.ts +2 -0
- package/dist/types/puppeteer/test-runner/agent-nodes.d.ts.map +1 -0
- package/dist/types/puppeteer/test-runner/driver.d.ts +4 -0
- package/dist/types/puppeteer/test-runner/driver.d.ts.map +1 -0
- package/dist/types/puppeteer/test-runner/index.d.ts +5 -0
- package/dist/types/puppeteer/test-runner/index.d.ts.map +1 -0
- package/dist/types/puppeteer/test-runner/types.d.ts +18 -0
- package/dist/types/puppeteer/test-runner/types.d.ts.map +1 -0
- package/dist/types/puppeteer/test-runner/utils.d.ts +4 -0
- package/dist/types/puppeteer/test-runner/utils.d.ts.map +1 -0
- package/package.json +9 -4
- package/dist/es/playwright/test-runner/clear-cookies.mjs +0 -45
- package/dist/es/playwright/test-runner/clear-cookies.mjs.map +0 -1
- package/dist/es/playwright/test-runner/cookies.mjs.map +0 -1
- package/dist/es/playwright/test-runner/goto-url.mjs +0 -60
- package/dist/es/playwright/test-runner/goto-url.mjs.map +0 -1
- package/dist/es/playwright/test-runner/viewport.mjs +0 -35
- package/dist/es/playwright/test-runner/viewport.mjs.map +0 -1
- package/dist/lib/playwright/test-runner/clear-cookies.js +0 -82
- package/dist/lib/playwright/test-runner/clear-cookies.js.map +0 -1
- package/dist/lib/playwright/test-runner/cookies.js.map +0 -1
- package/dist/lib/playwright/test-runner/goto-url.js +0 -97
- package/dist/lib/playwright/test-runner/goto-url.js.map +0 -1
- package/dist/lib/playwright/test-runner/viewport.js +0 -72
- package/dist/lib/playwright/test-runner/viewport.js.map +0 -1
- package/dist/types/playwright/test-runner/clear-cookies.d.ts +0 -17
- package/dist/types/playwright/test-runner/clear-cookies.d.ts.map +0 -1
- package/dist/types/playwright/test-runner/cookies.d.ts +0 -33
- package/dist/types/playwright/test-runner/cookies.d.ts.map +0 -1
- package/dist/types/playwright/test-runner/goto-url.d.ts +0 -26
- package/dist/types/playwright/test-runner/goto-url.d.ts.map +0 -1
- package/dist/types/playwright/test-runner/viewport.d.ts +0 -14
- package/dist/types/playwright/test-runner/viewport.d.ts.map +0 -1
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
const SUPPORTED_WEB_PROTOCOLS = new Set([
|
|
2
|
+
'http:',
|
|
3
|
+
'https:'
|
|
4
|
+
]);
|
|
5
|
+
const throwIfAborted = (signal, operation)=>{
|
|
6
|
+
if (signal.aborted) throw signal.reason ?? new Error(`${operation} aborted.`);
|
|
7
|
+
};
|
|
8
|
+
const resolveWebUrl = (target, baseUrl, label)=>{
|
|
9
|
+
const trimmed = target.trim();
|
|
10
|
+
if (!trimmed) throw new TypeError(`${label} must not be blank.`);
|
|
11
|
+
let resolved;
|
|
12
|
+
try {
|
|
13
|
+
resolved = void 0 === baseUrl ? new URL(trimmed) : new URL(trimmed, baseUrl);
|
|
14
|
+
} catch (error) {
|
|
15
|
+
throw new TypeError(void 0 === baseUrl ? `${label} must be an absolute HTTP(S) URL.` : `${label} is not a valid URL.`, {
|
|
16
|
+
cause: error
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
if (!SUPPORTED_WEB_PROTOCOLS.has(resolved.protocol)) throw new TypeError(`${label} does not support the ${resolved.protocol} protocol.`);
|
|
20
|
+
return resolved.toString();
|
|
21
|
+
};
|
|
22
|
+
export { resolveWebUrl, throwIfAborted };
|
|
23
|
+
|
|
24
|
+
//# sourceMappingURL=utils.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common/test-runner/utils.mjs","sources":["../../../../src/common/test-runner/utils.ts"],"sourcesContent":["const SUPPORTED_WEB_PROTOCOLS = new Set(['http:', 'https:']);\n\nexport const throwIfAborted = (signal: AbortSignal, operation: string) => {\n if (signal.aborted) {\n throw signal.reason ?? new Error(`${operation} aborted.`);\n }\n};\n\nexport const resolveWebUrl = (\n target: string,\n baseUrl: string | undefined,\n label: string,\n): string => {\n const trimmed = target.trim();\n if (!trimmed) throw new TypeError(`${label} must not be blank.`);\n\n let resolved: URL;\n try {\n resolved =\n baseUrl === undefined ? new URL(trimmed) : new URL(trimmed, baseUrl);\n } catch (error) {\n throw new TypeError(\n baseUrl === undefined\n ? `${label} must be an absolute HTTP(S) URL.`\n : `${label} is not a valid URL.`,\n { cause: error },\n );\n }\n if (!SUPPORTED_WEB_PROTOCOLS.has(resolved.protocol)) {\n throw new TypeError(\n `${label} does not support the ${resolved.protocol} protocol.`,\n );\n }\n return resolved.toString();\n};\n"],"names":["SUPPORTED_WEB_PROTOCOLS","Set","throwIfAborted","signal","operation","Error","resolveWebUrl","target","baseUrl","label","trimmed","TypeError","resolved","undefined","URL","error"],"mappings":"AAAA,MAAMA,0BAA0B,IAAIC,IAAI;IAAC;IAAS;CAAS;AAEpD,MAAMC,iBAAiB,CAACC,QAAqBC;IAClD,IAAID,OAAO,OAAO,EAChB,MAAMA,OAAO,MAAM,IAAI,IAAIE,MAAM,GAAGD,UAAU,SAAS,CAAC;AAE5D;AAEO,MAAME,gBAAgB,CAC3BC,QACAC,SACAC;IAEA,MAAMC,UAAUH,OAAO,IAAI;IAC3B,IAAI,CAACG,SAAS,MAAM,IAAIC,UAAU,GAAGF,MAAM,mBAAmB,CAAC;IAE/D,IAAIG;IACJ,IAAI;QACFA,WACEJ,AAAYK,WAAZL,UAAwB,IAAIM,IAAIJ,WAAW,IAAII,IAAIJ,SAASF;IAChE,EAAE,OAAOO,OAAO;QACd,MAAM,IAAIJ,UACRH,AAAYK,WAAZL,UACI,GAAGC,MAAM,iCAAiC,CAAC,GAC3C,GAAGA,MAAM,oBAAoB,CAAC,EAClC;YAAE,OAAOM;QAAM;IAEnB;IACA,IAAI,CAACf,wBAAwB,GAAG,CAACY,SAAS,QAAQ,GAChD,MAAM,IAAID,UACR,GAAGF,MAAM,sBAAsB,EAAEG,SAAS,QAAQ,CAAC,UAAU,CAAC;IAGlE,OAAOA,SAAS,QAAQ;AAC1B"}
|
|
@@ -1,13 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
import { setViewportSizeNode } from "./viewport.mjs";
|
|
5
|
-
const playwrightAgentTestRunnerNodeDefinitions = [
|
|
6
|
-
gotoUrlNode,
|
|
7
|
-
setCookiesNode,
|
|
8
|
-
clearCookiesNode,
|
|
9
|
-
setViewportSizeNode
|
|
10
|
-
];
|
|
1
|
+
import { createWebTestRunnerNodeDefinitions } from "../../common/test-runner/nodes.mjs";
|
|
2
|
+
import { playwrightTestDriverAdapter } from "./driver.mjs";
|
|
3
|
+
const playwrightAgentTestRunnerNodeDefinitions = createWebTestRunnerNodeDefinitions(playwrightTestDriverAdapter);
|
|
11
4
|
export { playwrightAgentTestRunnerNodeDefinitions };
|
|
12
5
|
|
|
13
6
|
//# sourceMappingURL=agent-nodes.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"playwright/test-runner/agent-nodes.mjs","sources":["../../../../src/playwright/test-runner/agent-nodes.ts"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"file":"playwright/test-runner/agent-nodes.mjs","sources":["../../../../src/playwright/test-runner/agent-nodes.ts"],"sourcesContent":["import { createWebTestRunnerNodeDefinitions } from '@/common/test-runner/nodes';\nimport { playwrightTestDriverAdapter } from './driver';\n\nexport const playwrightAgentTestRunnerNodeDefinitions =\n createWebTestRunnerNodeDefinitions(playwrightTestDriverAdapter);\n"],"names":["playwrightAgentTestRunnerNodeDefinitions","createWebTestRunnerNodeDefinitions","playwrightTestDriverAdapter"],"mappings":";;AAGO,MAAMA,2CACXC,mCAAmCC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { requirePlaywrightAgent } from "./utils.mjs";
|
|
2
|
+
const createPlaywrightDriver = (agent)=>{
|
|
3
|
+
const page = agent.interface.underlyingPage;
|
|
4
|
+
return {
|
|
5
|
+
currentUrl: ()=>page.url(),
|
|
6
|
+
baseUrl: ()=>{
|
|
7
|
+
const context = page.context();
|
|
8
|
+
return context._options?.baseURL;
|
|
9
|
+
},
|
|
10
|
+
async goto (url, options) {
|
|
11
|
+
if ('networkidle0' === options.waitUntil || 'networkidle2' === options.waitUntil) throw new TypeError(`Playwright does not support gotoUrl.waitUntil=${options.waitUntil}; use networkidle instead.`);
|
|
12
|
+
const response = await page.goto(url, {
|
|
13
|
+
waitUntil: options.waitUntil,
|
|
14
|
+
timeout: options.timeoutMs
|
|
15
|
+
});
|
|
16
|
+
return {
|
|
17
|
+
status: response?.status() ?? null
|
|
18
|
+
};
|
|
19
|
+
},
|
|
20
|
+
title: ()=>page.title(),
|
|
21
|
+
setCookies: async (cookies)=>{
|
|
22
|
+
await page.context().addCookies(cookies);
|
|
23
|
+
},
|
|
24
|
+
clearCookies: async (filters)=>{
|
|
25
|
+
await page.context().clearCookies(filters);
|
|
26
|
+
},
|
|
27
|
+
setViewportSize: async (size)=>{
|
|
28
|
+
await page.setViewportSize(size);
|
|
29
|
+
const viewport = page.viewportSize();
|
|
30
|
+
if (!viewport) throw new Error('Playwright did not report an effective viewport size.');
|
|
31
|
+
return viewport;
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
const playwrightTestDriverAdapter = {
|
|
36
|
+
requireAgent: requirePlaywrightAgent,
|
|
37
|
+
createDriver: createPlaywrightDriver,
|
|
38
|
+
getOptions: (agent)=>agent.testRunner
|
|
39
|
+
};
|
|
40
|
+
export { playwrightTestDriverAdapter };
|
|
41
|
+
|
|
42
|
+
//# sourceMappingURL=driver.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"playwright/test-runner/driver.mjs","sources":["../../../../src/playwright/test-runner/driver.ts"],"sourcesContent":["import type {\n WebCookieFilters,\n WebTestDriver,\n WebTestDriverAdapter,\n} from '@/common/test-runner/driver';\nimport type { BrowserContext } from 'playwright';\nimport type {\n PlaywrightTestRunnerAgent,\n PlaywrightTestRunnerOptions,\n} from './types';\nimport { requirePlaywrightAgent } from './utils';\n\ntype CookieClearOptions = NonNullable<\n Parameters<BrowserContext['clearCookies']>[0]\n>;\n\nconst createPlaywrightDriver = (\n agent: PlaywrightTestRunnerAgent,\n): WebTestDriver => {\n const page = agent.interface.underlyingPage;\n return {\n currentUrl: () => page.url(),\n baseUrl: () => {\n const context = page.context() as BrowserContext & {\n _options?: { baseURL?: string };\n };\n return context._options?.baseURL;\n },\n async goto(url, options) {\n if (\n options.waitUntil === 'networkidle0' ||\n options.waitUntil === 'networkidle2'\n ) {\n throw new TypeError(\n `Playwright does not support gotoUrl.waitUntil=${options.waitUntil}; use networkidle instead.`,\n );\n }\n const response = await page.goto(url, {\n waitUntil: options.waitUntil,\n timeout: options.timeoutMs,\n });\n return { status: response?.status() ?? null };\n },\n title: () => page.title(),\n setCookies: async (cookies) => {\n await page.context().addCookies(cookies);\n },\n clearCookies: async (filters: WebCookieFilters) => {\n await page.context().clearCookies(filters as CookieClearOptions);\n },\n setViewportSize: async (size) => {\n await page.setViewportSize(size);\n const viewport = page.viewportSize();\n if (!viewport) {\n throw new Error(\n 'Playwright did not report an effective viewport size.',\n );\n }\n return viewport;\n },\n };\n};\n\nexport const playwrightTestDriverAdapter: WebTestDriverAdapter<\n PlaywrightTestRunnerAgent,\n PlaywrightTestRunnerOptions\n> = {\n requireAgent: requirePlaywrightAgent,\n createDriver: createPlaywrightDriver,\n getOptions: (agent) => agent.testRunner,\n};\n"],"names":["createPlaywrightDriver","agent","page","context","url","options","TypeError","response","cookies","filters","size","viewport","Error","playwrightTestDriverAdapter","requirePlaywrightAgent"],"mappings":";AAgBA,MAAMA,yBAAyB,CAC7BC;IAEA,MAAMC,OAAOD,MAAM,SAAS,CAAC,cAAc;IAC3C,OAAO;QACL,YAAY,IAAMC,KAAK,GAAG;QAC1B,SAAS;YACP,MAAMC,UAAUD,KAAK,OAAO;YAG5B,OAAOC,QAAQ,QAAQ,EAAE;QAC3B;QACA,MAAM,MAAKC,GAAG,EAAEC,OAAO;YACrB,IACEA,AAAsB,mBAAtBA,QAAQ,SAAS,IACjBA,AAAsB,mBAAtBA,QAAQ,SAAS,EAEjB,MAAM,IAAIC,UACR,CAAC,8CAA8C,EAAED,QAAQ,SAAS,CAAC,0BAA0B,CAAC;YAGlG,MAAME,WAAW,MAAML,KAAK,IAAI,CAACE,KAAK;gBACpC,WAAWC,QAAQ,SAAS;gBAC5B,SAASA,QAAQ,SAAS;YAC5B;YACA,OAAO;gBAAE,QAAQE,UAAU,YAAY;YAAK;QAC9C;QACA,OAAO,IAAML,KAAK,KAAK;QACvB,YAAY,OAAOM;YACjB,MAAMN,KAAK,OAAO,GAAG,UAAU,CAACM;QAClC;QACA,cAAc,OAAOC;YACnB,MAAMP,KAAK,OAAO,GAAG,YAAY,CAACO;QACpC;QACA,iBAAiB,OAAOC;YACtB,MAAMR,KAAK,eAAe,CAACQ;YAC3B,MAAMC,WAAWT,KAAK,YAAY;YAClC,IAAI,CAACS,UACH,MAAM,IAAIC,MACR;YAGJ,OAAOD;QACT;IACF;AACF;AAEO,MAAME,8BAGT;IACF,cAAcC;IACd,cAAcd;IACd,YAAY,CAACC,QAAUA,MAAM,UAAU;AACzC"}
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
import { clearCookiesInputSchema } from "
|
|
2
|
-
import { setCookiesInputSchema } from "./cookies.mjs";
|
|
3
|
-
import { gotoUrlInputSchema } from "./goto-url.mjs";
|
|
4
|
-
import { setViewportSizeInputSchema } from "./viewport.mjs";
|
|
1
|
+
import { clearCookiesInputSchema, gotoUrlInputSchema, setCookiesInputSchema, setViewportSizeInputSchema } from "../../common/test-runner/nodes.mjs";
|
|
5
2
|
import { playwrightAgentTestRunnerNodeDefinitions } from "./agent-nodes.mjs";
|
|
6
3
|
export { clearCookiesInputSchema, gotoUrlInputSchema, playwrightAgentTestRunnerNodeDefinitions, setCookiesInputSchema, setViewportSizeInputSchema };
|
|
@@ -1,24 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
'http:',
|
|
3
|
-
'https:'
|
|
4
|
-
]);
|
|
5
|
-
const throwIfAborted = (signal, operation)=>{
|
|
6
|
-
if (signal.aborted) throw signal.reason ?? new Error(`${operation} aborted.`);
|
|
7
|
-
};
|
|
8
|
-
const resolveWebUrl = (target, baseUrl, label)=>{
|
|
9
|
-
const trimmed = target.trim();
|
|
10
|
-
if (!trimmed) throw new TypeError(`${label} must not be blank.`);
|
|
11
|
-
let resolved;
|
|
12
|
-
try {
|
|
13
|
-
resolved = void 0 === baseUrl ? new URL(trimmed) : new URL(trimmed, baseUrl);
|
|
14
|
-
} catch (error) {
|
|
15
|
-
throw new TypeError(void 0 === baseUrl ? `${label} must be an absolute HTTP(S) URL.` : `${label} is not a valid URL.`, {
|
|
16
|
-
cause: error
|
|
17
|
-
});
|
|
18
|
-
}
|
|
19
|
-
if (!SUPPORTED_WEB_PROTOCOLS.has(resolved.protocol)) throw new TypeError(`${label} does not support the ${resolved.protocol} protocol.`);
|
|
20
|
-
return resolved.toString();
|
|
21
|
-
};
|
|
1
|
+
import { resolveWebUrl, throwIfAborted } from "../../common/test-runner/utils.mjs";
|
|
22
2
|
const requirePlaywrightAgent = (agent)=>{
|
|
23
3
|
if (!agent || 'object' != typeof agent || !('interface' in agent) || !agent.interface || 'object' != typeof agent.interface || !('underlyingPage' in agent.interface) || !agent.interface.underlyingPage) throw new TypeError('getAgent() must return a Playwright Agent with an underlying Page.');
|
|
24
4
|
return agent;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"playwright/test-runner/utils.mjs","sources":["../../../../src/playwright/test-runner/utils.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"playwright/test-runner/utils.mjs","sources":["../../../../src/playwright/test-runner/utils.ts"],"sourcesContent":["export { resolveWebUrl, throwIfAborted } from '../../common/test-runner/utils';\n\nimport type { PlaywrightTestRunnerAgent } from './types';\n\nexport const requirePlaywrightAgent = (\n agent: unknown,\n): PlaywrightTestRunnerAgent => {\n if (\n !agent ||\n typeof agent !== 'object' ||\n !('interface' in agent) ||\n !agent.interface ||\n typeof agent.interface !== 'object' ||\n !('underlyingPage' in agent.interface) ||\n !agent.interface.underlyingPage\n ) {\n throw new TypeError(\n 'getAgent() must return a Playwright Agent with an underlying Page.',\n );\n }\n return agent as PlaywrightTestRunnerAgent;\n};\n"],"names":["requirePlaywrightAgent","agent","TypeError"],"mappings":";AAIO,MAAMA,yBAAyB,CACpCC;IAEA,IACE,CAACA,SACD,AAAiB,YAAjB,OAAOA,SACP,CAAE,gBAAeA,KAAI,KACrB,CAACA,MAAM,SAAS,IAChB,AAA2B,YAA3B,OAAOA,MAAM,SAAS,IACtB,CAAE,qBAAoBA,MAAM,SAAQ,KACpC,CAACA,MAAM,SAAS,CAAC,cAAc,EAE/B,MAAM,IAAIC,UACR;IAGJ,OAAOD;AACT"}
|
|
@@ -4,6 +4,7 @@ import { appendBrowserAgentPageActions, createBrowserAgentPageActions } from "..
|
|
|
4
4
|
import { getDebug } from "@midscene/shared/logger";
|
|
5
5
|
import { createPuppeteerBrowserPageManager } from "./browser-page-manager.mjs";
|
|
6
6
|
import { PuppeteerWebPage } from "./page.mjs";
|
|
7
|
+
import { puppeteerAgentTestRunnerNodeDefinitions } from "./test-runner/agent-nodes.mjs";
|
|
7
8
|
function _define_property(obj, key, value) {
|
|
8
9
|
if (key in obj) Object.defineProperty(obj, key, {
|
|
9
10
|
value: value,
|
|
@@ -16,6 +17,12 @@ function _define_property(obj, key, value) {
|
|
|
16
17
|
}
|
|
17
18
|
const debug = getDebug('puppeteer:browser-agent');
|
|
18
19
|
class PuppeteerBrowserAgent extends WebAgentCore {
|
|
20
|
+
static getTestRunnerNodeDefinitions() {
|
|
21
|
+
return [
|
|
22
|
+
...WebAgentCore.getTestRunnerNodeDefinitions(),
|
|
23
|
+
...puppeteerAgentTestRunnerNodeDefinitions
|
|
24
|
+
];
|
|
25
|
+
}
|
|
19
26
|
static async create(browser, opts) {
|
|
20
27
|
const { initialPage, ...agentOpts } = opts ?? {};
|
|
21
28
|
const page = initialPage ?? (await browser.pages())[0] ?? await browser.newPage();
|
|
@@ -67,7 +74,8 @@ class PuppeteerBrowserAgent extends WebAgentCore {
|
|
|
67
74
|
debug,
|
|
68
75
|
pageScope
|
|
69
76
|
});
|
|
70
|
-
super(webPage, agentOpts), _define_property(this, "pageManager", void 0);
|
|
77
|
+
super(webPage, agentOpts), _define_property(this, "testRunner", void 0), _define_property(this, "pageManager", void 0);
|
|
78
|
+
this.testRunner = opts?.testRunner;
|
|
71
79
|
this.pageManager = pageManager;
|
|
72
80
|
applyForceChromeSelectRendering(initialPage, 'puppeteer', forceChromeSelectRendering);
|
|
73
81
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"puppeteer/browser-agent.mjs","sources":["../../../src/puppeteer/browser-agent.ts"],"sourcesContent":["import {\n type BrowserPageManager,\n WebAgentCore,\n resolveBrowserAgentRuntimeOptions,\n} from '@/common/browser-agent';\nimport { applyForceChromeSelectRendering } from '@/common/browser-agent-utils';\nimport {\n appendBrowserAgentPageActions,\n createBrowserAgentPageActions,\n} from '@/common/browser-page-actions';\nimport type { WebPageAgentOpt } from '@/web-element';\nimport { getDebug } from '@midscene/shared/logger';\nimport type {\n Browser as PuppeteerBrowser,\n Page as PuppeteerPage,\n Target as PuppeteerTarget,\n} from 'puppeteer';\nimport { createPuppeteerBrowserPageManager } from './browser-page-manager';\nimport type { PuppeteerBrowserPageScope } from './browser-page-manager';\nimport { PuppeteerWebPage } from './page';\n\nconst debug = getDebug('puppeteer:browser-agent');\n\nexport type PuppeteerBrowserAgentOpt = Omit<\n WebPageAgentOpt,\n 'forceSameTabNavigation'\n> & {\n autoFollowNewPage?: boolean;\n newPageTimeout?: number;\n};\n\nexport type PuppeteerBrowserAgentCreateOpt = PuppeteerBrowserAgentOpt & {\n initialPage?: PuppeteerPage;\n};\n\nexport class PuppeteerBrowserAgent extends WebAgentCore<PuppeteerWebPage> {\n protected readonly pageManager: BrowserPageManager<\n PuppeteerPage,\n PuppeteerTarget\n >;\n\n constructor(\n browser: PuppeteerBrowser,\n initialPage: PuppeteerPage,\n opts?: PuppeteerBrowserAgentOpt,\n pageScope?: PuppeteerBrowserPageScope,\n ) {\n if (!browser) {\n throw new Error(\n '[midscene] PuppeteerBrowserAgent requires a valid Puppeteer browser instance.',\n );\n }\n if (!initialPage) {\n throw new Error(\n '[midscene] PuppeteerBrowserAgent requires a valid initial page instance.',\n );\n }\n\n const { autoFollowNewPage, newPageTimeout, ...agentOpts } = opts ?? {};\n const runtimeOptions = resolveBrowserAgentRuntimeOptions({\n agentName: 'PuppeteerBrowserAgent',\n pageScope: 'browser',\n forceSameTabNavigation: (opts as WebPageAgentOpt | undefined)\n ?.forceSameTabNavigation,\n autoFollowNewPage,\n newPageTimeout,\n });\n const { forceChromeSelectRendering } = agentOpts;\n const browserActions = createBrowserAgentPageActions({\n getPageManager: () => pageManager,\n });\n const webPage: PuppeteerWebPage = new PuppeteerWebPage(initialPage, {\n ...agentOpts,\n forceSameTabNavigation: runtimeOptions.forceSameTabNavigation,\n customActions: appendBrowserAgentPageActions(\n agentOpts.customActions,\n browserActions,\n ),\n });\n const pageManager: BrowserPageManager<PuppeteerPage, PuppeteerTarget> =\n createPuppeteerBrowserPageManager({\n browser,\n webPage,\n runtimeOptions,\n debug,\n pageScope,\n });\n super(webPage, agentOpts);\n this.pageManager = pageManager;\n\n applyForceChromeSelectRendering(\n initialPage,\n 'puppeteer',\n forceChromeSelectRendering,\n );\n }\n\n static async create(\n browser: PuppeteerBrowser,\n opts?: PuppeteerBrowserAgentCreateOpt,\n ) {\n const { initialPage, ...agentOpts } = opts ?? {};\n const page =\n initialPage ?? (await browser.pages())[0] ?? (await browser.newPage());\n\n return new PuppeteerBrowserAgent(browser, page, agentOpts);\n }\n\n get activePage() {\n return this.pageManager.activePage;\n }\n\n pages() {\n return this.pageManager.pages();\n }\n\n async newPage() {\n return this.pageManager.newPage();\n }\n\n async setActivePage(page: PuppeteerPage) {\n await this.pageManager.setActivePage(page);\n }\n\n async waitForNewPage(\n action?: () => Promise<unknown> | unknown,\n opts?: { timeout?: number },\n ) {\n return this.pageManager.waitForNewPage(action, opts);\n }\n\n async destroy() {\n this.pageManager.destroy();\n await super.destroy();\n }\n}\n"],"names":["debug","getDebug","PuppeteerBrowserAgent","WebAgentCore","browser","opts","initialPage","agentOpts","page","action","pageScope","Error","autoFollowNewPage","newPageTimeout","runtimeOptions","resolveBrowserAgentRuntimeOptions","forceChromeSelectRendering","browserActions","createBrowserAgentPageActions","pageManager","webPage","PuppeteerWebPage","appendBrowserAgentPageActions","createPuppeteerBrowserPageManager","applyForceChromeSelectRendering"],"mappings":"
|
|
1
|
+
{"version":3,"file":"puppeteer/browser-agent.mjs","sources":["../../../src/puppeteer/browser-agent.ts"],"sourcesContent":["import {\n type BrowserPageManager,\n WebAgentCore,\n resolveBrowserAgentRuntimeOptions,\n} from '@/common/browser-agent';\nimport { applyForceChromeSelectRendering } from '@/common/browser-agent-utils';\nimport {\n appendBrowserAgentPageActions,\n createBrowserAgentPageActions,\n} from '@/common/browser-page-actions';\nimport type { WebPageAgentOpt } from '@/web-element';\nimport type { AgentTestRunnerNodeDefinition } from '@midscene/core/agent';\nimport { getDebug } from '@midscene/shared/logger';\nimport type {\n Browser as PuppeteerBrowser,\n Page as PuppeteerPage,\n Target as PuppeteerTarget,\n} from 'puppeteer';\nimport { createPuppeteerBrowserPageManager } from './browser-page-manager';\nimport type { PuppeteerBrowserPageScope } from './browser-page-manager';\nimport { PuppeteerWebPage } from './page';\nimport { puppeteerAgentTestRunnerNodeDefinitions } from './test-runner/agent-nodes';\nimport type { PuppeteerTestRunnerOptions } from './test-runner/types';\n\nconst debug = getDebug('puppeteer:browser-agent');\n\nexport type PuppeteerBrowserAgentOpt = Omit<\n WebPageAgentOpt,\n 'forceSameTabNavigation'\n> & {\n testRunner?: PuppeteerTestRunnerOptions;\n autoFollowNewPage?: boolean;\n newPageTimeout?: number;\n};\n\nexport type PuppeteerBrowserAgentCreateOpt = PuppeteerBrowserAgentOpt & {\n initialPage?: PuppeteerPage;\n};\n\nexport class PuppeteerBrowserAgent extends WebAgentCore<PuppeteerWebPage> {\n static override getTestRunnerNodeDefinitions(): readonly AgentTestRunnerNodeDefinition[] {\n return [\n ...WebAgentCore.getTestRunnerNodeDefinitions(),\n ...puppeteerAgentTestRunnerNodeDefinitions,\n ];\n }\n\n readonly testRunner?: PuppeteerTestRunnerOptions;\n\n protected readonly pageManager: BrowserPageManager<\n PuppeteerPage,\n PuppeteerTarget\n >;\n\n constructor(\n browser: PuppeteerBrowser,\n initialPage: PuppeteerPage,\n opts?: PuppeteerBrowserAgentOpt,\n pageScope?: PuppeteerBrowserPageScope,\n ) {\n if (!browser) {\n throw new Error(\n '[midscene] PuppeteerBrowserAgent requires a valid Puppeteer browser instance.',\n );\n }\n if (!initialPage) {\n throw new Error(\n '[midscene] PuppeteerBrowserAgent requires a valid initial page instance.',\n );\n }\n\n const { autoFollowNewPage, newPageTimeout, ...agentOpts } = opts ?? {};\n const runtimeOptions = resolveBrowserAgentRuntimeOptions({\n agentName: 'PuppeteerBrowserAgent',\n pageScope: 'browser',\n forceSameTabNavigation: (opts as WebPageAgentOpt | undefined)\n ?.forceSameTabNavigation,\n autoFollowNewPage,\n newPageTimeout,\n });\n const { forceChromeSelectRendering } = agentOpts;\n const browserActions = createBrowserAgentPageActions({\n getPageManager: () => pageManager,\n });\n const webPage: PuppeteerWebPage = new PuppeteerWebPage(initialPage, {\n ...agentOpts,\n forceSameTabNavigation: runtimeOptions.forceSameTabNavigation,\n customActions: appendBrowserAgentPageActions(\n agentOpts.customActions,\n browserActions,\n ),\n });\n const pageManager: BrowserPageManager<PuppeteerPage, PuppeteerTarget> =\n createPuppeteerBrowserPageManager({\n browser,\n webPage,\n runtimeOptions,\n debug,\n pageScope,\n });\n super(webPage, agentOpts);\n this.testRunner = opts?.testRunner;\n this.pageManager = pageManager;\n\n applyForceChromeSelectRendering(\n initialPage,\n 'puppeteer',\n forceChromeSelectRendering,\n );\n }\n\n static async create(\n browser: PuppeteerBrowser,\n opts?: PuppeteerBrowserAgentCreateOpt,\n ) {\n const { initialPage, ...agentOpts } = opts ?? {};\n const page =\n initialPage ?? (await browser.pages())[0] ?? (await browser.newPage());\n\n return new PuppeteerBrowserAgent(browser, page, agentOpts);\n }\n\n get activePage() {\n return this.pageManager.activePage;\n }\n\n pages() {\n return this.pageManager.pages();\n }\n\n async newPage() {\n return this.pageManager.newPage();\n }\n\n async setActivePage(page: PuppeteerPage) {\n await this.pageManager.setActivePage(page);\n }\n\n async waitForNewPage(\n action?: () => Promise<unknown> | unknown,\n opts?: { timeout?: number },\n ) {\n return this.pageManager.waitForNewPage(action, opts);\n }\n\n async destroy() {\n this.pageManager.destroy();\n await super.destroy();\n }\n}\n"],"names":["debug","getDebug","PuppeteerBrowserAgent","WebAgentCore","puppeteerAgentTestRunnerNodeDefinitions","browser","opts","initialPage","agentOpts","page","action","pageScope","Error","autoFollowNewPage","newPageTimeout","runtimeOptions","resolveBrowserAgentRuntimeOptions","forceChromeSelectRendering","browserActions","createBrowserAgentPageActions","pageManager","webPage","PuppeteerWebPage","appendBrowserAgentPageActions","createPuppeteerBrowserPageManager","applyForceChromeSelectRendering"],"mappings":";;;;;;;;;;;;;;;;;AAwBA,MAAMA,QAAQC,SAAS;AAehB,MAAMC,8BAA8BC;IACzC,OAAgB,+BAAyE;QACvF,OAAO;eACFA,aAAa,4BAA4B;eACzCC;SACJ;IACH;IAkEA,aAAa,OACXC,OAAyB,EACzBC,IAAqC,EACrC;QACA,MAAM,EAAEC,WAAW,EAAE,GAAGC,WAAW,GAAGF,QAAQ,CAAC;QAC/C,MAAMG,OACJF,eAAgB,OAAMF,QAAQ,KAAK,EAAC,CAAE,CAAC,EAAE,IAAK,MAAMA,QAAQ,OAAO;QAErE,OAAO,IAAIH,sBAAsBG,SAASI,MAAMD;IAClD;IAEA,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,WAAW,CAAC,UAAU;IACpC;IAEA,QAAQ;QACN,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK;IAC/B;IAEA,MAAM,UAAU;QACd,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO;IACjC;IAEA,MAAM,cAAcC,IAAmB,EAAE;QACvC,MAAM,IAAI,CAAC,WAAW,CAAC,aAAa,CAACA;IACvC;IAEA,MAAM,eACJC,MAAyC,EACzCJ,IAA2B,EAC3B;QACA,OAAO,IAAI,CAAC,WAAW,CAAC,cAAc,CAACI,QAAQJ;IACjD;IAEA,MAAM,UAAU;QACd,IAAI,CAAC,WAAW,CAAC,OAAO;QACxB,MAAM,KAAK,CAAC;IACd;IA9FA,YACED,OAAyB,EACzBE,WAA0B,EAC1BD,IAA+B,EAC/BK,SAAqC,CACrC;QACA,IAAI,CAACN,SACH,MAAM,IAAIO,MACR;QAGJ,IAAI,CAACL,aACH,MAAM,IAAIK,MACR;QAIJ,MAAM,EAAEC,iBAAiB,EAAEC,cAAc,EAAE,GAAGN,WAAW,GAAGF,QAAQ,CAAC;QACrE,MAAMS,iBAAiBC,kCAAkC;YACvD,WAAW;YACX,WAAW;YACX,wBAAyBV,MACrB;YACJO;YACAC;QACF;QACA,MAAM,EAAEG,0BAA0B,EAAE,GAAGT;QACvC,MAAMU,iBAAiBC,8BAA8B;YACnD,gBAAgB,IAAMC;QACxB;QACA,MAAMC,UAA4B,IAAIC,iBAAiBf,aAAa;YAClE,GAAGC,SAAS;YACZ,wBAAwBO,eAAe,sBAAsB;YAC7D,eAAeQ,8BACbf,UAAU,aAAa,EACvBU;QAEJ;QACA,MAAME,cACJI,kCAAkC;YAChCnB;YACAgB;YACAN;YACAf;YACAW;QACF;QACF,KAAK,CAACU,SAASb,YArDjB,uBAAS,cAAT,SAEA,uBAAmB,eAAnB;QAoDE,IAAI,CAAC,UAAU,GAAGF,MAAM;QACxB,IAAI,CAAC,WAAW,GAAGc;QAEnBK,gCACElB,aACA,aACAU;IAEJ;AAwCF"}
|
|
@@ -3,12 +3,30 @@ import { applyForceChromeSelectRendering } from "../common/browser-agent-utils.m
|
|
|
3
3
|
import { getDebug } from "@midscene/shared/logger";
|
|
4
4
|
import { forceClosePopup } from "./base-page.mjs";
|
|
5
5
|
import { PuppeteerWebPage } from "./page.mjs";
|
|
6
|
+
import { puppeteerAgentTestRunnerNodeDefinitions } from "./test-runner/agent-nodes.mjs";
|
|
7
|
+
function _define_property(obj, key, value) {
|
|
8
|
+
if (key in obj) Object.defineProperty(obj, key, {
|
|
9
|
+
value: value,
|
|
10
|
+
enumerable: true,
|
|
11
|
+
configurable: true,
|
|
12
|
+
writable: true
|
|
13
|
+
});
|
|
14
|
+
else obj[key] = value;
|
|
15
|
+
return obj;
|
|
16
|
+
}
|
|
6
17
|
const debug = getDebug('puppeteer:agent');
|
|
7
18
|
class PuppeteerPageAgent extends WebAgentCore {
|
|
19
|
+
static getTestRunnerNodeDefinitions() {
|
|
20
|
+
return [
|
|
21
|
+
...WebAgentCore.getTestRunnerNodeDefinitions(),
|
|
22
|
+
...puppeteerAgentTestRunnerNodeDefinitions
|
|
23
|
+
];
|
|
24
|
+
}
|
|
8
25
|
constructor(page, opts){
|
|
9
26
|
if (!page) throw new Error('[midscene] PuppeteerPageAgent requires a valid Puppeteer page instance. Please make sure to pass a valid page object.');
|
|
10
27
|
const webPage = new PuppeteerWebPage(page, opts);
|
|
11
|
-
super(webPage, opts);
|
|
28
|
+
super(webPage, opts), _define_property(this, "testRunner", void 0);
|
|
29
|
+
this.testRunner = opts?.testRunner;
|
|
12
30
|
const { forceSameTabNavigation, forceChromeSelectRendering } = opts ?? {};
|
|
13
31
|
const runtimeOptions = resolveBrowserAgentRuntimeOptions({
|
|
14
32
|
agentName: 'PuppeteerPageAgent',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"puppeteer/page-agent.mjs","sources":["../../../src/puppeteer/page-agent.ts"],"sourcesContent":["import {\n WebAgentCore,\n resolveBrowserAgentRuntimeOptions,\n} from '@/common/browser-agent';\nimport { applyForceChromeSelectRendering } from '@/common/browser-agent-utils';\nimport type { WebPageAgentOpt } from '@/web-element';\nimport { getDebug } from '@midscene/shared/logger';\nimport type { Page as PuppeteerPage } from 'puppeteer';\nimport { forceClosePopup } from './base-page';\nimport { PuppeteerWebPage } from './page';\n\nconst debug = getDebug('puppeteer:agent');\n\nexport class PuppeteerPageAgent extends WebAgentCore<PuppeteerWebPage> {\n constructor(page: PuppeteerPage, opts?:
|
|
1
|
+
{"version":3,"file":"puppeteer/page-agent.mjs","sources":["../../../src/puppeteer/page-agent.ts"],"sourcesContent":["import {\n WebAgentCore,\n resolveBrowserAgentRuntimeOptions,\n} from '@/common/browser-agent';\nimport { applyForceChromeSelectRendering } from '@/common/browser-agent-utils';\nimport type { WebPageAgentOpt } from '@/web-element';\nimport type { AgentTestRunnerNodeDefinition } from '@midscene/core/agent';\nimport { getDebug } from '@midscene/shared/logger';\nimport type { Page as PuppeteerPage } from 'puppeteer';\nimport { forceClosePopup } from './base-page';\nimport { PuppeteerWebPage } from './page';\nimport { puppeteerAgentTestRunnerNodeDefinitions } from './test-runner/agent-nodes';\nimport type { PuppeteerTestRunnerOptions } from './test-runner/types';\n\nconst debug = getDebug('puppeteer:agent');\n\nexport type PuppeteerPageAgentOpt = WebPageAgentOpt & {\n testRunner?: PuppeteerTestRunnerOptions;\n};\n\nexport class PuppeteerPageAgent extends WebAgentCore<PuppeteerWebPage> {\n static override getTestRunnerNodeDefinitions(): readonly AgentTestRunnerNodeDefinition[] {\n return [\n ...WebAgentCore.getTestRunnerNodeDefinitions(),\n ...puppeteerAgentTestRunnerNodeDefinitions,\n ];\n }\n\n readonly testRunner?: PuppeteerTestRunnerOptions;\n\n constructor(page: PuppeteerPage, opts?: PuppeteerPageAgentOpt) {\n if (!page) {\n throw new Error(\n '[midscene] PuppeteerPageAgent requires a valid Puppeteer page instance. Please make sure to pass a valid page object.',\n );\n }\n const webPage = new PuppeteerWebPage(page, opts);\n super(webPage, opts);\n this.testRunner = opts?.testRunner;\n\n const { forceSameTabNavigation, forceChromeSelectRendering } = opts ?? {};\n const runtimeOptions = resolveBrowserAgentRuntimeOptions({\n agentName: 'PuppeteerPageAgent',\n pageScope: 'page',\n forceSameTabNavigation,\n });\n\n if (runtimeOptions.forceSameTabNavigation) {\n forceClosePopup(page, debug);\n }\n\n applyForceChromeSelectRendering(\n page,\n 'puppeteer',\n forceChromeSelectRendering,\n );\n }\n}\n\nexport { PuppeteerPageAgent as PuppeteerAgent };\n"],"names":["debug","getDebug","PuppeteerPageAgent","WebAgentCore","puppeteerAgentTestRunnerNodeDefinitions","page","opts","Error","webPage","PuppeteerWebPage","forceSameTabNavigation","forceChromeSelectRendering","runtimeOptions","resolveBrowserAgentRuntimeOptions","forceClosePopup","applyForceChromeSelectRendering"],"mappings":";;;;;;;;;;;;;;;;AAcA,MAAMA,QAAQC,SAAS;AAMhB,MAAMC,2BAA2BC;IACtC,OAAgB,+BAAyE;QACvF,OAAO;eACFA,aAAa,4BAA4B;eACzCC;SACJ;IACH;IAIA,YAAYC,IAAmB,EAAEC,IAA4B,CAAE;QAC7D,IAAI,CAACD,MACH,MAAM,IAAIE,MACR;QAGJ,MAAMC,UAAU,IAAIC,iBAAiBJ,MAAMC;QAC3C,KAAK,CAACE,SAASF,OATjB,uBAAS,cAAT;QAUE,IAAI,CAAC,UAAU,GAAGA,MAAM;QAExB,MAAM,EAAEI,sBAAsB,EAAEC,0BAA0B,EAAE,GAAGL,QAAQ,CAAC;QACxE,MAAMM,iBAAiBC,kCAAkC;YACvD,WAAW;YACX,WAAW;YACXH;QACF;QAEA,IAAIE,eAAe,sBAAsB,EACvCE,gBAAgBT,MAAML;QAGxBe,gCACEV,MACA,aACAM;IAEJ;AACF"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { createWebTestRunnerNodeDefinitions } from "../../common/test-runner/nodes.mjs";
|
|
2
|
+
import { puppeteerTestDriverAdapter } from "./driver.mjs";
|
|
3
|
+
const puppeteerAgentTestRunnerNodeDefinitions = createWebTestRunnerNodeDefinitions(puppeteerTestDriverAdapter);
|
|
4
|
+
export { puppeteerAgentTestRunnerNodeDefinitions };
|
|
5
|
+
|
|
6
|
+
//# sourceMappingURL=agent-nodes.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"puppeteer/test-runner/agent-nodes.mjs","sources":["../../../../src/puppeteer/test-runner/agent-nodes.ts"],"sourcesContent":["import { createWebTestRunnerNodeDefinitions } from '@/common/test-runner/nodes';\nimport { puppeteerTestDriverAdapter } from './driver';\n\nexport const puppeteerAgentTestRunnerNodeDefinitions =\n createWebTestRunnerNodeDefinitions(puppeteerTestDriverAdapter);\n"],"names":["puppeteerAgentTestRunnerNodeDefinitions","createWebTestRunnerNodeDefinitions","puppeteerTestDriverAdapter"],"mappings":";;AAGO,MAAMA,0CACXC,mCAAmCC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { requirePuppeteerAgent } from "./utils.mjs";
|
|
2
|
+
const createPuppeteerDriver = (agent)=>{
|
|
3
|
+
const page = agent.interface.underlyingPage;
|
|
4
|
+
return {
|
|
5
|
+
currentUrl: ()=>page.url(),
|
|
6
|
+
baseUrl: ()=>void 0,
|
|
7
|
+
async goto (url, options) {
|
|
8
|
+
if ('commit' === options.waitUntil) throw new TypeError('Puppeteer does not support gotoUrl.waitUntil=commit; use domcontentloaded instead.');
|
|
9
|
+
const response = await page.goto(url, {
|
|
10
|
+
waitUntil: 'networkidle' === options.waitUntil ? 'networkidle0' : options.waitUntil,
|
|
11
|
+
timeout: options.timeoutMs
|
|
12
|
+
});
|
|
13
|
+
return {
|
|
14
|
+
status: response?.status() ?? null
|
|
15
|
+
};
|
|
16
|
+
},
|
|
17
|
+
title: ()=>page.title(),
|
|
18
|
+
setCookies: async (cookies)=>{
|
|
19
|
+
await page.setCookie(...cookies.map((cookie)=>cookie));
|
|
20
|
+
},
|
|
21
|
+
clearCookies: async (filters)=>{
|
|
22
|
+
const browserContext = page.browserContext();
|
|
23
|
+
const matches = (cookie)=>(void 0 === filters.name || cookie.name === filters.name) && (void 0 === filters.domain || cookie.domain === filters.domain) && (void 0 === filters.path || cookie.path === filters.path);
|
|
24
|
+
if ('function' == typeof browserContext.cookies && 'function' == typeof browserContext.deleteCookie) {
|
|
25
|
+
const cookies = (await browserContext.cookies()).filter(matches);
|
|
26
|
+
if (cookies.length > 0) await browserContext.deleteCookie(...cookies);
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const session = await page.target().createCDPSession();
|
|
30
|
+
try {
|
|
31
|
+
const { cookies } = await session.send('Network.getAllCookies');
|
|
32
|
+
for (const cookie of cookies.filter(matches))await session.send('Network.deleteCookies', {
|
|
33
|
+
name: cookie.name,
|
|
34
|
+
domain: cookie.domain,
|
|
35
|
+
path: cookie.path,
|
|
36
|
+
...cookie.partitionKey ? {
|
|
37
|
+
partitionKey: cookie.partitionKey
|
|
38
|
+
} : {}
|
|
39
|
+
});
|
|
40
|
+
} finally{
|
|
41
|
+
await session.detach();
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
setViewportSize: async (size)=>{
|
|
45
|
+
await page.setViewport(size);
|
|
46
|
+
const viewport = page.viewport();
|
|
47
|
+
if (!viewport) throw new Error('Puppeteer did not report an effective viewport size.');
|
|
48
|
+
return {
|
|
49
|
+
width: viewport.width,
|
|
50
|
+
height: viewport.height
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
};
|
|
55
|
+
const puppeteerTestDriverAdapter = {
|
|
56
|
+
requireAgent: requirePuppeteerAgent,
|
|
57
|
+
createDriver: createPuppeteerDriver,
|
|
58
|
+
getOptions: (agent)=>agent.testRunner
|
|
59
|
+
};
|
|
60
|
+
export { puppeteerTestDriverAdapter };
|
|
61
|
+
|
|
62
|
+
//# sourceMappingURL=driver.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"puppeteer/test-runner/driver.mjs","sources":["../../../../src/puppeteer/test-runner/driver.ts"],"sourcesContent":["import type {\n WebTestDriver,\n WebTestDriverAdapter,\n} from '@/common/test-runner/driver';\nimport type { CookieParam } from 'puppeteer';\nimport type {\n PuppeteerTestRunnerAgent,\n PuppeteerTestRunnerOptions,\n} from './types';\nimport { requirePuppeteerAgent } from './utils';\n\nconst createPuppeteerDriver = (\n agent: PuppeteerTestRunnerAgent,\n): WebTestDriver => {\n const page = agent.interface.underlyingPage;\n return {\n currentUrl: () => page.url(),\n baseUrl: () => undefined,\n async goto(url, options) {\n if (options.waitUntil === 'commit') {\n throw new TypeError(\n 'Puppeteer does not support gotoUrl.waitUntil=commit; use domcontentloaded instead.',\n );\n }\n const response = await page.goto(url, {\n waitUntil:\n options.waitUntil === 'networkidle'\n ? 'networkidle0'\n : options.waitUntil,\n timeout: options.timeoutMs,\n });\n return { status: response?.status() ?? null };\n },\n title: () => page.title(),\n setCookies: async (cookies) => {\n await page.setCookie(\n ...cookies.map((cookie) => cookie as unknown as CookieParam),\n );\n },\n clearCookies: async (filters) => {\n const browserContext = page.browserContext();\n const matches = (cookie: {\n name: string;\n domain: string;\n path: string;\n }) =>\n (filters.name === undefined || cookie.name === filters.name) &&\n (filters.domain === undefined || cookie.domain === filters.domain) &&\n (filters.path === undefined || cookie.path === filters.path);\n if (\n typeof browserContext.cookies === 'function' &&\n typeof browserContext.deleteCookie === 'function'\n ) {\n const cookies = (await browserContext.cookies()).filter(matches);\n if (cookies.length > 0) await browserContext.deleteCookie(...cookies);\n return;\n }\n\n // Puppeteer <23.10 lacks context cookie APIs. A page-target CDP session\n // reads all cookies in that context, including origins not open in a tab.\n const session = await page.target().createCDPSession();\n try {\n const { cookies } = await session.send('Network.getAllCookies');\n for (const cookie of cookies.filter(matches)) {\n await session.send('Network.deleteCookies', {\n name: cookie.name,\n domain: cookie.domain,\n path: cookie.path,\n ...(cookie.partitionKey\n ? { partitionKey: cookie.partitionKey }\n : {}),\n });\n }\n } finally {\n await session.detach();\n }\n },\n setViewportSize: async (size) => {\n await page.setViewport(size);\n const viewport = page.viewport();\n if (!viewport) {\n throw new Error('Puppeteer did not report an effective viewport size.');\n }\n return { width: viewport.width, height: viewport.height };\n },\n };\n};\n\nexport const puppeteerTestDriverAdapter: WebTestDriverAdapter<\n PuppeteerTestRunnerAgent,\n PuppeteerTestRunnerOptions\n> = {\n requireAgent: requirePuppeteerAgent,\n createDriver: createPuppeteerDriver,\n getOptions: (agent) => agent.testRunner,\n};\n"],"names":["createPuppeteerDriver","agent","page","undefined","url","options","TypeError","response","cookies","cookie","filters","browserContext","matches","session","size","viewport","Error","puppeteerTestDriverAdapter","requirePuppeteerAgent"],"mappings":";AAWA,MAAMA,wBAAwB,CAC5BC;IAEA,MAAMC,OAAOD,MAAM,SAAS,CAAC,cAAc;IAC3C,OAAO;QACL,YAAY,IAAMC,KAAK,GAAG;QAC1B,SAAS,IAAMC;QACf,MAAM,MAAKC,GAAG,EAAEC,OAAO;YACrB,IAAIA,AAAsB,aAAtBA,QAAQ,SAAS,EACnB,MAAM,IAAIC,UACR;YAGJ,MAAMC,WAAW,MAAML,KAAK,IAAI,CAACE,KAAK;gBACpC,WACEC,AAAsB,kBAAtBA,QAAQ,SAAS,GACb,iBACAA,QAAQ,SAAS;gBACvB,SAASA,QAAQ,SAAS;YAC5B;YACA,OAAO;gBAAE,QAAQE,UAAU,YAAY;YAAK;QAC9C;QACA,OAAO,IAAML,KAAK,KAAK;QACvB,YAAY,OAAOM;YACjB,MAAMN,KAAK,SAAS,IACfM,QAAQ,GAAG,CAAC,CAACC,SAAWA;QAE/B;QACA,cAAc,OAAOC;YACnB,MAAMC,iBAAiBT,KAAK,cAAc;YAC1C,MAAMU,UAAU,CAACH,SAKdC,AAAAA,CAAAA,AAAiBP,WAAjBO,QAAQ,IAAI,IAAkBD,OAAO,IAAI,KAAKC,QAAQ,IAAG,KACzDA,CAAAA,AAAmBP,WAAnBO,QAAQ,MAAM,IAAkBD,OAAO,MAAM,KAAKC,QAAQ,MAAK,KAC/DA,CAAAA,AAAiBP,WAAjBO,QAAQ,IAAI,IAAkBD,OAAO,IAAI,KAAKC,QAAQ,IAAG;YAC5D,IACE,AAAkC,cAAlC,OAAOC,eAAe,OAAO,IAC7B,AAAuC,cAAvC,OAAOA,eAAe,YAAY,EAClC;gBACA,MAAMH,UAAW,OAAMG,eAAe,OAAO,EAAC,EAAG,MAAM,CAACC;gBACxD,IAAIJ,QAAQ,MAAM,GAAG,GAAG,MAAMG,eAAe,YAAY,IAAIH;gBAC7D;YACF;YAIA,MAAMK,UAAU,MAAMX,KAAK,MAAM,GAAG,gBAAgB;YACpD,IAAI;gBACF,MAAM,EAAEM,OAAO,EAAE,GAAG,MAAMK,QAAQ,IAAI,CAAC;gBACvC,KAAK,MAAMJ,UAAUD,QAAQ,MAAM,CAACI,SAClC,MAAMC,QAAQ,IAAI,CAAC,yBAAyB;oBAC1C,MAAMJ,OAAO,IAAI;oBACjB,QAAQA,OAAO,MAAM;oBACrB,MAAMA,OAAO,IAAI;oBACjB,GAAIA,OAAO,YAAY,GACnB;wBAAE,cAAcA,OAAO,YAAY;oBAAC,IACpC,CAAC,CAAC;gBACR;YAEJ,SAAU;gBACR,MAAMI,QAAQ,MAAM;YACtB;QACF;QACA,iBAAiB,OAAOC;YACtB,MAAMZ,KAAK,WAAW,CAACY;YACvB,MAAMC,WAAWb,KAAK,QAAQ;YAC9B,IAAI,CAACa,UACH,MAAM,IAAIC,MAAM;YAElB,OAAO;gBAAE,OAAOD,SAAS,KAAK;gBAAE,QAAQA,SAAS,MAAM;YAAC;QAC1D;IACF;AACF;AAEO,MAAME,6BAGT;IACF,cAAcC;IACd,cAAclB;IACd,YAAY,CAACC,QAAUA,MAAM,UAAU;AACzC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { clearCookiesInputSchema, gotoUrlInputSchema, setCookiesInputSchema, setViewportSizeInputSchema } from "../../common/test-runner/nodes.mjs";
|
|
2
|
+
import { puppeteerAgentTestRunnerNodeDefinitions } from "./agent-nodes.mjs";
|
|
3
|
+
export { clearCookiesInputSchema, gotoUrlInputSchema, puppeteerAgentTestRunnerNodeDefinitions, setCookiesInputSchema, setViewportSizeInputSchema };
|
|
File without changes
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { resolveWebUrl, throwIfAborted } from "../../common/test-runner/utils.mjs";
|
|
2
|
+
const requirePuppeteerAgent = (agent)=>{
|
|
3
|
+
if (!agent || 'object' != typeof agent || !('interface' in agent) || !agent.interface || 'object' != typeof agent.interface || !('underlyingPage' in agent.interface) || !agent.interface.underlyingPage) throw new TypeError('getAgent() must return a Puppeteer Agent with an underlying Page.');
|
|
4
|
+
return agent;
|
|
5
|
+
};
|
|
6
|
+
export { requirePuppeteerAgent, resolveWebUrl, throwIfAborted };
|
|
7
|
+
|
|
8
|
+
//# sourceMappingURL=utils.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"puppeteer/test-runner/utils.mjs","sources":["../../../../src/puppeteer/test-runner/utils.ts"],"sourcesContent":["import type { PuppeteerTestRunnerAgent } from './types';\n\nexport { resolveWebUrl, throwIfAborted } from '../../common/test-runner/utils';\n\nexport const requirePuppeteerAgent = (\n agent: unknown,\n): PuppeteerTestRunnerAgent => {\n if (\n !agent ||\n typeof agent !== 'object' ||\n !('interface' in agent) ||\n !agent.interface ||\n typeof agent.interface !== 'object' ||\n !('underlyingPage' in agent.interface) ||\n !agent.interface.underlyingPage\n ) {\n throw new TypeError(\n 'getAgent() must return a Puppeteer Agent with an underlying Page.',\n );\n }\n return agent as PuppeteerTestRunnerAgent;\n};\n"],"names":["requirePuppeteerAgent","agent","TypeError"],"mappings":";AAIO,MAAMA,wBAAwB,CACnCC;IAEA,IACE,CAACA,SACD,AAAiB,YAAjB,OAAOA,SACP,CAAE,gBAAeA,KAAI,KACrB,CAACA,MAAM,SAAS,IAChB,AAA2B,YAA3B,OAAOA,MAAM,SAAS,IACtB,CAAE,qBAAoBA,MAAM,SAAQ,KACpC,CAACA,MAAM,SAAS,CAAC,cAAc,EAE/B,MAAM,IAAIC,UACR;IAGJ,OAAOD;AACT"}
|
|
@@ -343,7 +343,7 @@ class WebPuppeteerMidsceneTools extends base_tools_namespaceObject.BaseMidsceneT
|
|
|
343
343
|
let page;
|
|
344
344
|
if (navigateToUrl) {
|
|
345
345
|
page = await browser.newPage();
|
|
346
|
-
if (this.viewport) await
|
|
346
|
+
if (this.viewport) await this.resizePersistentViewport(page);
|
|
347
347
|
await page.goto(navigateToUrl, {
|
|
348
348
|
timeout: 30000,
|
|
349
349
|
waitUntil: 'domcontentloaded'
|
|
@@ -354,7 +354,7 @@ class WebPuppeteerMidsceneTools extends base_tools_namespaceObject.BaseMidsceneT
|
|
|
354
354
|
const webPages = pages.filter((p)=>/^https?:\/\//.test(p.url()));
|
|
355
355
|
page = matchedPage ?? (webPages.length > 0 ? webPages[webPages.length - 1] : pages[pages.length - 1] || await browser.newPage());
|
|
356
356
|
if (reused) await page.bringToFront();
|
|
357
|
-
if (this.viewport) await
|
|
357
|
+
if (this.viewport) await this.resizePersistentViewport(page);
|
|
358
358
|
}
|
|
359
359
|
const targetId = getTargetId(page);
|
|
360
360
|
if (!targetId) throw new Error('Failed to persist Puppeteer page session because Puppeteer did not expose a Chrome targetId.');
|
|
@@ -367,6 +367,30 @@ class WebPuppeteerMidsceneTools extends base_tools_namespaceObject.BaseMidsceneT
|
|
|
367
367
|
this.lastInitArgsSignature = nextSignature;
|
|
368
368
|
return this.agent;
|
|
369
369
|
}
|
|
370
|
+
async resizePersistentViewport(page) {
|
|
371
|
+
const viewport = this.viewport;
|
|
372
|
+
if (!viewport) return;
|
|
373
|
+
await page.setViewport(null);
|
|
374
|
+
const client = await page.createCDPSession();
|
|
375
|
+
try {
|
|
376
|
+
const { windowId, bounds } = await client.send('Browser.getWindowForTarget');
|
|
377
|
+
const content = await page.evaluate('({ width: window.innerWidth, height: window.innerHeight })');
|
|
378
|
+
if (void 0 === bounds.width || void 0 === bounds.height) throw new Error('Chrome did not return window dimensions');
|
|
379
|
+
await client.send('Browser.setWindowBounds', {
|
|
380
|
+
windowId,
|
|
381
|
+
bounds: {
|
|
382
|
+
width: bounds.width + viewport.width - content.width,
|
|
383
|
+
height: bounds.height + viewport.height - content.height
|
|
384
|
+
}
|
|
385
|
+
});
|
|
386
|
+
await page.waitForFunction(`window.innerWidth === ${JSON.stringify(viewport.width)} && window.innerHeight === ${JSON.stringify(viewport.height)}`, {
|
|
387
|
+
timeout: 10000
|
|
388
|
+
});
|
|
389
|
+
} finally{
|
|
390
|
+
await client.detach();
|
|
391
|
+
}
|
|
392
|
+
await page.setViewport(viewport);
|
|
393
|
+
}
|
|
370
394
|
async destroy() {
|
|
371
395
|
await super.destroy();
|
|
372
396
|
this.browserManager.disconnect();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-tools-puppeteer.js","sources":["webpack/runtime/compat_get_default_export","webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../src/agent-tools-puppeteer.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 { type ChildProcess, spawn } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport { mkdir, open, readFile, unlink, writeFile } from 'node:fs/promises';\nimport { tmpdir } from 'node:os';\nimport { join } from 'node:path';\nimport { ScreenshotItem } from '@midscene/core';\nimport {\n extractAgentBehaviorInitArgs,\n getAgentInitArgsSignature,\n shouldRebuildAgentForInitArgs,\n} from '@midscene/shared/agent-tools/agent-behavior-init-args';\nimport {\n BaseMidsceneTools,\n type InitArgSpec,\n} from '@midscene/shared/agent-tools/base-tools';\nimport { resolveChromePath } from '@midscene/shared/agent-tools/chrome-path';\nimport type { ToolDefinition } from '@midscene/shared/agent-tools/types';\nimport { getDebug } from '@midscene/shared/logger';\nimport type { Page as PuppeteerPage } from 'puppeteer';\nimport puppeteer from 'puppeteer-core';\nimport type { Browser, Page } from 'puppeteer-core';\nimport {\n type WebAgentInitArgs,\n adaptWebAgentInitArgs,\n webAgentInitArgShape,\n} from './agent-init-args';\nimport {\n type ViewportSize,\n defaultPuppeteerWindowViewportSize,\n defaultStaticPageViewportSize,\n} from './common/viewport';\nimport { PuppeteerAgent } from './puppeteer';\nimport { StaticPage } from './static';\n\nconst ENDPOINT_FILE = join(tmpdir(), 'midscene-puppeteer-endpoint');\nconst USER_DATA_DIR = join(tmpdir(), 'midscene-puppeteer-profile');\nconst TARGET_ID_FILE = join(tmpdir(), 'midscene-puppeteer-target-id');\nconst DETACHED_CHROME_LAUNCH_TIMEOUT_MS = 30_000;\nconst DETACHED_CHROME_ENDPOINT_POLL_INTERVAL_MS = 25;\nconst debug = getDebug('agent-tools:puppeteer');\n\nexport const PUPPETEER_ENDPOINT_FILE = ENDPOINT_FILE;\n\nexport interface PuppeteerPersistenceOptions {\n endpointFile?: string;\n userDataDir?: string;\n targetIdFile?: string;\n}\n\nexport interface WebPuppeteerMidsceneToolsOptions {\n persistence?: PuppeteerPersistenceOptions;\n}\n\nexport function buildDetachedChromeArgs(options: {\n userDataDir: string;\n viewport?: ViewportSize;\n}): string[] {\n const viewport = options.viewport ?? defaultPuppeteerWindowViewportSize;\n\n return [\n '--headless=new',\n `--user-data-dir=${options.userDataDir}`,\n '--remote-debugging-port=0',\n '--no-first-run',\n '--no-default-browser-check',\n '--disable-extensions',\n '--disable-default-apps',\n '--disable-sync',\n '--disable-background-networking',\n '--password-store=basic',\n '--use-mock-keychain',\n `--window-size=${viewport.width},${viewport.height}`,\n '--force-color-profile=srgb',\n ];\n}\n\nfunction terminateDetachedChrome(proc: ChildProcess): void {\n if (proc.killed || proc.exitCode !== null || proc.signalCode !== null) {\n return;\n }\n\n if (process.platform !== 'win32' && proc.pid) {\n try {\n process.kill(-proc.pid, 'SIGKILL');\n return;\n } catch {}\n }\n\n try {\n proc.kill('SIGKILL');\n } catch {}\n}\n\nfunction getTargetId(page: Page): string | undefined {\n return (page.target() as unknown as { _targetId?: string })._targetId;\n}\n\nexport function waitForDetachedChromeEndpoint(\n proc: ChildProcess,\n stderrFile: string,\n timeoutMs = DETACHED_CHROME_LAUNCH_TIMEOUT_MS,\n): Promise<string> {\n return new Promise<string>((resolve, reject) => {\n let output = '';\n let settled = false;\n let exited = false;\n let pollTimer: NodeJS.Timeout | undefined;\n const cleanup = () => {\n clearTimeout(timeout);\n if (pollTimer) {\n clearTimeout(pollTimer);\n }\n proc.removeListener('exit', onExit);\n proc.removeListener('error', onError);\n };\n const resolveOnce = (value: string) => {\n if (settled) return;\n settled = true;\n cleanup();\n resolve(value);\n };\n const rejectOnce = (error: Error, terminate = false) => {\n if (settled) return;\n settled = true;\n if (terminate) {\n terminateDetachedChrome(proc);\n }\n cleanup();\n reject(error);\n };\n const onExit = (code: number | null, signal: NodeJS.Signals | null) => {\n exited = true;\n void readFile(stderrFile, 'utf-8')\n .catch(() => output)\n .then((latestOutput) => {\n output = latestOutput;\n rejectOnce(\n new Error(\n `Chrome exited with code ${code ?? signal} before DevTools was ready.\\nChrome stderr: ${output}\\nTip: if running in a container, launch Chrome with sandbox-compatible arguments.`,\n ),\n );\n });\n };\n const onError = (error: Error) => {\n rejectOnce(\n new Error(`Failed to launch Chrome. Stderr log: \"${stderrFile}\".`, {\n cause: error,\n }),\n true,\n );\n };\n const pollForEndpoint = async (): Promise<void> => {\n if (settled || exited) return;\n try {\n output = await readFile(stderrFile, 'utf-8');\n } catch (error) {\n rejectOnce(\n new Error(`Failed to read Chrome stderr log \"${stderrFile}\".`, {\n cause: error,\n }),\n true,\n );\n return;\n }\n\n if (settled || exited) return;\n const match = output.match(/DevTools listening on (ws:\\/\\/[^\\s]+)/);\n if (match) {\n resolveOnce(match[1]);\n return;\n }\n pollTimer = setTimeout(\n () => void pollForEndpoint(),\n DETACHED_CHROME_ENDPOINT_POLL_INTERVAL_MS,\n );\n };\n const timeout = setTimeout(\n () =>\n rejectOnce(\n new Error(\n `Chrome launch timeout.\\nChrome stderr: ${output}\\nTip: if running in a container, launch Chrome with sandbox-compatible arguments.`,\n ),\n true,\n ),\n timeoutMs,\n );\n\n proc.on('exit', onExit);\n proc.on('error', onError);\n void pollForEndpoint();\n });\n}\n\n/**\n * Persistent Puppeteer browser manager.\n * Launches a detached Chrome and persists the WS endpoint across CLI calls.\n */\nclass PuppeteerBrowserManager {\n activeBrowser: Browser | null = null;\n\n constructor(private readonly persistence: PuppeteerPersistenceOptions = {}) {}\n\n private get endpointFile() {\n return this.persistence.endpointFile || ENDPOINT_FILE;\n }\n\n private get userDataDir() {\n return this.persistence.userDataDir || USER_DATA_DIR;\n }\n\n private get targetIdFile() {\n return this.persistence.targetIdFile || TARGET_ID_FILE;\n }\n\n private get chromeStderrFile() {\n return join(this.userDataDir, 'chrome-stderr.log');\n }\n\n async readSavedTargetId(): Promise<string | null> {\n let content: string;\n try {\n content = await readFile(this.targetIdFile, 'utf-8');\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return null;\n throw new Error(\n `Failed to read Puppeteer targetId from \"${this.targetIdFile}\".`,\n { cause: error },\n );\n }\n\n const targetId = content.trim();\n if (!targetId) {\n throw new Error(\n `Puppeteer targetId file \"${this.targetIdFile}\" is empty.`,\n );\n }\n return targetId;\n }\n\n async saveTargetId(targetId: string): Promise<void> {\n try {\n await writeFile(this.targetIdFile, targetId, 'utf-8');\n debug('Saved Puppeteer targetId: %s', targetId);\n } catch (error) {\n throw new Error(\n `Failed to save Puppeteer targetId to \"${this.targetIdFile}\".`,\n { cause: error },\n );\n }\n }\n\n async cleanupTargetIdFile(): Promise<void> {\n try {\n await unlink(this.targetIdFile);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return;\n throw new Error(\n `Failed to remove Puppeteer targetId file \"${this.targetIdFile}\".`,\n { cause: error },\n );\n }\n }\n\n async cleanupChromeStderrFile(): Promise<void> {\n try {\n await unlink(this.chromeStderrFile);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n debug('Failed to clean Chrome stderr log: %s', error);\n }\n }\n }\n\n async getOrLaunch(\n viewport?: ViewportSize,\n ): Promise<{ browser: Browser; reused: boolean }> {\n const endpointFile = this.endpointFile;\n if (existsSync(endpointFile)) {\n try {\n const endpoint = (await readFile(endpointFile, 'utf-8')).trim();\n const browser = await puppeteer.connect({\n browserWSEndpoint: endpoint,\n defaultViewport: null,\n });\n return { browser, reused: true };\n } catch (error) {\n debug('Failed to reuse persisted Puppeteer endpoint: %s', error);\n try {\n await unlink(endpointFile);\n } catch {}\n await this.cleanupTargetIdFile();\n }\n }\n\n await this.cleanupTargetIdFile();\n const wsEndpoint = await this.launchDetachedChrome(viewport);\n await writeFile(endpointFile, wsEndpoint);\n\n const browser = await puppeteer.connect({\n browserWSEndpoint: wsEndpoint,\n defaultViewport: null,\n });\n return { browser, reused: false };\n }\n\n async closeBrowser(): Promise<void> {\n const endpointFile = this.endpointFile;\n if (existsSync(endpointFile)) {\n try {\n const endpoint = (await readFile(endpointFile, 'utf-8')).trim();\n const browser = await puppeteer.connect({\n browserWSEndpoint: endpoint,\n });\n await browser.close();\n } catch (error) {\n debug('Failed to close persisted Puppeteer browser: %s', error);\n }\n }\n try {\n if (existsSync(endpointFile)) {\n await unlink(endpointFile);\n }\n } catch {}\n await this.cleanupTargetIdFile();\n await this.cleanupChromeStderrFile();\n }\n\n disconnect(): void {\n if (this.activeBrowser) {\n this.activeBrowser.disconnect();\n this.activeBrowser = null;\n }\n }\n\n async launchDetachedChrome(viewport?: ViewportSize): Promise<string> {\n const chromePath = resolveChromePath();\n const userDataDir = this.userDataDir;\n\n await mkdir(userDataDir, { recursive: true });\n\n const args = buildDetachedChromeArgs({\n userDataDir,\n viewport,\n });\n\n const stderrFile = this.chromeStderrFile;\n const stderrHandle = await open(stderrFile, 'w');\n let proc: ChildProcess;\n try {\n proc = spawn(chromePath, args, {\n detached: true,\n stdio: ['ignore', 'ignore', stderrHandle.fd],\n });\n } catch (error) {\n await stderrHandle.close();\n throw error;\n }\n const endpointPromise = waitForDetachedChromeEndpoint(proc, stderrFile);\n proc.unref();\n try {\n await stderrHandle.close();\n } catch (error) {\n terminateDetachedChrome(proc);\n await endpointPromise.catch(() => undefined);\n throw new Error(`Failed to close Chrome stderr log \"${stderrFile}\".`, {\n cause: error,\n });\n }\n\n return endpointPromise;\n }\n}\n\nconst defaultBrowserManager = new PuppeteerBrowserManager();\n\n/**\n * Tools manager for Web Puppeteer mode.\n * Uses a persistent headless Chrome browser that survives across CLI calls.\n */\nexport class WebPuppeteerMidsceneTools extends BaseMidsceneTools<\n PuppeteerAgent,\n WebAgentInitArgs\n> {\n private readonly viewport?: ViewportSize;\n private readonly browserManager: PuppeteerBrowserManager;\n private lastInitArgsSignature?: string;\n\n constructor(\n viewport?: ViewportSize,\n options: WebPuppeteerMidsceneToolsOptions = {},\n ) {\n super();\n this.viewport = viewport ? { ...viewport } : undefined;\n this.browserManager = options.persistence\n ? new PuppeteerBrowserManager(options.persistence)\n : defaultBrowserManager;\n }\n\n protected getCliReportSessionName() {\n return 'midscene-web';\n }\n\n protected readonly initArgSpec: InitArgSpec<WebAgentInitArgs> = {\n namespace: 'web',\n shape: webAgentInitArgShape,\n cli: {\n preferBareKeys: true,\n },\n adapt: adaptWebAgentInitArgs,\n };\n\n protected createTemporaryDevice() {\n return new StaticPage({\n screenshot: ScreenshotItem.create('', Date.now()),\n shotSize: this.viewport ?? defaultStaticPageViewportSize,\n shrunkShotToLogicalRatio: 1,\n });\n }\n\n protected async ensureAgent(\n initArgs?: WebAgentInitArgs,\n ): Promise<PuppeteerAgent> {\n const navigateToUrl = initArgs?.url;\n const nextSignature = getAgentInitArgsSignature(initArgs);\n const shouldOpenUrl = typeof navigateToUrl === 'string';\n\n if (\n this.agent &&\n (shouldOpenUrl ||\n shouldRebuildAgentForInitArgs(\n this.lastInitArgsSignature,\n nextSignature,\n ))\n ) {\n try {\n await this.agent?.destroy?.();\n } catch {}\n this.agent = undefined;\n }\n\n if (this.agent) return this.agent;\n\n const { browser, reused } = await this.browserManager.getOrLaunch(\n this.viewport,\n );\n this.browserManager.activeBrowser = browser;\n\n const pages = await browser.pages();\n let page: Page;\n\n if (navigateToUrl) {\n page = await browser.newPage();\n if (this.viewport) {\n await page.setViewport(this.viewport);\n }\n await page.goto(navigateToUrl, {\n timeout: 30000,\n waitUntil: 'domcontentloaded',\n });\n } else {\n const savedTargetId = await this.browserManager.readSavedTargetId();\n const matchedPage = savedTargetId\n ? pages.find((candidate) => getTargetId(candidate) === savedTargetId)\n : undefined;\n const webPages = pages.filter((p) => /^https?:\\/\\//.test(p.url()));\n page =\n matchedPage ??\n (webPages.length > 0\n ? webPages[webPages.length - 1]\n : pages[pages.length - 1] || (await browser.newPage()));\n\n if (reused) {\n await page.bringToFront();\n }\n if (this.viewport) {\n await page.setViewport(this.viewport);\n }\n }\n\n const targetId = getTargetId(page);\n if (!targetId) {\n throw new Error(\n 'Failed to persist Puppeteer page session because Puppeteer did not expose a Chrome targetId.',\n );\n }\n await this.browserManager.saveTargetId(targetId);\n\n const reportOptions = this.readCliReportAgentOptions();\n this.agent = new PuppeteerAgent(page as unknown as PuppeteerPage, {\n ...(extractAgentBehaviorInitArgs(initArgs) ?? {}),\n ...(reportOptions ?? {}),\n });\n this.lastInitArgsSignature = nextSignature;\n return this.agent;\n }\n\n public async destroy(): Promise<void> {\n await super.destroy();\n this.browserManager.disconnect();\n }\n\n protected preparePlatformTools(): ToolDefinition[] {\n return [\n {\n name: 'web_connect',\n description:\n 'Connect to a web page. Opens a new tab with the given URL, or reuses the current page.',\n schema: this.getAgentInitArgSchema(),\n cli: this.getAgentInitArgCliMetadata(),\n handler: async (args) => {\n const initArgs = this.extractAgentInitParam(args);\n const url = initArgs?.url;\n\n // Explicit connect always starts a fresh page session.\n if (this.agent) {\n try {\n await this.agent.destroy?.();\n } catch {}\n this.agent = undefined;\n this.lastInitArgsSignature = undefined;\n }\n\n const reportSession = this.createNewCliReportSession(\n url ?? 'current-page',\n );\n this.commitCliReportSession(reportSession);\n this.agent = await this.ensureAgent(initArgs);\n\n const screenshot = await this.agent.page?.screenshotBase64();\n const label = url ?? 'current page';\n\n return {\n content: [\n { type: 'text', text: `Connected to: ${label}` },\n ...(screenshot ? this.buildScreenshotContent(screenshot) : []),\n ],\n };\n },\n },\n {\n name: 'web_disconnect',\n description:\n 'Disconnect from current web page. The browser stays running for future calls.',\n schema: {},\n handler: async () => {\n if (this.agent) {\n try {\n await this.agent.destroy?.();\n } catch {}\n this.agent = undefined;\n this.lastInitArgsSignature = undefined;\n }\n this.browserManager.disconnect();\n await this.browserManager.cleanupTargetIdFile();\n return this.buildTextResult(\n 'Disconnected from web page (browser still running)',\n );\n },\n },\n {\n name: 'web_close',\n description: 'Close the browser completely and release all resources.',\n schema: {},\n handler: async () => {\n if (this.agent) {\n try {\n await this.agent.destroy?.();\n } catch {}\n this.agent = undefined;\n this.lastInitArgsSignature = undefined;\n }\n await this.browserManager.closeBrowser();\n return this.buildTextResult('Browser closed');\n },\n },\n ];\n }\n}\n"],"names":["__webpack_require__","module","getter","definition","key","Object","obj","prop","Symbol","ENDPOINT_FILE","join","tmpdir","USER_DATA_DIR","TARGET_ID_FILE","DETACHED_CHROME_LAUNCH_TIMEOUT_MS","DETACHED_CHROME_ENDPOINT_POLL_INTERVAL_MS","debug","getDebug","PUPPETEER_ENDPOINT_FILE","buildDetachedChromeArgs","options","viewport","defaultPuppeteerWindowViewportSize","terminateDetachedChrome","proc","process","getTargetId","page","waitForDetachedChromeEndpoint","stderrFile","timeoutMs","Promise","resolve","reject","output","settled","exited","pollTimer","cleanup","clearTimeout","timeout","onExit","onError","resolveOnce","value","rejectOnce","error","terminate","code","signal","readFile","latestOutput","Error","pollForEndpoint","match","setTimeout","PuppeteerBrowserManager","content","targetId","writeFile","unlink","endpointFile","existsSync","endpoint","browser","puppeteer","wsEndpoint","chromePath","resolveChromePath","userDataDir","mkdir","args","stderrHandle","open","spawn","endpointPromise","undefined","persistence","defaultBrowserManager","WebPuppeteerMidsceneTools","BaseMidsceneTools","StaticPage","ScreenshotItem","Date","defaultStaticPageViewportSize","initArgs","navigateToUrl","nextSignature","getAgentInitArgsSignature","shouldOpenUrl","shouldRebuildAgentForInitArgs","reused","pages","savedTargetId","matchedPage","candidate","webPages","p","reportOptions","PuppeteerAgent","extractAgentBehaviorInitArgs","url","reportSession","screenshot","label","webAgentInitArgShape","adaptWebAgentInitArgs"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"agent-tools-puppeteer.js","sources":["webpack/runtime/compat_get_default_export","webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../src/agent-tools-puppeteer.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 { type ChildProcess, spawn } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport { mkdir, open, readFile, unlink, writeFile } from 'node:fs/promises';\nimport { tmpdir } from 'node:os';\nimport { join } from 'node:path';\nimport { ScreenshotItem } from '@midscene/core';\nimport {\n extractAgentBehaviorInitArgs,\n getAgentInitArgsSignature,\n shouldRebuildAgentForInitArgs,\n} from '@midscene/shared/agent-tools/agent-behavior-init-args';\nimport {\n BaseMidsceneTools,\n type InitArgSpec,\n} from '@midscene/shared/agent-tools/base-tools';\nimport { resolveChromePath } from '@midscene/shared/agent-tools/chrome-path';\nimport type { ToolDefinition } from '@midscene/shared/agent-tools/types';\nimport { getDebug } from '@midscene/shared/logger';\nimport type { Page as PuppeteerPage } from 'puppeteer';\nimport puppeteer from 'puppeteer-core';\nimport type { Browser, Page } from 'puppeteer-core';\nimport {\n type WebAgentInitArgs,\n adaptWebAgentInitArgs,\n webAgentInitArgShape,\n} from './agent-init-args';\nimport {\n type ViewportSize,\n defaultPuppeteerWindowViewportSize,\n defaultStaticPageViewportSize,\n} from './common/viewport';\nimport { PuppeteerAgent } from './puppeteer';\nimport { StaticPage } from './static';\n\nconst ENDPOINT_FILE = join(tmpdir(), 'midscene-puppeteer-endpoint');\nconst USER_DATA_DIR = join(tmpdir(), 'midscene-puppeteer-profile');\nconst TARGET_ID_FILE = join(tmpdir(), 'midscene-puppeteer-target-id');\nconst DETACHED_CHROME_LAUNCH_TIMEOUT_MS = 30_000;\nconst DETACHED_CHROME_ENDPOINT_POLL_INTERVAL_MS = 25;\nconst debug = getDebug('agent-tools:puppeteer');\n\nexport const PUPPETEER_ENDPOINT_FILE = ENDPOINT_FILE;\n\nexport interface PuppeteerPersistenceOptions {\n endpointFile?: string;\n userDataDir?: string;\n targetIdFile?: string;\n}\n\nexport interface WebPuppeteerMidsceneToolsOptions {\n persistence?: PuppeteerPersistenceOptions;\n}\n\nexport function buildDetachedChromeArgs(options: {\n userDataDir: string;\n viewport?: ViewportSize;\n}): string[] {\n const viewport = options.viewport ?? defaultPuppeteerWindowViewportSize;\n\n return [\n '--headless=new',\n `--user-data-dir=${options.userDataDir}`,\n '--remote-debugging-port=0',\n '--no-first-run',\n '--no-default-browser-check',\n '--disable-extensions',\n '--disable-default-apps',\n '--disable-sync',\n '--disable-background-networking',\n '--password-store=basic',\n '--use-mock-keychain',\n `--window-size=${viewport.width},${viewport.height}`,\n '--force-color-profile=srgb',\n ];\n}\n\nfunction terminateDetachedChrome(proc: ChildProcess): void {\n if (proc.killed || proc.exitCode !== null || proc.signalCode !== null) {\n return;\n }\n\n if (process.platform !== 'win32' && proc.pid) {\n try {\n process.kill(-proc.pid, 'SIGKILL');\n return;\n } catch {}\n }\n\n try {\n proc.kill('SIGKILL');\n } catch {}\n}\n\nfunction getTargetId(page: Page): string | undefined {\n return (page.target() as unknown as { _targetId?: string })._targetId;\n}\n\nexport function waitForDetachedChromeEndpoint(\n proc: ChildProcess,\n stderrFile: string,\n timeoutMs = DETACHED_CHROME_LAUNCH_TIMEOUT_MS,\n): Promise<string> {\n return new Promise<string>((resolve, reject) => {\n let output = '';\n let settled = false;\n let exited = false;\n let pollTimer: NodeJS.Timeout | undefined;\n const cleanup = () => {\n clearTimeout(timeout);\n if (pollTimer) {\n clearTimeout(pollTimer);\n }\n proc.removeListener('exit', onExit);\n proc.removeListener('error', onError);\n };\n const resolveOnce = (value: string) => {\n if (settled) return;\n settled = true;\n cleanup();\n resolve(value);\n };\n const rejectOnce = (error: Error, terminate = false) => {\n if (settled) return;\n settled = true;\n if (terminate) {\n terminateDetachedChrome(proc);\n }\n cleanup();\n reject(error);\n };\n const onExit = (code: number | null, signal: NodeJS.Signals | null) => {\n exited = true;\n void readFile(stderrFile, 'utf-8')\n .catch(() => output)\n .then((latestOutput) => {\n output = latestOutput;\n rejectOnce(\n new Error(\n `Chrome exited with code ${code ?? signal} before DevTools was ready.\\nChrome stderr: ${output}\\nTip: if running in a container, launch Chrome with sandbox-compatible arguments.`,\n ),\n );\n });\n };\n const onError = (error: Error) => {\n rejectOnce(\n new Error(`Failed to launch Chrome. Stderr log: \"${stderrFile}\".`, {\n cause: error,\n }),\n true,\n );\n };\n const pollForEndpoint = async (): Promise<void> => {\n if (settled || exited) return;\n try {\n output = await readFile(stderrFile, 'utf-8');\n } catch (error) {\n rejectOnce(\n new Error(`Failed to read Chrome stderr log \"${stderrFile}\".`, {\n cause: error,\n }),\n true,\n );\n return;\n }\n\n if (settled || exited) return;\n const match = output.match(/DevTools listening on (ws:\\/\\/[^\\s]+)/);\n if (match) {\n resolveOnce(match[1]);\n return;\n }\n pollTimer = setTimeout(\n () => void pollForEndpoint(),\n DETACHED_CHROME_ENDPOINT_POLL_INTERVAL_MS,\n );\n };\n const timeout = setTimeout(\n () =>\n rejectOnce(\n new Error(\n `Chrome launch timeout.\\nChrome stderr: ${output}\\nTip: if running in a container, launch Chrome with sandbox-compatible arguments.`,\n ),\n true,\n ),\n timeoutMs,\n );\n\n proc.on('exit', onExit);\n proc.on('error', onError);\n void pollForEndpoint();\n });\n}\n\n/**\n * Persistent Puppeteer browser manager.\n * Launches a detached Chrome and persists the WS endpoint across CLI calls.\n */\nclass PuppeteerBrowserManager {\n activeBrowser: Browser | null = null;\n\n constructor(private readonly persistence: PuppeteerPersistenceOptions = {}) {}\n\n private get endpointFile() {\n return this.persistence.endpointFile || ENDPOINT_FILE;\n }\n\n private get userDataDir() {\n return this.persistence.userDataDir || USER_DATA_DIR;\n }\n\n private get targetIdFile() {\n return this.persistence.targetIdFile || TARGET_ID_FILE;\n }\n\n private get chromeStderrFile() {\n return join(this.userDataDir, 'chrome-stderr.log');\n }\n\n async readSavedTargetId(): Promise<string | null> {\n let content: string;\n try {\n content = await readFile(this.targetIdFile, 'utf-8');\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return null;\n throw new Error(\n `Failed to read Puppeteer targetId from \"${this.targetIdFile}\".`,\n { cause: error },\n );\n }\n\n const targetId = content.trim();\n if (!targetId) {\n throw new Error(\n `Puppeteer targetId file \"${this.targetIdFile}\" is empty.`,\n );\n }\n return targetId;\n }\n\n async saveTargetId(targetId: string): Promise<void> {\n try {\n await writeFile(this.targetIdFile, targetId, 'utf-8');\n debug('Saved Puppeteer targetId: %s', targetId);\n } catch (error) {\n throw new Error(\n `Failed to save Puppeteer targetId to \"${this.targetIdFile}\".`,\n { cause: error },\n );\n }\n }\n\n async cleanupTargetIdFile(): Promise<void> {\n try {\n await unlink(this.targetIdFile);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return;\n throw new Error(\n `Failed to remove Puppeteer targetId file \"${this.targetIdFile}\".`,\n { cause: error },\n );\n }\n }\n\n async cleanupChromeStderrFile(): Promise<void> {\n try {\n await unlink(this.chromeStderrFile);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n debug('Failed to clean Chrome stderr log: %s', error);\n }\n }\n }\n\n async getOrLaunch(\n viewport?: ViewportSize,\n ): Promise<{ browser: Browser; reused: boolean }> {\n const endpointFile = this.endpointFile;\n if (existsSync(endpointFile)) {\n try {\n const endpoint = (await readFile(endpointFile, 'utf-8')).trim();\n const browser = await puppeteer.connect({\n browserWSEndpoint: endpoint,\n defaultViewport: null,\n });\n return { browser, reused: true };\n } catch (error) {\n debug('Failed to reuse persisted Puppeteer endpoint: %s', error);\n try {\n await unlink(endpointFile);\n } catch {}\n await this.cleanupTargetIdFile();\n }\n }\n\n await this.cleanupTargetIdFile();\n const wsEndpoint = await this.launchDetachedChrome(viewport);\n await writeFile(endpointFile, wsEndpoint);\n\n const browser = await puppeteer.connect({\n browserWSEndpoint: wsEndpoint,\n defaultViewport: null,\n });\n return { browser, reused: false };\n }\n\n async closeBrowser(): Promise<void> {\n const endpointFile = this.endpointFile;\n if (existsSync(endpointFile)) {\n try {\n const endpoint = (await readFile(endpointFile, 'utf-8')).trim();\n const browser = await puppeteer.connect({\n browserWSEndpoint: endpoint,\n });\n await browser.close();\n } catch (error) {\n debug('Failed to close persisted Puppeteer browser: %s', error);\n }\n }\n try {\n if (existsSync(endpointFile)) {\n await unlink(endpointFile);\n }\n } catch {}\n await this.cleanupTargetIdFile();\n await this.cleanupChromeStderrFile();\n }\n\n disconnect(): void {\n if (this.activeBrowser) {\n this.activeBrowser.disconnect();\n this.activeBrowser = null;\n }\n }\n\n async launchDetachedChrome(viewport?: ViewportSize): Promise<string> {\n const chromePath = resolveChromePath();\n const userDataDir = this.userDataDir;\n\n await mkdir(userDataDir, { recursive: true });\n\n const args = buildDetachedChromeArgs({\n userDataDir,\n viewport,\n });\n\n const stderrFile = this.chromeStderrFile;\n const stderrHandle = await open(stderrFile, 'w');\n let proc: ChildProcess;\n try {\n proc = spawn(chromePath, args, {\n detached: true,\n stdio: ['ignore', 'ignore', stderrHandle.fd],\n });\n } catch (error) {\n await stderrHandle.close();\n throw error;\n }\n const endpointPromise = waitForDetachedChromeEndpoint(proc, stderrFile);\n proc.unref();\n try {\n await stderrHandle.close();\n } catch (error) {\n terminateDetachedChrome(proc);\n await endpointPromise.catch(() => undefined);\n throw new Error(`Failed to close Chrome stderr log \"${stderrFile}\".`, {\n cause: error,\n });\n }\n\n return endpointPromise;\n }\n}\n\nconst defaultBrowserManager = new PuppeteerBrowserManager();\n\n/**\n * Tools manager for Web Puppeteer mode.\n * Uses a persistent headless Chrome browser that survives across CLI calls.\n */\nexport class WebPuppeteerMidsceneTools extends BaseMidsceneTools<\n PuppeteerAgent,\n WebAgentInitArgs\n> {\n private readonly viewport?: ViewportSize;\n private readonly browserManager: PuppeteerBrowserManager;\n private lastInitArgsSignature?: string;\n\n constructor(\n viewport?: ViewportSize,\n options: WebPuppeteerMidsceneToolsOptions = {},\n ) {\n super();\n this.viewport = viewport ? { ...viewport } : undefined;\n this.browserManager = options.persistence\n ? new PuppeteerBrowserManager(options.persistence)\n : defaultBrowserManager;\n }\n\n protected getCliReportSessionName() {\n return 'midscene-web';\n }\n\n protected readonly initArgSpec: InitArgSpec<WebAgentInitArgs> = {\n namespace: 'web',\n shape: webAgentInitArgShape,\n cli: {\n preferBareKeys: true,\n },\n adapt: adaptWebAgentInitArgs,\n };\n\n protected createTemporaryDevice() {\n return new StaticPage({\n screenshot: ScreenshotItem.create('', Date.now()),\n shotSize: this.viewport ?? defaultStaticPageViewportSize,\n shrunkShotToLogicalRatio: 1,\n });\n }\n\n protected async ensureAgent(\n initArgs?: WebAgentInitArgs,\n ): Promise<PuppeteerAgent> {\n const navigateToUrl = initArgs?.url;\n const nextSignature = getAgentInitArgsSignature(initArgs);\n const shouldOpenUrl = typeof navigateToUrl === 'string';\n\n if (\n this.agent &&\n (shouldOpenUrl ||\n shouldRebuildAgentForInitArgs(\n this.lastInitArgsSignature,\n nextSignature,\n ))\n ) {\n try {\n await this.agent?.destroy?.();\n } catch {}\n this.agent = undefined;\n }\n\n if (this.agent) return this.agent;\n\n const { browser, reused } = await this.browserManager.getOrLaunch(\n this.viewport,\n );\n this.browserManager.activeBrowser = browser;\n\n const pages = await browser.pages();\n let page: Page;\n\n if (navigateToUrl) {\n page = await browser.newPage();\n if (this.viewport) {\n await this.resizePersistentViewport(page);\n }\n await page.goto(navigateToUrl, {\n timeout: 30000,\n waitUntil: 'domcontentloaded',\n });\n } else {\n const savedTargetId = await this.browserManager.readSavedTargetId();\n const matchedPage = savedTargetId\n ? pages.find((candidate) => getTargetId(candidate) === savedTargetId)\n : undefined;\n const webPages = pages.filter((p) => /^https?:\\/\\//.test(p.url()));\n page =\n matchedPage ??\n (webPages.length > 0\n ? webPages[webPages.length - 1]\n : pages[pages.length - 1] || (await browser.newPage()));\n\n if (reused) {\n await page.bringToFront();\n }\n if (this.viewport) {\n await this.resizePersistentViewport(page);\n }\n }\n\n const targetId = getTargetId(page);\n if (!targetId) {\n throw new Error(\n 'Failed to persist Puppeteer page session because Puppeteer did not expose a Chrome targetId.',\n );\n }\n await this.browserManager.saveTargetId(targetId);\n\n const reportOptions = this.readCliReportAgentOptions();\n this.agent = new PuppeteerAgent(page as unknown as PuppeteerPage, {\n ...(extractAgentBehaviorInitArgs(initArgs) ?? {}),\n ...(reportOptions ?? {}),\n });\n this.lastInitArgsSignature = nextSignature;\n return this.agent;\n }\n\n private async resizePersistentViewport(page: Page): Promise<void> {\n const viewport = this.viewport;\n if (!viewport) return;\n\n // Emulation is scoped to the CDP connection. Resize the actual content area\n // so the requested dimensions also survive CLI disconnect and reconnect.\n await page.setViewport(null);\n const client = await page.createCDPSession();\n try {\n const { windowId, bounds } = await client.send(\n 'Browser.getWindowForTarget',\n );\n // Browser snippets must remain free of Node-side coverage counters.\n const content = (await page.evaluate(\n '({ width: window.innerWidth, height: window.innerHeight })',\n )) as { width: number; height: number };\n if (bounds.width === undefined || bounds.height === undefined) {\n throw new Error('Chrome did not return window dimensions');\n }\n await client.send('Browser.setWindowBounds', {\n windowId,\n bounds: {\n width: bounds.width + viewport.width - content.width,\n height: bounds.height + viewport.height - content.height,\n },\n });\n await page.waitForFunction(\n `window.innerWidth === ${JSON.stringify(viewport.width)} && window.innerHeight === ${JSON.stringify(viewport.height)}`,\n { timeout: 10_000 },\n );\n } finally {\n await client.detach();\n }\n await page.setViewport(viewport);\n }\n\n public async destroy(): Promise<void> {\n await super.destroy();\n this.browserManager.disconnect();\n }\n\n protected preparePlatformTools(): ToolDefinition[] {\n return [\n {\n name: 'web_connect',\n description:\n 'Connect to a web page. Opens a new tab with the given URL, or reuses the current page.',\n schema: this.getAgentInitArgSchema(),\n cli: this.getAgentInitArgCliMetadata(),\n handler: async (args) => {\n const initArgs = this.extractAgentInitParam(args);\n const url = initArgs?.url;\n\n // Explicit connect always starts a fresh page session.\n if (this.agent) {\n try {\n await this.agent.destroy?.();\n } catch {}\n this.agent = undefined;\n this.lastInitArgsSignature = undefined;\n }\n\n const reportSession = this.createNewCliReportSession(\n url ?? 'current-page',\n );\n this.commitCliReportSession(reportSession);\n this.agent = await this.ensureAgent(initArgs);\n\n const screenshot = await this.agent.page?.screenshotBase64();\n const label = url ?? 'current page';\n\n return {\n content: [\n { type: 'text', text: `Connected to: ${label}` },\n ...(screenshot ? this.buildScreenshotContent(screenshot) : []),\n ],\n };\n },\n },\n {\n name: 'web_disconnect',\n description:\n 'Disconnect from current web page. The browser stays running for future calls.',\n schema: {},\n handler: async () => {\n if (this.agent) {\n try {\n await this.agent.destroy?.();\n } catch {}\n this.agent = undefined;\n this.lastInitArgsSignature = undefined;\n }\n this.browserManager.disconnect();\n await this.browserManager.cleanupTargetIdFile();\n return this.buildTextResult(\n 'Disconnected from web page (browser still running)',\n );\n },\n },\n {\n name: 'web_close',\n description: 'Close the browser completely and release all resources.',\n schema: {},\n handler: async () => {\n if (this.agent) {\n try {\n await this.agent.destroy?.();\n } catch {}\n this.agent = undefined;\n this.lastInitArgsSignature = undefined;\n }\n await this.browserManager.closeBrowser();\n return this.buildTextResult('Browser closed');\n },\n },\n ];\n }\n}\n"],"names":["__webpack_require__","module","getter","definition","key","Object","obj","prop","Symbol","ENDPOINT_FILE","join","tmpdir","USER_DATA_DIR","TARGET_ID_FILE","DETACHED_CHROME_LAUNCH_TIMEOUT_MS","DETACHED_CHROME_ENDPOINT_POLL_INTERVAL_MS","debug","getDebug","PUPPETEER_ENDPOINT_FILE","buildDetachedChromeArgs","options","viewport","defaultPuppeteerWindowViewportSize","terminateDetachedChrome","proc","process","getTargetId","page","waitForDetachedChromeEndpoint","stderrFile","timeoutMs","Promise","resolve","reject","output","settled","exited","pollTimer","cleanup","clearTimeout","timeout","onExit","onError","resolveOnce","value","rejectOnce","error","terminate","code","signal","readFile","latestOutput","Error","pollForEndpoint","match","setTimeout","PuppeteerBrowserManager","content","targetId","writeFile","unlink","endpointFile","existsSync","endpoint","browser","puppeteer","wsEndpoint","chromePath","resolveChromePath","userDataDir","mkdir","args","stderrHandle","open","spawn","endpointPromise","undefined","persistence","defaultBrowserManager","WebPuppeteerMidsceneTools","BaseMidsceneTools","StaticPage","ScreenshotItem","Date","defaultStaticPageViewportSize","initArgs","navigateToUrl","nextSignature","getAgentInitArgsSignature","shouldOpenUrl","shouldRebuildAgentForInitArgs","reused","pages","savedTargetId","matchedPage","candidate","webPages","p","reportOptions","PuppeteerAgent","extractAgentBehaviorInitArgs","client","windowId","bounds","JSON","url","reportSession","screenshot","label","webAgentInitArgShape","adaptWebAgentInitArgs"],"mappings":"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"}
|