visionclaw 0.1.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/README.md +116 -0
- package/dist/agent/context.d.ts +56 -0
- package/dist/agent/context.d.ts.map +1 -0
- package/dist/agent/context.js +142 -0
- package/dist/agent/context.js.map +1 -0
- package/dist/agent/loop.d.ts +18 -0
- package/dist/agent/loop.d.ts.map +1 -0
- package/dist/agent/loop.js +323 -0
- package/dist/agent/loop.js.map +1 -0
- package/dist/agent/session.d.ts +49 -0
- package/dist/agent/session.d.ts.map +1 -0
- package/dist/agent/session.js +200 -0
- package/dist/agent/session.js.map +1 -0
- package/dist/agent/system-prompt.d.ts +10 -0
- package/dist/agent/system-prompt.d.ts.map +1 -0
- package/dist/agent/system-prompt.js +167 -0
- package/dist/agent/system-prompt.js.map +1 -0
- package/dist/calendar/google-calendar.d.ts +46 -0
- package/dist/calendar/google-calendar.d.ts.map +1 -0
- package/dist/calendar/google-calendar.js +132 -0
- package/dist/calendar/google-calendar.js.map +1 -0
- package/dist/calendar/scheduler.d.ts +7 -0
- package/dist/calendar/scheduler.d.ts.map +1 -0
- package/dist/calendar/scheduler.js +33 -0
- package/dist/calendar/scheduler.js.map +1 -0
- package/dist/channels/discord.d.ts +19 -0
- package/dist/channels/discord.d.ts.map +1 -0
- package/dist/channels/discord.js +169 -0
- package/dist/channels/discord.js.map +1 -0
- package/dist/channels/gmail.d.ts +31 -0
- package/dist/channels/gmail.d.ts.map +1 -0
- package/dist/channels/gmail.js +300 -0
- package/dist/channels/gmail.js.map +1 -0
- package/dist/channels/interface.d.ts +45 -0
- package/dist/channels/interface.d.ts.map +1 -0
- package/dist/channels/interface.js +2 -0
- package/dist/channels/interface.js.map +1 -0
- package/dist/channels/manager.d.ts +36 -0
- package/dist/channels/manager.d.ts.map +1 -0
- package/dist/channels/manager.js +108 -0
- package/dist/channels/manager.js.map +1 -0
- package/dist/channels/queue.d.ts +17 -0
- package/dist/channels/queue.d.ts.map +1 -0
- package/dist/channels/queue.js +85 -0
- package/dist/channels/queue.js.map +1 -0
- package/dist/channels/slack.d.ts +17 -0
- package/dist/channels/slack.d.ts.map +1 -0
- package/dist/channels/slack.js +142 -0
- package/dist/channels/slack.js.map +1 -0
- package/dist/channels/sms.d.ts +19 -0
- package/dist/channels/sms.d.ts.map +1 -0
- package/dist/channels/sms.js +111 -0
- package/dist/channels/sms.js.map +1 -0
- package/dist/channels/telegram.d.ts +28 -0
- package/dist/channels/telegram.d.ts.map +1 -0
- package/dist/channels/telegram.js +246 -0
- package/dist/channels/telegram.js.map +1 -0
- package/dist/channels/whatsapp.d.ts +28 -0
- package/dist/channels/whatsapp.d.ts.map +1 -0
- package/dist/channels/whatsapp.js +292 -0
- package/dist/channels/whatsapp.js.map +1 -0
- package/dist/config/index.d.ts +24 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +104 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/types.d.ts +227 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +45 -0
- package/dist/config/types.js.map +1 -0
- package/dist/files.d.ts +20 -0
- package/dist/files.d.ts.map +1 -0
- package/dist/files.js +82 -0
- package/dist/files.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +54 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +76 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +384 -0
- package/dist/logger.js.map +1 -0
- package/dist/memory/store.d.ts +24 -0
- package/dist/memory/store.d.ts.map +1 -0
- package/dist/memory/store.js +71 -0
- package/dist/memory/store.js.map +1 -0
- package/dist/obs/server.d.ts +10 -0
- package/dist/obs/server.d.ts.map +1 -0
- package/dist/obs/server.js +406 -0
- package/dist/obs/server.js.map +1 -0
- package/dist/onboarding/google-auth.d.ts +11 -0
- package/dist/onboarding/google-auth.d.ts.map +1 -0
- package/dist/onboarding/google-auth.js +113 -0
- package/dist/onboarding/google-auth.js.map +1 -0
- package/dist/onboarding/index.d.ts +2 -0
- package/dist/onboarding/index.d.ts.map +1 -0
- package/dist/onboarding/index.js +213 -0
- package/dist/onboarding/index.js.map +1 -0
- package/dist/onboarding/macos-permissions.d.ts +37 -0
- package/dist/onboarding/macos-permissions.d.ts.map +1 -0
- package/dist/onboarding/macos-permissions.js +207 -0
- package/dist/onboarding/macos-permissions.js.map +1 -0
- package/dist/skills/install.d.ts +7 -0
- package/dist/skills/install.d.ts.map +1 -0
- package/dist/skills/install.js +63 -0
- package/dist/skills/install.js.map +1 -0
- package/dist/tools/browser.d.ts +7 -0
- package/dist/tools/browser.d.ts.map +1 -0
- package/dist/tools/browser.js +202 -0
- package/dist/tools/browser.js.map +1 -0
- package/dist/tools/calendar.d.ts +12 -0
- package/dist/tools/calendar.d.ts.map +1 -0
- package/dist/tools/calendar.js +210 -0
- package/dist/tools/calendar.js.map +1 -0
- package/dist/tools/computer-use.d.ts +28 -0
- package/dist/tools/computer-use.d.ts.map +1 -0
- package/dist/tools/computer-use.js +311 -0
- package/dist/tools/computer-use.js.map +1 -0
- package/dist/tools/coordinate-resolver.d.ts +26 -0
- package/dist/tools/coordinate-resolver.d.ts.map +1 -0
- package/dist/tools/coordinate-resolver.js +157 -0
- package/dist/tools/coordinate-resolver.js.map +1 -0
- package/dist/tools/desktop-executor.d.ts +52 -0
- package/dist/tools/desktop-executor.d.ts.map +1 -0
- package/dist/tools/desktop-executor.js +202 -0
- package/dist/tools/desktop-executor.js.map +1 -0
- package/dist/tools/finish.d.ts +5 -0
- package/dist/tools/finish.d.ts.map +1 -0
- package/dist/tools/finish.js +18 -0
- package/dist/tools/finish.js.map +1 -0
- package/dist/tools/index.d.ts +7 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +37 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/memory.d.ts +14 -0
- package/dist/tools/memory.d.ts.map +1 -0
- package/dist/tools/memory.js +269 -0
- package/dist/tools/memory.js.map +1 -0
- package/dist/tools/notify.d.ts +12 -0
- package/dist/tools/notify.d.ts.map +1 -0
- package/dist/tools/notify.js +108 -0
- package/dist/tools/notify.js.map +1 -0
- package/dist/tools/screenshot.d.ts +7 -0
- package/dist/tools/screenshot.d.ts.map +1 -0
- package/dist/tools/screenshot.js +189 -0
- package/dist/tools/screenshot.js.map +1 -0
- package/dist/tools/skill.d.ts +8 -0
- package/dist/tools/skill.d.ts.map +1 -0
- package/dist/tools/skill.js +133 -0
- package/dist/tools/skill.js.map +1 -0
- package/dist/tools/upgrade.d.ts +5 -0
- package/dist/tools/upgrade.d.ts.map +1 -0
- package/dist/tools/upgrade.js +89 -0
- package/dist/tools/upgrade.js.map +1 -0
- package/dist/tools/wait.d.ts +5 -0
- package/dist/tools/wait.d.ts.map +1 -0
- package/dist/tools/wait.js +21 -0
- package/dist/tools/wait.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Computer use MCP tools for desktop interaction.
|
|
3
|
+
* Each tool: screenshot -> resolve coordinates (if needed) -> execute -> result screenshot.
|
|
4
|
+
*/
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
import { tool } from "@anthropic-ai/claude-agent-sdk";
|
|
7
|
+
import { captureScreen, getDisplaySize, click, doubleClick, rightClick, drag, typeText, pressKey, scroll, } from "./desktop-executor.js";
|
|
8
|
+
import { resolveCoordinates } from "./coordinate-resolver.js";
|
|
9
|
+
import { logger } from "../logger.js";
|
|
10
|
+
/** Check if we're on macOS; computer_use tools require darwin + cliclick. */
|
|
11
|
+
function requireDarwin() {
|
|
12
|
+
if (process.platform !== "darwin") {
|
|
13
|
+
return {
|
|
14
|
+
content: [{ type: "text", text: "computer_use tools require macOS" }],
|
|
15
|
+
isError: true,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
async function getApiKey() {
|
|
21
|
+
const { loadConfig } = await import("../config/index.js");
|
|
22
|
+
try {
|
|
23
|
+
const config = loadConfig();
|
|
24
|
+
return config.anthropicApiKey;
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return process.env.ANTHROPIC_API_KEY ?? null;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
async function resolveAndExecute(instruction, apiKey, fn) {
|
|
31
|
+
const screenshot = await captureScreen();
|
|
32
|
+
const size = getDisplaySize();
|
|
33
|
+
const resolved = await resolveCoordinates(screenshot, instruction, size.width, size.height, apiKey);
|
|
34
|
+
if (!resolved) {
|
|
35
|
+
return {
|
|
36
|
+
content: [
|
|
37
|
+
{
|
|
38
|
+
type: "text",
|
|
39
|
+
text: `Could not resolve coordinates for: ${instruction}`,
|
|
40
|
+
},
|
|
41
|
+
],
|
|
42
|
+
isError: true,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
await fn(resolved.x, resolved.y);
|
|
46
|
+
// wait for 1 second
|
|
47
|
+
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
48
|
+
const resultScreenshot = await captureScreen();
|
|
49
|
+
return {
|
|
50
|
+
content: [
|
|
51
|
+
{ type: "text", text: `Executed at (${resolved.x}, ${resolved.y})` },
|
|
52
|
+
{
|
|
53
|
+
type: "image",
|
|
54
|
+
data: resultScreenshot,
|
|
55
|
+
mimeType: "image/png",
|
|
56
|
+
},
|
|
57
|
+
],
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
export const computerUseClickTool = tool("computer_use_click", "Click on a UI element described in natural language (e.g. 'the Chrome icon', 'the submit button'). Resolves target via AI, then performs left/right/double-click.", {
|
|
61
|
+
target: z.string().describe("Natural language description of the element to click"),
|
|
62
|
+
button: z.enum(["left", "right", "double"]).optional().default("left"),
|
|
63
|
+
}, async (args) => {
|
|
64
|
+
const err = requireDarwin();
|
|
65
|
+
if (err)
|
|
66
|
+
return err;
|
|
67
|
+
const apiKey = await getApiKey();
|
|
68
|
+
if (!apiKey) {
|
|
69
|
+
return {
|
|
70
|
+
content: [{ type: "text", text: "ANTHROPIC_API_KEY not configured" }],
|
|
71
|
+
isError: true,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
const instruction = args.button === "right"
|
|
75
|
+
? `Right-click on: ${args.target}`
|
|
76
|
+
: args.button === "double"
|
|
77
|
+
? `Double-click on: ${args.target}`
|
|
78
|
+
: `Click on: ${args.target}`;
|
|
79
|
+
const fn = args.button === "right"
|
|
80
|
+
? (x, y) => rightClick(x, y)
|
|
81
|
+
: args.button === "double"
|
|
82
|
+
? (x, y) => doubleClick(x, y)
|
|
83
|
+
: (x, y) => click(x, y);
|
|
84
|
+
try {
|
|
85
|
+
return await resolveAndExecute(instruction, apiKey, fn);
|
|
86
|
+
}
|
|
87
|
+
catch (e) {
|
|
88
|
+
logger.err("computer_use_click failed", { error: String(e) });
|
|
89
|
+
return {
|
|
90
|
+
content: [
|
|
91
|
+
{
|
|
92
|
+
type: "text",
|
|
93
|
+
text: `computer_use_click failed: ${e instanceof Error ? e.message : String(e)}`,
|
|
94
|
+
},
|
|
95
|
+
],
|
|
96
|
+
isError: true,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
export const computerUseScrollTool = tool("computer_use_scroll", "Scroll at a target location in a direction. Resolves the scroll target via AI, then scrolls.", {
|
|
101
|
+
target: z.string().describe("Natural language description of where to scroll"),
|
|
102
|
+
direction: z.enum(["up", "down", "left", "right"]),
|
|
103
|
+
amount: z.number().optional().default(3).describe("Scroll amount (default 3)"),
|
|
104
|
+
}, async (args) => {
|
|
105
|
+
const err = requireDarwin();
|
|
106
|
+
if (err)
|
|
107
|
+
return err;
|
|
108
|
+
const apiKey = await getApiKey();
|
|
109
|
+
if (!apiKey) {
|
|
110
|
+
return {
|
|
111
|
+
content: [{ type: "text", text: "ANTHROPIC_API_KEY not configured" }],
|
|
112
|
+
isError: true,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
const instruction = `Move cursor to the center of: ${args.target} (for scrolling)`;
|
|
116
|
+
const amount = args.amount;
|
|
117
|
+
try {
|
|
118
|
+
return await resolveAndExecute(instruction, apiKey, async (x, y) => {
|
|
119
|
+
await scroll(x, y, args.direction, amount);
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
catch (e) {
|
|
123
|
+
logger.err("computer_use_scroll failed", { error: String(e) });
|
|
124
|
+
return {
|
|
125
|
+
content: [
|
|
126
|
+
{
|
|
127
|
+
type: "text",
|
|
128
|
+
text: `computer_use_scroll failed: ${e instanceof Error ? e.message : String(e)}`,
|
|
129
|
+
},
|
|
130
|
+
],
|
|
131
|
+
isError: true,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
export const computerUseDragTool = tool("computer_use_drag", "Drag from one element to another. Resolves both 'from' and 'to' via AI, then performs drag.", {
|
|
136
|
+
from: z.string().describe("Natural language description of drag start"),
|
|
137
|
+
to: z.string().describe("Natural language description of drag end"),
|
|
138
|
+
}, async (args) => {
|
|
139
|
+
const err = requireDarwin();
|
|
140
|
+
if (err)
|
|
141
|
+
return err;
|
|
142
|
+
const apiKey = await getApiKey();
|
|
143
|
+
if (!apiKey) {
|
|
144
|
+
return {
|
|
145
|
+
content: [{ type: "text", text: "ANTHROPIC_API_KEY not configured" }],
|
|
146
|
+
isError: true,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
const screenshot = await captureScreen();
|
|
150
|
+
const size = getDisplaySize();
|
|
151
|
+
const fromResolved = await resolveCoordinates(screenshot, `The start point for dragging: ${args.from}`, size.width, size.height, apiKey);
|
|
152
|
+
if (!fromResolved) {
|
|
153
|
+
return {
|
|
154
|
+
content: [
|
|
155
|
+
{
|
|
156
|
+
type: "text",
|
|
157
|
+
text: `Could not resolve 'from' coordinates: ${args.from}`,
|
|
158
|
+
},
|
|
159
|
+
],
|
|
160
|
+
isError: true,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
const toScreenshot = await captureScreen();
|
|
164
|
+
const toResolved = await resolveCoordinates(toScreenshot, `The end point for dragging: ${args.to}`, size.width, size.height, apiKey);
|
|
165
|
+
if (!toResolved) {
|
|
166
|
+
return {
|
|
167
|
+
content: [
|
|
168
|
+
{
|
|
169
|
+
type: "text",
|
|
170
|
+
text: `Could not resolve 'to' coordinates: ${args.to}`,
|
|
171
|
+
},
|
|
172
|
+
],
|
|
173
|
+
isError: true,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
try {
|
|
177
|
+
await drag(fromResolved.x, fromResolved.y, toResolved.x, toResolved.y);
|
|
178
|
+
const resultScreenshot = await captureScreen();
|
|
179
|
+
return {
|
|
180
|
+
content: [
|
|
181
|
+
{
|
|
182
|
+
type: "text",
|
|
183
|
+
text: `Dragged from (${fromResolved.x}, ${fromResolved.y}) to (${toResolved.x}, ${toResolved.y})`,
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
type: "image",
|
|
187
|
+
data: resultScreenshot,
|
|
188
|
+
mimeType: "image/png",
|
|
189
|
+
},
|
|
190
|
+
],
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
catch (e) {
|
|
194
|
+
logger.err("computer_use_drag failed", { error: String(e) });
|
|
195
|
+
return {
|
|
196
|
+
content: [
|
|
197
|
+
{
|
|
198
|
+
type: "text",
|
|
199
|
+
text: `computer_use_drag failed: ${e instanceof Error ? e.message : String(e)}`,
|
|
200
|
+
},
|
|
201
|
+
],
|
|
202
|
+
isError: true,
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
export const computerUseTypeTool = tool("computer_use_type", "Type text into the focused field. Optionally clear the field first (replace) and/or press Enter after.", {
|
|
207
|
+
text: z.string().describe("Text to type"),
|
|
208
|
+
replace: z.boolean().optional().default(false).describe("If true, select-all and replace existing text first"),
|
|
209
|
+
press_enter: z.boolean().optional().default(false).describe("If true, press Enter after typing"),
|
|
210
|
+
}, async (args) => {
|
|
211
|
+
const err = requireDarwin();
|
|
212
|
+
if (err)
|
|
213
|
+
return err;
|
|
214
|
+
try {
|
|
215
|
+
if (args.replace) {
|
|
216
|
+
await pressKey("cmd+a");
|
|
217
|
+
}
|
|
218
|
+
await typeText(args.text);
|
|
219
|
+
if (args.press_enter) {
|
|
220
|
+
await pressKey("enter");
|
|
221
|
+
}
|
|
222
|
+
const resultScreenshot = await captureScreen();
|
|
223
|
+
return {
|
|
224
|
+
content: [
|
|
225
|
+
{ type: "text", text: `Typed text${args.press_enter ? " and pressed Enter" : ""}` },
|
|
226
|
+
{
|
|
227
|
+
type: "image",
|
|
228
|
+
data: resultScreenshot,
|
|
229
|
+
mimeType: "image/png",
|
|
230
|
+
},
|
|
231
|
+
],
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
catch (e) {
|
|
235
|
+
logger.err("computer_use_type failed", { error: String(e) });
|
|
236
|
+
return {
|
|
237
|
+
content: [
|
|
238
|
+
{
|
|
239
|
+
type: "text",
|
|
240
|
+
text: `computer_use_type failed: ${e instanceof Error ? e.message : String(e)}`,
|
|
241
|
+
},
|
|
242
|
+
],
|
|
243
|
+
isError: true,
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
});
|
|
247
|
+
export const computerUseKeyTool = tool("computer_use_key", "Press a key or key combination (e.g. 'enter', 'escape', 'cmd+s', 'ctrl+shift+t').", {
|
|
248
|
+
key: z
|
|
249
|
+
.string()
|
|
250
|
+
.describe("Key or combo: 'enter', 'escape', 'cmd+s', 'ctrl+shift+t', etc."),
|
|
251
|
+
}, async (args) => {
|
|
252
|
+
const err = requireDarwin();
|
|
253
|
+
if (err)
|
|
254
|
+
return err;
|
|
255
|
+
try {
|
|
256
|
+
await pressKey(args.key);
|
|
257
|
+
const resultScreenshot = await captureScreen();
|
|
258
|
+
return {
|
|
259
|
+
content: [
|
|
260
|
+
{ type: "text", text: `Pressed: ${args.key}` },
|
|
261
|
+
{
|
|
262
|
+
type: "image",
|
|
263
|
+
data: resultScreenshot,
|
|
264
|
+
mimeType: "image/png",
|
|
265
|
+
},
|
|
266
|
+
],
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
catch (e) {
|
|
270
|
+
logger.err("computer_use_key failed", { error: String(e) });
|
|
271
|
+
return {
|
|
272
|
+
content: [
|
|
273
|
+
{
|
|
274
|
+
type: "text",
|
|
275
|
+
text: `computer_use_key failed: ${e instanceof Error ? e.message : String(e)}`,
|
|
276
|
+
},
|
|
277
|
+
],
|
|
278
|
+
isError: true,
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
});
|
|
282
|
+
export const computerUseScreenshotTool = tool("computer_use_screenshot", "Take a screenshot of the desktop. Returns the image.", {}, async () => {
|
|
283
|
+
const err = requireDarwin();
|
|
284
|
+
if (err)
|
|
285
|
+
return err;
|
|
286
|
+
try {
|
|
287
|
+
const base64 = await captureScreen();
|
|
288
|
+
return {
|
|
289
|
+
content: [
|
|
290
|
+
{
|
|
291
|
+
type: "image",
|
|
292
|
+
data: base64,
|
|
293
|
+
mimeType: "image/png",
|
|
294
|
+
},
|
|
295
|
+
],
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
catch (e) {
|
|
299
|
+
logger.err("computer_use_screenshot failed", { error: String(e) });
|
|
300
|
+
return {
|
|
301
|
+
content: [
|
|
302
|
+
{
|
|
303
|
+
type: "text",
|
|
304
|
+
text: `computer_use_screenshot failed: ${e instanceof Error ? e.message : String(e)}`,
|
|
305
|
+
},
|
|
306
|
+
],
|
|
307
|
+
isError: true,
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
});
|
|
311
|
+
//# sourceMappingURL=computer-use.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"computer-use.js","sourceRoot":"","sources":["../../src/tools/computer-use.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolves natural language targets to pixel coordinates using
|
|
3
|
+
* Anthropic's computer_20251124 tool via the Messages API.
|
|
4
|
+
*
|
|
5
|
+
* Sends screenshot + instruction to Claude; Claude returns a tool_use
|
|
6
|
+
* with action and coordinate. We extract coordinates only (no execution).
|
|
7
|
+
*
|
|
8
|
+
* IMPORTANT: Claude's computer-use tool has display dimension constraints.
|
|
9
|
+
* We must scale down the display dimensions we send, and then unscale
|
|
10
|
+
* the returned coordinates back to actual display space.
|
|
11
|
+
* Reference: https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool
|
|
12
|
+
*/
|
|
13
|
+
export interface ResolvedAction {
|
|
14
|
+
action: string;
|
|
15
|
+
x: number;
|
|
16
|
+
y: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Resolve a natural language target to pixel coordinates.
|
|
20
|
+
* Uses Messages API with computer_20251124 tool; returns the first tool_use result.
|
|
21
|
+
*
|
|
22
|
+
* The screenshot is resized to fit Claude's constraints before sending.
|
|
23
|
+
* Returned coordinates are unscaled back to actual display space.
|
|
24
|
+
*/
|
|
25
|
+
export declare function resolveCoordinates(screenshotBase64: string, instruction: string, displayWidth: number, displayHeight: number, apiKey: string): Promise<ResolvedAction | null>;
|
|
26
|
+
//# sourceMappingURL=coordinate-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coordinate-resolver.d.ts","sourceRoot":"","sources":["../../src/tools/coordinate-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAaH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAyED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,gBAAgB,EAAE,MAAM,EACxB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAyFhC"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolves natural language targets to pixel coordinates using
|
|
3
|
+
* Anthropic's computer_20251124 tool via the Messages API.
|
|
4
|
+
*
|
|
5
|
+
* Sends screenshot + instruction to Claude; Claude returns a tool_use
|
|
6
|
+
* with action and coordinate. We extract coordinates only (no execution).
|
|
7
|
+
*
|
|
8
|
+
* IMPORTANT: Claude's computer-use tool has display dimension constraints.
|
|
9
|
+
* We must scale down the display dimensions we send, and then unscale
|
|
10
|
+
* the returned coordinates back to actual display space.
|
|
11
|
+
* Reference: https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool
|
|
12
|
+
*/
|
|
13
|
+
import { exec } from "node:child_process";
|
|
14
|
+
import { promisify } from "node:util";
|
|
15
|
+
import fs from "node:fs";
|
|
16
|
+
import path from "node:path";
|
|
17
|
+
import os from "node:os";
|
|
18
|
+
import Anthropic from "@anthropic-ai/sdk";
|
|
19
|
+
import { logger } from "../logger.js";
|
|
20
|
+
import { CLAUDE_MODEL } from "../agent/session.js";
|
|
21
|
+
const execAsync = promisify(exec);
|
|
22
|
+
// ── Claude computer-use dimension constraints ──────────────────────────
|
|
23
|
+
const CLAUDE_MAX_LONG_EDGE_PX = 1568;
|
|
24
|
+
const CLAUDE_MAX_PIXELS = 1_150_000;
|
|
25
|
+
/**
|
|
26
|
+
* Compute how much to scale the display dimensions to fit Claude's constraints.
|
|
27
|
+
* Returns a factor <= 1.0.
|
|
28
|
+
*/
|
|
29
|
+
function getScaleFactor(width, height) {
|
|
30
|
+
const longEdge = Math.max(width, height);
|
|
31
|
+
const totalPixels = width * height;
|
|
32
|
+
const longEdgeScale = CLAUDE_MAX_LONG_EDGE_PX / longEdge;
|
|
33
|
+
const totalPixelsScale = Math.sqrt(CLAUDE_MAX_PIXELS / totalPixels);
|
|
34
|
+
return Math.min(1.0, longEdgeScale, totalPixelsScale);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Get the scaled display dimensions and scale factor to send to Claude.
|
|
38
|
+
*/
|
|
39
|
+
function getToolDisplaySize(displayWidth, displayHeight) {
|
|
40
|
+
const scale = getScaleFactor(displayWidth, displayHeight);
|
|
41
|
+
const width = Math.max(1, Math.floor(displayWidth * scale));
|
|
42
|
+
const height = Math.max(1, Math.floor(displayHeight * scale));
|
|
43
|
+
return { width, height, scale };
|
|
44
|
+
}
|
|
45
|
+
function clamp(n, min, max) {
|
|
46
|
+
return Math.max(min, Math.min(max, n));
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Resize a base64 PNG screenshot to target dimensions.
|
|
50
|
+
* Uses sips on macOS, ImageMagick on Linux.
|
|
51
|
+
* Returns the resized image as base64.
|
|
52
|
+
*/
|
|
53
|
+
async function resizeScreenshot(base64, targetWidth, targetHeight) {
|
|
54
|
+
const tmpIn = path.join(os.tmpdir(), `visionclaw-resize-in-${Date.now()}.png`);
|
|
55
|
+
const tmpOut = path.join(os.tmpdir(), `visionclaw-resize-out-${Date.now()}.png`);
|
|
56
|
+
try {
|
|
57
|
+
fs.writeFileSync(tmpIn, Buffer.from(base64, "base64"));
|
|
58
|
+
if (process.platform === "darwin") {
|
|
59
|
+
await execAsync(`sips -z ${targetHeight} ${targetWidth} "${tmpIn}" --out "${tmpOut}"`);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
await execAsync(`convert "${tmpIn}" -resize ${targetWidth}x${targetHeight}! "${tmpOut}"`);
|
|
63
|
+
}
|
|
64
|
+
const resized = fs.readFileSync(tmpOut);
|
|
65
|
+
return resized.toString("base64");
|
|
66
|
+
}
|
|
67
|
+
finally {
|
|
68
|
+
try {
|
|
69
|
+
fs.unlinkSync(tmpIn);
|
|
70
|
+
}
|
|
71
|
+
catch { /* noop */ }
|
|
72
|
+
try {
|
|
73
|
+
fs.unlinkSync(tmpOut);
|
|
74
|
+
}
|
|
75
|
+
catch { /* noop */ }
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// ── Resolver ───────────────────────────────────────────────────────────
|
|
79
|
+
/**
|
|
80
|
+
* Resolve a natural language target to pixel coordinates.
|
|
81
|
+
* Uses Messages API with computer_20251124 tool; returns the first tool_use result.
|
|
82
|
+
*
|
|
83
|
+
* The screenshot is resized to fit Claude's constraints before sending.
|
|
84
|
+
* Returned coordinates are unscaled back to actual display space.
|
|
85
|
+
*/
|
|
86
|
+
export async function resolveCoordinates(screenshotBase64, instruction, displayWidth, displayHeight, apiKey) {
|
|
87
|
+
const toolDisplay = getToolDisplaySize(displayWidth, displayHeight);
|
|
88
|
+
logger.info(`Resolving coordinates: "${instruction}" (display ${displayWidth}x${displayHeight}, tool ${toolDisplay.width}x${toolDisplay.height}, scale=${toolDisplay.scale.toFixed(3)})`, { instruction, displayWidth, displayHeight, toolWidth: toolDisplay.width, toolHeight: toolDisplay.height, scale: toolDisplay.scale });
|
|
89
|
+
// Resize screenshot to match the tool display dimensions
|
|
90
|
+
let imageBase64 = screenshotBase64;
|
|
91
|
+
if (toolDisplay.scale < 1.0) {
|
|
92
|
+
try {
|
|
93
|
+
imageBase64 = await resizeScreenshot(screenshotBase64, toolDisplay.width, toolDisplay.height);
|
|
94
|
+
logger.debug(`Screenshot resized to ${toolDisplay.width}x${toolDisplay.height} for coordinate resolution`);
|
|
95
|
+
}
|
|
96
|
+
catch (e) {
|
|
97
|
+
logger.warn(`Failed to resize screenshot, sending original: ${e instanceof Error ? e.message : String(e)}`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
const client = new Anthropic({ apiKey });
|
|
101
|
+
const response = await client.beta.messages.create({
|
|
102
|
+
model: CLAUDE_MODEL,
|
|
103
|
+
max_tokens: 1024,
|
|
104
|
+
betas: ["computer-use-2025-11-24"],
|
|
105
|
+
tools: [
|
|
106
|
+
{
|
|
107
|
+
type: "computer_20251124",
|
|
108
|
+
name: "computer",
|
|
109
|
+
display_width_px: toolDisplay.width,
|
|
110
|
+
display_height_px: toolDisplay.height,
|
|
111
|
+
display_number: 1,
|
|
112
|
+
},
|
|
113
|
+
],
|
|
114
|
+
system: "You are a helpful assistant that can resolve natural language targets to pixel coordinates using the computer tool. Call the tool directly, no questions or explanations.",
|
|
115
|
+
tool_choice: { type: "tool", name: "computer" },
|
|
116
|
+
messages: [
|
|
117
|
+
{
|
|
118
|
+
role: "user",
|
|
119
|
+
content: [
|
|
120
|
+
{
|
|
121
|
+
type: "image",
|
|
122
|
+
source: {
|
|
123
|
+
type: "base64",
|
|
124
|
+
media_type: "image/png",
|
|
125
|
+
data: imageBase64,
|
|
126
|
+
},
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
type: "text",
|
|
130
|
+
text: instruction,
|
|
131
|
+
},
|
|
132
|
+
],
|
|
133
|
+
},
|
|
134
|
+
],
|
|
135
|
+
});
|
|
136
|
+
for (const block of response.content) {
|
|
137
|
+
if (block.type === "tool_use" && block.name === "computer") {
|
|
138
|
+
const input = block.input;
|
|
139
|
+
const coord = input.coordinate;
|
|
140
|
+
const action = input.action ?? "left_click";
|
|
141
|
+
if (Array.isArray(coord) && coord.length >= 2) {
|
|
142
|
+
const rawX = coord[0];
|
|
143
|
+
const rawY = coord[1];
|
|
144
|
+
if (typeof rawX === "number" && typeof rawY === "number" && Number.isFinite(rawX) && Number.isFinite(rawY)) {
|
|
145
|
+
// Unscale: Claude returned coords in tool display space → convert to actual display space
|
|
146
|
+
const x = clamp(Math.round(rawX / toolDisplay.scale), 0, displayWidth);
|
|
147
|
+
const y = clamp(Math.round(rawY / toolDisplay.scale), 0, displayHeight);
|
|
148
|
+
logger.info(`Resolved coordinates: action=${action} raw=(${rawX},${rawY}) unscaled=(${x},${y}) scale=${toolDisplay.scale.toFixed(3)}`, { instruction, action, rawX, rawY, x, y, scale: toolDisplay.scale });
|
|
149
|
+
return { action, x, y };
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
logger.info(`Could not resolve coordinates: "${instruction}"`, { instruction });
|
|
155
|
+
return null;
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=coordinate-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coordinate-resolver.js","sourceRoot":"","sources":["../../src/tools/coordinate-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Low-level macOS desktop executor using cliclick, osascript, and screencapture.
|
|
3
|
+
* Used by computer_use MCP tools to perform mouse, keyboard, and screenshot actions.
|
|
4
|
+
*/
|
|
5
|
+
import { takeScreenshot } from "./screenshot.js";
|
|
6
|
+
/** Capture the screen. Returns base64 PNG. Re-exports takeScreenshot for consistency. */
|
|
7
|
+
export declare const captureScreen: typeof takeScreenshot;
|
|
8
|
+
/**
|
|
9
|
+
* Initialize display size cache. Call once at agent startup.
|
|
10
|
+
*/
|
|
11
|
+
export declare function initDisplaySize(): Promise<void>;
|
|
12
|
+
/** Return cached display size. Use after initDisplaySize() has been called. */
|
|
13
|
+
export declare function getDisplaySize(): {
|
|
14
|
+
width: number;
|
|
15
|
+
height: number;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Left click at (x, y).
|
|
19
|
+
*/
|
|
20
|
+
export declare function click(x: number, y: number): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Double click at (x, y).
|
|
23
|
+
*/
|
|
24
|
+
export declare function doubleClick(x: number, y: number): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Right click at (x, y).
|
|
27
|
+
*/
|
|
28
|
+
export declare function rightClick(x: number, y: number): Promise<void>;
|
|
29
|
+
/**
|
|
30
|
+
* Move cursor to (x, y).
|
|
31
|
+
*/
|
|
32
|
+
export declare function moveTo(x: number, y: number): Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* Drag from (x1, y1) to (x2, y2).
|
|
35
|
+
*/
|
|
36
|
+
export declare function drag(x1: number, y1: number, x2: number, y2: number): Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* Type text (use cliclick t: for plain text, or osascript for special chars).
|
|
39
|
+
*/
|
|
40
|
+
export declare function typeText(text: string): Promise<void>;
|
|
41
|
+
/**
|
|
42
|
+
* Press a key or key combination (e.g. "enter", "escape", "cmd+s", "ctrl+shift+t").
|
|
43
|
+
* Uses cliclick: kd:mods for modifiers, kp: for special keys, t: for character keys.
|
|
44
|
+
*/
|
|
45
|
+
export declare function pressKey(key: string): Promise<void>;
|
|
46
|
+
/**
|
|
47
|
+
* Scroll at (x, y) in direction. Amount is number of scroll steps (default 3).
|
|
48
|
+
* cliclick does not support scroll; we use osascript with key code 116/121 (page up/down)
|
|
49
|
+
* after moving the mouse to the target. This works in many apps (browsers, text editors).
|
|
50
|
+
*/
|
|
51
|
+
export declare function scroll(x: number, y: number, direction: "up" | "down" | "left" | "right", amount?: number): Promise<void>;
|
|
52
|
+
//# sourceMappingURL=desktop-executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"desktop-executor.d.ts","sourceRoot":"","sources":["../../src/tools/desktop-executor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAKjD,yFAAyF;AACzF,eAAO,MAAM,aAAa,uBAAiB,CAAC;AAK5C;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAErD;AAED,+EAA+E;AAC/E,wBAAgB,cAAc,IAAI;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAElE;AAsFD;;GAEG;AACH,wBAAsB,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/D;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAErE;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEpE;AAED;;GAEG;AACH,wBAAsB,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEhE;AAED;;GAEG;AACH,wBAAsB,IAAI,CACxB,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,IAAI,CAAC,CAIf;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAI1D;AA4BD;;;GAGG;AACH,wBAAsB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA+BzD;AAED;;;;GAIG;AACH,wBAAsB,MAAM,CAC1B,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,SAAS,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,EAC3C,MAAM,SAAI,GACT,OAAO,CAAC,IAAI,CAAC,CASf"}
|