@midscene/web 0.16.4 → 0.16.6
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.js +78 -14
- package/dist/es/agent.js.map +1 -1
- package/dist/es/bridge-mode-browser.js +3 -3
- package/dist/es/bridge-mode-browser.js.map +1 -1
- package/dist/es/bridge-mode.js +82 -18
- package/dist/es/bridge-mode.js.map +1 -1
- package/dist/es/chrome-extension.js +79 -15
- package/dist/es/chrome-extension.js.map +1 -1
- package/dist/es/index.js +110 -14
- package/dist/es/index.js.map +1 -1
- package/dist/es/midscene-playground.js +78 -14
- package/dist/es/midscene-playground.js.map +1 -1
- package/dist/es/playground.js +78 -14
- package/dist/es/playground.js.map +1 -1
- package/dist/es/playwright.js +110 -14
- package/dist/es/playwright.js.map +1 -1
- package/dist/es/puppeteer-agent-launcher.js +78 -14
- package/dist/es/puppeteer-agent-launcher.js.map +1 -1
- package/dist/es/puppeteer.js +78 -14
- package/dist/es/puppeteer.js.map +1 -1
- package/dist/es/ui-utils.js.map +1 -1
- package/dist/lib/agent.js +77 -10
- package/dist/lib/agent.js.map +1 -1
- package/dist/lib/bridge-mode-browser.js +3 -3
- package/dist/lib/bridge-mode-browser.js.map +1 -1
- package/dist/lib/bridge-mode.js +81 -14
- package/dist/lib/bridge-mode.js.map +1 -1
- package/dist/lib/chrome-extension.js +78 -11
- package/dist/lib/chrome-extension.js.map +1 -1
- package/dist/lib/index.js +109 -10
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/midscene-playground.js +77 -10
- package/dist/lib/midscene-playground.js.map +1 -1
- package/dist/lib/playground.js +77 -10
- package/dist/lib/playground.js.map +1 -1
- package/dist/lib/playwright.js +109 -10
- package/dist/lib/playwright.js.map +1 -1
- package/dist/lib/puppeteer-agent-launcher.js +77 -10
- package/dist/lib/puppeteer-agent-launcher.js.map +1 -1
- package/dist/lib/puppeteer.js +77 -10
- package/dist/lib/puppeteer.js.map +1 -1
- package/dist/lib/ui-utils.js.map +1 -1
- package/dist/types/agent.d.ts +8 -0
- package/dist/types/playwright.d.ts +16 -0
- package/dist/types/ui-utils.d.ts +1 -1
- package/package.json +4 -5
package/dist/es/ui-utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"mappings":";AAWO,SAAS,QAAQ,MAAqB;AAC3C,SAAO,KAAK,UAAU,GAAG,KAAK,IAAI,MAAM,KAAK,WAAW,EAAE,KAAK,KAAK;AACtE;AAEO,SAAS,eACd,OAC0C;AAE1C,QAAM,OAAO,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK;AAIlD,SAAO,KAAK,OAAO,CAAC,KAA+C,MAAM;AACvE,UAAM,cAAc,KAAK,SAAS,MAAM,KAAK,KAAK,SAAS,SAAS;AACpE,QAAI,gBAAgB,MAAM,OAAO,MAAM,MAAM;AAC3C,aAAO,IAAI,OAAO,CAAC,EAAE,KAAK,GAAG,SAAS,YAAY,CAAC,CAAC;AAAA,IACtD;AACA,QAAI,gBAAgB,MAAM,OAAO,MAAM,MAAM;AAC3C,aAAO,IAAI,OAAO,CAAC,EAAE,KAAK,GAAG,SAAS,OAAO,CAAC,CAAC;AAAA,IACjD;AACA,QAAI,gBAAgB,MAAM,OAAO,MAAM,MAAM;AAC3C,aAAO,IAAI,OAAO,CAAC,EAAE,KAAK,GAAG,SAAS,QAAQ,CAAC,CAAC;AAAA,IAClD;AACA,WAAO,IAAI,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AAAA,EAChC,GAAG,CAAC,CAAC;AACP;AAEO,SAAS,eAAe,QAA8B;AAC3D,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,WAAW,UAAU;AAC9B,WAAO;AAAA,EACT;AAEA,SAAO,OAAO;AAChB;AAEO,SAAS,eAAe,aAAyC;AACtE,MAAI,CAAC,aAAa;AAChB,WAAO;AAAA,EACT;AACA,SAAO,GAAG,YAAY,aAAa,MAAM,KAAK,YAAY,cAAc,MAAM,KAAK,YAAY,YAAY,kBAAkB;AAC/H;AAEO,SAAS,aACd,
|
|
1
|
+
{"version":3,"mappings":";AAWO,SAAS,QAAQ,MAAqB;AAC3C,SAAO,KAAK,UAAU,GAAG,KAAK,IAAI,MAAM,KAAK,WAAW,EAAE,KAAK,KAAK;AACtE;AAEO,SAAS,eACd,OAC0C;AAE1C,QAAM,OAAO,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK;AAIlD,SAAO,KAAK,OAAO,CAAC,KAA+C,MAAM;AACvE,UAAM,cAAc,KAAK,SAAS,MAAM,KAAK,KAAK,SAAS,SAAS;AACpE,QAAI,gBAAgB,MAAM,OAAO,MAAM,MAAM;AAC3C,aAAO,IAAI,OAAO,CAAC,EAAE,KAAK,GAAG,SAAS,YAAY,CAAC,CAAC;AAAA,IACtD;AACA,QAAI,gBAAgB,MAAM,OAAO,MAAM,MAAM;AAC3C,aAAO,IAAI,OAAO,CAAC,EAAE,KAAK,GAAG,SAAS,OAAO,CAAC,CAAC;AAAA,IACjD;AACA,QAAI,gBAAgB,MAAM,OAAO,MAAM,MAAM;AAC3C,aAAO,IAAI,OAAO,CAAC,EAAE,KAAK,GAAG,SAAS,QAAQ,CAAC,CAAC;AAAA,IAClD;AACA,WAAO,IAAI,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AAAA,EAChC,GAAG,CAAC,CAAC;AACP;AAEO,SAAS,eAAe,QAA8B;AAC3D,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,WAAW,UAAU;AAC9B,WAAO;AAAA,EACT;AAEA,SAAO,OAAO;AAChB;AAEO,SAAS,eAAe,aAAyC;AACtE,MAAI,CAAC,aAAa;AAChB,WAAO;AAAA,EACT;AACA,SAAO,GAAG,YAAY,aAAa,MAAM,KAAK,YAAY,cAAc,MAAM,KAAK,YAAY,YAAY,kBAAkB;AAC/H;AAEO,SAAS,aACd,MAcA,QACA;AACA,MAAI,QAAQ;AACV,WAAO,GAAG,IAAI,MAAM,MAAM;AAAA,EAC5B;AACA,SAAO;AACT;AAEO,SAAS,SAAS,MAAqB;AAC5C,MAAI;AACJ,MAAI,KAAK,SAAS,YAAY;AAC5B,YAAS,MAAgC,OAAO;AAAA,EAClD;AAEA,MAAI,KAAK,SAAS,WAAW;AAC3B,YACG,MAAqC,OAAO,UAC5C,MAAqC,OAAO,MAC5C,MAAoC,OAAO,cAC3C,MAAwC,OAAO;AAAA,EACpD;AAEA,MAAI,KAAK,SAAS,UAAU;AAC1B,UAAM,SAAU,MAA8B;AAC9C,UAAM,YAAY,SAAS,eAAe,MAAM,IAAI;AAEpD,YAAQ,KAAK,WAAW;AACxB,QAAI,OAAQ,MAA8B,OAAO,WAAW,UAAU;AACpE,cAAQ,GAAI,MAA8B,OAAO,MAAM;AAAA,IACzD,WACE,OAAQ,MAA8B,OAAO,eAAe,UAC5D;AACA,cAAQ,eAAgB,MAA8B,KAAK;AAAA,IAC7D,WACE,OAAQ,MAA8B,OAAO,UAAU,aACvD;AACA,cAAS,MAA8B,OAAO;AAAA,IAChD;AAEA,QAAI,WAAW;AACb,UAAI,OAAO;AACT,gBAAQ,GAAG,SAAS,MAAM,KAAK;AAAA,MACjC,OAAO;AACL,gBAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AAEA,MAAI,OAAO,UAAU;AAAa,WAAO;AACzC,SAAO,OAAO,UAAU,WACpB,QACA,KAAK,UAAU,OAAO,QAAW,CAAC;AACxC;AAEO,IAAM,wBAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA","names":[],"ignoreList":[],"sources":["../../src/common/ui-utils.ts"],"sourcesContent":["import type {\n DetailedLocateParam,\n ExecutionTask,\n ExecutionTaskAction,\n ExecutionTaskInsightAssertion,\n ExecutionTaskInsightLocate,\n ExecutionTaskInsightQuery,\n ExecutionTaskPlanning,\n PlanningActionParamScroll,\n} from '@midscene/core';\n\nexport function typeStr(task: ExecutionTask) {\n return task.subType ? `${task.type} / ${task.subType || ''}` : task.type;\n}\n\nexport function getKeyCommands(\n value: string | string[],\n): Array<{ key: string; command?: string }> {\n // Ensure value is an array of keys\n const keys = Array.isArray(value) ? value : [value];\n\n // Process each key to attach a corresponding command if needed, based on the presence of 'Meta' or 'Control' in the keys array.\n // ref: https://github.com/puppeteer/puppeteer/pull/9357/files#diff-32cf475237b000f980eb214a0a823e45a902bddb7d2426d677cae96397aa0ae4R94\n return keys.reduce((acc: Array<{ key: string; command?: string }>, k) => {\n const includeMeta = keys.includes('Meta') || keys.includes('Control');\n if (includeMeta && (k === 'a' || k === 'A')) {\n return acc.concat([{ key: k, command: 'SelectAll' }]);\n }\n if (includeMeta && (k === 'c' || k === 'C')) {\n return acc.concat([{ key: k, command: 'Copy' }]);\n }\n if (includeMeta && (k === 'v' || k === 'V')) {\n return acc.concat([{ key: k, command: 'Paste' }]);\n }\n return acc.concat([{ key: k }]);\n }, []);\n}\n\nexport function locateParamStr(locate?: DetailedLocateParam) {\n if (!locate) {\n return '';\n }\n\n if (typeof locate === 'string') {\n return locate;\n }\n\n return locate.prompt;\n}\n\nexport function scrollParamStr(scrollParam?: PlanningActionParamScroll) {\n if (!scrollParam) {\n return '';\n }\n return `${scrollParam.direction || 'down'}, ${scrollParam.scrollType || 'once'}, ${scrollParam.distance || 'distance-not-set'}`;\n}\n\nexport function taskTitleStr(\n type:\n | 'Tap'\n | 'Hover'\n | 'Input'\n | 'KeyboardPress'\n | 'Scroll'\n | 'Action'\n | 'Query'\n | 'Assert'\n | 'WaitFor'\n | 'Locate'\n | 'Boolean'\n | 'Number'\n | 'String',\n prompt: string,\n) {\n if (prompt) {\n return `${type} - ${prompt}`;\n }\n return type;\n}\n\nexport function paramStr(task: ExecutionTask) {\n let value: string | undefined | object;\n if (task.type === 'Planning') {\n value = (task as ExecutionTaskPlanning)?.param?.userInstruction;\n }\n\n if (task.type === 'Insight') {\n value =\n (task as ExecutionTaskInsightLocate)?.param?.prompt ||\n (task as ExecutionTaskInsightLocate)?.param?.id ||\n (task as ExecutionTaskInsightQuery)?.param?.dataDemand ||\n (task as ExecutionTaskInsightAssertion)?.param?.assertion;\n }\n\n if (task.type === 'Action') {\n const locate = (task as ExecutionTaskAction)?.locate;\n const locateStr = locate ? locateParamStr(locate) : '';\n\n value = task.thought || '';\n if (typeof (task as ExecutionTaskAction)?.param?.timeMs === 'number') {\n value = `${(task as ExecutionTaskAction)?.param?.timeMs}ms`;\n } else if (\n typeof (task as ExecutionTaskAction)?.param?.scrollType === 'string'\n ) {\n value = scrollParamStr((task as ExecutionTaskAction)?.param);\n } else if (\n typeof (task as ExecutionTaskAction)?.param?.value !== 'undefined'\n ) {\n value = (task as ExecutionTaskAction)?.param?.value;\n }\n\n if (locateStr) {\n if (value) {\n value = `${locateStr} - ${value}`;\n } else {\n value = locateStr;\n }\n }\n }\n\n if (typeof value === 'undefined') return '';\n return typeof value === 'string'\n ? value\n : JSON.stringify(value, undefined, 2);\n}\n\nexport const limitOpenNewTabScript = `\nif (!window.__MIDSCENE_NEW_TAB_INTERCEPTOR_INITIALIZED__) {\n window.__MIDSCENE_NEW_TAB_INTERCEPTOR_INITIALIZED__ = true;\n\n // Intercept the window.open method (only once)\n window.open = function(url) {\n console.log('Blocked window.open:', url);\n window.location.href = url;\n return null;\n };\n\n // Block all a tag clicks with target=\"_blank\" (only once)\n document.addEventListener('click', function(e) {\n const target = e.target.closest('a');\n if (target && target.target === '_blank') {\n e.preventDefault();\n console.log('Blocked new tab:', target.href);\n window.location.href = target.href;\n target.removeAttribute('target');\n }\n }, true);\n}\n`;\n"]}
|
package/dist/lib/agent.js
CHANGED
|
@@ -1501,17 +1501,23 @@ var PageTaskExecutor = class {
|
|
|
1501
1501
|
executor: taskExecutor
|
|
1502
1502
|
};
|
|
1503
1503
|
}
|
|
1504
|
-
async
|
|
1505
|
-
const
|
|
1506
|
-
|
|
1507
|
-
|
|
1508
|
-
|
|
1504
|
+
async createTypeQueryTask(type, demand) {
|
|
1505
|
+
const taskExecutor = new import_core.Executor(
|
|
1506
|
+
taskTitleStr(
|
|
1507
|
+
type,
|
|
1508
|
+
typeof demand === "string" ? demand : JSON.stringify(demand)
|
|
1509
|
+
),
|
|
1510
|
+
{
|
|
1511
|
+
onTaskStart: this.onTaskStartCallback
|
|
1512
|
+
}
|
|
1513
|
+
);
|
|
1509
1514
|
const queryTask = {
|
|
1510
1515
|
type: "Insight",
|
|
1511
|
-
subType:
|
|
1516
|
+
subType: type,
|
|
1512
1517
|
locate: null,
|
|
1513
1518
|
param: {
|
|
1514
1519
|
dataDemand: demand
|
|
1520
|
+
// for user param presentation in report right sidebar
|
|
1515
1521
|
},
|
|
1516
1522
|
executor: async (param) => {
|
|
1517
1523
|
let insightDump;
|
|
@@ -1519,11 +1525,21 @@ var PageTaskExecutor = class {
|
|
|
1519
1525
|
insightDump = dump;
|
|
1520
1526
|
};
|
|
1521
1527
|
this.insight.onceDumpUpdatedFn = dumpCollector;
|
|
1522
|
-
const
|
|
1523
|
-
|
|
1524
|
-
)
|
|
1528
|
+
const ifTypeRestricted = type !== "Query";
|
|
1529
|
+
let demandInput = demand;
|
|
1530
|
+
if (ifTypeRestricted) {
|
|
1531
|
+
demandInput = {
|
|
1532
|
+
result: `${type}, ${demand}`
|
|
1533
|
+
};
|
|
1534
|
+
}
|
|
1535
|
+
const { data, usage } = await this.insight.extract(demandInput);
|
|
1536
|
+
let outputResult = data;
|
|
1537
|
+
if (ifTypeRestricted) {
|
|
1538
|
+
(0, import_utils9.assert)(data?.result !== void 0, "No result in query data");
|
|
1539
|
+
outputResult = data.result;
|
|
1540
|
+
}
|
|
1525
1541
|
return {
|
|
1526
|
-
output:
|
|
1542
|
+
output: outputResult,
|
|
1527
1543
|
log: { dump: insightDump },
|
|
1528
1544
|
usage
|
|
1529
1545
|
};
|
|
@@ -1536,6 +1552,18 @@ var PageTaskExecutor = class {
|
|
|
1536
1552
|
executor: taskExecutor
|
|
1537
1553
|
};
|
|
1538
1554
|
}
|
|
1555
|
+
async query(demand) {
|
|
1556
|
+
return this.createTypeQueryTask("Query", demand);
|
|
1557
|
+
}
|
|
1558
|
+
async boolean(prompt) {
|
|
1559
|
+
return this.createTypeQueryTask("Boolean", prompt);
|
|
1560
|
+
}
|
|
1561
|
+
async number(prompt) {
|
|
1562
|
+
return this.createTypeQueryTask("Number", prompt);
|
|
1563
|
+
}
|
|
1564
|
+
async string(prompt) {
|
|
1565
|
+
return this.createTypeQueryTask("String", prompt);
|
|
1566
|
+
}
|
|
1539
1567
|
async assert(assertion) {
|
|
1540
1568
|
const description = `assert: ${assertion}`;
|
|
1541
1569
|
const taskExecutor = new import_core.Executor(taskTitleStr("Assert", description), {
|
|
@@ -1722,6 +1750,16 @@ function buildPlans(type, locateParam, param) {
|
|
|
1722
1750
|
};
|
|
1723
1751
|
returnPlans = [sleepPlan];
|
|
1724
1752
|
}
|
|
1753
|
+
if (type === "Locate") {
|
|
1754
|
+
(0, import_utils10.assert)(locateParam, `missing locate info for action "${type}"`);
|
|
1755
|
+
const locatePlan2 = {
|
|
1756
|
+
type,
|
|
1757
|
+
param: locateParam,
|
|
1758
|
+
locate: locateParam,
|
|
1759
|
+
thought: ""
|
|
1760
|
+
};
|
|
1761
|
+
returnPlans = [locatePlan2];
|
|
1762
|
+
}
|
|
1725
1763
|
if (returnPlans) {
|
|
1726
1764
|
debug3("buildPlans", returnPlans);
|
|
1727
1765
|
return returnPlans;
|
|
@@ -1921,6 +1959,35 @@ ${errorTask?.errorStack}`);
|
|
|
1921
1959
|
this.afterTaskRunning(executor);
|
|
1922
1960
|
return output;
|
|
1923
1961
|
}
|
|
1962
|
+
async aiBoolean(prompt) {
|
|
1963
|
+
const { output, executor } = await this.taskExecutor.boolean(prompt);
|
|
1964
|
+
this.afterTaskRunning(executor);
|
|
1965
|
+
return output;
|
|
1966
|
+
}
|
|
1967
|
+
async aiNumber(prompt) {
|
|
1968
|
+
const { output, executor } = await this.taskExecutor.number(prompt);
|
|
1969
|
+
this.afterTaskRunning(executor);
|
|
1970
|
+
return output;
|
|
1971
|
+
}
|
|
1972
|
+
async aiString(prompt) {
|
|
1973
|
+
const { output, executor } = await this.taskExecutor.string(prompt);
|
|
1974
|
+
this.afterTaskRunning(executor);
|
|
1975
|
+
return output;
|
|
1976
|
+
}
|
|
1977
|
+
async aiLocate(prompt, opt) {
|
|
1978
|
+
const detailedLocateParam = this.buildDetailedLocateParam(prompt, opt);
|
|
1979
|
+
const plans = buildPlans("Locate", detailedLocateParam);
|
|
1980
|
+
const { executor, output } = await this.taskExecutor.runPlans(
|
|
1981
|
+
taskTitleStr("Locate", locateParamStr(detailedLocateParam)),
|
|
1982
|
+
plans
|
|
1983
|
+
);
|
|
1984
|
+
this.afterTaskRunning(executor);
|
|
1985
|
+
const { element } = output;
|
|
1986
|
+
return {
|
|
1987
|
+
rect: element?.rect,
|
|
1988
|
+
center: element?.center
|
|
1989
|
+
};
|
|
1990
|
+
}
|
|
1924
1991
|
async aiAssert(assertion, msg, opt) {
|
|
1925
1992
|
const { output, executor } = await this.taskExecutor.assert(assertion);
|
|
1926
1993
|
this.afterTaskRunning(executor, true);
|