@midscene/cli 0.14.3 → 0.14.4-beta-20250415065130.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/es/index.js CHANGED
@@ -13955,7 +13955,7 @@ Usage: $0 [options] <path-to-yaml-script-file-or-directory>`
13955
13955
  default: false,
13956
13956
  description: "Keep the browser window open after the script finishes. This is useful when debugging, but will consume more resources"
13957
13957
  }
13958
- }).version("version", "Show version number", "0.14.3").help().wrap(yargs_default().terminalWidth());
13958
+ }).version("version", "Show version number", "0.14.4-beta-20250415065130.0").help().wrap(yargs_default().terminalWidth());
13959
13959
  const argv = await args.argv;
13960
13960
  return {
13961
13961
  path: argv._[0],
@@ -14600,6 +14600,7 @@ function getRenderedRowCount(contents, stream2) {
14600
14600
 
14601
14601
  // src/yaml-runner.ts
14602
14602
  import assert from "assert";
14603
+ import { agentFromAdbDevice } from "@midscene/android";
14603
14604
  import { AgentOverChromeBridge } from "@midscene/web/bridge-mode";
14604
14605
  import { puppeteerAgentForTarget } from "@midscene/web/puppeteer";
14605
14606
  var launchServer = async (dir) => {
@@ -14626,60 +14627,86 @@ async function playYamlFiles(files, options) {
14626
14627
  };
14627
14628
  const player = new ScriptPlayer(script, async (target) => {
14628
14629
  const freeFn = [];
14629
- let localServer;
14630
- let urlToVisit;
14631
- if (target.serve) {
14632
- assert(typeof target.url === "string", "url is required in serve mode");
14633
- localServer = await launchServer(target.serve);
14634
- const serverAddress = localServer.server.address();
14635
- freeFn.push({
14636
- name: "local_server",
14637
- fn: () => localServer?.server.close()
14630
+ const webTarget = script.web || script.target;
14631
+ if (webTarget) {
14632
+ if (script.target) {
14633
+ console.warn(
14634
+ "target is deprecated, please use web instead. See https://midscenejs.com/automate-with-scripts-in-yaml for more information. Sorry for the inconvenience."
14635
+ );
14636
+ }
14637
+ let localServer;
14638
+ let urlToVisit;
14639
+ if (webTarget.serve) {
14640
+ assert(
14641
+ typeof webTarget.url === "string",
14642
+ "url is required in serve mode"
14643
+ );
14644
+ localServer = await launchServer(webTarget.serve);
14645
+ const serverAddress = localServer.server.address();
14646
+ freeFn.push({
14647
+ name: "local_server",
14648
+ fn: () => localServer?.server.close()
14649
+ });
14650
+ if (webTarget.url.startsWith("/")) {
14651
+ urlToVisit = `http://${serverAddress?.address}:${serverAddress?.port}${webTarget.url}`;
14652
+ } else {
14653
+ urlToVisit = `http://${serverAddress?.address}:${serverAddress?.port}/${webTarget.url}`;
14654
+ }
14655
+ webTarget.url = urlToVisit;
14656
+ }
14657
+ if (!webTarget.bridgeMode) {
14658
+ const { agent: agent2, freeFn: newFreeFn } = await puppeteerAgentForTarget(
14659
+ webTarget,
14660
+ preference
14661
+ );
14662
+ freeFn.push(...newFreeFn);
14663
+ return { agent: agent2, freeFn };
14664
+ }
14665
+ assert(
14666
+ webTarget.bridgeMode === "newTabWithUrl" || webTarget.bridgeMode === "currentTab",
14667
+ `bridgeMode config value must be either "newTabWithUrl" or "currentTab", but got ${webTarget.bridgeMode}`
14668
+ );
14669
+ if (webTarget.userAgent || webTarget.viewportWidth || webTarget.viewportHeight || webTarget.viewportScale || webTarget.waitForNetworkIdle || webTarget.cookie) {
14670
+ console.warn(
14671
+ "puppeteer options (userAgent, viewportWidth, viewportHeight, viewportScale, waitForNetworkIdle, cookie) are not supported in bridge mode. They will be ignored."
14672
+ );
14673
+ }
14674
+ const agent = new AgentOverChromeBridge({
14675
+ closeNewTabsAfterDisconnect: webTarget.closeNewTabsAfterDisconnect,
14676
+ cacheId: fileName
14638
14677
  });
14639
- if (target.url.startsWith("/")) {
14640
- urlToVisit = `http://${serverAddress?.address}:${serverAddress?.port}${target.url}`;
14678
+ if (webTarget.bridgeMode === "newTabWithUrl") {
14679
+ await agent.connectNewTabWithUrl(webTarget.url);
14641
14680
  } else {
14642
- urlToVisit = `http://${serverAddress?.address}:${serverAddress?.port}/${target.url}`;
14681
+ if (webTarget.url) {
14682
+ console.warn(
14683
+ 'url will be ignored in bridge mode with "currentTab"'
14684
+ );
14685
+ }
14686
+ await agent.connectCurrentTab();
14643
14687
  }
14644
- target.url = urlToVisit;
14688
+ freeFn.push({
14689
+ name: "destroy_agent_over_chrome_bridge",
14690
+ fn: () => agent.destroy()
14691
+ });
14692
+ return {
14693
+ agent,
14694
+ freeFn
14695
+ };
14645
14696
  }
14646
- if (!target.bridgeMode) {
14647
- const { agent: agent2, freeFn: newFreeFn } = await puppeteerAgentForTarget(
14648
- target,
14649
- preference
14650
- );
14651
- freeFn.push(...newFreeFn);
14652
- return { agent: agent2, freeFn };
14697
+ if (script.android) {
14698
+ const androidTarget = script.android;
14699
+ const agent = await agentFromAdbDevice(androidTarget.deviceId);
14700
+ await agent.launch(androidTarget.launch);
14701
+ freeFn.push({
14702
+ name: "destroy_android_agent",
14703
+ fn: () => agent.destroy()
14704
+ });
14705
+ return { agent, freeFn };
14653
14706
  }
14654
- assert(
14655
- target.bridgeMode === "newTabWithUrl" || target.bridgeMode === "currentTab",
14656
- `bridgeMode config value must be either "newTabWithUrl" or "currentTab", but got ${target.bridgeMode}`
14707
+ throw new Error(
14708
+ 'No valid target configuration found in the yaml script, should be either "web" or "android"'
14657
14709
  );
14658
- if (target.userAgent || target.viewportWidth || target.viewportHeight || target.viewportScale || target.waitForNetworkIdle || target.cookie) {
14659
- console.warn(
14660
- "puppeteer options (userAgent, viewportWidth, viewportHeight, viewportScale, waitForNetworkIdle, cookie) are not supported in bridge mode. They will be ignored."
14661
- );
14662
- }
14663
- const agent = new AgentOverChromeBridge({
14664
- closeNewTabsAfterDisconnect: target.closeNewTabsAfterDisconnect,
14665
- cacheId: fileName
14666
- });
14667
- if (target.bridgeMode === "newTabWithUrl") {
14668
- await agent.connectNewTabWithUrl(target.url);
14669
- } else {
14670
- if (target.url) {
14671
- console.warn('url will be ignored in bridge mode with "currentTab"');
14672
- }
14673
- await agent.connectCurrentTab();
14674
- }
14675
- freeFn.push({
14676
- name: "destroy_agent_over_chrome_bridge",
14677
- fn: () => agent.destroy()
14678
- });
14679
- return {
14680
- agent,
14681
- freeFn
14682
- };
14683
14710
  });
14684
14711
  fileContextList.push({ file, player });
14685
14712
  }