@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 +3 -1
- package/dist/es/index.mjs +84 -1
- package/dist/es/mcp-server.mjs +2 -1
- package/dist/lib/cli.js +3 -1
- package/dist/lib/index.js +90 -1
- package/dist/lib/mcp-server.js +2 -1
- package/dist/types/index.d.ts +17 -0
- package/package.json +3 -3
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 };
|
package/dist/es/mcp-server.mjs
CHANGED
|
@@ -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:
|
|
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
|
package/dist/lib/mcp-server.js
CHANGED
|
@@ -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:
|
|
810
|
+
version: "1.5.4-beta-20260310084708.0",
|
|
810
811
|
description: 'Control the computer desktop using natural language commands'
|
|
811
812
|
}, toolsManager);
|
|
812
813
|
}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -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
|
+
"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/
|
|
40
|
-
"@midscene/
|
|
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"
|