@elizaos/plugin-computeruse 2.0.0-alpha.7 → 2.0.0-alpha.9
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/actions/click-coordinates.d.ts.map +1 -1
- package/dist/actions/click-coordinates.js +61 -3
- package/dist/actions/click-coordinates.js.map +1 -1
- package/dist/actions/click.d.ts.map +1 -1
- package/dist/actions/click.js +75 -7
- package/dist/actions/click.js.map +1 -1
- package/dist/actions/drag.d.ts.map +1 -1
- package/dist/actions/drag.js +61 -3
- package/dist/actions/drag.js.map +1 -1
- package/dist/actions/get-applications.d.ts.map +1 -1
- package/dist/actions/get-applications.js +69 -6
- package/dist/actions/get-applications.js.map +1 -1
- package/dist/actions/get-window-tree.d.ts.map +1 -1
- package/dist/actions/get-window-tree.js +65 -5
- package/dist/actions/get-window-tree.js.map +1 -1
- package/dist/actions/open-application.d.ts.map +1 -1
- package/dist/actions/open-application.js +65 -5
- package/dist/actions/open-application.js.map +1 -1
- package/dist/actions/press-key.d.ts.map +1 -1
- package/dist/actions/press-key.js +61 -3
- package/dist/actions/press-key.js.map +1 -1
- package/dist/actions/screenshot.d.ts.map +1 -1
- package/dist/actions/screenshot.js +62 -4
- package/dist/actions/screenshot.js.map +1 -1
- package/dist/actions/scroll.d.ts.map +1 -1
- package/dist/actions/scroll.js +61 -3
- package/dist/actions/scroll.js.map +1 -1
- package/dist/actions/type.d.ts.map +1 -1
- package/dist/actions/type.js +66 -6
- package/dist/actions/type.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/providers/available-apps.d.ts.map +1 -1
- package/dist/providers/available-apps.js +8 -2
- package/dist/providers/available-apps.js.map +1 -1
- package/dist/providers/computeruse-state.d.ts.map +1 -1
- package/dist/providers/computeruse-state.js +1 -0
- package/dist/providers/computeruse-state.js.map +1 -1
- package/dist/service-registry.d.ts.map +1 -1
- package/dist/service-registry.js.map +1 -1
- package/dist/services/computeruse-service.d.ts.map +1 -1
- package/dist/services/computeruse-service.js +7 -2
- package/dist/services/computeruse-service.js.map +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/params.d.ts.map +1 -1
- package/dist/utils/params.js.map +1 -1
- package/package.json +103 -103
package/dist/actions/type.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { logger } from "@elizaos/core";
|
|
2
|
-
import { getBooleanParam, getNumberParam, getStringParam } from "../utils/params.js";
|
|
2
|
+
import { getBooleanParam, getNumberParam, getStringParam, } from "../utils/params.js";
|
|
3
3
|
export const computeruseTypeAction = {
|
|
4
4
|
name: "COMPUTERUSE_TYPE",
|
|
5
5
|
description: "Types text into a UI element on the computer using a ComputerUse selector (optionally clearing the field).",
|
|
@@ -39,12 +39,72 @@ export const computeruseTypeAction = {
|
|
|
39
39
|
schema: { type: "boolean", default: true },
|
|
40
40
|
},
|
|
41
41
|
],
|
|
42
|
-
validate: async (runtime, message) => {
|
|
43
|
-
const
|
|
44
|
-
|
|
42
|
+
validate: async (runtime, message, state, options) => {
|
|
43
|
+
const __avTextRaw = typeof message?.content?.text === "string" ? message.content.text : "";
|
|
44
|
+
const __avText = __avTextRaw.toLowerCase();
|
|
45
|
+
const __avKeywords = ["computeruse", "type"];
|
|
46
|
+
const __avKeywordOk = __avKeywords.length > 0 &&
|
|
47
|
+
__avKeywords.some((word) => word.length > 0 && __avText.includes(word));
|
|
48
|
+
const __avRegex = /\b(?:computeruse|type)\b/i;
|
|
49
|
+
const __avRegexOk = __avRegex.test(__avText);
|
|
50
|
+
const __avSource = String(message?.content?.source ?? message?.source ?? "");
|
|
51
|
+
const __avExpectedSource = "";
|
|
52
|
+
const __avSourceOk = __avExpectedSource
|
|
53
|
+
? __avSource === __avExpectedSource
|
|
54
|
+
: Boolean(__avSource ||
|
|
55
|
+
state ||
|
|
56
|
+
runtime?.agentId ||
|
|
57
|
+
runtime?.getService ||
|
|
58
|
+
runtime?.getSetting);
|
|
59
|
+
const __avOptions = options && typeof options === "object" ? options : {};
|
|
60
|
+
const __avInputOk = __avText.trim().length > 0 ||
|
|
61
|
+
Object.keys(__avOptions).length > 0 ||
|
|
62
|
+
Boolean(message?.content && typeof message.content === "object");
|
|
63
|
+
if (!(__avKeywordOk && __avRegexOk && __avSourceOk && __avInputOk)) {
|
|
45
64
|
return false;
|
|
46
|
-
|
|
47
|
-
|
|
65
|
+
}
|
|
66
|
+
const __avLegacyValidate = async (runtime, message, state, options) => {
|
|
67
|
+
const __avTextRaw = typeof message?.content?.text === "string" ? message.content.text : "";
|
|
68
|
+
const __avText = __avTextRaw.toLowerCase();
|
|
69
|
+
const __avKeywords = ["computeruse", "type"];
|
|
70
|
+
const __avKeywordOk = __avKeywords.length > 0 &&
|
|
71
|
+
__avKeywords.some((kw) => kw.length > 0 && __avText.includes(kw));
|
|
72
|
+
const __avRegex = /\b(?:computeruse|type)\b/i;
|
|
73
|
+
const __avRegexOk = __avRegex.test(__avText);
|
|
74
|
+
const __avSource = String(message?.content?.source ?? message?.source ?? "");
|
|
75
|
+
const __avExpectedSource = "";
|
|
76
|
+
const __avSourceOk = __avExpectedSource
|
|
77
|
+
? __avSource === __avExpectedSource
|
|
78
|
+
: Boolean(__avSource || state || runtime?.agentId || runtime?.getService);
|
|
79
|
+
const __avOptions = options && typeof options === "object" ? options : {};
|
|
80
|
+
const __avInputOk = __avText.trim().length > 0 ||
|
|
81
|
+
Object.keys(__avOptions).length > 0 ||
|
|
82
|
+
Boolean(message?.content && typeof message.content === "object");
|
|
83
|
+
if (!(__avKeywordOk && __avRegexOk && __avSourceOk && __avInputOk)) {
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
const __avLegacyValidate = async (runtime, message) => {
|
|
87
|
+
const service = runtime.getService("computeruse");
|
|
88
|
+
if (!service || !service.isEnabled())
|
|
89
|
+
return false;
|
|
90
|
+
const text = message.content?.text?.toLowerCase() ?? "";
|
|
91
|
+
return (text.includes("type") ||
|
|
92
|
+
text.includes("enter") ||
|
|
93
|
+
text.includes("fill"));
|
|
94
|
+
};
|
|
95
|
+
try {
|
|
96
|
+
return Boolean(await __avLegacyValidate(runtime, message, state, options));
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
try {
|
|
103
|
+
return Boolean(await __avLegacyValidate(runtime, message, state, options));
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
48
108
|
},
|
|
49
109
|
handler: async (runtime, message, _state, options, callback) => {
|
|
50
110
|
const service = runtime.getService("computeruse");
|
package/dist/actions/type.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"type.js","sourceRoot":"","sources":["../../src/actions/type.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n Action,\n ActionResult,\n Content,\n HandlerCallback,\n HandlerOptions,\n IAgentRuntime,\n Memory,\n State,\n} from \"@elizaos/core\";\nimport { logger } from \"@elizaos/core\";\nimport type { ComputerUseService } from \"../services/computeruse-service.js\";\nimport { getBooleanParam, getNumberParam, getStringParam } from \"../utils/params.js\";\n\nexport const computeruseTypeAction: Action = {\n name: \"COMPUTERUSE_TYPE\",\n description:\n \"Types text into a UI element on the computer using a ComputerUse selector (optionally clearing the field).\",\n similes: [\"TYPE_UI\", \"ENTER_TEXT\", \"FILL_FIELD\"],\n parameters: [\n {\n name: \"process\",\n description:\n \"Process name to scope the typing when using MCP mode (e.g. 'chrome', 'notepad'). Optional if selector is prefixed with 'process:<name> >> ...'.\",\n required: false,\n schema: { type: \"string\" },\n examples: [\"chrome\", \"notepad\"],\n },\n {\n name: \"selector\",\n description: \"ComputerUse selector string for the target element\",\n required: true,\n schema: { type: \"string\" },\n examples: [\"role:Edit && name:Search\"],\n },\n {\n name: \"text\",\n description: \"Text to type\",\n required: true,\n schema: { type: \"string\" },\n examples: [\"hello world\", \"user@example.com{Enter}\"],\n },\n {\n name: \"timeoutMs\",\n description: \"Timeout in milliseconds to find the element\",\n required: false,\n schema: { type: \"number\", default: 5000, minimum: 0 },\n },\n {\n name: \"clearBeforeTyping\",\n description: \"Whether to clear existing text before typing (default: true)\",\n required: false,\n schema: { type: \"boolean\", default: true },\n },\n ],\n\n validate: async (runtime: IAgentRuntime, message: Memory): Promise<boolean> => {\n const service = runtime.getService<ComputerUseService>(\"computeruse\");\n if (!service || !service.isEnabled()) return false;\n\n const text = message.content?.text?.toLowerCase() ?? \"\";\n return text.includes(\"type\") || text.includes(\"enter\") || text.includes(\"fill\");\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n options?: HandlerOptions,\n callback?: HandlerCallback\n ): Promise<ActionResult> => {\n const service = runtime.getService<ComputerUseService>(\"computeruse\");\n if (!service) {\n return { success: false, text: \"ComputerUse service not available\" };\n }\n\n const params = options?.parameters;\n const process = getStringParam(params, \"process\");\n const selector = getStringParam(params, \"selector\");\n const text = getStringParam(params, \"text\");\n const timeoutMs = getNumberParam(params, \"timeoutMs\") ?? 5000;\n const clearBeforeTyping = getBooleanParam(params, \"clearBeforeTyping\") ?? true;\n\n if (!selector) return { success: false, text: \"Missing required parameter: selector\" };\n if (!text) return { success: false, text: \"Missing required parameter: text\" };\n\n try {\n await service.typeText(selector, text, timeoutMs, clearBeforeTyping, process);\n const response: Content = {\n text: `Typed into element: ${selector}`,\n actions: [\"COMPUTERUSE_TYPE\"],\n source: message.content?.source ?? \"action\",\n };\n await callback?.(response);\n return {\n success: true,\n text: response.text ?? \"\",\n values: { process, selector, timeoutMs, clearBeforeTyping },\n data: {\n process,\n selector,\n timeoutMs,\n clearBeforeTyping,\n backend: service.getBackendName(),\n },\n };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n logger.error(`[computeruse] type failed: ${msg}`);\n return {\n success: false,\n text: `ComputerUse type failed: ${msg}`,\n values: { process, selector, timeoutMs, clearBeforeTyping },\n data: {\n process,\n selector,\n timeoutMs,\n clearBeforeTyping,\n backend: service.getBackendName(),\n },\n };\n }\n },\n};\n"]}
|
|
1
|
+
{"version":3,"file":"type.js","sourceRoot":"","sources":["../../src/actions/type.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n\tAction,\n\tActionResult,\n\tContent,\n\tHandlerCallback,\n\tHandlerOptions,\n\tIAgentRuntime,\n\tMemory,\n\tState,\n} from \"@elizaos/core\";\nimport { logger } from \"@elizaos/core\";\nimport type { ComputerUseService } from \"../services/computeruse-service.js\";\nimport {\n\tgetBooleanParam,\n\tgetNumberParam,\n\tgetStringParam,\n} from \"../utils/params.js\";\n\nexport const computeruseTypeAction: Action = {\n\tname: \"COMPUTERUSE_TYPE\",\n\tdescription:\n\t\t\"Types text into a UI element on the computer using a ComputerUse selector (optionally clearing the field).\",\n\tsimiles: [\"TYPE_UI\", \"ENTER_TEXT\", \"FILL_FIELD\"],\n\tparameters: [\n\t\t{\n\t\t\tname: \"process\",\n\t\t\tdescription:\n\t\t\t\t\"Process name to scope the typing when using MCP mode (e.g. 'chrome', 'notepad'). Optional if selector is prefixed with 'process:<name> >> ...'.\",\n\t\t\trequired: false,\n\t\t\tschema: { type: \"string\" },\n\t\t\texamples: [\"chrome\", \"notepad\"],\n\t\t},\n\t\t{\n\t\t\tname: \"selector\",\n\t\t\tdescription: \"ComputerUse selector string for the target element\",\n\t\t\trequired: true,\n\t\t\tschema: { type: \"string\" },\n\t\t\texamples: [\"role:Edit && name:Search\"],\n\t\t},\n\t\t{\n\t\t\tname: \"text\",\n\t\t\tdescription: \"Text to type\",\n\t\t\trequired: true,\n\t\t\tschema: { type: \"string\" },\n\t\t\texamples: [\"hello world\", \"user@example.com{Enter}\"],\n\t\t},\n\t\t{\n\t\t\tname: \"timeoutMs\",\n\t\t\tdescription: \"Timeout in milliseconds to find the element\",\n\t\t\trequired: false,\n\t\t\tschema: { type: \"number\", default: 5000, minimum: 0 },\n\t\t},\n\t\t{\n\t\t\tname: \"clearBeforeTyping\",\n\t\t\tdescription:\n\t\t\t\t\"Whether to clear existing text before typing (default: true)\",\n\t\t\trequired: false,\n\t\t\tschema: { type: \"boolean\", default: true },\n\t\t},\n\t],\n\n\tvalidate: async (\n\t\truntime: any,\n\t\tmessage: any,\n\t\tstate?: any,\n\t\toptions?: any,\n\t): Promise<boolean> => {\n\t\tconst __avTextRaw =\n\t\t\ttypeof message?.content?.text === \"string\" ? message.content.text : \"\";\n\t\tconst __avText = __avTextRaw.toLowerCase();\n\t\tconst __avKeywords = [\"computeruse\", \"type\"];\n\t\tconst __avKeywordOk =\n\t\t\t__avKeywords.length > 0 &&\n\t\t\t__avKeywords.some((word) => word.length > 0 && __avText.includes(word));\n\t\tconst __avRegex = /\\b(?:computeruse|type)\\b/i;\n\t\tconst __avRegexOk = __avRegex.test(__avText);\n\t\tconst __avSource = String(\n\t\t\tmessage?.content?.source ?? message?.source ?? \"\",\n\t\t);\n\t\tconst __avExpectedSource = \"\";\n\t\tconst __avSourceOk = __avExpectedSource\n\t\t\t? __avSource === __avExpectedSource\n\t\t\t: Boolean(\n\t\t\t\t\t__avSource ||\n\t\t\t\t\t\tstate ||\n\t\t\t\t\t\truntime?.agentId ||\n\t\t\t\t\t\truntime?.getService ||\n\t\t\t\t\t\truntime?.getSetting,\n\t\t\t\t);\n\t\tconst __avOptions = options && typeof options === \"object\" ? options : {};\n\t\tconst __avInputOk =\n\t\t\t__avText.trim().length > 0 ||\n\t\t\tObject.keys(__avOptions as Record<string, unknown>).length > 0 ||\n\t\t\tBoolean(message?.content && typeof message.content === \"object\");\n\n\t\tif (!(__avKeywordOk && __avRegexOk && __avSourceOk && __avInputOk)) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst __avLegacyValidate = async (\n\t\t\truntime: any,\n\t\t\tmessage: any,\n\t\t\tstate?: any,\n\t\t\toptions?: any,\n\t\t): Promise<boolean> => {\n\t\t\tconst __avTextRaw =\n\t\t\t\ttypeof message?.content?.text === \"string\" ? message.content.text : \"\";\n\t\t\tconst __avText = __avTextRaw.toLowerCase();\n\t\t\tconst __avKeywords = [\"computeruse\", \"type\"];\n\t\t\tconst __avKeywordOk =\n\t\t\t\t__avKeywords.length > 0 &&\n\t\t\t\t__avKeywords.some((kw) => kw.length > 0 && __avText.includes(kw));\n\t\t\tconst __avRegex = /\\b(?:computeruse|type)\\b/i;\n\t\t\tconst __avRegexOk = __avRegex.test(__avText);\n\t\t\tconst __avSource = String(\n\t\t\t\tmessage?.content?.source ?? message?.source ?? \"\",\n\t\t\t);\n\t\t\tconst __avExpectedSource = \"\";\n\t\t\tconst __avSourceOk = __avExpectedSource\n\t\t\t\t? __avSource === __avExpectedSource\n\t\t\t\t: Boolean(\n\t\t\t\t\t\t__avSource || state || runtime?.agentId || runtime?.getService,\n\t\t\t\t\t);\n\t\t\tconst __avOptions = options && typeof options === \"object\" ? options : {};\n\t\t\tconst __avInputOk =\n\t\t\t\t__avText.trim().length > 0 ||\n\t\t\t\tObject.keys(__avOptions as Record<string, unknown>).length > 0 ||\n\t\t\t\tBoolean(message?.content && typeof message.content === \"object\");\n\n\t\t\tif (!(__avKeywordOk && __avRegexOk && __avSourceOk && __avInputOk)) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst __avLegacyValidate = async (\n\t\t\t\truntime: IAgentRuntime,\n\t\t\t\tmessage: Memory,\n\t\t\t): Promise<boolean> => {\n\t\t\t\tconst service = runtime.getService<ComputerUseService>(\"computeruse\");\n\t\t\t\tif (!service || !service.isEnabled()) return false;\n\n\t\t\t\tconst text = message.content?.text?.toLowerCase() ?? \"\";\n\t\t\t\treturn (\n\t\t\t\t\ttext.includes(\"type\") ||\n\t\t\t\t\ttext.includes(\"enter\") ||\n\t\t\t\t\ttext.includes(\"fill\")\n\t\t\t\t);\n\t\t\t};\n\t\t\ttry {\n\t\t\t\treturn Boolean(\n\t\t\t\t\tawait (__avLegacyValidate as any)(runtime, message, state, options),\n\t\t\t\t);\n\t\t\t} catch {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t};\n\t\ttry {\n\t\t\treturn Boolean(\n\t\t\t\tawait (__avLegacyValidate as any)(runtime, message, state, options),\n\t\t\t);\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t},\n\n\thandler: async (\n\t\truntime: IAgentRuntime,\n\t\tmessage: Memory,\n\t\t_state?: State,\n\t\toptions?: HandlerOptions,\n\t\tcallback?: HandlerCallback,\n\t): Promise<ActionResult> => {\n\t\tconst service = runtime.getService<ComputerUseService>(\"computeruse\");\n\t\tif (!service) {\n\t\t\treturn { success: false, text: \"ComputerUse service not available\" };\n\t\t}\n\n\t\tconst params = options?.parameters;\n\t\tconst process = getStringParam(params, \"process\");\n\t\tconst selector = getStringParam(params, \"selector\");\n\t\tconst text = getStringParam(params, \"text\");\n\t\tconst timeoutMs = getNumberParam(params, \"timeoutMs\") ?? 5000;\n\t\tconst clearBeforeTyping =\n\t\t\tgetBooleanParam(params, \"clearBeforeTyping\") ?? true;\n\n\t\tif (!selector)\n\t\t\treturn { success: false, text: \"Missing required parameter: selector\" };\n\t\tif (!text)\n\t\t\treturn { success: false, text: \"Missing required parameter: text\" };\n\n\t\ttry {\n\t\t\tawait service.typeText(\n\t\t\t\tselector,\n\t\t\t\ttext,\n\t\t\t\ttimeoutMs,\n\t\t\t\tclearBeforeTyping,\n\t\t\t\tprocess,\n\t\t\t);\n\t\t\tconst response: Content = {\n\t\t\t\ttext: `Typed into element: ${selector}`,\n\t\t\t\tactions: [\"COMPUTERUSE_TYPE\"],\n\t\t\t\tsource: message.content?.source ?? \"action\",\n\t\t\t};\n\t\t\tawait callback?.(response);\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\ttext: response.text ?? \"\",\n\t\t\t\tvalues: { process, selector, timeoutMs, clearBeforeTyping },\n\t\t\t\tdata: {\n\t\t\t\t\tprocess,\n\t\t\t\t\tselector,\n\t\t\t\t\ttimeoutMs,\n\t\t\t\t\tclearBeforeTyping,\n\t\t\t\t\tbackend: service.getBackendName(),\n\t\t\t\t},\n\t\t\t};\n\t\t} catch (err) {\n\t\t\tconst msg = err instanceof Error ? err.message : String(err);\n\t\t\tlogger.error(`[computeruse] type failed: ${msg}`);\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\ttext: `ComputerUse type failed: ${msg}`,\n\t\t\t\tvalues: { process, selector, timeoutMs, clearBeforeTyping },\n\t\t\t\tdata: {\n\t\t\t\t\tprocess,\n\t\t\t\t\tselector,\n\t\t\t\t\ttimeoutMs,\n\t\t\t\t\tclearBeforeTyping,\n\t\t\t\t\tbackend: service.getBackendName(),\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t},\n};\n"]}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,MAAM,EAAE,MAAM,eAAe,CAAC;AAG3D,OAAO,uBAAuB,CAAC;AAa/B,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAEvE,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAY9B,eAAO,MAAM,iBAAiB,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,MAAM,EAAE,MAAM,eAAe,CAAC;AAG3D,OAAO,uBAAuB,CAAC;AAa/B,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAEvE,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAY9B,eAAO,MAAM,iBAAiB,EAAE,MAuC/B,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -37,7 +37,10 @@ export const computerusePlugin = {
|
|
|
37
37
|
logger.info("Initializing computeruse plugin");
|
|
38
38
|
// Auto-enable when the plugin is loaded — the plugin being present in
|
|
39
39
|
// the runtime means the user toggled it on via the Capabilities UI.
|
|
40
|
-
const configWithDefaults = {
|
|
40
|
+
const configWithDefaults = {
|
|
41
|
+
...config,
|
|
42
|
+
COMPUTERUSE_ENABLED: config.COMPUTERUSE_ENABLED ?? "true",
|
|
43
|
+
};
|
|
41
44
|
const validated = await configSchema.parseAsync(configWithDefaults);
|
|
42
45
|
for (const [key, value] of Object.entries(validated)) {
|
|
43
46
|
process.env[key] = String(value);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,uBAAuB,CAAC;AAC/B,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,iCAAiC,EAAE,MAAM,gCAAgC,CAAC;AACnF,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,gCAAgC,EAAE,MAAM,+BAA+B,CAAC;AACjF,OAAO,EAAE,8BAA8B,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,EAAE,gCAAgC,EAAE,MAAM,+BAA+B,CAAC;AACjF,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,gCAAgC,EAAE,MAAM,+BAA+B,CAAC;AACjF,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAEvE,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAE9B,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IAgentRuntime, Plugin } from \"@elizaos/core\";\nimport { logger } from \"@elizaos/core\";\nimport { z } from \"zod\";\nimport \"./service-registry.js\";\nimport { computeruseClickAction } from \"./actions/click.js\";\nimport { computeruseClickCoordinatesAction } from \"./actions/click-coordinates.js\";\nimport { computeruseDragAction } from \"./actions/drag.js\";\nimport { computeruseGetApplicationsAction } from \"./actions/get-applications.js\";\nimport { computeruseGetWindowTreeAction } from \"./actions/get-window-tree.js\";\nimport { computeruseOpenApplicationAction } from \"./actions/open-application.js\";\nimport { computerusePressKeyAction } from \"./actions/press-key.js\";\nimport { computeruseScreenshotAction } from \"./actions/screenshot.js\";\nimport { computeruseScrollAction } from \"./actions/scroll.js\";\nimport { computeruseTypeAction } from \"./actions/type.js\";\nimport { computeruseAvailableAppsProvider } from \"./providers/available-apps.js\";\nimport { computeruseStateProvider } from \"./providers/computeruse-state.js\";\nimport { ComputerUseService } from \"./services/computeruse-service.js\";\n\nexport * from \"./types.js\";\nexport { ComputerUseService };\n\nconst configSchema = z.object({\n\tCOMPUTERUSE_ENABLED: z\n\t\t.string()\n\t\t.optional()\n\t\t.default(\"false\")\n\t\t.transform((val) => val === \"true\"),\n\tCOMPUTERUSE_MODE: z.enum([\"auto\", \"local\", \"mcp\"]).optional().default(\"auto\"),\n\tCOMPUTERUSE_MCP_SERVER: z.string().optional().default(\"computeruse\"),\n});\n\nexport const computerusePlugin: Plugin = {\n\tname: \"plugin-computeruse\",\n\tdescription: \"Computer automation plugin (local or MCP)\",\n\tconfig: {\n\t\tCOMPUTERUSE_ENABLED: process.env.COMPUTERUSE_ENABLED ?? \"true\",\n\t\tCOMPUTERUSE_MODE: process.env.COMPUTERUSE_MODE ?? \"auto\",\n\t\tCOMPUTERUSE_MCP_SERVER: process.env.COMPUTERUSE_MCP_SERVER ?? \"computeruse\",\n\t},\n\tasync init(\n\t\tconfig: Record<string, string>,\n\t\t_runtime: IAgentRuntime,\n\t): Promise<void> {\n\t\tlogger.info(\"Initializing computeruse plugin\");\n\t\t// Auto-enable when the plugin is loaded — the plugin being present in\n\t\t// the runtime means the user toggled it on via the Capabilities UI.\n\t\tconst configWithDefaults = {\n\t\t\t...config,\n\t\t\tCOMPUTERUSE_ENABLED: config.COMPUTERUSE_ENABLED ?? \"true\",\n\t\t};\n\t\tconst validated = await configSchema.parseAsync(configWithDefaults);\n\t\tfor (const [key, value] of Object.entries(validated)) {\n\t\t\tprocess.env[key] = String(value);\n\t\t}\n\t},\n\tservices: [ComputerUseService],\n\tactions: [\n\t\tcomputeruseOpenApplicationAction,\n\t\tcomputeruseClickAction,\n\t\tcomputeruseClickCoordinatesAction,\n\t\tcomputeruseTypeAction,\n\t\tcomputerusePressKeyAction,\n\t\tcomputeruseScrollAction,\n\t\tcomputeruseDragAction,\n\t\tcomputeruseScreenshotAction,\n\t\tcomputeruseGetApplicationsAction,\n\t\tcomputeruseGetWindowTreeAction,\n\t],\n\tproviders: [computeruseStateProvider, computeruseAvailableAppsProvider],\n\tdependencies: [\"mcp\"],\n};\n\nexport default computerusePlugin;\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"available-apps.d.ts","sourceRoot":"","sources":["../../src/providers/available-apps.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"available-apps.d.ts","sourceRoot":"","sources":["../../src/providers/available-apps.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGX,QAAQ,EAGR,MAAM,eAAe,CAAC;AAGvB,eAAO,MAAM,gCAAgC,EAAE,QAiC9C,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export const computeruseAvailableAppsProvider = {
|
|
2
2
|
name: "COMPUTERUSE_AVAILABLE_APPS",
|
|
3
3
|
description: "Lists currently running applications (best-effort, may be summarized in MCP mode)",
|
|
4
|
+
dynamic: true,
|
|
4
5
|
get: async (runtime, _message, _state) => {
|
|
5
6
|
const service = runtime.getService("computeruse");
|
|
6
7
|
if (!service || !service.isEnabled()) {
|
|
@@ -11,11 +12,16 @@ export const computeruseAvailableAppsProvider = {
|
|
|
11
12
|
};
|
|
12
13
|
}
|
|
13
14
|
const apps = await service.getApplications();
|
|
14
|
-
const text = `Running applications (${apps.length}):\n${apps.map((
|
|
15
|
+
const text = `Running applications (${apps.length}):\n${apps.map((app) => `- ${app}`).join("\n")}`;
|
|
15
16
|
return {
|
|
16
17
|
text,
|
|
17
18
|
values: { enabled: true, count: apps.length },
|
|
18
|
-
data: {
|
|
19
|
+
data: {
|
|
20
|
+
enabled: true,
|
|
21
|
+
apps,
|
|
22
|
+
count: apps.length,
|
|
23
|
+
backend: service.getBackendName(),
|
|
24
|
+
},
|
|
19
25
|
};
|
|
20
26
|
},
|
|
21
27
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"available-apps.js","sourceRoot":"","sources":["../../src/providers/available-apps.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"available-apps.js","sourceRoot":"","sources":["../../src/providers/available-apps.ts"],"names":[],"mappings":"AASA,MAAM,CAAC,MAAM,gCAAgC,GAAa;IACzD,IAAI,EAAE,4BAA4B;IAClC,WAAW,EACV,mFAAmF;IACpF,OAAO,EAAE,IAAI;IACb,GAAG,EAAE,KAAK,EACT,OAAsB,EACtB,QAAgB,EAChB,MAAa,EACa,EAAE;QAC5B,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAqB,aAAa,CAAC,CAAC;QACtE,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;YACtC,OAAO;gBACN,IAAI,EAAE,yBAAyB;gBAC/B,MAAM,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;gBAC1B,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;aACxB,CAAC;QACH,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,eAAe,EAAE,CAAC;QAC7C,MAAM,IAAI,GAAG,yBAAyB,IAAI,CAAC,MAAM,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAEnG,OAAO;YACN,IAAI;YACJ,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE;YAC7C,IAAI,EAAE;gBACL,OAAO,EAAE,IAAI;gBACb,IAAI;gBACJ,KAAK,EAAE,IAAI,CAAC,MAAM;gBAClB,OAAO,EAAE,OAAO,CAAC,cAAc,EAAE;aACjC;SACD,CAAC;IACH,CAAC;CACD,CAAC","sourcesContent":["import type {\n\tIAgentRuntime,\n\tMemory,\n\tProvider,\n\tProviderResult,\n\tState,\n} from \"@elizaos/core\";\nimport type { ComputerUseService } from \"../services/computeruse-service.js\";\n\nexport const computeruseAvailableAppsProvider: Provider = {\n\tname: \"COMPUTERUSE_AVAILABLE_APPS\",\n\tdescription:\n\t\t\"Lists currently running applications (best-effort, may be summarized in MCP mode)\",\n\tdynamic: true,\n\tget: async (\n\t\truntime: IAgentRuntime,\n\t\t_message: Memory,\n\t\t_state: State,\n\t): Promise<ProviderResult> => {\n\t\tconst service = runtime.getService<ComputerUseService>(\"computeruse\");\n\t\tif (!service || !service.isEnabled()) {\n\t\t\treturn {\n\t\t\t\ttext: \"ComputerUse is disabled\",\n\t\t\t\tvalues: { enabled: false },\n\t\t\t\tdata: { enabled: false },\n\t\t\t};\n\t\t}\n\n\t\tconst apps = await service.getApplications();\n\t\tconst text = `Running applications (${apps.length}):\\n${apps.map((app) => `- ${app}`).join(\"\\n\")}`;\n\n\t\treturn {\n\t\t\ttext,\n\t\t\tvalues: { enabled: true, count: apps.length },\n\t\t\tdata: {\n\t\t\t\tenabled: true,\n\t\t\t\tapps,\n\t\t\t\tcount: apps.length,\n\t\t\t\tbackend: service.getBackendName(),\n\t\t\t},\n\t\t};\n\t},\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"computeruse-state.d.ts","sourceRoot":"","sources":["../../src/providers/computeruse-state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"computeruse-state.d.ts","sourceRoot":"","sources":["../../src/providers/computeruse-state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGX,QAAQ,EAGR,MAAM,eAAe,CAAC;AAGvB,eAAO,MAAM,wBAAwB,EAAE,QAwCtC,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export const computeruseStateProvider = {
|
|
2
2
|
name: "COMPUTERUSE_STATE",
|
|
3
3
|
description: "Provides current ComputerUse backend/mode information",
|
|
4
|
+
dynamic: true,
|
|
4
5
|
get: async (runtime, _message, _state) => {
|
|
5
6
|
const service = runtime.getService("computeruse");
|
|
6
7
|
if (!service || !service.isEnabled()) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"computeruse-state.js","sourceRoot":"","sources":["../../src/providers/computeruse-state.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"computeruse-state.js","sourceRoot":"","sources":["../../src/providers/computeruse-state.ts"],"names":[],"mappings":"AASA,MAAM,CAAC,MAAM,wBAAwB,GAAa;IACjD,IAAI,EAAE,mBAAmB;IACzB,WAAW,EAAE,uDAAuD;IACpE,OAAO,EAAE,IAAI;IACb,GAAG,EAAE,KAAK,EACT,OAAsB,EACtB,QAAgB,EAChB,MAAa,EACa,EAAE;QAC5B,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAqB,aAAa,CAAC,CAAC;QACtE,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;YACtC,OAAO;gBACN,IAAI,EAAE,yBAAyB;gBAC/B,MAAM,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;gBAC1B,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;aACxB,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;QACzC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;QAC/B,MAAM,SAAS,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;QAE7C,OAAO;YACN,IAAI,EAAE,6BAA6B,IAAI,aAAa,OAAO,IAAI,MAAM,cAAc,OAAO,CAAC,QAAQ,GAAG;YACtG,MAAM,EAAE;gBACP,OAAO,EAAE,IAAI;gBACb,IAAI;gBACJ,OAAO,EAAE,OAAO,IAAI,MAAM;gBAC1B,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,SAAS;aACT;YACD,IAAI,EAAE;gBACL,OAAO,EAAE,IAAI;gBACb,IAAI;gBACJ,OAAO;gBACP,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,SAAS;aACT;SACD,CAAC;IACH,CAAC;CACD,CAAC","sourcesContent":["import type {\n\tIAgentRuntime,\n\tMemory,\n\tProvider,\n\tProviderResult,\n\tState,\n} from \"@elizaos/core\";\nimport type { ComputerUseService } from \"../services/computeruse-service.js\";\n\nexport const computeruseStateProvider: Provider = {\n\tname: \"COMPUTERUSE_STATE\",\n\tdescription: \"Provides current ComputerUse backend/mode information\",\n\tdynamic: true,\n\tget: async (\n\t\truntime: IAgentRuntime,\n\t\t_message: Memory,\n\t\t_state: State,\n\t): Promise<ProviderResult> => {\n\t\tconst service = runtime.getService<ComputerUseService>(\"computeruse\");\n\t\tif (!service || !service.isEnabled()) {\n\t\t\treturn {\n\t\t\t\ttext: \"ComputerUse is disabled\",\n\t\t\t\tvalues: { enabled: false },\n\t\t\t\tdata: { enabled: false },\n\t\t\t};\n\t\t}\n\n\t\tconst backend = service.getBackendName();\n\t\tconst mode = service.getMode();\n\t\tconst mcpServer = service.getMcpServerName();\n\n\t\treturn {\n\t\t\ttext: `ComputerUse enabled. Mode=${mode}. Backend=${backend ?? \"none\"}. Platform=${process.platform}.`,\n\t\t\tvalues: {\n\t\t\t\tenabled: true,\n\t\t\t\tmode,\n\t\t\t\tbackend: backend ?? \"none\",\n\t\t\t\tplatform: process.platform,\n\t\t\t\tmcpServer,\n\t\t\t},\n\t\t\tdata: {\n\t\t\t\tenabled: true,\n\t\t\t\tmode,\n\t\t\t\tbackend,\n\t\t\t\tplatform: process.platform,\n\t\t\t\tmcpServer,\n\t\t\t},\n\t\t};\n\t},\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service-registry.d.ts","sourceRoot":"","sources":["../src/service-registry.ts"],"names":[],"mappings":"AAEA,OAAO,QAAQ,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"service-registry.d.ts","sourceRoot":"","sources":["../src/service-registry.ts"],"names":[],"mappings":"AAEA,OAAO,QAAQ,eAAe,CAAC;IAC9B,UAAU,mBAAmB;QAC5B,WAAW,EAAE,aAAa,CAAC;KAC3B;CACD;AAED,eAAO,MAAM,wBAAwB,EAAG,aAAsB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service-registry.js","sourceRoot":"","sources":["../src/service-registry.ts"],"names":[],"mappings":"AAQA,MAAM,CAAC,MAAM,wBAAwB,GAAG,aAAsB,CAAC","sourcesContent":["// Module augmentation: add COMPUTERUSE to the core service registry so\n// `runtime.getServiceLoadPromise(\"computeruse\")` is type-safe.\ndeclare module \"@elizaos/core\" {\n
|
|
1
|
+
{"version":3,"file":"service-registry.js","sourceRoot":"","sources":["../src/service-registry.ts"],"names":[],"mappings":"AAQA,MAAM,CAAC,MAAM,wBAAwB,GAAG,aAAsB,CAAC","sourcesContent":["// Module augmentation: add COMPUTERUSE to the core service registry so\n// `runtime.getServiceLoadPromise(\"computeruse\")` is type-safe.\ndeclare module \"@elizaos/core\" {\n\tinterface ServiceTypeRegistry {\n\t\tCOMPUTERUSE: \"computeruse\";\n\t}\n}\n\nexport const COMPUTERUSE_SERVICE_TYPE = \"computeruse\" as const;\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"computeruse-service.d.ts","sourceRoot":"","sources":["../../src/services/computeruse-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAU,OAAO,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,
|
|
1
|
+
{"version":3,"file":"computeruse-service.d.ts","sourceRoot":"","sources":["../../src/services/computeruse-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAU,OAAO,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,EACN,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,EAGtB,MAAM,aAAa,CAAC;AA0CrB,qBAAa,kBAAmB,SAAQ,OAAO;IAC9C,MAAM,CAAC,WAAW,SAAiB;IACnC,qBAAqB,SACkF;IAEvG,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,WAAW,CAAuC;IAC1D,OAAO,CAAC,WAAW,CAAS;IAG5B,OAAO,CAAC,YAAY,CAAiC;gBAEzC,OAAO,CAAC,EAAE,aAAa;WAWtB,KAAK,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAKjE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAM3B,OAAO,IAAI,iBAAiB,CAAC,kBAAkB,CAAC;IAIhD,cAAc,IAAI,sBAAsB,GAAG,IAAI;IAI/C,gBAAgB,IAAI,MAAM;IAI1B,SAAS,IAAI,OAAO;IAId,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;YAMpB,iBAAiB;YAiDjB,kBAAkB;YAgClB,gBAAgB;YAahB,iBAAiB;IAa/B,OAAO,CAAC,MAAM;IAQd,OAAO,CAAC,0BAA0B;IA0B5B,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA6B/C,KAAK,CACV,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC;IAmCV,QAAQ,CACb,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,iBAAiB,EAAE,OAAO,EAC1B,OAAO,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC;IAmCV,aAAa,CAClB,OAAO,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,MAAM,EACd,QAAQ,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC;IAkCZ,gBAAgB,CACrB,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,MAAM,GAAE,MAAe,EACvB,SAAS,GAAE,MAAU,GACnB,OAAO,CAAC,IAAI,CAAC;IAwBV,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBrC,MAAM,CACX,SAAS,GAAE,MAAe,EAC1B,MAAM,GAAE,MAAU,EAClB,CAAC,CAAC,EAAE,MAAM,EACV,CAAC,CAAC,EAAE,MAAM,GACR,OAAO,CAAC,IAAI,CAAC;IAkCV,IAAI,CACT,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GACV,OAAO,CAAC,IAAI,CAAC;IA6BV,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;IA+B7B,eAAe,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;CAkC1C"}
|
|
@@ -50,7 +50,8 @@ export class ComputerUseService extends Service {
|
|
|
50
50
|
return;
|
|
51
51
|
}
|
|
52
52
|
// ── Sandbox mode: force MCP to prevent local desktop control ──────
|
|
53
|
-
const
|
|
53
|
+
const runtimeRecord = this.runtime;
|
|
54
|
+
const isSandboxMode = Boolean(runtimeRecord?.sandboxMode);
|
|
54
55
|
if (isSandboxMode) {
|
|
55
56
|
logger.info("[computeruse] sandbox mode active — forcing MCP backend (local desktop control disabled)");
|
|
56
57
|
this.computeruseConfig.COMPUTERUSE_MODE = "mcp";
|
|
@@ -88,7 +89,11 @@ export class ComputerUseService extends Service {
|
|
|
88
89
|
return;
|
|
89
90
|
// Import only when needed (native optional deps).
|
|
90
91
|
try {
|
|
91
|
-
const
|
|
92
|
+
const loadModule = Function("moduleName", "return import(moduleName)");
|
|
93
|
+
const mod = (await loadModule("@elizaos/computeruse"));
|
|
94
|
+
if (typeof mod.Desktop !== "function") {
|
|
95
|
+
throw new Error("Desktop API is not available in @elizaos/computeruse");
|
|
96
|
+
}
|
|
92
97
|
this.localDesktop = new mod.Desktop();
|
|
93
98
|
}
|
|
94
99
|
catch (err) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"computeruse-service.js","sourceRoot":"","sources":["../../src/services/computeruse-service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,EAGL,uBAAuB,GAExB,MAAM,aAAa,CAAC;AAYrB,MAAM,OAAO,kBAAmB,SAAQ,OAAO;IAC7C,MAAM,CAAC,WAAW,GAAG,aAAa,CAAC;IACnC,qBAAqB,GACnB,qGAAqG,CAAC;IAEhG,iBAAiB,CAAoB;IACrC,WAAW,GAAkC,IAAI,CAAC;IAClD,WAAW,GAAG,KAAK,CAAC;IAE5B,uEAAuE;IAC/D,YAAY,GAAkD,IAAI,CAAC;IAE3E,YAAY,OAAuB;QACjC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,iBAAiB,GAAG,uBAAuB,CAAC,KAAK,CAAC;YACrD,mBAAmB,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,OAAO,CAAC;YACvE,gBAAgB,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,MAAM,CAAC;YAChE,sBAAsB,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,aAAa,CAAC;SACpF,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAsB;QACvC,MAAM,OAAO,GAAG,IAAI,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAChD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC;IACjD,CAAC;IAED,cAAc;QACZ,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,gBAAgB;QACd,OAAO,IAAI,CAAC,iBAAiB,CAAC,sBAAsB,CAAC;IACvD,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,iBAAiB,CAAC,mBAAmB,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,WAAW;QACf,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO;QAC7B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;IACjC,CAAC;IAEO,KAAK,CAAC,iBAAiB;QAC7B,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,mBAAmB,EAAE,CAAC;YAChD,MAAM,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;YAClE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;YACxB,OAAO;QACT,CAAC;QAED,qEAAqE;QACrE,MAAM,aAAa,GAAG,OAAO,CAC3B,IAAI,CAAC,OAAO,IAAK,IAAI,CAAC,OAAmC,CAAC,WAAW,CACtE,CAAC;QACF,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,CAAC,IAAI,CACT,0FAA0F,CAC3F,CAAC;YACF,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,GAAG,KAAK,CAAC;YAChD,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC9B,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;YACzB,OAAO;QACT,CAAC;QACD,qEAAqE;QAErE,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC;QACrD,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACrB,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAChC,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC;YAC3B,OAAO;QACT,CAAC;QACD,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;YACnB,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC9B,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;YACzB,OAAO;QACT,CAAC;QAED,sDAAsD;QACtD,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAChC,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC;YAC3B,OAAO;QACT,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,MAAM,CAAC,IAAI,CAAC,iEAAiE,GAAG,EAAE,CAAC,CAAC;QACtF,CAAC;QAED,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC9B,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,CAAC;IAEO,KAAK,CAAC,kBAAkB;QAC9B,IAAI,IAAI,CAAC,YAAY;YAAE,OAAO;QAE9B,kDAAkD;QAClD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;YACjD,IAAI,CAAC,YAAY,GAAG,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;QACxC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;YAClC,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAC1B,MAAM,IAAI,KAAK,CACb,wCAAwC,GAAG,sEAAsE,CAClH,CAAC;YACJ,CAAC;iBAAM,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;gBAChC,MAAM,IAAI,KAAK,CACb,wCAAwC,GAAG,qEAAqE,CACjH,CAAC;YACJ,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,gBAAgB;QAC5B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAE3C,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,sBAAsB,CAAC;QACjE,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;QAC1D,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CACb,eAAe,UAAU,0EAA0E,CACpG,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,iBAAiB;QAC7B,oFAAoF;QACpF,kEAAkE;QAClE,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC;YAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAiB,KAAK,CAAC,CAAC;YAC3D,IAAI,GAAG;gBAAE,OAAO,GAAG,CAAC;YACpB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;QAChE,CAAC;QACD,MAAM,IAAI,KAAK,CACb,wFAAwF,CACzF,CAAC;IACJ,CAAC;IAEO,MAAM;QACZ,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAiB,KAAK,CAAC,CAAC;QAC3D,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAEO,0BAA0B,CAChC,WAAmB,EACnB,WAAoB;QAEpB,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;QACxE,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;YACjC,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YACtC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,IAAI,KAAK,CACb,6FAA6F,CAC9F,CAAC;YACJ,CAAC;YACD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;QACtC,CAAC;QAED,MAAM,OAAO,GAAG,WAAW,EAAE,IAAI,EAAE,CAAC;QACpC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CACb,6FAA6F,CAC9F,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,OAAe;QACnC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,mBAAmB;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAE5F,IAAI,IAAI,CAAC,WAAW,KAAK,OAAO,EAAE,CAAC;YACjC,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAChC,IAAI,CAAC,YAAY,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC;YAC5C,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,WAAW,KAAK,KAAK,EAAE,CAAC;YAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YAC1B,MAAM,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,kBAAkB,EAAE;gBACpF,QAAQ,EAAE,OAAO;gBACjB,qBAAqB,EAAE,EAAE;gBACzB,yBAAyB,EAAE,EAAE;gBAC7B,yBAAyB,EAAE,KAAK;aACjC,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,QAAgB,EAAE,SAAiB,EAAE,OAAgB;QAC/D,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,mBAAmB;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAE5F,IAAI,IAAI,CAAC,WAAW,KAAK,OAAO,EAAE,CAAC;YACjC,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAChC,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YACvE,IAAI,CAAC,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,QAAQ,EAAE,CAAC,CAAC;YAC3D,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,WAAW,KAAK,KAAK,EAAE,CAAC;YAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,0BAA0B,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAClE,MAAM,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,eAAe,EAAE;gBACjF,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,UAAU,EAAE,SAAS;gBACrB,qBAAqB,EAAE,EAAE;gBACzB,yBAAyB,EAAE,EAAE;gBAC7B,uBAAuB,EAAE,KAAK;gBAC9B,oBAAoB,EAAE,KAAK;aAC5B,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,QAAQ,CACZ,QAAgB,EAChB,IAAY,EACZ,SAAiB,EACjB,iBAA0B,EAC1B,OAAgB;QAEhB,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,mBAAmB;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAE5F,IAAI,IAAI,CAAC,WAAW,KAAK,OAAO,EAAE,CAAC;YACjC,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAChC,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YACvE,IAAI,CAAC,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,QAAQ,EAAE,CAAC,CAAC;YAC3D,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,iBAAiB,EAAE,CAAC,CAAC;YACzC,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,WAAW,KAAK,KAAK,EAAE,CAAC;YAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,0BAA0B,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAClE,MAAM,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,mBAAmB,EAAE;gBACrF,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,YAAY,EAAE,IAAI;gBAClB,UAAU,EAAE,SAAS;gBACrB,mBAAmB,EAAE,iBAAiB;gBACtC,uBAAuB,EAAE,KAAK;gBAC9B,oBAAoB,EAAE,KAAK;aAC5B,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,OAAe,EAAE,KAAc,EAAE,QAAiB;QACpE,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,mBAAmB;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAE5F,IAAI,IAAI,CAAC,WAAW,KAAK,OAAO,EAAE,CAAC;YACjC,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAChC,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE,aAAa,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;YACzE,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC/C,CAAC;QAED,IAAI,IAAI,CAAC,WAAW,KAAK,KAAK,EAAE,CAAC;YAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YAC1B,MAAM,QAAQ,GAAe;gBAC3B,OAAO;gBACP,yBAAyB,EAAE,IAAI;aAChC,CAAC;YACF,IAAI,KAAK,KAAK,SAAS;gBAAE,QAAQ,CAAC,KAAK,GAAG,KAAK,CAAC;YAChD,IAAI,QAAQ,KAAK,SAAS;gBAAE,QAAQ,CAAC,cAAc,GAAG,QAAQ,CAAC;YAC/D,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,QAAQ,CAC5B,IAAI,CAAC,iBAAiB,CAAC,sBAAsB,EAC7C,iBAAiB,EACjB,QAAQ,CACT,CAAC;YACF,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO;iBACtB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;iBAChC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;iBAClB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;YACxC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,gBAAgB,CACpB,CAAS,EACT,CAAS,EACT,SAAiB,MAAM,EACvB,YAAoB,CAAC;QAErB,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,mBAAmB;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAE5F,IAAI,IAAI,CAAC,WAAW,KAAK,OAAO,EAAE,CAAC;YACjC,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAChC,IAAI,CAAC,YAAY,EAAE,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC5C,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,WAAW,KAAK,KAAK,EAAE,CAAC;YAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YAC1B,MAAM,GAAG,CAAC,QAAQ,CAChB,IAAI,CAAC,iBAAiB,CAAC,sBAAsB,EAC7C,sBAAsB,EACtB,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,CACxC,CAAC;YACF,OAAO;QACT,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAAY;QACzB,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,mBAAmB;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAE5F,IAAI,IAAI,CAAC,WAAW,KAAK,OAAO,EAAE,CAAC;YACjC,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAChC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;YAClC,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,WAAW,KAAK,KAAK,EAAE,CAAC;YAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YAC1B,MAAM,GAAG,CAAC,QAAQ,CAChB,IAAI,CAAC,iBAAiB,CAAC,sBAAsB,EAC7C,WAAW,EACX,EAAE,GAAG,EAAE,IAAI,EAAE,CACd,CAAC;YACF,OAAO;QACT,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,MAAM,CACV,YAAoB,MAAM,EAC1B,SAAiB,CAAC,EAClB,CAAU,EACV,CAAU;QAEV,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,mBAAmB;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAE5F,IAAI,IAAI,CAAC,WAAW,KAAK,OAAO,EAAE,CAAC;YACjC,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAChC,mFAAmF;YACnF,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;gBACvC,IAAI,CAAC,YAAY,EAAE,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC9C,CAAC;YACD,MAAM,SAAS,GAAG,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC;YACjE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAChC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;YACzC,CAAC;YACD,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,WAAW,KAAK,KAAK,EAAE,CAAC;YAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YAC1B,MAAM,QAAQ,GAAe,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;YACnD,IAAI,CAAC,KAAK,SAAS;gBAAE,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC;YACpC,IAAI,CAAC,KAAK,SAAS;gBAAE,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC;YACpC,MAAM,GAAG,CAAC,QAAQ,CAChB,IAAI,CAAC,iBAAiB,CAAC,sBAAsB,EAC7C,QAAQ,EACR,QAAQ,CACT,CAAC;YACF,OAAO;QACT,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,IAAI,CACR,MAAc,EACd,MAAc,EACd,IAAY,EACZ,IAAY;QAEZ,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,mBAAmB;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAE5F,IAAI,IAAI,CAAC,WAAW,KAAK,OAAO,EAAE,CAAC;YACjC,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAChC,wDAAwD;YACxD,2EAA2E;YAC3E,MAAM,CAAC,IAAI,CAAC,+EAA+E,CAAC,CAAC;YAC7F,IAAI,CAAC,YAAY,EAAE,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACtD,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,WAAW,KAAK,KAAK,EAAE,CAAC;YAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YAC1B,MAAM,GAAG,CAAC,QAAQ,CAChB,IAAI,CAAC,iBAAiB,CAAC,sBAAsB,EAC7C,MAAM,EACN,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAC/D,CAAC;YACF,OAAO;QACT,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,mBAAmB;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAE5F,IAAI,IAAI,CAAC,WAAW,KAAK,OAAO,EAAE,CAAC;YACjC,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAChC,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;YACpD,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,UAAU,IAAI,MAAM,EAAE,CAAC;gBACjE,OAAQ,MAAiC,CAAC,QAAQ,EAAE,CAAC;YACvD,CAAC;YACD,OAAO,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;QAC9B,CAAC;QAED,IAAI,IAAI,CAAC,WAAW,KAAK,KAAK,EAAE,CAAC;YAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YAC1B,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,QAAQ,CAC5B,IAAI,CAAC,iBAAiB,CAAC,sBAAsB,EAC7C,oBAAoB,EACpB,EAAE,CACH,CAAC;YACF,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO;iBACtB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;iBAChC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;iBAClB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;YACxC,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxB,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,mBAAmB;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAE5F,IAAI,IAAI,CAAC,WAAW,KAAK,OAAO,EAAE,CAAC;YACjC,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAChC,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;YACrD,uCAAuC;YACvC,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;gBACrB,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;oBAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClE,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,IAAI,CAAC,WAAW,KAAK,KAAK,EAAE,CAAC;YAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YAC1B,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,QAAQ,CAC5B,IAAI,CAAC,iBAAiB,CAAC,sBAAsB,EAC7C,mCAAmC,EACnC,EAAE,CACH,CAAC;YACF,+FAA+F;YAC/F,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO;iBACtB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;iBAChC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;iBAClB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;YACxC,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC;QAC9D,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACzD,CAAC","sourcesContent":["import type { IAgentRuntime } from \"@elizaos/core\";\nimport { logger, Service } from \"@elizaos/core\";\nimport type { CallToolResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport {\n type ComputerUseBackendName,\n type ComputerUseConfig,\n computerUseConfigSchema,\n type JsonObject,\n} from \"../types.js\";\n\n// Runtime service shape (from @elizaos/plugin-mcp), referenced structurally to avoid a hard dep.\ninterface McpServiceLike extends Service {\n callTool(\n serverName: string,\n toolName: string,\n toolArguments?: Readonly<JsonObject>\n ): Promise<CallToolResult>;\n getServers(): ReadonlyArray<{ name: string; status: string }>;\n}\n\nexport class ComputerUseService extends Service {\n static serviceType = \"computeruse\";\n capabilityDescription =\n \"Enables the agent to control a computer UI locally (when supported) or via a ComputerUse MCP server\";\n\n private computeruseConfig: ComputerUseConfig;\n private backendName: ComputerUseBackendName | null = null;\n private initialized = false;\n\n // Lazy-loaded to avoid importing native bindings unless actually used.\n private localDesktop: import(\"@elizaos/computeruse\").Desktop | null = null;\n\n constructor(runtime?: IAgentRuntime) {\n super(runtime);\n this.computeruseConfig = computerUseConfigSchema.parse({\n COMPUTERUSE_ENABLED: String(process.env.COMPUTERUSE_ENABLED ?? \"false\"),\n COMPUTERUSE_MODE: String(process.env.COMPUTERUSE_MODE ?? \"auto\"),\n COMPUTERUSE_MCP_SERVER: String(process.env.COMPUTERUSE_MCP_SERVER ?? \"computeruse\"),\n });\n }\n\n static async start(runtime: IAgentRuntime): Promise<ComputerUseService> {\n const service = new ComputerUseService(runtime);\n return service;\n }\n\n async stop(): Promise<void> {\n this.localDesktop = null;\n this.backendName = null;\n this.initialized = false;\n }\n\n getMode(): ComputerUseConfig[\"COMPUTERUSE_MODE\"] {\n return this.computeruseConfig.COMPUTERUSE_MODE;\n }\n\n getBackendName(): ComputerUseBackendName | null {\n return this.backendName;\n }\n\n getMcpServerName(): string {\n return this.computeruseConfig.COMPUTERUSE_MCP_SERVER;\n }\n\n isEnabled(): boolean {\n return this.computeruseConfig.COMPUTERUSE_ENABLED;\n }\n\n async ensureReady(): Promise<void> {\n if (this.initialized) return;\n this.initialized = true;\n await this.initializeBackend();\n }\n\n private async initializeBackend(): Promise<void> {\n if (!this.computeruseConfig.COMPUTERUSE_ENABLED) {\n logger.info(\"[computeruse] disabled (COMPUTERUSE_ENABLED=false)\");\n this.backendName = null;\n return;\n }\n\n // ── Sandbox mode: force MCP to prevent local desktop control ──────\n const isSandboxMode = Boolean(\n this.runtime && (this.runtime as Record<string, unknown>).sandboxMode,\n );\n if (isSandboxMode) {\n logger.info(\n \"[computeruse] sandbox mode active — forcing MCP backend (local desktop control disabled)\",\n );\n this.computeruseConfig.COMPUTERUSE_MODE = \"mcp\";\n await this.ensureMcpBackend();\n this.backendName = \"mcp\";\n return;\n }\n // ── End sandbox mode override ─────────────────────────────────────\n\n const mode = this.computeruseConfig.COMPUTERUSE_MODE;\n if (mode === \"local\") {\n await this.ensureLocalBackend();\n this.backendName = \"local\";\n return;\n }\n if (mode === \"mcp\") {\n await this.ensureMcpBackend();\n this.backendName = \"mcp\";\n return;\n }\n\n // auto - try local on all platforms, fall back to MCP\n try {\n await this.ensureLocalBackend();\n this.backendName = \"local\";\n return;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n logger.warn(`[computeruse] local backend unavailable, falling back to mcp: ${msg}`);\n }\n\n await this.ensureMcpBackend();\n this.backendName = \"mcp\";\n }\n\n private async ensureLocalBackend(): Promise<void> {\n if (this.localDesktop) return;\n\n // Import only when needed (native optional deps).\n try {\n const mod = await import(\"@elizaos/computeruse\");\n this.localDesktop = new mod.Desktop();\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n const platform = process.platform;\n if (platform === \"darwin\") {\n throw new Error(\n `macOS native bindings not available: ${msg}. Use MCP mode or ensure @elizaos/computeruse-darwin-* is installed.`\n );\n } else if (platform === \"linux\") {\n throw new Error(\n `Linux native bindings not available: ${msg}. Use MCP mode or ensure @elizaos/computeruse-linux-* is installed.`\n );\n }\n throw err;\n }\n }\n\n private async ensureMcpBackend(): Promise<void> {\n const mcp = await this.waitForMcpService();\n\n const serverName = this.computeruseConfig.COMPUTERUSE_MCP_SERVER;\n const servers = mcp.getServers();\n const exists = servers.some((s) => s.name === serverName);\n if (!exists) {\n throw new Error(\n `MCP server \"${serverName}\" not configured. Add it under runtime/character settings \"mcp.servers\".`\n );\n }\n }\n\n private async waitForMcpService(): Promise<McpServiceLike> {\n // Services are registered during runtime initialization; depending on plugin order,\n // \"mcp\" may not be available during another service's start hook.\n for (let attempt = 0; attempt < 20; attempt++) {\n const mcp = this.runtime.getService<McpServiceLike>(\"mcp\");\n if (mcp) return mcp;\n await new Promise<void>((resolve) => setTimeout(resolve, 50));\n }\n throw new Error(\n \"MCP service not available. Add @elizaos/plugin-mcp and configure a computeruse server.\"\n );\n }\n\n private getMcp(): McpServiceLike {\n const mcp = this.runtime.getService<McpServiceLike>(\"mcp\");\n if (!mcp) {\n throw new Error(\"MCP service not available\");\n }\n return mcp;\n }\n\n private parseProcessScopedSelector(\n rawSelector: string,\n processHint?: string\n ): { process: string; selector: string } {\n const selector = rawSelector.trim();\n const match = selector.match(/^\\s*process:([^\\s>]+)\\s*(?:>>\\s*(.*))?$/);\n if (match) {\n const process = match[1]?.trim();\n const inner = (match[2] ?? \"\").trim();\n if (!process) {\n throw new Error(\n \"Missing process. Provide parameters.process or prefix selector with 'process:<name> >> ...'\"\n );\n }\n return { process, selector: inner };\n }\n\n const process = processHint?.trim();\n if (!process) {\n throw new Error(\n \"Missing process. Provide parameters.process or prefix selector with 'process:<name> >> ...'\"\n );\n }\n return { process, selector };\n }\n\n async openApplication(appName: string): Promise<void> {\n await this.ensureReady();\n if (!this.computeruseConfig.COMPUTERUSE_ENABLED) throw new Error(\"ComputerUse is disabled\");\n\n if (this.backendName === \"local\") {\n await this.ensureLocalBackend();\n this.localDesktop?.openApplication(appName);\n return;\n }\n\n if (this.backendName === \"mcp\") {\n const mcp = this.getMcp();\n await mcp.callTool(this.computeruseConfig.COMPUTERUSE_MCP_SERVER, \"open_application\", {\n app_name: appName,\n verify_element_exists: \"\",\n verify_element_not_exists: \"\",\n include_tree_after_action: false,\n });\n return;\n }\n\n throw new Error(\"ComputerUse backend not initialized\");\n }\n\n async click(selector: string, timeoutMs: number, process?: string): Promise<void> {\n await this.ensureReady();\n if (!this.computeruseConfig.COMPUTERUSE_ENABLED) throw new Error(\"ComputerUse is disabled\");\n\n if (this.backendName === \"local\") {\n await this.ensureLocalBackend();\n const el = await this.localDesktop?.locator(selector).first(timeoutMs);\n if (!el) throw new Error(`Element not found: ${selector}`);\n await el.click();\n return;\n }\n\n if (this.backendName === \"mcp\") {\n const mcp = this.getMcp();\n const parsed = this.parseProcessScopedSelector(selector, process);\n await mcp.callTool(this.computeruseConfig.COMPUTERUSE_MCP_SERVER, \"click_element\", {\n process: parsed.process,\n selector: parsed.selector,\n timeout_ms: timeoutMs,\n verify_element_exists: \"\",\n verify_element_not_exists: \"\",\n highlight_before_action: false,\n ui_diff_before_after: false,\n });\n return;\n }\n\n throw new Error(\"ComputerUse backend not initialized\");\n }\n\n async typeText(\n selector: string,\n text: string,\n timeoutMs: number,\n clearBeforeTyping: boolean,\n process?: string\n ): Promise<void> {\n await this.ensureReady();\n if (!this.computeruseConfig.COMPUTERUSE_ENABLED) throw new Error(\"ComputerUse is disabled\");\n\n if (this.backendName === \"local\") {\n await this.ensureLocalBackend();\n const el = await this.localDesktop?.locator(selector).first(timeoutMs);\n if (!el) throw new Error(`Element not found: ${selector}`);\n el.typeText(text, { clearBeforeTyping });\n return;\n }\n\n if (this.backendName === \"mcp\") {\n const mcp = this.getMcp();\n const parsed = this.parseProcessScopedSelector(selector, process);\n await mcp.callTool(this.computeruseConfig.COMPUTERUSE_MCP_SERVER, \"type_into_element\", {\n process: parsed.process,\n selector: parsed.selector,\n text_to_type: text,\n timeout_ms: timeoutMs,\n clear_before_typing: clearBeforeTyping,\n highlight_before_action: false,\n ui_diff_before_after: false,\n });\n return;\n }\n\n throw new Error(\"ComputerUse backend not initialized\");\n }\n\n async getWindowTree(process: string, title?: string, maxDepth?: number): Promise<string> {\n await this.ensureReady();\n if (!this.computeruseConfig.COMPUTERUSE_ENABLED) throw new Error(\"ComputerUse is disabled\");\n\n if (this.backendName === \"local\") {\n await this.ensureLocalBackend();\n const tree = this.localDesktop?.getWindowTree(process, title, undefined);\n return JSON.stringify(tree ?? null, null, 2);\n }\n\n if (this.backendName === \"mcp\") {\n const mcp = this.getMcp();\n const toolArgs: JsonObject = {\n process,\n include_tree_after_action: true,\n };\n if (title !== undefined) toolArgs.title = title;\n if (maxDepth !== undefined) toolArgs.tree_max_depth = maxDepth;\n const res = await mcp.callTool(\n this.computeruseConfig.COMPUTERUSE_MCP_SERVER,\n \"get_window_tree\",\n toolArgs\n );\n const texts = res.content\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .filter((t) => typeof t === \"string\");\n return texts.join(\"\\n\");\n }\n\n throw new Error(\"ComputerUse backend not initialized\");\n }\n\n async clickCoordinates(\n x: number,\n y: number,\n button: string = \"left\",\n numClicks: number = 1\n ): Promise<void> {\n await this.ensureReady();\n if (!this.computeruseConfig.COMPUTERUSE_ENABLED) throw new Error(\"ComputerUse is disabled\");\n\n if (this.backendName === \"local\") {\n await this.ensureLocalBackend();\n this.localDesktop?.clickAtCoordinates(x, y);\n return;\n }\n\n if (this.backendName === \"mcp\") {\n const mcp = this.getMcp();\n await mcp.callTool(\n this.computeruseConfig.COMPUTERUSE_MCP_SERVER,\n \"click_at_coordinates\",\n { x, y, button, num_clicks: numClicks }\n );\n return;\n }\n\n throw new Error(\"ComputerUse backend not initialized\");\n }\n\n async pressKey(keys: string): Promise<void> {\n await this.ensureReady();\n if (!this.computeruseConfig.COMPUTERUSE_ENABLED) throw new Error(\"ComputerUse is disabled\");\n\n if (this.backendName === \"local\") {\n await this.ensureLocalBackend();\n this.localDesktop?.pressKey(keys);\n return;\n }\n\n if (this.backendName === \"mcp\") {\n const mcp = this.getMcp();\n await mcp.callTool(\n this.computeruseConfig.COMPUTERUSE_MCP_SERVER,\n \"press_key\",\n { key: keys }\n );\n return;\n }\n\n throw new Error(\"ComputerUse backend not initialized\");\n }\n\n async scroll(\n direction: string = \"down\",\n amount: number = 3,\n x?: number,\n y?: number\n ): Promise<void> {\n await this.ensureReady();\n if (!this.computeruseConfig.COMPUTERUSE_ENABLED) throw new Error(\"ComputerUse is disabled\");\n\n if (this.backendName === \"local\") {\n await this.ensureLocalBackend();\n // Local backend: click at position first if specified, then scroll via key presses\n if (x !== undefined && y !== undefined) {\n this.localDesktop?.clickAtCoordinates(x, y);\n }\n const scrollKey = direction === \"up\" ? \"scrollup\" : \"scrolldown\";\n for (let i = 0; i < amount; i++) {\n this.localDesktop?.pressKey(scrollKey);\n }\n return;\n }\n\n if (this.backendName === \"mcp\") {\n const mcp = this.getMcp();\n const toolArgs: JsonObject = { direction, amount };\n if (x !== undefined) toolArgs.x = x;\n if (y !== undefined) toolArgs.y = y;\n await mcp.callTool(\n this.computeruseConfig.COMPUTERUSE_MCP_SERVER,\n \"scroll\",\n toolArgs\n );\n return;\n }\n\n throw new Error(\"ComputerUse backend not initialized\");\n }\n\n async drag(\n startX: number,\n startY: number,\n endX: number,\n endY: number\n ): Promise<void> {\n await this.ensureReady();\n if (!this.computeruseConfig.COMPUTERUSE_ENABLED) throw new Error(\"ComputerUse is disabled\");\n\n if (this.backendName === \"local\") {\n await this.ensureLocalBackend();\n // The Desktop native API does not expose a drag method.\n // Local backend can only click the start position; full drag requires MCP.\n logger.warn(\"[computeruse] Local drag is limited to click-at-start. Use MCP for full drag.\");\n this.localDesktop?.clickAtCoordinates(startX, startY);\n return;\n }\n\n if (this.backendName === \"mcp\") {\n const mcp = this.getMcp();\n await mcp.callTool(\n this.computeruseConfig.COMPUTERUSE_MCP_SERVER,\n \"drag\",\n { start_x: startX, start_y: startY, end_x: endX, end_y: endY }\n );\n return;\n }\n\n throw new Error(\"ComputerUse backend not initialized\");\n }\n\n async screenshot(): Promise<string> {\n await this.ensureReady();\n if (!this.computeruseConfig.COMPUTERUSE_ENABLED) throw new Error(\"ComputerUse is disabled\");\n\n if (this.backendName === \"local\") {\n await this.ensureLocalBackend();\n const result = this.localDesktop?.captureMonitor(0);\n if (result && typeof result === \"object\" && \"toBase64\" in result) {\n return (result as { toBase64(): string }).toBase64();\n }\n return String(result ?? \"\");\n }\n\n if (this.backendName === \"mcp\") {\n const mcp = this.getMcp();\n const res = await mcp.callTool(\n this.computeruseConfig.COMPUTERUSE_MCP_SERVER,\n \"capture_screenshot\",\n {}\n );\n const texts = res.content\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .filter((t) => typeof t === \"string\");\n return texts.join(\"\");\n }\n\n throw new Error(\"ComputerUse backend not initialized\");\n }\n\n async getApplications(): Promise<string[]> {\n await this.ensureReady();\n if (!this.computeruseConfig.COMPUTERUSE_ENABLED) throw new Error(\"ComputerUse is disabled\");\n\n if (this.backendName === \"local\") {\n await this.ensureLocalBackend();\n const apps = this.localDesktop?.applications() ?? [];\n // Normalize into human-readable names.\n const names: string[] = [];\n for (const app of apps) {\n const n = app.name();\n if (typeof n === \"string\" && n.trim().length > 0) names.push(n);\n }\n return names;\n }\n\n if (this.backendName === \"mcp\") {\n const mcp = this.getMcp();\n const res = await mcp.callTool(\n this.computeruseConfig.COMPUTERUSE_MCP_SERVER,\n \"get_applications_and_windows_list\",\n {}\n );\n // Return text-only summary for now; structured parsing is done in actions/providers if needed.\n const texts = res.content\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .filter((t) => typeof t === \"string\");\n return texts.length > 0 ? texts : [\"(see MCP tool output)\"];\n }\n\n throw new Error(\"ComputerUse backend not initialized\");\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"computeruse-service.js","sourceRoot":"","sources":["../../src/services/computeruse-service.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IAgentRuntime } from \"@elizaos/core\";\nimport { logger, Service } from \"@elizaos/core\";\nimport type { CallToolResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport {\n\ttype ComputerUseBackendName,\n\ttype ComputerUseConfig,\n\tcomputerUseConfigSchema,\n\ttype JsonObject,\n} from \"../types.js\";\n\n// Runtime service shape (from @elizaos/plugin-mcp), referenced structurally to avoid a hard dep.\ninterface McpServiceLike extends Service {\n\tcallTool(\n\t\tserverName: string,\n\t\ttoolName: string,\n\t\ttoolArguments?: Readonly<JsonObject>,\n\t): Promise<CallToolResult>;\n\tgetServers(): ReadonlyArray<{ name: string; status: string }>;\n}\n\ninterface LocalDesktopElementLike {\n\tclick(): Promise<void> | void;\n\ttypeText(\n\t\ttext: string,\n\t\toptions?: { clearBeforeTyping?: boolean },\n\t): Promise<void> | void;\n}\n\ninterface LocalDesktopLocatorLike {\n\tfirst(timeoutMs: number): Promise<LocalDesktopElementLike | null | undefined>;\n}\n\ninterface LocalDesktopApplicationLike {\n\tname(): string;\n}\n\ninterface LocalDesktopLike {\n\topenApplication(appName: string): Promise<void> | void;\n\tlocator(selector: string): LocalDesktopLocatorLike;\n\tgetWindowTree(process: string, title?: string, format?: unknown): unknown;\n\tclickAtCoordinates(x: number, y: number): Promise<void> | void;\n\tpressKey(keys: string): Promise<void> | void;\n\tcaptureMonitor(index: number): unknown;\n\tapplications(): LocalDesktopApplicationLike[];\n}\n\ntype LocalDesktopModuleLike = {\n\tDesktop?: new () => LocalDesktopLike;\n};\n\nexport class ComputerUseService extends Service {\n\tstatic serviceType = \"computeruse\";\n\tcapabilityDescription =\n\t\t\"Enables the agent to control a computer UI locally (when supported) or via a ComputerUse MCP server\";\n\n\tprivate computeruseConfig: ComputerUseConfig;\n\tprivate backendName: ComputerUseBackendName | null = null;\n\tprivate initialized = false;\n\n\t// Lazy-loaded to avoid importing native bindings unless actually used.\n\tprivate localDesktop: LocalDesktopLike | null = null;\n\n\tconstructor(runtime?: IAgentRuntime) {\n\t\tsuper(runtime);\n\t\tthis.computeruseConfig = computerUseConfigSchema.parse({\n\t\t\tCOMPUTERUSE_ENABLED: String(process.env.COMPUTERUSE_ENABLED ?? \"false\"),\n\t\t\tCOMPUTERUSE_MODE: String(process.env.COMPUTERUSE_MODE ?? \"auto\"),\n\t\t\tCOMPUTERUSE_MCP_SERVER: String(\n\t\t\t\tprocess.env.COMPUTERUSE_MCP_SERVER ?? \"computeruse\",\n\t\t\t),\n\t\t});\n\t}\n\n\tstatic async start(runtime: IAgentRuntime): Promise<ComputerUseService> {\n\t\tconst service = new ComputerUseService(runtime);\n\t\treturn service;\n\t}\n\n\tasync stop(): Promise<void> {\n\t\tthis.localDesktop = null;\n\t\tthis.backendName = null;\n\t\tthis.initialized = false;\n\t}\n\n\tgetMode(): ComputerUseConfig[\"COMPUTERUSE_MODE\"] {\n\t\treturn this.computeruseConfig.COMPUTERUSE_MODE;\n\t}\n\n\tgetBackendName(): ComputerUseBackendName | null {\n\t\treturn this.backendName;\n\t}\n\n\tgetMcpServerName(): string {\n\t\treturn this.computeruseConfig.COMPUTERUSE_MCP_SERVER;\n\t}\n\n\tisEnabled(): boolean {\n\t\treturn this.computeruseConfig.COMPUTERUSE_ENABLED;\n\t}\n\n\tasync ensureReady(): Promise<void> {\n\t\tif (this.initialized) return;\n\t\tthis.initialized = true;\n\t\tawait this.initializeBackend();\n\t}\n\n\tprivate async initializeBackend(): Promise<void> {\n\t\tif (!this.computeruseConfig.COMPUTERUSE_ENABLED) {\n\t\t\tlogger.info(\"[computeruse] disabled (COMPUTERUSE_ENABLED=false)\");\n\t\t\tthis.backendName = null;\n\t\t\treturn;\n\t\t}\n\n\t\t// ── Sandbox mode: force MCP to prevent local desktop control ──────\n\t\tconst runtimeRecord = this.runtime as unknown as { sandboxMode?: unknown };\n\t\tconst isSandboxMode = Boolean(runtimeRecord?.sandboxMode);\n\t\tif (isSandboxMode) {\n\t\t\tlogger.info(\n\t\t\t\t\"[computeruse] sandbox mode active — forcing MCP backend (local desktop control disabled)\",\n\t\t\t);\n\t\t\tthis.computeruseConfig.COMPUTERUSE_MODE = \"mcp\";\n\t\t\tawait this.ensureMcpBackend();\n\t\t\tthis.backendName = \"mcp\";\n\t\t\treturn;\n\t\t}\n\t\t// ── End sandbox mode override ─────────────────────────────────────\n\n\t\tconst mode = this.computeruseConfig.COMPUTERUSE_MODE;\n\t\tif (mode === \"local\") {\n\t\t\tawait this.ensureLocalBackend();\n\t\t\tthis.backendName = \"local\";\n\t\t\treturn;\n\t\t}\n\t\tif (mode === \"mcp\") {\n\t\t\tawait this.ensureMcpBackend();\n\t\t\tthis.backendName = \"mcp\";\n\t\t\treturn;\n\t\t}\n\n\t\t// auto - try local on all platforms, fall back to MCP\n\t\ttry {\n\t\t\tawait this.ensureLocalBackend();\n\t\t\tthis.backendName = \"local\";\n\t\t\treturn;\n\t\t} catch (err) {\n\t\t\tconst msg = err instanceof Error ? err.message : String(err);\n\t\t\tlogger.warn(\n\t\t\t\t`[computeruse] local backend unavailable, falling back to mcp: ${msg}`,\n\t\t\t);\n\t\t}\n\n\t\tawait this.ensureMcpBackend();\n\t\tthis.backendName = \"mcp\";\n\t}\n\n\tprivate async ensureLocalBackend(): Promise<void> {\n\t\tif (this.localDesktop) return;\n\n\t\t// Import only when needed (native optional deps).\n\t\ttry {\n\t\t\tconst loadModule = Function(\n\t\t\t\t\"moduleName\",\n\t\t\t\t\"return import(moduleName)\",\n\t\t\t) as (moduleName: string) => Promise<unknown>;\n\t\t\tconst mod = (await loadModule(\n\t\t\t\t\"@elizaos/computeruse\",\n\t\t\t)) as LocalDesktopModuleLike;\n\t\t\tif (typeof mod.Desktop !== \"function\") {\n\t\t\t\tthrow new Error(\"Desktop API is not available in @elizaos/computeruse\");\n\t\t\t}\n\t\t\tthis.localDesktop = new mod.Desktop();\n\t\t} catch (err) {\n\t\t\tconst msg = err instanceof Error ? err.message : String(err);\n\t\t\tconst platform = process.platform;\n\t\t\tif (platform === \"darwin\") {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`macOS native bindings not available: ${msg}. Use MCP mode or ensure @elizaos/computeruse-darwin-* is installed.`,\n\t\t\t\t);\n\t\t\t} else if (platform === \"linux\") {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Linux native bindings not available: ${msg}. Use MCP mode or ensure @elizaos/computeruse-linux-* is installed.`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\tprivate async ensureMcpBackend(): Promise<void> {\n\t\tconst mcp = await this.waitForMcpService();\n\n\t\tconst serverName = this.computeruseConfig.COMPUTERUSE_MCP_SERVER;\n\t\tconst servers = mcp.getServers();\n\t\tconst exists = servers.some((s) => s.name === serverName);\n\t\tif (!exists) {\n\t\t\tthrow new Error(\n\t\t\t\t`MCP server \"${serverName}\" not configured. Add it under runtime/character settings \"mcp.servers\".`,\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate async waitForMcpService(): Promise<McpServiceLike> {\n\t\t// Services are registered during runtime initialization; depending on plugin order,\n\t\t// \"mcp\" may not be available during another service's start hook.\n\t\tfor (let attempt = 0; attempt < 20; attempt++) {\n\t\t\tconst mcp = this.runtime.getService<McpServiceLike>(\"mcp\");\n\t\t\tif (mcp) return mcp;\n\t\t\tawait new Promise<void>((resolve) => setTimeout(resolve, 50));\n\t\t}\n\t\tthrow new Error(\n\t\t\t\"MCP service not available. Add @elizaos/plugin-mcp and configure a computeruse server.\",\n\t\t);\n\t}\n\n\tprivate getMcp(): McpServiceLike {\n\t\tconst mcp = this.runtime.getService<McpServiceLike>(\"mcp\");\n\t\tif (!mcp) {\n\t\t\tthrow new Error(\"MCP service not available\");\n\t\t}\n\t\treturn mcp;\n\t}\n\n\tprivate parseProcessScopedSelector(\n\t\trawSelector: string,\n\t\tprocessHint?: string,\n\t): { process: string; selector: string } {\n\t\tconst selector = rawSelector.trim();\n\t\tconst match = selector.match(/^\\s*process:([^\\s>]+)\\s*(?:>>\\s*(.*))?$/);\n\t\tif (match) {\n\t\t\tconst process = match[1]?.trim();\n\t\t\tconst inner = (match[2] ?? \"\").trim();\n\t\t\tif (!process) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"Missing process. Provide parameters.process or prefix selector with 'process:<name> >> ...'\",\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn { process, selector: inner };\n\t\t}\n\n\t\tconst process = processHint?.trim();\n\t\tif (!process) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Missing process. Provide parameters.process or prefix selector with 'process:<name> >> ...'\",\n\t\t\t);\n\t\t}\n\t\treturn { process, selector };\n\t}\n\n\tasync openApplication(appName: string): Promise<void> {\n\t\tawait this.ensureReady();\n\t\tif (!this.computeruseConfig.COMPUTERUSE_ENABLED)\n\t\t\tthrow new Error(\"ComputerUse is disabled\");\n\n\t\tif (this.backendName === \"local\") {\n\t\t\tawait this.ensureLocalBackend();\n\t\t\tthis.localDesktop?.openApplication(appName);\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.backendName === \"mcp\") {\n\t\t\tconst mcp = this.getMcp();\n\t\t\tawait mcp.callTool(\n\t\t\t\tthis.computeruseConfig.COMPUTERUSE_MCP_SERVER,\n\t\t\t\t\"open_application\",\n\t\t\t\t{\n\t\t\t\t\tapp_name: appName,\n\t\t\t\t\tverify_element_exists: \"\",\n\t\t\t\t\tverify_element_not_exists: \"\",\n\t\t\t\t\tinclude_tree_after_action: false,\n\t\t\t\t},\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tthrow new Error(\"ComputerUse backend not initialized\");\n\t}\n\n\tasync click(\n\t\tselector: string,\n\t\ttimeoutMs: number,\n\t\tprocess?: string,\n\t): Promise<void> {\n\t\tawait this.ensureReady();\n\t\tif (!this.computeruseConfig.COMPUTERUSE_ENABLED)\n\t\t\tthrow new Error(\"ComputerUse is disabled\");\n\n\t\tif (this.backendName === \"local\") {\n\t\t\tawait this.ensureLocalBackend();\n\t\t\tconst el = await this.localDesktop?.locator(selector).first(timeoutMs);\n\t\t\tif (!el) throw new Error(`Element not found: ${selector}`);\n\t\t\tawait el.click();\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.backendName === \"mcp\") {\n\t\t\tconst mcp = this.getMcp();\n\t\t\tconst parsed = this.parseProcessScopedSelector(selector, process);\n\t\t\tawait mcp.callTool(\n\t\t\t\tthis.computeruseConfig.COMPUTERUSE_MCP_SERVER,\n\t\t\t\t\"click_element\",\n\t\t\t\t{\n\t\t\t\t\tprocess: parsed.process,\n\t\t\t\t\tselector: parsed.selector,\n\t\t\t\t\ttimeout_ms: timeoutMs,\n\t\t\t\t\tverify_element_exists: \"\",\n\t\t\t\t\tverify_element_not_exists: \"\",\n\t\t\t\t\thighlight_before_action: false,\n\t\t\t\t\tui_diff_before_after: false,\n\t\t\t\t},\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tthrow new Error(\"ComputerUse backend not initialized\");\n\t}\n\n\tasync typeText(\n\t\tselector: string,\n\t\ttext: string,\n\t\ttimeoutMs: number,\n\t\tclearBeforeTyping: boolean,\n\t\tprocess?: string,\n\t): Promise<void> {\n\t\tawait this.ensureReady();\n\t\tif (!this.computeruseConfig.COMPUTERUSE_ENABLED)\n\t\t\tthrow new Error(\"ComputerUse is disabled\");\n\n\t\tif (this.backendName === \"local\") {\n\t\t\tawait this.ensureLocalBackend();\n\t\t\tconst el = await this.localDesktop?.locator(selector).first(timeoutMs);\n\t\t\tif (!el) throw new Error(`Element not found: ${selector}`);\n\t\t\tel.typeText(text, { clearBeforeTyping });\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.backendName === \"mcp\") {\n\t\t\tconst mcp = this.getMcp();\n\t\t\tconst parsed = this.parseProcessScopedSelector(selector, process);\n\t\t\tawait mcp.callTool(\n\t\t\t\tthis.computeruseConfig.COMPUTERUSE_MCP_SERVER,\n\t\t\t\t\"type_into_element\",\n\t\t\t\t{\n\t\t\t\t\tprocess: parsed.process,\n\t\t\t\t\tselector: parsed.selector,\n\t\t\t\t\ttext_to_type: text,\n\t\t\t\t\ttimeout_ms: timeoutMs,\n\t\t\t\t\tclear_before_typing: clearBeforeTyping,\n\t\t\t\t\thighlight_before_action: false,\n\t\t\t\t\tui_diff_before_after: false,\n\t\t\t\t},\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tthrow new Error(\"ComputerUse backend not initialized\");\n\t}\n\n\tasync getWindowTree(\n\t\tprocess: string,\n\t\ttitle?: string,\n\t\tmaxDepth?: number,\n\t): Promise<string> {\n\t\tawait this.ensureReady();\n\t\tif (!this.computeruseConfig.COMPUTERUSE_ENABLED)\n\t\t\tthrow new Error(\"ComputerUse is disabled\");\n\n\t\tif (this.backendName === \"local\") {\n\t\t\tawait this.ensureLocalBackend();\n\t\t\tconst tree = this.localDesktop?.getWindowTree(process, title, undefined);\n\t\t\treturn JSON.stringify(tree ?? null, null, 2);\n\t\t}\n\n\t\tif (this.backendName === \"mcp\") {\n\t\t\tconst mcp = this.getMcp();\n\t\t\tconst toolArgs: JsonObject = {\n\t\t\t\tprocess,\n\t\t\t\tinclude_tree_after_action: true,\n\t\t\t};\n\t\t\tif (title !== undefined) toolArgs.title = title;\n\t\t\tif (maxDepth !== undefined) toolArgs.tree_max_depth = maxDepth;\n\t\t\tconst res = await mcp.callTool(\n\t\t\t\tthis.computeruseConfig.COMPUTERUSE_MCP_SERVER,\n\t\t\t\t\"get_window_tree\",\n\t\t\t\ttoolArgs,\n\t\t\t);\n\t\t\tconst texts = res.content\n\t\t\t\t.filter((c) => c.type === \"text\")\n\t\t\t\t.map((c) => c.text)\n\t\t\t\t.filter((t) => typeof t === \"string\");\n\t\t\treturn texts.join(\"\\n\");\n\t\t}\n\n\t\tthrow new Error(\"ComputerUse backend not initialized\");\n\t}\n\n\tasync clickCoordinates(\n\t\tx: number,\n\t\ty: number,\n\t\tbutton: string = \"left\",\n\t\tnumClicks: number = 1,\n\t): Promise<void> {\n\t\tawait this.ensureReady();\n\t\tif (!this.computeruseConfig.COMPUTERUSE_ENABLED)\n\t\t\tthrow new Error(\"ComputerUse is disabled\");\n\n\t\tif (this.backendName === \"local\") {\n\t\t\tawait this.ensureLocalBackend();\n\t\t\tthis.localDesktop?.clickAtCoordinates(x, y);\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.backendName === \"mcp\") {\n\t\t\tconst mcp = this.getMcp();\n\t\t\tawait mcp.callTool(\n\t\t\t\tthis.computeruseConfig.COMPUTERUSE_MCP_SERVER,\n\t\t\t\t\"click_at_coordinates\",\n\t\t\t\t{ x, y, button, num_clicks: numClicks },\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tthrow new Error(\"ComputerUse backend not initialized\");\n\t}\n\n\tasync pressKey(keys: string): Promise<void> {\n\t\tawait this.ensureReady();\n\t\tif (!this.computeruseConfig.COMPUTERUSE_ENABLED)\n\t\t\tthrow new Error(\"ComputerUse is disabled\");\n\n\t\tif (this.backendName === \"local\") {\n\t\t\tawait this.ensureLocalBackend();\n\t\t\tthis.localDesktop?.pressKey(keys);\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.backendName === \"mcp\") {\n\t\t\tconst mcp = this.getMcp();\n\t\t\tawait mcp.callTool(\n\t\t\t\tthis.computeruseConfig.COMPUTERUSE_MCP_SERVER,\n\t\t\t\t\"press_key\",\n\t\t\t\t{ key: keys },\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tthrow new Error(\"ComputerUse backend not initialized\");\n\t}\n\n\tasync scroll(\n\t\tdirection: string = \"down\",\n\t\tamount: number = 3,\n\t\tx?: number,\n\t\ty?: number,\n\t): Promise<void> {\n\t\tawait this.ensureReady();\n\t\tif (!this.computeruseConfig.COMPUTERUSE_ENABLED)\n\t\t\tthrow new Error(\"ComputerUse is disabled\");\n\n\t\tif (this.backendName === \"local\") {\n\t\t\tawait this.ensureLocalBackend();\n\t\t\t// Local backend: click at position first if specified, then scroll via key presses\n\t\t\tif (x !== undefined && y !== undefined) {\n\t\t\t\tthis.localDesktop?.clickAtCoordinates(x, y);\n\t\t\t}\n\t\t\tconst scrollKey = direction === \"up\" ? \"scrollup\" : \"scrolldown\";\n\t\t\tfor (let i = 0; i < amount; i++) {\n\t\t\t\tthis.localDesktop?.pressKey(scrollKey);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.backendName === \"mcp\") {\n\t\t\tconst mcp = this.getMcp();\n\t\t\tconst toolArgs: JsonObject = { direction, amount };\n\t\t\tif (x !== undefined) toolArgs.x = x;\n\t\t\tif (y !== undefined) toolArgs.y = y;\n\t\t\tawait mcp.callTool(\n\t\t\t\tthis.computeruseConfig.COMPUTERUSE_MCP_SERVER,\n\t\t\t\t\"scroll\",\n\t\t\t\ttoolArgs,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tthrow new Error(\"ComputerUse backend not initialized\");\n\t}\n\n\tasync drag(\n\t\tstartX: number,\n\t\tstartY: number,\n\t\tendX: number,\n\t\tendY: number,\n\t): Promise<void> {\n\t\tawait this.ensureReady();\n\t\tif (!this.computeruseConfig.COMPUTERUSE_ENABLED)\n\t\t\tthrow new Error(\"ComputerUse is disabled\");\n\n\t\tif (this.backendName === \"local\") {\n\t\t\tawait this.ensureLocalBackend();\n\t\t\t// The Desktop native API does not expose a drag method.\n\t\t\t// Local backend can only click the start position; full drag requires MCP.\n\t\t\tlogger.warn(\n\t\t\t\t\"[computeruse] Local drag is limited to click-at-start. Use MCP for full drag.\",\n\t\t\t);\n\t\t\tthis.localDesktop?.clickAtCoordinates(startX, startY);\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.backendName === \"mcp\") {\n\t\t\tconst mcp = this.getMcp();\n\t\t\tawait mcp.callTool(\n\t\t\t\tthis.computeruseConfig.COMPUTERUSE_MCP_SERVER,\n\t\t\t\t\"drag\",\n\t\t\t\t{ start_x: startX, start_y: startY, end_x: endX, end_y: endY },\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tthrow new Error(\"ComputerUse backend not initialized\");\n\t}\n\n\tasync screenshot(): Promise<string> {\n\t\tawait this.ensureReady();\n\t\tif (!this.computeruseConfig.COMPUTERUSE_ENABLED)\n\t\t\tthrow new Error(\"ComputerUse is disabled\");\n\n\t\tif (this.backendName === \"local\") {\n\t\t\tawait this.ensureLocalBackend();\n\t\t\tconst result = this.localDesktop?.captureMonitor(0);\n\t\t\tif (result && typeof result === \"object\" && \"toBase64\" in result) {\n\t\t\t\treturn (result as { toBase64(): string }).toBase64();\n\t\t\t}\n\t\t\treturn String(result ?? \"\");\n\t\t}\n\n\t\tif (this.backendName === \"mcp\") {\n\t\t\tconst mcp = this.getMcp();\n\t\t\tconst res = await mcp.callTool(\n\t\t\t\tthis.computeruseConfig.COMPUTERUSE_MCP_SERVER,\n\t\t\t\t\"capture_screenshot\",\n\t\t\t\t{},\n\t\t\t);\n\t\t\tconst texts = res.content\n\t\t\t\t.filter((c) => c.type === \"text\")\n\t\t\t\t.map((c) => c.text)\n\t\t\t\t.filter((t) => typeof t === \"string\");\n\t\t\treturn texts.join(\"\");\n\t\t}\n\n\t\tthrow new Error(\"ComputerUse backend not initialized\");\n\t}\n\n\tasync getApplications(): Promise<string[]> {\n\t\tawait this.ensureReady();\n\t\tif (!this.computeruseConfig.COMPUTERUSE_ENABLED)\n\t\t\tthrow new Error(\"ComputerUse is disabled\");\n\n\t\tif (this.backendName === \"local\") {\n\t\t\tawait this.ensureLocalBackend();\n\t\t\tconst apps = this.localDesktop?.applications() ?? [];\n\t\t\t// Normalize into human-readable names.\n\t\t\tconst names: string[] = [];\n\t\t\tfor (const app of apps) {\n\t\t\t\tconst n = app.name();\n\t\t\t\tif (typeof n === \"string\" && n.trim().length > 0) names.push(n);\n\t\t\t}\n\t\t\treturn names;\n\t\t}\n\n\t\tif (this.backendName === \"mcp\") {\n\t\t\tconst mcp = this.getMcp();\n\t\t\tconst res = await mcp.callTool(\n\t\t\t\tthis.computeruseConfig.COMPUTERUSE_MCP_SERVER,\n\t\t\t\t\"get_applications_and_windows_list\",\n\t\t\t\t{},\n\t\t\t);\n\t\t\t// Return text-only summary for now; structured parsing is done in actions/providers if needed.\n\t\t\tconst texts = res.content\n\t\t\t\t.filter((c) => c.type === \"text\")\n\t\t\t\t.map((c) => c.text)\n\t\t\t\t.filter((t) => typeof t === \"string\");\n\t\t\treturn texts.length > 0 ? texts : [\"(see MCP tool output)\"];\n\t\t}\n\n\t\tthrow new Error(\"ComputerUse backend not initialized\");\n\t}\n}\n"]}
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;AAC7D,MAAM,MAAM,SAAS,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;AAC7D,MAAM,MAAM,SAAS,GAClB,aAAa,GACb,SAAS,EAAE,GACX;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAChC,MAAM,MAAM,UAAU,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAEtD,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC;AAEvD,eAAO,MAAM,uBAAuB;;;;;;;;iBAQlC,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAExE,MAAM,MAAM,sBAAsB,GAAG,OAAO,GAAG,KAAK,CAAC;AAErD,MAAM,WAAW,+BAA+B;IAC/C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,qBAAqB;IACrC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,oBAAoB;IACpC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC;CACpC;AAED,MAAM,WAAW,6BAA6B;IAC7C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC3B"}
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAWxB,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/C,mBAAmB,EAAE,CAAC;SACpB,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,OAAO,CAAC,OAAO,CAAC;SAChB,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,MAAM,CAAC;IACpC,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;IAC7E,sBAAsB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC;CACpE,CAAC,CAAC","sourcesContent":["import { z } from \"zod\";\n\nexport type JsonPrimitive = string | number | boolean | null;\nexport type JsonValue =\n\t| JsonPrimitive\n\t| JsonValue[]\n\t| { [key: string]: JsonValue };\nexport type JsonObject = { [key: string]: JsonValue };\n\nexport type ComputerUseMode = \"auto\" | \"local\" | \"mcp\";\n\nexport const computerUseConfigSchema = z.object({\n\tCOMPUTERUSE_ENABLED: z\n\t\t.string()\n\t\t.optional()\n\t\t.default(\"false\")\n\t\t.transform((val) => val === \"true\"),\n\tCOMPUTERUSE_MODE: z.enum([\"auto\", \"local\", \"mcp\"]).optional().default(\"auto\"),\n\tCOMPUTERUSE_MCP_SERVER: z.string().optional().default(\"computeruse\"),\n});\n\nexport type ComputerUseConfig = z.infer<typeof computerUseConfigSchema>;\n\nexport type ComputerUseBackendName = \"local\" | \"mcp\";\n\nexport interface ComputerUseOpenApplicationInput {\n\treadonly name: string;\n}\n\nexport interface ComputerUseClickInput {\n\treadonly process?: string;\n\treadonly selector: string;\n\treadonly timeoutMs: number;\n}\n\nexport interface ComputerUseTypeInput {\n\treadonly process?: string;\n\treadonly selector: string;\n\treadonly text: string;\n\treadonly timeoutMs: number;\n\treadonly clearBeforeTyping: boolean;\n}\n\nexport interface ComputerUseGetWindowTreeInput {\n\treadonly process: string;\n\treadonly title?: string;\n\treadonly maxDepth?: number;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"params.d.ts","sourceRoot":"","sources":["../../src/utils/params.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEtD,wBAAgB,cAAc,
|
|
1
|
+
{"version":3,"file":"params.d.ts","sourceRoot":"","sources":["../../src/utils/params.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEtD,wBAAgB,cAAc,CAC7B,MAAM,EAAE,gBAAgB,GAAG,SAAS,EACpC,IAAI,EAAE,MAAM,GACV,MAAM,GAAG,SAAS,CAGpB;AAED,wBAAgB,cAAc,CAC7B,MAAM,EAAE,gBAAgB,GAAG,SAAS,EACpC,IAAI,EAAE,MAAM,GACV,MAAM,GAAG,SAAS,CAGpB;AAED,wBAAgB,eAAe,CAC9B,MAAM,EAAE,gBAAgB,GAAG,SAAS,EACpC,IAAI,EAAE,MAAM,GACV,OAAO,GAAG,SAAS,CAGrB"}
|
package/dist/utils/params.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"params.js","sourceRoot":"","sources":["../../src/utils/params.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,cAAc,
|
|
1
|
+
{"version":3,"file":"params.js","sourceRoot":"","sources":["../../src/utils/params.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,cAAc,CAC7B,MAAoC,EACpC,IAAY;IAEZ,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;IAC3B,OAAO,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,cAAc,CAC7B,MAAoC,EACpC,IAAY;IAEZ,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;IAC3B,OAAO,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,eAAe,CAC9B,MAAoC,EACpC,IAAY;IAEZ,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;IAC3B,OAAO,OAAO,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;AACnD,CAAC","sourcesContent":["import type { ActionParameters } from \"@elizaos/core\";\n\nexport function getStringParam(\n\tparams: ActionParameters | undefined,\n\tname: string,\n): string | undefined {\n\tconst val = params?.[name];\n\treturn typeof val === \"string\" ? val : undefined;\n}\n\nexport function getNumberParam(\n\tparams: ActionParameters | undefined,\n\tname: string,\n): number | undefined {\n\tconst val = params?.[name];\n\treturn typeof val === \"number\" ? val : undefined;\n}\n\nexport function getBooleanParam(\n\tparams: ActionParameters | undefined,\n\tname: string,\n): boolean | undefined {\n\tconst val = params?.[name];\n\treturn typeof val === \"boolean\" ? val : undefined;\n}\n"]}
|