@midscene/computer 1.5.3 → 1.5.4-beta-20260310084708.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
@@ -290,6 +290,7 @@ Available Displays: ${displays.length > 0 ? displays.map((d)=>d.name).join(', ')
290
290
  }
291
291
  async healthCheck() {
292
292
  console.log('[HealthCheck] Starting health check...');
293
+ console.log("[HealthCheck] @midscene/computer v1.5.4-beta-20260310084708.0");
293
294
  console.log('[HealthCheck] Taking screenshot...');
294
295
  const screenshotTimeout = 15000;
295
296
  let timeoutId;
@@ -758,7 +759,8 @@ class ComputerMidsceneTools extends BaseMidsceneTools {
758
759
  }
759
760
  const tools = new ComputerMidsceneTools();
760
761
  runToolsCLI(tools, 'midscene-computer', {
761
- stripPrefix: 'computer_'
762
+ stripPrefix: 'computer_',
763
+ version: "1.5.4-beta-20260310084708.0"
762
764
  }).catch((e)=>{
763
765
  if (!(e instanceof CLIError)) console.error(e);
764
766
  process.exit(e instanceof CLIError ? e.exitCode : 1);
package/dist/es/index.mjs CHANGED
@@ -9,6 +9,7 @@ import { getDebug } from "@midscene/shared/logger";
9
9
  import screenshot_desktop from "screenshot-desktop";
10
10
  import { existsSync } from "node:fs";
11
11
  import { Agent } from "@midscene/core/agent";
12
+ import { BaseMidsceneTools } from "@midscene/shared/mcp";
12
13
  import { overrideAIConfig } from "@midscene/shared/env";
13
14
  const debugXvfb = getDebug('computer:xvfb');
14
15
  function checkXvfbInstalled() {
@@ -289,6 +290,7 @@ Available Displays: ${displays.length > 0 ? displays.map((d)=>d.name).join(', ')
289
290
  }
290
291
  async healthCheck() {
291
292
  console.log('[HealthCheck] Starting health check...');
293
+ console.log("[HealthCheck] @midscene/computer v1.5.4-beta-20260310084708.0");
292
294
  console.log('[HealthCheck] Taking screenshot...');
293
295
  const screenshotTimeout = 15000;
294
296
  let timeoutId;
@@ -679,6 +681,87 @@ async function agentFromComputer(opts) {
679
681
  await device.connect();
680
682
  return new ComputerAgent(device, opts);
681
683
  }
684
+ const debug = getDebug('mcp:computer-tools');
685
+ class ComputerMidsceneTools extends BaseMidsceneTools {
686
+ createTemporaryDevice() {
687
+ return new ComputerDevice({});
688
+ }
689
+ async ensureAgent(displayId, headless) {
690
+ if (this.agent && displayId) {
691
+ try {
692
+ await this.agent.destroy?.();
693
+ } catch (error) {
694
+ debug('Failed to destroy agent during cleanup:', error);
695
+ }
696
+ this.agent = void 0;
697
+ }
698
+ if (this.agent) return this.agent;
699
+ debug('Creating Computer agent with displayId:', displayId || 'primary');
700
+ const opts = {
701
+ ...displayId ? {
702
+ displayId
703
+ } : {},
704
+ ...void 0 !== headless ? {
705
+ headless
706
+ } : {}
707
+ };
708
+ const agent = await agentFromComputer(Object.keys(opts).length > 0 ? opts : void 0);
709
+ this.agent = agent;
710
+ return agent;
711
+ }
712
+ preparePlatformTools() {
713
+ return [
714
+ {
715
+ name: 'computer_connect',
716
+ description: 'Connect to computer desktop. Provide displayId to connect to a specific display (use computer_list_displays to get available IDs). If not provided, uses the primary display.',
717
+ schema: {
718
+ displayId: z.string().optional().describe('Display ID (from computer_list_displays)'),
719
+ headless: z.boolean().optional().describe('Start virtual display via Xvfb (Linux only)')
720
+ },
721
+ handler: async ({ displayId, headless })=>{
722
+ const agent = await this.ensureAgent(displayId, headless);
723
+ const screenshot = await agent.interface.screenshotBase64();
724
+ return {
725
+ content: [
726
+ {
727
+ type: 'text',
728
+ text: `Connected to computer${displayId ? ` (Display: ${displayId})` : ' (Primary display)'}`
729
+ },
730
+ ...this.buildScreenshotContent(screenshot)
731
+ ]
732
+ };
733
+ }
734
+ },
735
+ {
736
+ name: 'computer_disconnect',
737
+ description: 'Disconnect from computer and release resources',
738
+ schema: {},
739
+ handler: this.createDisconnectHandler('computer')
740
+ },
741
+ {
742
+ name: 'computer_list_displays',
743
+ description: 'List all available displays/monitors',
744
+ schema: {},
745
+ handler: async ()=>{
746
+ const displays = await ComputerDevice.listDisplays();
747
+ return {
748
+ content: [
749
+ {
750
+ type: 'text',
751
+ text: `Available displays:\n${displays.map((d)=>`- ${d.name} (ID: ${d.id})${d.primary ? ' [PRIMARY]' : ''}`).join('\n')}`
752
+ }
753
+ ]
754
+ };
755
+ }
756
+ }
757
+ ];
758
+ }
759
+ }
760
+ function version() {
761
+ const currentVersion = "1.5.4-beta-20260310084708.0";
762
+ console.log(`@midscene/computer v${currentVersion}`);
763
+ return currentVersion;
764
+ }
682
765
  function checkAccessibilityPermission(promptIfNeeded = false) {
683
766
  if ('darwin' !== process.platform) return {
684
767
  hasPermission: true,
@@ -744,4 +827,4 @@ async function checkComputerEnvironment() {
744
827
  async function getConnectedDisplays() {
745
828
  return ComputerDevice.listDisplays();
746
829
  }
747
- export { ComputerAgent, ComputerDevice, agentFromComputer, checkAccessibilityPermission, checkComputerEnvironment, checkXvfbInstalled, getConnectedDisplays, needsXvfb, overrideAIConfig };
830
+ export { ComputerAgent, ComputerDevice, ComputerMidsceneTools, agentFromComputer, checkAccessibilityPermission, checkComputerEnvironment, checkXvfbInstalled, getConnectedDisplays, needsXvfb, overrideAIConfig, version };
@@ -289,6 +289,7 @@ Available Displays: ${displays.length > 0 ? displays.map((d)=>d.name).join(', ')
289
289
  }
290
290
  async healthCheck() {
291
291
  console.log('[HealthCheck] Starting health check...');
292
+ console.log("[HealthCheck] @midscene/computer v1.5.4-beta-20260310084708.0");
292
293
  console.log('[HealthCheck] Taking screenshot...');
293
294
  const screenshotTimeout = 15000;
294
295
  let timeoutId;
@@ -762,7 +763,7 @@ class ComputerMCPServer extends BaseMCPServer {
762
763
  constructor(toolsManager){
763
764
  super({
764
765
  name: '@midscene/computer-mcp',
765
- version: __VERSION__,
766
+ version: "1.5.4-beta-20260310084708.0",
766
767
  description: 'Control the computer desktop using natural language commands'
767
768
  }, toolsManager);
768
769
  }
package/dist/lib/cli.js CHANGED
@@ -318,6 +318,7 @@ Available Displays: ${displays.length > 0 ? displays.map((d)=>d.name).join(', ')
318
318
  }
319
319
  async healthCheck() {
320
320
  console.log('[HealthCheck] Starting health check...');
321
+ console.log("[HealthCheck] @midscene/computer v1.5.4-beta-20260310084708.0");
321
322
  console.log('[HealthCheck] Taking screenshot...');
322
323
  const screenshotTimeout = 15000;
323
324
  let timeoutId;
@@ -786,7 +787,8 @@ class ComputerMidsceneTools extends mcp_namespaceObject.BaseMidsceneTools {
786
787
  }
787
788
  const tools = new ComputerMidsceneTools();
788
789
  (0, cli_namespaceObject.runToolsCLI)(tools, 'midscene-computer', {
789
- stripPrefix: 'computer_'
790
+ stripPrefix: 'computer_',
791
+ version: "1.5.4-beta-20260310084708.0"
790
792
  }).catch((e)=>{
791
793
  if (!(e instanceof cli_namespaceObject.CLIError)) console.error(e);
792
794
  process.exit(e instanceof cli_namespaceObject.CLIError ? e.exitCode : 1);
package/dist/lib/index.js CHANGED
@@ -36,12 +36,14 @@ var __webpack_require__ = {};
36
36
  var __webpack_exports__ = {};
37
37
  __webpack_require__.r(__webpack_exports__);
38
38
  __webpack_require__.d(__webpack_exports__, {
39
+ version: ()=>version,
39
40
  checkComputerEnvironment: ()=>checkComputerEnvironment,
40
41
  checkXvfbInstalled: ()=>checkXvfbInstalled,
41
42
  checkAccessibilityPermission: ()=>checkAccessibilityPermission,
42
43
  agentFromComputer: ()=>agentFromComputer,
43
44
  needsXvfb: ()=>needsXvfb,
44
45
  overrideAIConfig: ()=>env_namespaceObject.overrideAIConfig,
46
+ ComputerMidsceneTools: ()=>ComputerMidsceneTools,
45
47
  getConnectedDisplays: ()=>getConnectedDisplays,
46
48
  ComputerDevice: ()=>ComputerDevice,
47
49
  ComputerAgent: ()=>ComputerAgent
@@ -337,6 +339,7 @@ Available Displays: ${displays.length > 0 ? displays.map((d)=>d.name).join(', ')
337
339
  }
338
340
  async healthCheck() {
339
341
  console.log('[HealthCheck] Starting health check...');
342
+ console.log("[HealthCheck] @midscene/computer v1.5.4-beta-20260310084708.0");
340
343
  console.log('[HealthCheck] Taking screenshot...');
341
344
  const screenshotTimeout = 15000;
342
345
  let timeoutId;
@@ -728,7 +731,89 @@ async function agentFromComputer(opts) {
728
731
  await device.connect();
729
732
  return new ComputerAgent(device, opts);
730
733
  }
734
+ const mcp_namespaceObject = require("@midscene/shared/mcp");
735
+ const debug = (0, logger_namespaceObject.getDebug)('mcp:computer-tools');
736
+ class ComputerMidsceneTools extends mcp_namespaceObject.BaseMidsceneTools {
737
+ createTemporaryDevice() {
738
+ return new ComputerDevice({});
739
+ }
740
+ async ensureAgent(displayId, headless) {
741
+ if (this.agent && displayId) {
742
+ try {
743
+ await this.agent.destroy?.();
744
+ } catch (error) {
745
+ debug('Failed to destroy agent during cleanup:', error);
746
+ }
747
+ this.agent = void 0;
748
+ }
749
+ if (this.agent) return this.agent;
750
+ debug('Creating Computer agent with displayId:', displayId || 'primary');
751
+ const opts = {
752
+ ...displayId ? {
753
+ displayId
754
+ } : {},
755
+ ...void 0 !== headless ? {
756
+ headless
757
+ } : {}
758
+ };
759
+ const agent = await agentFromComputer(Object.keys(opts).length > 0 ? opts : void 0);
760
+ this.agent = agent;
761
+ return agent;
762
+ }
763
+ preparePlatformTools() {
764
+ return [
765
+ {
766
+ name: 'computer_connect',
767
+ description: 'Connect to computer desktop. Provide displayId to connect to a specific display (use computer_list_displays to get available IDs). If not provided, uses the primary display.',
768
+ schema: {
769
+ displayId: core_namespaceObject.z.string().optional().describe('Display ID (from computer_list_displays)'),
770
+ headless: core_namespaceObject.z.boolean().optional().describe('Start virtual display via Xvfb (Linux only)')
771
+ },
772
+ handler: async ({ displayId, headless })=>{
773
+ const agent = await this.ensureAgent(displayId, headless);
774
+ const screenshot = await agent.interface.screenshotBase64();
775
+ return {
776
+ content: [
777
+ {
778
+ type: 'text',
779
+ text: `Connected to computer${displayId ? ` (Display: ${displayId})` : ' (Primary display)'}`
780
+ },
781
+ ...this.buildScreenshotContent(screenshot)
782
+ ]
783
+ };
784
+ }
785
+ },
786
+ {
787
+ name: 'computer_disconnect',
788
+ description: 'Disconnect from computer and release resources',
789
+ schema: {},
790
+ handler: this.createDisconnectHandler('computer')
791
+ },
792
+ {
793
+ name: 'computer_list_displays',
794
+ description: 'List all available displays/monitors',
795
+ schema: {},
796
+ handler: async ()=>{
797
+ const displays = await ComputerDevice.listDisplays();
798
+ return {
799
+ content: [
800
+ {
801
+ type: 'text',
802
+ text: `Available displays:\n${displays.map((d)=>`- ${d.name} (ID: ${d.id})${d.primary ? ' [PRIMARY]' : ''}`).join('\n')}`
803
+ }
804
+ ]
805
+ };
806
+ }
807
+ }
808
+ ];
809
+ }
810
+ }
731
811
  const env_namespaceObject = require("@midscene/shared/env");
812
+ function version() {
813
+ const currentVersion = "1.5.4-beta-20260310084708.0";
814
+ console.log(`@midscene/computer v${currentVersion}`);
815
+ return currentVersion;
816
+ }
732
817
  function checkAccessibilityPermission(promptIfNeeded = false) {
733
818
  if ('darwin' !== process.platform) return {
734
819
  hasPermission: true,
@@ -796,6 +881,7 @@ async function getConnectedDisplays() {
796
881
  }
797
882
  exports.ComputerAgent = __webpack_exports__.ComputerAgent;
798
883
  exports.ComputerDevice = __webpack_exports__.ComputerDevice;
884
+ exports.ComputerMidsceneTools = __webpack_exports__.ComputerMidsceneTools;
799
885
  exports.agentFromComputer = __webpack_exports__.agentFromComputer;
800
886
  exports.checkAccessibilityPermission = __webpack_exports__.checkAccessibilityPermission;
801
887
  exports.checkComputerEnvironment = __webpack_exports__.checkComputerEnvironment;
@@ -803,16 +889,19 @@ exports.checkXvfbInstalled = __webpack_exports__.checkXvfbInstalled;
803
889
  exports.getConnectedDisplays = __webpack_exports__.getConnectedDisplays;
804
890
  exports.needsXvfb = __webpack_exports__.needsXvfb;
805
891
  exports.overrideAIConfig = __webpack_exports__.overrideAIConfig;
892
+ exports.version = __webpack_exports__.version;
806
893
  for(var __rspack_i in __webpack_exports__)if (-1 === [
807
894
  "ComputerAgent",
808
895
  "ComputerDevice",
896
+ "ComputerMidsceneTools",
809
897
  "agentFromComputer",
810
898
  "checkAccessibilityPermission",
811
899
  "checkComputerEnvironment",
812
900
  "checkXvfbInstalled",
813
901
  "getConnectedDisplays",
814
902
  "needsXvfb",
815
- "overrideAIConfig"
903
+ "overrideAIConfig",
904
+ "version"
816
905
  ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
817
906
  Object.defineProperty(exports, '__esModule', {
818
907
  value: true
@@ -333,6 +333,7 @@ Available Displays: ${displays.length > 0 ? displays.map((d)=>d.name).join(', ')
333
333
  }
334
334
  async healthCheck() {
335
335
  console.log('[HealthCheck] Starting health check...');
336
+ console.log("[HealthCheck] @midscene/computer v1.5.4-beta-20260310084708.0");
336
337
  console.log('[HealthCheck] Taking screenshot...');
337
338
  const screenshotTimeout = 15000;
338
339
  let timeoutId;
@@ -806,7 +807,7 @@ class ComputerMCPServer extends mcp_namespaceObject.BaseMCPServer {
806
807
  constructor(toolsManager){
807
808
  super({
808
809
  name: '@midscene/computer-mcp',
809
- version: __VERSION__,
810
+ version: "1.5.4-beta-20260310084708.0",
810
811
  description: 'Control the computer desktop using natural language commands'
811
812
  }, toolsManager);
812
813
  }
@@ -1,10 +1,12 @@
1
1
  import { AbstractInterface } from '@midscene/core/device';
2
2
  import { Agent } from '@midscene/core/agent';
3
3
  import { AgentOpt } from '@midscene/core/agent';
4
+ import { BaseMidsceneTools } from '@midscene/shared/mcp';
4
5
  import { DeviceAction } from '@midscene/core';
5
6
  import { InterfaceType } from '@midscene/core';
6
7
  import { overrideAIConfig } from '@midscene/shared/env';
7
8
  import { Size } from '@midscene/core';
9
+ import { ToolDefinition } from '@midscene/shared/mcp';
8
10
 
9
11
  declare interface AccessibilityCheckResult {
10
12
  hasPermission: boolean;
@@ -111,6 +113,19 @@ export declare interface ComputerDeviceOpt {
111
113
  xvfbResolution?: string;
112
114
  }
113
115
 
116
+ /**
117
+ * Computer-specific tools manager
118
+ * Extends BaseMidsceneTools to provide desktop automation tools
119
+ */
120
+ export declare class ComputerMidsceneTools extends BaseMidsceneTools<ComputerAgent> {
121
+ protected createTemporaryDevice(): ComputerDevice;
122
+ protected ensureAgent(displayId?: string, headless?: boolean): Promise<ComputerAgent>;
123
+ /**
124
+ * Provide Computer-specific platform tools
125
+ */
126
+ protected preparePlatformTools(): ToolDefinition[];
127
+ }
128
+
114
129
  export declare interface DisplayInfo {
115
130
  id: string;
116
131
  name: string;
@@ -138,4 +153,6 @@ export declare function needsXvfb(explicitOpt?: boolean): boolean;
138
153
 
139
154
  export { overrideAIConfig }
140
155
 
156
+ export declare function version(): string;
157
+
141
158
  export { }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@midscene/computer",
3
- "version": "1.5.3",
3
+ "version": "1.5.4-beta-20260310084708.0",
4
4
  "description": "Midscene.js Computer Desktop Automation",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -36,8 +36,8 @@
36
36
  "@computer-use/libnut": "^4.2.0",
37
37
  "clipboardy": "^4.0.0",
38
38
  "screenshot-desktop": "^1.15.3",
39
- "@midscene/core": "1.5.3",
40
- "@midscene/shared": "1.5.3"
39
+ "@midscene/shared": "1.5.4-beta-20260310084708.0",
40
+ "@midscene/core": "1.5.4-beta-20260310084708.0"
41
41
  },
42
42
  "optionalDependencies": {
43
43
  "node-mac-permissions": "2.5.0"