@midscene/android 1.9.5 → 1.9.6-beta-20260612050456.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/cli.mjs CHANGED
@@ -4,6 +4,7 @@ import * as __rspack_external_node_module_ab9f2194 from "node:module";
4
4
  import * as __rspack_external_node_path_c5b9b54f from "node:path";
5
5
  import { createReportCliCommands, getMidsceneLocationSchema, z } from "@midscene/core";
6
6
  import { reportCLIError, runToolsCLI } from "@midscene/shared/cli";
7
+ import { agentBehaviorInitArgShape, extractAgentBehaviorInitArgs, getAgentInitArgsSignature } from "@midscene/shared/mcp/agent-behavior-init-args";
7
8
  import { BaseMidsceneTools } from "@midscene/shared/mcp/base-tools";
8
9
  import { Agent } from "@midscene/core/agent";
9
10
  import { mergeAndNormalizeAppNameMapping, normalizeForComparison, repeat } from "@midscene/shared/utils";
@@ -1950,6 +1951,19 @@ function mcp_tools_define_property(obj, key, value) {
1950
1951
  return obj;
1951
1952
  }
1952
1953
  const debug = (0, logger_.getDebug)('mcp:android-tools');
1954
+ function adaptAndroidInitArgs(extracted) {
1955
+ if (!extracted) return;
1956
+ const initArgs = {
1957
+ ...'string' == typeof extracted.deviceId ? {
1958
+ deviceId: extracted.deviceId
1959
+ } : {},
1960
+ ...'boolean' == typeof extracted.useScrcpy ? {
1961
+ useScrcpy: extracted.useScrcpy
1962
+ } : {},
1963
+ ...extractAgentBehaviorInitArgs(extracted) ?? {}
1964
+ };
1965
+ return Object.keys(initArgs).length > 0 ? initArgs : void 0;
1966
+ }
1953
1967
  class AndroidMidsceneTools extends BaseMidsceneTools {
1954
1968
  getCliReportSessionName() {
1955
1969
  return 'midscene-android';
@@ -1959,7 +1973,8 @@ class AndroidMidsceneTools extends BaseMidsceneTools {
1959
1973
  }
1960
1974
  async ensureAgent(initArgs) {
1961
1975
  const deviceId = initArgs?.deviceId;
1962
- if (this.agent && deviceId) {
1976
+ const nextSignature = getAgentInitArgsSignature(initArgs);
1977
+ if (this.agent && nextSignature && nextSignature !== this.lastInitArgsSignature) {
1963
1978
  try {
1964
1979
  await this.agent.destroy?.();
1965
1980
  } catch (error) {
@@ -1972,6 +1987,7 @@ class AndroidMidsceneTools extends BaseMidsceneTools {
1972
1987
  const reportOptions = this.readCliReportAgentOptions();
1973
1988
  const agent = await agentFromAdbDevice(deviceId, {
1974
1989
  autoDismissKeyboard: false,
1990
+ ...extractAgentBehaviorInitArgs(initArgs) ?? {},
1975
1991
  ...initArgs?.useScrcpy ? {
1976
1992
  scrcpyConfig: {
1977
1993
  enabled: true
@@ -1980,6 +1996,7 @@ class AndroidMidsceneTools extends BaseMidsceneTools {
1980
1996
  ...reportOptions ?? {}
1981
1997
  });
1982
1998
  this.agent = agent;
1999
+ this.lastInitArgsSignature = nextSignature;
1983
2000
  return agent;
1984
2001
  }
1985
2002
  preparePlatformTools() {
@@ -2001,6 +2018,7 @@ class AndroidMidsceneTools extends BaseMidsceneTools {
2001
2018
  debug('Failed to destroy agent during connect:', error);
2002
2019
  }
2003
2020
  this.agent = void 0;
2021
+ this.lastInitArgsSignature = void 0;
2004
2022
  }
2005
2023
  const agent = await this.ensureAgent(initArgs);
2006
2024
  const screenshot = await agent.page.screenshotBase64();
@@ -2025,26 +2043,24 @@ class AndroidMidsceneTools extends BaseMidsceneTools {
2025
2043
  ];
2026
2044
  }
2027
2045
  constructor(...args){
2028
- super(...args), mcp_tools_define_property(this, "initArgSpec", {
2046
+ super(...args), mcp_tools_define_property(this, "lastInitArgsSignature", void 0), mcp_tools_define_property(this, "initArgSpec", {
2029
2047
  namespace: 'android',
2030
2048
  shape: {
2031
2049
  deviceId: z.string().optional().describe('Android device ID (from adb devices)'),
2032
- useScrcpy: z.boolean().optional().describe('Enable scrcpy accelerated screenshots')
2050
+ useScrcpy: z.boolean().optional().describe('Enable scrcpy accelerated screenshots'),
2051
+ ...agentBehaviorInitArgShape
2033
2052
  },
2034
2053
  cli: {
2035
2054
  preferBareKeys: true
2036
2055
  },
2037
- adapt: (extracted)=>({
2038
- deviceId: extracted?.deviceId,
2039
- useScrcpy: extracted?.useScrcpy
2040
- })
2056
+ adapt: adaptAndroidInitArgs
2041
2057
  });
2042
2058
  }
2043
2059
  }
2044
2060
  const tools = new AndroidMidsceneTools();
2045
2061
  runToolsCLI(tools, 'midscene-android', {
2046
2062
  stripPrefix: 'android_',
2047
- version: "1.9.5",
2063
+ version: "1.9.6-beta-20260612050456.0",
2048
2064
  extraCommands: createReportCliCommands()
2049
2065
  }).catch((e)=>{
2050
2066
  process.exit(reportCLIError(e));
package/dist/es/index.mjs CHANGED
@@ -12,6 +12,7 @@ import { createImgBase64ByFormat, validateScreenshotBuffer } from "@midscene/sha
12
12
  import { mergeAndNormalizeAppNameMapping, normalizeForComparison, repeat } from "@midscene/shared/utils";
13
13
  import { ADB } from "appium-adb";
14
14
  import { Agent } from "@midscene/core/agent";
15
+ import { agentBehaviorInitArgShape, extractAgentBehaviorInitArgs, getAgentInitArgsSignature } from "@midscene/shared/mcp/agent-behavior-init-args";
15
16
  import { BaseMidsceneTools } from "@midscene/shared/mcp/base-tools";
16
17
  var __webpack_modules__ = {
17
18
  "./src/scrcpy-manager.ts" (__unused_rspack_module, __webpack_exports__, __webpack_require__) {
@@ -2016,6 +2017,19 @@ function mcp_tools_define_property(obj, key, value) {
2016
2017
  return obj;
2017
2018
  }
2018
2019
  const debug = (0, logger_.getDebug)('mcp:android-tools');
2020
+ function adaptAndroidInitArgs(extracted) {
2021
+ if (!extracted) return;
2022
+ const initArgs = {
2023
+ ...'string' == typeof extracted.deviceId ? {
2024
+ deviceId: extracted.deviceId
2025
+ } : {},
2026
+ ...'boolean' == typeof extracted.useScrcpy ? {
2027
+ useScrcpy: extracted.useScrcpy
2028
+ } : {},
2029
+ ...extractAgentBehaviorInitArgs(extracted) ?? {}
2030
+ };
2031
+ return Object.keys(initArgs).length > 0 ? initArgs : void 0;
2032
+ }
2019
2033
  class AndroidMidsceneTools extends BaseMidsceneTools {
2020
2034
  getCliReportSessionName() {
2021
2035
  return 'midscene-android';
@@ -2025,7 +2039,8 @@ class AndroidMidsceneTools extends BaseMidsceneTools {
2025
2039
  }
2026
2040
  async ensureAgent(initArgs) {
2027
2041
  const deviceId = initArgs?.deviceId;
2028
- if (this.agent && deviceId) {
2042
+ const nextSignature = getAgentInitArgsSignature(initArgs);
2043
+ if (this.agent && nextSignature && nextSignature !== this.lastInitArgsSignature) {
2029
2044
  try {
2030
2045
  await this.agent.destroy?.();
2031
2046
  } catch (error) {
@@ -2038,6 +2053,7 @@ class AndroidMidsceneTools extends BaseMidsceneTools {
2038
2053
  const reportOptions = this.readCliReportAgentOptions();
2039
2054
  const agent = await agentFromAdbDevice(deviceId, {
2040
2055
  autoDismissKeyboard: false,
2056
+ ...extractAgentBehaviorInitArgs(initArgs) ?? {},
2041
2057
  ...initArgs?.useScrcpy ? {
2042
2058
  scrcpyConfig: {
2043
2059
  enabled: true
@@ -2046,6 +2062,7 @@ class AndroidMidsceneTools extends BaseMidsceneTools {
2046
2062
  ...reportOptions ?? {}
2047
2063
  });
2048
2064
  this.agent = agent;
2065
+ this.lastInitArgsSignature = nextSignature;
2049
2066
  return agent;
2050
2067
  }
2051
2068
  preparePlatformTools() {
@@ -2067,6 +2084,7 @@ class AndroidMidsceneTools extends BaseMidsceneTools {
2067
2084
  debug('Failed to destroy agent during connect:', error);
2068
2085
  }
2069
2086
  this.agent = void 0;
2087
+ this.lastInitArgsSignature = void 0;
2070
2088
  }
2071
2089
  const agent = await this.ensureAgent(initArgs);
2072
2090
  const screenshot = await agent.page.screenshotBase64();
@@ -2091,19 +2109,17 @@ class AndroidMidsceneTools extends BaseMidsceneTools {
2091
2109
  ];
2092
2110
  }
2093
2111
  constructor(...args){
2094
- super(...args), mcp_tools_define_property(this, "initArgSpec", {
2112
+ super(...args), mcp_tools_define_property(this, "lastInitArgsSignature", void 0), mcp_tools_define_property(this, "initArgSpec", {
2095
2113
  namespace: 'android',
2096
2114
  shape: {
2097
2115
  deviceId: z.string().optional().describe('Android device ID (from adb devices)'),
2098
- useScrcpy: z.boolean().optional().describe('Enable scrcpy accelerated screenshots')
2116
+ useScrcpy: z.boolean().optional().describe('Enable scrcpy accelerated screenshots'),
2117
+ ...agentBehaviorInitArgShape
2099
2118
  },
2100
2119
  cli: {
2101
2120
  preferBareKeys: true
2102
2121
  },
2103
- adapt: (extracted)=>({
2104
- deviceId: extracted?.deviceId,
2105
- useScrcpy: extracted?.useScrcpy
2106
- })
2122
+ adapt: adaptAndroidInitArgs
2107
2123
  });
2108
2124
  }
2109
2125
  }
@@ -13,6 +13,7 @@ import { getTmpFile, sleep } from "@midscene/core/utils";
13
13
  import { MIDSCENE_ADB_PATH, MIDSCENE_ADB_REMOTE_HOST, MIDSCENE_ADB_REMOTE_PORT, MIDSCENE_ANDROID_IME_STRATEGY, globalConfigManager } from "@midscene/shared/env";
14
14
  import { createImgBase64ByFormat, validateScreenshotBuffer } from "@midscene/shared/img";
15
15
  import { ADB as external_appium_adb_ADB } from "appium-adb";
16
+ import { agentBehaviorInitArgShape, extractAgentBehaviorInitArgs, getAgentInitArgsSignature } from "@midscene/shared/mcp/agent-behavior-init-args";
16
17
  import { BaseMidsceneTools } from "@midscene/shared/mcp/base-tools";
17
18
  var __webpack_modules__ = {
18
19
  "./src/scrcpy-manager.ts" (__unused_rspack_module, __webpack_exports__, __webpack_require__) {
@@ -1950,6 +1951,19 @@ function mcp_tools_define_property(obj, key, value) {
1950
1951
  return obj;
1951
1952
  }
1952
1953
  const debug = (0, logger_.getDebug)('mcp:android-tools');
1954
+ function adaptAndroidInitArgs(extracted) {
1955
+ if (!extracted) return;
1956
+ const initArgs = {
1957
+ ...'string' == typeof extracted.deviceId ? {
1958
+ deviceId: extracted.deviceId
1959
+ } : {},
1960
+ ...'boolean' == typeof extracted.useScrcpy ? {
1961
+ useScrcpy: extracted.useScrcpy
1962
+ } : {},
1963
+ ...extractAgentBehaviorInitArgs(extracted) ?? {}
1964
+ };
1965
+ return Object.keys(initArgs).length > 0 ? initArgs : void 0;
1966
+ }
1953
1967
  class AndroidMidsceneTools extends BaseMidsceneTools {
1954
1968
  getCliReportSessionName() {
1955
1969
  return 'midscene-android';
@@ -1959,7 +1973,8 @@ class AndroidMidsceneTools extends BaseMidsceneTools {
1959
1973
  }
1960
1974
  async ensureAgent(initArgs) {
1961
1975
  const deviceId = initArgs?.deviceId;
1962
- if (this.agent && deviceId) {
1976
+ const nextSignature = getAgentInitArgsSignature(initArgs);
1977
+ if (this.agent && nextSignature && nextSignature !== this.lastInitArgsSignature) {
1963
1978
  try {
1964
1979
  await this.agent.destroy?.();
1965
1980
  } catch (error) {
@@ -1972,6 +1987,7 @@ class AndroidMidsceneTools extends BaseMidsceneTools {
1972
1987
  const reportOptions = this.readCliReportAgentOptions();
1973
1988
  const agent = await agentFromAdbDevice(deviceId, {
1974
1989
  autoDismissKeyboard: false,
1990
+ ...extractAgentBehaviorInitArgs(initArgs) ?? {},
1975
1991
  ...initArgs?.useScrcpy ? {
1976
1992
  scrcpyConfig: {
1977
1993
  enabled: true
@@ -1980,6 +1996,7 @@ class AndroidMidsceneTools extends BaseMidsceneTools {
1980
1996
  ...reportOptions ?? {}
1981
1997
  });
1982
1998
  this.agent = agent;
1999
+ this.lastInitArgsSignature = nextSignature;
1983
2000
  return agent;
1984
2001
  }
1985
2002
  preparePlatformTools() {
@@ -2001,6 +2018,7 @@ class AndroidMidsceneTools extends BaseMidsceneTools {
2001
2018
  debug('Failed to destroy agent during connect:', error);
2002
2019
  }
2003
2020
  this.agent = void 0;
2021
+ this.lastInitArgsSignature = void 0;
2004
2022
  }
2005
2023
  const agent = await this.ensureAgent(initArgs);
2006
2024
  const screenshot = await agent.page.screenshotBase64();
@@ -2025,19 +2043,17 @@ class AndroidMidsceneTools extends BaseMidsceneTools {
2025
2043
  ];
2026
2044
  }
2027
2045
  constructor(...args){
2028
- super(...args), mcp_tools_define_property(this, "initArgSpec", {
2046
+ super(...args), mcp_tools_define_property(this, "lastInitArgsSignature", void 0), mcp_tools_define_property(this, "initArgSpec", {
2029
2047
  namespace: 'android',
2030
2048
  shape: {
2031
2049
  deviceId: z.string().optional().describe('Android device ID (from adb devices)'),
2032
- useScrcpy: z.boolean().optional().describe('Enable scrcpy accelerated screenshots')
2050
+ useScrcpy: z.boolean().optional().describe('Enable scrcpy accelerated screenshots'),
2051
+ ...agentBehaviorInitArgShape
2033
2052
  },
2034
2053
  cli: {
2035
2054
  preferBareKeys: true
2036
2055
  },
2037
- adapt: (extracted)=>({
2038
- deviceId: extracted?.deviceId,
2039
- useScrcpy: extracted?.useScrcpy
2040
- })
2056
+ adapt: adaptAndroidInitArgs
2041
2057
  });
2042
2058
  }
2043
2059
  }
@@ -2048,7 +2064,7 @@ class AndroidMCPServer extends BaseMCPServer {
2048
2064
  constructor(toolsManager){
2049
2065
  super({
2050
2066
  name: '@midscene/android-mcp',
2051
- version: "1.9.5",
2067
+ version: "1.9.6-beta-20260612050456.0",
2052
2068
  description: 'Control the Android device using natural language commands'
2053
2069
  }, toolsManager);
2054
2070
  }
package/dist/lib/cli.js CHANGED
@@ -449,6 +449,7 @@ var __webpack_exports__ = {};
449
449
  const core_namespaceObject = require("@midscene/core");
450
450
  const cli_namespaceObject = require("@midscene/shared/cli");
451
451
  var logger_ = __webpack_require__("@midscene/shared/logger");
452
+ const agent_behavior_init_args_namespaceObject = require("@midscene/shared/mcp/agent-behavior-init-args");
452
453
  const base_tools_namespaceObject = require("@midscene/shared/mcp/base-tools");
453
454
  const agent_namespaceObject = require("@midscene/core/agent");
454
455
  const utils_namespaceObject = require("@midscene/shared/utils");
@@ -1965,6 +1966,19 @@ ${Object.keys(size).filter((key)=>size[key]).map((key)=>` ${key} size: ${size[k
1965
1966
  return obj;
1966
1967
  }
1967
1968
  const debug = (0, logger_.getDebug)('mcp:android-tools');
1969
+ function adaptAndroidInitArgs(extracted) {
1970
+ if (!extracted) return;
1971
+ const initArgs = {
1972
+ ...'string' == typeof extracted.deviceId ? {
1973
+ deviceId: extracted.deviceId
1974
+ } : {},
1975
+ ...'boolean' == typeof extracted.useScrcpy ? {
1976
+ useScrcpy: extracted.useScrcpy
1977
+ } : {},
1978
+ ...(0, agent_behavior_init_args_namespaceObject.extractAgentBehaviorInitArgs)(extracted) ?? {}
1979
+ };
1980
+ return Object.keys(initArgs).length > 0 ? initArgs : void 0;
1981
+ }
1968
1982
  class AndroidMidsceneTools extends base_tools_namespaceObject.BaseMidsceneTools {
1969
1983
  getCliReportSessionName() {
1970
1984
  return 'midscene-android';
@@ -1974,7 +1988,8 @@ ${Object.keys(size).filter((key)=>size[key]).map((key)=>` ${key} size: ${size[k
1974
1988
  }
1975
1989
  async ensureAgent(initArgs) {
1976
1990
  const deviceId = initArgs?.deviceId;
1977
- if (this.agent && deviceId) {
1991
+ const nextSignature = (0, agent_behavior_init_args_namespaceObject.getAgentInitArgsSignature)(initArgs);
1992
+ if (this.agent && nextSignature && nextSignature !== this.lastInitArgsSignature) {
1978
1993
  try {
1979
1994
  await this.agent.destroy?.();
1980
1995
  } catch (error) {
@@ -1987,6 +2002,7 @@ ${Object.keys(size).filter((key)=>size[key]).map((key)=>` ${key} size: ${size[k
1987
2002
  const reportOptions = this.readCliReportAgentOptions();
1988
2003
  const agent = await agentFromAdbDevice(deviceId, {
1989
2004
  autoDismissKeyboard: false,
2005
+ ...(0, agent_behavior_init_args_namespaceObject.extractAgentBehaviorInitArgs)(initArgs) ?? {},
1990
2006
  ...initArgs?.useScrcpy ? {
1991
2007
  scrcpyConfig: {
1992
2008
  enabled: true
@@ -1995,6 +2011,7 @@ ${Object.keys(size).filter((key)=>size[key]).map((key)=>` ${key} size: ${size[k
1995
2011
  ...reportOptions ?? {}
1996
2012
  });
1997
2013
  this.agent = agent;
2014
+ this.lastInitArgsSignature = nextSignature;
1998
2015
  return agent;
1999
2016
  }
2000
2017
  preparePlatformTools() {
@@ -2016,6 +2033,7 @@ ${Object.keys(size).filter((key)=>size[key]).map((key)=>` ${key} size: ${size[k
2016
2033
  debug('Failed to destroy agent during connect:', error);
2017
2034
  }
2018
2035
  this.agent = void 0;
2036
+ this.lastInitArgsSignature = void 0;
2019
2037
  }
2020
2038
  const agent = await this.ensureAgent(initArgs);
2021
2039
  const screenshot = await agent.page.screenshotBase64();
@@ -2040,26 +2058,24 @@ ${Object.keys(size).filter((key)=>size[key]).map((key)=>` ${key} size: ${size[k
2040
2058
  ];
2041
2059
  }
2042
2060
  constructor(...args){
2043
- super(...args), mcp_tools_define_property(this, "initArgSpec", {
2061
+ super(...args), mcp_tools_define_property(this, "lastInitArgsSignature", void 0), mcp_tools_define_property(this, "initArgSpec", {
2044
2062
  namespace: 'android',
2045
2063
  shape: {
2046
2064
  deviceId: core_namespaceObject.z.string().optional().describe('Android device ID (from adb devices)'),
2047
- useScrcpy: core_namespaceObject.z.boolean().optional().describe('Enable scrcpy accelerated screenshots')
2065
+ useScrcpy: core_namespaceObject.z.boolean().optional().describe('Enable scrcpy accelerated screenshots'),
2066
+ ...agent_behavior_init_args_namespaceObject.agentBehaviorInitArgShape
2048
2067
  },
2049
2068
  cli: {
2050
2069
  preferBareKeys: true
2051
2070
  },
2052
- adapt: (extracted)=>({
2053
- deviceId: extracted?.deviceId,
2054
- useScrcpy: extracted?.useScrcpy
2055
- })
2071
+ adapt: adaptAndroidInitArgs
2056
2072
  });
2057
2073
  }
2058
2074
  }
2059
2075
  const tools = new AndroidMidsceneTools();
2060
2076
  (0, cli_namespaceObject.runToolsCLI)(tools, 'midscene-android', {
2061
2077
  stripPrefix: 'android_',
2062
- version: "1.9.5",
2078
+ version: "1.9.6-beta-20260612050456.0",
2063
2079
  extraCommands: (0, core_namespaceObject.createReportCliCommands)()
2064
2080
  }).catch((e)=>{
2065
2081
  process.exit((0, cli_namespaceObject.reportCLIError)(e));
package/dist/lib/index.js CHANGED
@@ -2040,6 +2040,7 @@ ${Object.keys(size).filter((key)=>size[key]).map((key)=>` ${key} size: ${size[k
2040
2040
  await device.connect();
2041
2041
  return new AndroidAgent(device, opts);
2042
2042
  }
2043
+ const agent_behavior_init_args_namespaceObject = require("@midscene/shared/mcp/agent-behavior-init-args");
2043
2044
  const base_tools_namespaceObject = require("@midscene/shared/mcp/base-tools");
2044
2045
  function mcp_tools_define_property(obj, key, value) {
2045
2046
  if (key in obj) Object.defineProperty(obj, key, {
@@ -2052,6 +2053,19 @@ ${Object.keys(size).filter((key)=>size[key]).map((key)=>` ${key} size: ${size[k
2052
2053
  return obj;
2053
2054
  }
2054
2055
  const debug = (0, logger_.getDebug)('mcp:android-tools');
2056
+ function adaptAndroidInitArgs(extracted) {
2057
+ if (!extracted) return;
2058
+ const initArgs = {
2059
+ ...'string' == typeof extracted.deviceId ? {
2060
+ deviceId: extracted.deviceId
2061
+ } : {},
2062
+ ...'boolean' == typeof extracted.useScrcpy ? {
2063
+ useScrcpy: extracted.useScrcpy
2064
+ } : {},
2065
+ ...(0, agent_behavior_init_args_namespaceObject.extractAgentBehaviorInitArgs)(extracted) ?? {}
2066
+ };
2067
+ return Object.keys(initArgs).length > 0 ? initArgs : void 0;
2068
+ }
2055
2069
  class AndroidMidsceneTools extends base_tools_namespaceObject.BaseMidsceneTools {
2056
2070
  getCliReportSessionName() {
2057
2071
  return 'midscene-android';
@@ -2061,7 +2075,8 @@ ${Object.keys(size).filter((key)=>size[key]).map((key)=>` ${key} size: ${size[k
2061
2075
  }
2062
2076
  async ensureAgent(initArgs) {
2063
2077
  const deviceId = initArgs?.deviceId;
2064
- if (this.agent && deviceId) {
2078
+ const nextSignature = (0, agent_behavior_init_args_namespaceObject.getAgentInitArgsSignature)(initArgs);
2079
+ if (this.agent && nextSignature && nextSignature !== this.lastInitArgsSignature) {
2065
2080
  try {
2066
2081
  await this.agent.destroy?.();
2067
2082
  } catch (error) {
@@ -2074,6 +2089,7 @@ ${Object.keys(size).filter((key)=>size[key]).map((key)=>` ${key} size: ${size[k
2074
2089
  const reportOptions = this.readCliReportAgentOptions();
2075
2090
  const agent = await agentFromAdbDevice(deviceId, {
2076
2091
  autoDismissKeyboard: false,
2092
+ ...(0, agent_behavior_init_args_namespaceObject.extractAgentBehaviorInitArgs)(initArgs) ?? {},
2077
2093
  ...initArgs?.useScrcpy ? {
2078
2094
  scrcpyConfig: {
2079
2095
  enabled: true
@@ -2082,6 +2098,7 @@ ${Object.keys(size).filter((key)=>size[key]).map((key)=>` ${key} size: ${size[k
2082
2098
  ...reportOptions ?? {}
2083
2099
  });
2084
2100
  this.agent = agent;
2101
+ this.lastInitArgsSignature = nextSignature;
2085
2102
  return agent;
2086
2103
  }
2087
2104
  preparePlatformTools() {
@@ -2103,6 +2120,7 @@ ${Object.keys(size).filter((key)=>size[key]).map((key)=>` ${key} size: ${size[k
2103
2120
  debug('Failed to destroy agent during connect:', error);
2104
2121
  }
2105
2122
  this.agent = void 0;
2123
+ this.lastInitArgsSignature = void 0;
2106
2124
  }
2107
2125
  const agent = await this.ensureAgent(initArgs);
2108
2126
  const screenshot = await agent.page.screenshotBase64();
@@ -2127,19 +2145,17 @@ ${Object.keys(size).filter((key)=>size[key]).map((key)=>` ${key} size: ${size[k
2127
2145
  ];
2128
2146
  }
2129
2147
  constructor(...args){
2130
- super(...args), mcp_tools_define_property(this, "initArgSpec", {
2148
+ super(...args), mcp_tools_define_property(this, "lastInitArgsSignature", void 0), mcp_tools_define_property(this, "initArgSpec", {
2131
2149
  namespace: 'android',
2132
2150
  shape: {
2133
2151
  deviceId: core_namespaceObject.z.string().optional().describe('Android device ID (from adb devices)'),
2134
- useScrcpy: core_namespaceObject.z.boolean().optional().describe('Enable scrcpy accelerated screenshots')
2152
+ useScrcpy: core_namespaceObject.z.boolean().optional().describe('Enable scrcpy accelerated screenshots'),
2153
+ ...agent_behavior_init_args_namespaceObject.agentBehaviorInitArgShape
2135
2154
  },
2136
2155
  cli: {
2137
2156
  preferBareKeys: true
2138
2157
  },
2139
- adapt: (extracted)=>({
2140
- deviceId: extracted?.deviceId,
2141
- useScrcpy: extracted?.useScrcpy
2142
- })
2158
+ adapt: adaptAndroidInitArgs
2143
2159
  });
2144
2160
  }
2145
2161
  }
@@ -1969,6 +1969,7 @@ ${Object.keys(size).filter((key)=>size[key]).map((key)=>` ${key} size: ${size[k
1969
1969
  await device.connect();
1970
1970
  return new AndroidAgent(device, opts);
1971
1971
  }
1972
+ const agent_behavior_init_args_namespaceObject = require("@midscene/shared/mcp/agent-behavior-init-args");
1972
1973
  const base_tools_namespaceObject = require("@midscene/shared/mcp/base-tools");
1973
1974
  function mcp_tools_define_property(obj, key, value) {
1974
1975
  if (key in obj) Object.defineProperty(obj, key, {
@@ -1981,6 +1982,19 @@ ${Object.keys(size).filter((key)=>size[key]).map((key)=>` ${key} size: ${size[k
1981
1982
  return obj;
1982
1983
  }
1983
1984
  const debug = (0, logger_.getDebug)('mcp:android-tools');
1985
+ function adaptAndroidInitArgs(extracted) {
1986
+ if (!extracted) return;
1987
+ const initArgs = {
1988
+ ...'string' == typeof extracted.deviceId ? {
1989
+ deviceId: extracted.deviceId
1990
+ } : {},
1991
+ ...'boolean' == typeof extracted.useScrcpy ? {
1992
+ useScrcpy: extracted.useScrcpy
1993
+ } : {},
1994
+ ...(0, agent_behavior_init_args_namespaceObject.extractAgentBehaviorInitArgs)(extracted) ?? {}
1995
+ };
1996
+ return Object.keys(initArgs).length > 0 ? initArgs : void 0;
1997
+ }
1984
1998
  class AndroidMidsceneTools extends base_tools_namespaceObject.BaseMidsceneTools {
1985
1999
  getCliReportSessionName() {
1986
2000
  return 'midscene-android';
@@ -1990,7 +2004,8 @@ ${Object.keys(size).filter((key)=>size[key]).map((key)=>` ${key} size: ${size[k
1990
2004
  }
1991
2005
  async ensureAgent(initArgs) {
1992
2006
  const deviceId = initArgs?.deviceId;
1993
- if (this.agent && deviceId) {
2007
+ const nextSignature = (0, agent_behavior_init_args_namespaceObject.getAgentInitArgsSignature)(initArgs);
2008
+ if (this.agent && nextSignature && nextSignature !== this.lastInitArgsSignature) {
1994
2009
  try {
1995
2010
  await this.agent.destroy?.();
1996
2011
  } catch (error) {
@@ -2003,6 +2018,7 @@ ${Object.keys(size).filter((key)=>size[key]).map((key)=>` ${key} size: ${size[k
2003
2018
  const reportOptions = this.readCliReportAgentOptions();
2004
2019
  const agent = await agentFromAdbDevice(deviceId, {
2005
2020
  autoDismissKeyboard: false,
2021
+ ...(0, agent_behavior_init_args_namespaceObject.extractAgentBehaviorInitArgs)(initArgs) ?? {},
2006
2022
  ...initArgs?.useScrcpy ? {
2007
2023
  scrcpyConfig: {
2008
2024
  enabled: true
@@ -2011,6 +2027,7 @@ ${Object.keys(size).filter((key)=>size[key]).map((key)=>` ${key} size: ${size[k
2011
2027
  ...reportOptions ?? {}
2012
2028
  });
2013
2029
  this.agent = agent;
2030
+ this.lastInitArgsSignature = nextSignature;
2014
2031
  return agent;
2015
2032
  }
2016
2033
  preparePlatformTools() {
@@ -2032,6 +2049,7 @@ ${Object.keys(size).filter((key)=>size[key]).map((key)=>` ${key} size: ${size[k
2032
2049
  debug('Failed to destroy agent during connect:', error);
2033
2050
  }
2034
2051
  this.agent = void 0;
2052
+ this.lastInitArgsSignature = void 0;
2035
2053
  }
2036
2054
  const agent = await this.ensureAgent(initArgs);
2037
2055
  const screenshot = await agent.page.screenshotBase64();
@@ -2056,19 +2074,17 @@ ${Object.keys(size).filter((key)=>size[key]).map((key)=>` ${key} size: ${size[k
2056
2074
  ];
2057
2075
  }
2058
2076
  constructor(...args){
2059
- super(...args), mcp_tools_define_property(this, "initArgSpec", {
2077
+ super(...args), mcp_tools_define_property(this, "lastInitArgsSignature", void 0), mcp_tools_define_property(this, "initArgSpec", {
2060
2078
  namespace: 'android',
2061
2079
  shape: {
2062
2080
  deviceId: core_namespaceObject.z.string().optional().describe('Android device ID (from adb devices)'),
2063
- useScrcpy: core_namespaceObject.z.boolean().optional().describe('Enable scrcpy accelerated screenshots')
2081
+ useScrcpy: core_namespaceObject.z.boolean().optional().describe('Enable scrcpy accelerated screenshots'),
2082
+ ...agent_behavior_init_args_namespaceObject.agentBehaviorInitArgShape
2064
2083
  },
2065
2084
  cli: {
2066
2085
  preferBareKeys: true
2067
2086
  },
2068
- adapt: (extracted)=>({
2069
- deviceId: extracted?.deviceId,
2070
- useScrcpy: extracted?.useScrcpy
2071
- })
2087
+ adapt: adaptAndroidInitArgs
2072
2088
  });
2073
2089
  }
2074
2090
  }
@@ -2079,7 +2095,7 @@ ${Object.keys(size).filter((key)=>size[key]).map((key)=>` ${key} size: ${size[k
2079
2095
  constructor(toolsManager){
2080
2096
  super({
2081
2097
  name: '@midscene/android-mcp',
2082
- version: "1.9.5",
2098
+ version: "1.9.6-beta-20260612050456.0",
2083
2099
  description: 'Control the Android device using natural language commands'
2084
2100
  }, toolsManager);
2085
2101
  }
@@ -4,6 +4,7 @@ import type { ActionReturn } from '@midscene/core';
4
4
  import { ADB } from 'appium-adb';
5
5
  import type { Adb } from '@yume-chan/adb';
6
6
  import { Agent } from '@midscene/core/agent';
7
+ import { AgentBehaviorInitArgs } from '@midscene/shared/mcp/agent-behavior-init-args';
7
8
  import { AgentOpt } from '@midscene/core/agent';
8
9
  import { AndroidDeviceInputOpt } from '@midscene/core/device';
9
10
  import { AndroidDeviceOpt } from '@midscene/core/device';
@@ -234,24 +235,21 @@ export declare class AndroidDevice implements AbstractInterface {
234
235
  hideKeyboard(options?: AndroidDeviceInputOpt, timeoutMs?: number): Promise<boolean>;
235
236
  }
236
237
 
238
+ declare type AndroidInitArgs = AgentBehaviorInitArgs & {
239
+ deviceId?: string;
240
+ useScrcpy?: boolean;
241
+ };
242
+
237
243
  /**
238
244
  * Android-specific tools manager
239
245
  * Extends BaseMidsceneTools to provide Android ADB device connection tools
240
246
  */
241
- export declare class AndroidMidsceneTools extends BaseMidsceneTools<AndroidAgent, {
242
- deviceId?: string;
243
- useScrcpy?: boolean;
244
- }> {
247
+ export declare class AndroidMidsceneTools extends BaseMidsceneTools<AndroidAgent, AndroidInitArgs> {
248
+ private lastInitArgsSignature?;
245
249
  protected getCliReportSessionName(): string;
246
- protected readonly initArgSpec: InitArgSpec<{
247
- deviceId?: string;
248
- useScrcpy?: boolean;
249
- }>;
250
+ protected readonly initArgSpec: InitArgSpec<AndroidInitArgs>;
250
251
  protected createTemporaryDevice(): AndroidDevice;
251
- protected ensureAgent(initArgs?: {
252
- deviceId?: string;
253
- useScrcpy?: boolean;
254
- }): Promise<AndroidAgent>;
252
+ protected ensureAgent(initArgs?: AndroidInitArgs): Promise<AndroidAgent>;
255
253
  /**
256
254
  * Provide Android-specific platform tools
257
255
  */
@@ -3,6 +3,7 @@ import type { ActionParam } from '@midscene/core';
3
3
  import type { ActionReturn } from '@midscene/core';
4
4
  import { ADB } from 'appium-adb';
5
5
  import { Agent } from '@midscene/core/agent';
6
+ import { AgentBehaviorInitArgs } from '@midscene/shared/mcp/agent-behavior-init-args';
6
7
  import { AgentOpt } from '@midscene/core/agent';
7
8
  import { AndroidDeviceInputOpt } from '@midscene/core/device';
8
9
  import { AndroidDeviceOpt } from '@midscene/core/device';
@@ -226,6 +227,11 @@ declare class AndroidDevice implements AbstractInterface {
226
227
  hideKeyboard(options?: AndroidDeviceInputOpt, timeoutMs?: number): Promise<boolean>;
227
228
  }
228
229
 
230
+ declare type AndroidInitArgs = AgentBehaviorInitArgs & {
231
+ deviceId?: string;
232
+ useScrcpy?: boolean;
233
+ };
234
+
229
235
  /**
230
236
  * Android MCP Server
231
237
  * Provides MCP tools for Android automation through ADB
@@ -239,20 +245,12 @@ export declare class AndroidMCPServer extends BaseMCPServer {
239
245
  * Android-specific tools manager
240
246
  * Extends BaseMidsceneTools to provide Android ADB device connection tools
241
247
  */
242
- declare class AndroidMidsceneTools extends BaseMidsceneTools<AndroidAgent, {
243
- deviceId?: string;
244
- useScrcpy?: boolean;
245
- }> {
248
+ declare class AndroidMidsceneTools extends BaseMidsceneTools<AndroidAgent, AndroidInitArgs> {
249
+ private lastInitArgsSignature?;
246
250
  protected getCliReportSessionName(): string;
247
- protected readonly initArgSpec: InitArgSpec<{
248
- deviceId?: string;
249
- useScrcpy?: boolean;
250
- }>;
251
+ protected readonly initArgSpec: InitArgSpec<AndroidInitArgs>;
251
252
  protected createTemporaryDevice(): AndroidDevice;
252
- protected ensureAgent(initArgs?: {
253
- deviceId?: string;
254
- useScrcpy?: boolean;
255
- }): Promise<AndroidAgent>;
253
+ protected ensureAgent(initArgs?: AndroidInitArgs): Promise<AndroidAgent>;
256
254
  /**
257
255
  * Provide Android-specific platform tools
258
256
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@midscene/android",
3
- "version": "1.9.5",
3
+ "version": "1.9.6-beta-20260612050456.0",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/web-infra-dev/midscene.git",
@@ -46,8 +46,8 @@
46
46
  "@yume-chan/stream-extra": "2.1.0",
47
47
  "appium-adb": "12.12.1",
48
48
  "sharp": "^0.34.3",
49
- "@midscene/shared": "1.9.5",
50
- "@midscene/core": "1.9.5"
49
+ "@midscene/core": "1.9.6-beta-20260612050456.0",
50
+ "@midscene/shared": "1.9.6-beta-20260612050456.0"
51
51
  },
52
52
  "optionalDependencies": {
53
53
  "@ffmpeg-installer/ffmpeg": "^1.1.0"
@@ -61,7 +61,7 @@
61
61
  "undici": "^6.0.0",
62
62
  "vitest": "3.0.5",
63
63
  "zod": "^3.25.1",
64
- "@midscene/playground": "1.9.5"
64
+ "@midscene/playground": "1.9.6-beta-20260612050456.0"
65
65
  },
66
66
  "license": "MIT",
67
67
  "scripts": {