visionclaw 0.1.6 → 0.1.8
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/tools/coordinate-resolver.d.ts +8 -5
- package/dist/tools/coordinate-resolver.d.ts.map +1 -1
- package/dist/tools/coordinate-resolver.js +27 -83
- package/dist/tools/coordinate-resolver.js.map +1 -1
- package/dist/tools/desktop-executor.d.ts +3 -3
- package/dist/tools/desktop-executor.d.ts.map +1 -1
- package/dist/tools/desktop-executor.js +70 -48
- package/dist/tools/desktop-executor.js.map +1 -1
- package/dist/tools/screenshot.d.ts +7 -0
- package/dist/tools/screenshot.d.ts.map +1 -1
- package/dist/tools/screenshot.js +83 -34
- package/dist/tools/screenshot.js.map +1 -1
- package/package.json +1 -1
|
@@ -5,9 +5,10 @@
|
|
|
5
5
|
* Sends screenshot + instruction to Claude; Claude returns a tool_use
|
|
6
6
|
* with action and coordinate. We extract coordinates only (no execution).
|
|
7
7
|
*
|
|
8
|
-
* IMPORTANT:
|
|
9
|
-
*
|
|
10
|
-
* the
|
|
8
|
+
* IMPORTANT: The input screenshot is assumed to be already resized to fit
|
|
9
|
+
* Claude's vision constraints (done by takeScreenshot). We read the actual
|
|
10
|
+
* image dimensions, tell the computer-use tool those are the display size,
|
|
11
|
+
* and unscale returned coordinates back to the real display space.
|
|
11
12
|
* Reference: https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool
|
|
12
13
|
*/
|
|
13
14
|
export interface ResolvedAction {
|
|
@@ -19,8 +20,10 @@ export interface ResolvedAction {
|
|
|
19
20
|
* Resolve a natural language target to pixel coordinates.
|
|
20
21
|
* Uses Messages API with computer_20251124 tool; returns the first tool_use result.
|
|
21
22
|
*
|
|
22
|
-
* The screenshot is resized to fit Claude's
|
|
23
|
-
*
|
|
23
|
+
* The input screenshot is expected to already be resized to fit Claude's
|
|
24
|
+
* vision constraints (by takeScreenshot). We read its actual pixel dimensions,
|
|
25
|
+
* use those as display_width_px / display_height_px, and unscale the returned
|
|
26
|
+
* coordinates back to the real display space using imageWidth/displayWidth ratio.
|
|
24
27
|
*/
|
|
25
28
|
export declare function resolveCoordinates(screenshotBase64: string, instruction: string, displayWidth: number, displayHeight: number, apiKey: string): Promise<ResolvedAction | null>;
|
|
26
29
|
//# sourceMappingURL=coordinate-resolver.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coordinate-resolver.d.ts","sourceRoot":"","sources":["../../src/tools/coordinate-resolver.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"coordinate-resolver.d.ts","sourceRoot":"","sources":["../../src/tools/coordinate-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAQD;;;;;;;;GAQG;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,CAsFhC"}
|
|
@@ -5,98 +5,42 @@
|
|
|
5
5
|
* Sends screenshot + instruction to Claude; Claude returns a tool_use
|
|
6
6
|
* with action and coordinate. We extract coordinates only (no execution).
|
|
7
7
|
*
|
|
8
|
-
* IMPORTANT:
|
|
9
|
-
*
|
|
10
|
-
* the
|
|
8
|
+
* IMPORTANT: The input screenshot is assumed to be already resized to fit
|
|
9
|
+
* Claude's vision constraints (done by takeScreenshot). We read the actual
|
|
10
|
+
* image dimensions, tell the computer-use tool those are the display size,
|
|
11
|
+
* and unscale returned coordinates back to the real display space.
|
|
11
12
|
* Reference: https://platform.claude.com/docs/en/agents-and-tools/tool-use/computer-use-tool
|
|
12
13
|
*/
|
|
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
14
|
import Anthropic from "@anthropic-ai/sdk";
|
|
15
|
+
import sharp from "sharp";
|
|
19
16
|
import { logger } from "../logger.js";
|
|
20
17
|
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
18
|
function clamp(n, min, max) {
|
|
46
19
|
return Math.max(min, Math.min(max, n));
|
|
47
20
|
}
|
|
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
21
|
// ── Resolver ───────────────────────────────────────────────────────────
|
|
79
22
|
/**
|
|
80
23
|
* Resolve a natural language target to pixel coordinates.
|
|
81
24
|
* Uses Messages API with computer_20251124 tool; returns the first tool_use result.
|
|
82
25
|
*
|
|
83
|
-
* The screenshot is resized to fit Claude's
|
|
84
|
-
*
|
|
26
|
+
* The input screenshot is expected to already be resized to fit Claude's
|
|
27
|
+
* vision constraints (by takeScreenshot). We read its actual pixel dimensions,
|
|
28
|
+
* use those as display_width_px / display_height_px, and unscale the returned
|
|
29
|
+
* coordinates back to the real display space using imageWidth/displayWidth ratio.
|
|
85
30
|
*/
|
|
86
31
|
export async function resolveCoordinates(screenshotBase64, instruction, displayWidth, displayHeight, apiKey) {
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
if (
|
|
92
|
-
|
|
93
|
-
|
|
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
|
-
}
|
|
32
|
+
// Read actual pixel dimensions of the (already resized) screenshot
|
|
33
|
+
const meta = await sharp(Buffer.from(screenshotBase64, "base64")).metadata();
|
|
34
|
+
const imgW = meta.width;
|
|
35
|
+
const imgH = meta.height;
|
|
36
|
+
if (!imgW || !imgH) {
|
|
37
|
+
logger.warn("Could not read screenshot dimensions, aborting coordinate resolution");
|
|
38
|
+
return null;
|
|
99
39
|
}
|
|
40
|
+
// Scale factors to convert from image space back to actual display space
|
|
41
|
+
const scaleX = displayWidth / imgW;
|
|
42
|
+
const scaleY = displayHeight / imgH;
|
|
43
|
+
logger.info(`Resolving coordinates: "${instruction}" (display ${displayWidth}x${displayHeight}, image ${imgW}x${imgH}, scaleX=${scaleX.toFixed(3)}, scaleY=${scaleY.toFixed(3)})`, { instruction, displayWidth, displayHeight, imgW, imgH, scaleX, scaleY });
|
|
100
44
|
const client = new Anthropic({ apiKey });
|
|
101
45
|
const response = await client.beta.messages.create({
|
|
102
46
|
model: CLAUDE_MODEL,
|
|
@@ -106,8 +50,8 @@ export async function resolveCoordinates(screenshotBase64, instruction, displayW
|
|
|
106
50
|
{
|
|
107
51
|
type: "computer_20251124",
|
|
108
52
|
name: "computer",
|
|
109
|
-
display_width_px:
|
|
110
|
-
display_height_px:
|
|
53
|
+
display_width_px: imgW,
|
|
54
|
+
display_height_px: imgH,
|
|
111
55
|
display_number: 1,
|
|
112
56
|
},
|
|
113
57
|
],
|
|
@@ -122,7 +66,7 @@ export async function resolveCoordinates(screenshotBase64, instruction, displayW
|
|
|
122
66
|
source: {
|
|
123
67
|
type: "base64",
|
|
124
68
|
media_type: "image/png",
|
|
125
|
-
data:
|
|
69
|
+
data: screenshotBase64,
|
|
126
70
|
},
|
|
127
71
|
},
|
|
128
72
|
{
|
|
@@ -143,10 +87,10 @@ export async function resolveCoordinates(screenshotBase64, instruction, displayW
|
|
|
143
87
|
const rawX = coord[0];
|
|
144
88
|
const rawY = coord[1];
|
|
145
89
|
if (typeof rawX === "number" && typeof rawY === "number" && Number.isFinite(rawX) && Number.isFinite(rawY)) {
|
|
146
|
-
// Unscale: Claude returned coords in
|
|
147
|
-
const x = clamp(Math.round(rawX
|
|
148
|
-
const y = clamp(Math.round(rawY
|
|
149
|
-
logger.info(`Resolved coordinates: action=${action} raw=(${rawX},${rawY}) unscaled=(${x},${y})
|
|
90
|
+
// Unscale: Claude returned coords in image space → convert to actual display space
|
|
91
|
+
const x = clamp(Math.round(rawX * scaleX), 0, displayWidth);
|
|
92
|
+
const y = clamp(Math.round(rawY * scaleY), 0, displayHeight);
|
|
93
|
+
logger.info(`Resolved coordinates: action=${action} raw=(${rawX},${rawY}) unscaled=(${x},${y}) scaleX=${scaleX.toFixed(3)} scaleY=${scaleY.toFixed(3)}`, { instruction, action, rawX, rawY, x, y, scaleX, scaleY });
|
|
150
94
|
return { action, x, y };
|
|
151
95
|
}
|
|
152
96
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coordinate-resolver.js","sourceRoot":"","sources":["../../src/tools/coordinate-resolver.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"coordinate-resolver.js","sourceRoot":"","sources":["../../src/tools/coordinate-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -47,10 +47,10 @@ export declare function drag(x1: number, y1: number, x2: number, y2: number): Pr
|
|
|
47
47
|
export declare function typeText(text: string): Promise<void>;
|
|
48
48
|
/**
|
|
49
49
|
* Press a key or key combination (e.g. "enter", "escape", "cmd+s", "ctrl+shift+t").
|
|
50
|
-
* Uses cliclick: kd:mods for modifiers, kp: for special keys, t: for character keys.
|
|
51
50
|
*
|
|
52
|
-
*
|
|
53
|
-
*
|
|
51
|
+
* Uses osascript System Events `key code` for special keys (more reliable across
|
|
52
|
+
* apps than cliclick kp:), and cliclick `t:` for single character keys.
|
|
53
|
+
* Modifiers are handled via System Events `using` clause or cliclick `kd:/ku:`.
|
|
54
54
|
*/
|
|
55
55
|
export declare function pressKey(key: string): Promise<void>;
|
|
56
56
|
/**
|
|
@@ -1 +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;AAiGD;;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;;;;;;GAMG;AACH,wBAAsB,IAAI,CACxB,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,IAAI,CAAC,CAWf;AAED;;;;;GAKG;AACH,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA8B1D;
|
|
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;AAiGD;;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;;;;;;GAMG;AACH,wBAAsB,IAAI,CACxB,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,IAAI,CAAC,CAWf;AAED;;;;;GAKG;AACH,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA8B1D;AAqCD;;;;;;GAMG;AACH,wBAAsB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyCzD;AAYD;;;;;;GAMG;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,CAkBf"}
|
|
@@ -169,68 +169,90 @@ export async function typeText(text) {
|
|
|
169
169
|
proc.stdin?.end(prevClip);
|
|
170
170
|
});
|
|
171
171
|
}
|
|
172
|
-
/**
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
172
|
+
/**
|
|
173
|
+
* macOS key codes for System Events `key code` command.
|
|
174
|
+
* More reliable than cliclick kp: for special keys in many apps.
|
|
175
|
+
*/
|
|
176
|
+
const MAC_KEY_CODES = {
|
|
177
|
+
enter: 36,
|
|
178
|
+
return: 36,
|
|
179
|
+
tab: 48,
|
|
180
|
+
escape: 53,
|
|
181
|
+
esc: 53,
|
|
182
|
+
space: 49,
|
|
183
|
+
backspace: 51,
|
|
184
|
+
delete: 117,
|
|
185
|
+
up: 126,
|
|
186
|
+
down: 125,
|
|
187
|
+
left: 123,
|
|
188
|
+
right: 124,
|
|
189
|
+
home: 115,
|
|
190
|
+
end: 119,
|
|
191
|
+
pageup: 116,
|
|
192
|
+
pagedown: 121,
|
|
193
|
+
f1: 122, f2: 120, f3: 99, f4: 118, f5: 96, f6: 97,
|
|
194
|
+
f7: 98, f8: 100, f9: 101, f10: 109, f11: 103, f12: 111,
|
|
186
195
|
};
|
|
187
|
-
/**
|
|
188
|
-
const
|
|
189
|
-
cmd: "
|
|
190
|
-
meta: "
|
|
191
|
-
ctrl: "
|
|
192
|
-
alt: "
|
|
193
|
-
option: "
|
|
194
|
-
shift: "shift",
|
|
196
|
+
/** osascript modifier keyword for System Events `using` clause */
|
|
197
|
+
const OSA_MODS = {
|
|
198
|
+
cmd: "command down",
|
|
199
|
+
meta: "command down",
|
|
200
|
+
ctrl: "control down",
|
|
201
|
+
alt: "option down",
|
|
202
|
+
option: "option down",
|
|
203
|
+
shift: "shift down",
|
|
195
204
|
};
|
|
196
205
|
/**
|
|
197
206
|
* Press a key or key combination (e.g. "enter", "escape", "cmd+s", "ctrl+shift+t").
|
|
198
|
-
* Uses cliclick: kd:mods for modifiers, kp: for special keys, t: for character keys.
|
|
199
207
|
*
|
|
200
|
-
*
|
|
201
|
-
*
|
|
208
|
+
* Uses osascript System Events `key code` for special keys (more reliable across
|
|
209
|
+
* apps than cliclick kp:), and cliclick `t:` for single character keys.
|
|
210
|
+
* Modifiers are handled via System Events `using` clause or cliclick `kd:/ku:`.
|
|
202
211
|
*/
|
|
203
212
|
export async function pressKey(key) {
|
|
204
213
|
const parts = key.toLowerCase().split("+");
|
|
205
|
-
const
|
|
206
|
-
const
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
const cmds = [];
|
|
217
|
-
if (modifiers.length > 0) {
|
|
218
|
-
cmds.push(`kd:${cliclickMod}`);
|
|
219
|
-
}
|
|
220
|
-
if (specialKey) {
|
|
221
|
-
cmds.push(`kp:${specialKey}`);
|
|
214
|
+
const keyName = parts[parts.length - 1] ?? key;
|
|
215
|
+
const modParts = parts.slice(0, -1);
|
|
216
|
+
// Small delay so the frontmost app has time to accept focus before the key event.
|
|
217
|
+
await new Promise((r) => setTimeout(r, 100));
|
|
218
|
+
const keyCode = MAC_KEY_CODES[keyName];
|
|
219
|
+
if (keyCode !== undefined) {
|
|
220
|
+
// Use osascript System Events for special keys — more reliable than cliclick kp:
|
|
221
|
+
const using = modParts.length > 0
|
|
222
|
+
? ` using {${modParts.map((m) => OSA_MODS[m] ?? `${m} down`).join(", ")}}`
|
|
223
|
+
: "";
|
|
224
|
+
await execAsync(`osascript -e 'tell application "System Events" to key code ${keyCode}${using}'`);
|
|
222
225
|
}
|
|
223
226
|
else if (keyName.length === 1) {
|
|
224
|
-
|
|
227
|
+
// Single character key — use cliclick t: (with modifier support via kd:/ku:)
|
|
228
|
+
const cliclickMods = modParts
|
|
229
|
+
.map((m) => CLICLICK_MODS[m])
|
|
230
|
+
.filter(Boolean);
|
|
231
|
+
if (cliclickMods.length > 0) {
|
|
232
|
+
const mod = cliclickMods.join(",");
|
|
233
|
+
await cliclick(`kd:${mod} t:${keyName} ku:${mod}`);
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
await cliclick(`t:${keyName}`);
|
|
237
|
+
}
|
|
225
238
|
}
|
|
226
239
|
else {
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
240
|
+
// Unknown key name — try osascript keystroke as a last resort
|
|
241
|
+
const using = modParts.length > 0
|
|
242
|
+
? ` using {${modParts.map((m) => OSA_MODS[m] ?? `${m} down`).join(", ")}}`
|
|
243
|
+
: "";
|
|
244
|
+
await execAsync(`osascript -e 'tell application "System Events" to keystroke "${keyName}"${using}'`);
|
|
231
245
|
}
|
|
232
|
-
await cliclick(cmds.join(" "));
|
|
233
246
|
}
|
|
247
|
+
/** cliclick modifier names for kd:/ku: */
|
|
248
|
+
const CLICLICK_MODS = {
|
|
249
|
+
cmd: "cmd",
|
|
250
|
+
meta: "cmd",
|
|
251
|
+
ctrl: "ctrl",
|
|
252
|
+
alt: "alt",
|
|
253
|
+
option: "alt",
|
|
254
|
+
shift: "shift",
|
|
255
|
+
};
|
|
234
256
|
/**
|
|
235
257
|
* Scroll at (x, y) in direction. Amount is number of scroll line-steps (default 3).
|
|
236
258
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"desktop-executor.js","sourceRoot":"","sources":["../../src/tools/desktop-executor.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"desktop-executor.js","sourceRoot":"","sources":["../../src/tools/desktop-executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
export declare const CLAUDE_MAX_LONG_EDGE_PX = 1568;
|
|
2
|
+
export declare const CLAUDE_MAX_PIXELS = 1150000;
|
|
3
|
+
/**
|
|
4
|
+
* Compute how much to scale image dimensions to fit Claude's vision constraints.
|
|
5
|
+
* Returns a factor <= 1.0.
|
|
6
|
+
*/
|
|
7
|
+
export declare function getVisionScaleFactor(width: number, height: number): number;
|
|
1
8
|
/**
|
|
2
9
|
* Take a screenshot of the current desktop.
|
|
3
10
|
* Returns the base64-encoded PNG image. Compresses to under 2MB if needed.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"screenshot.d.ts","sourceRoot":"","sources":["../../src/tools/screenshot.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"screenshot.d.ts","sourceRoot":"","sources":["../../src/tools/screenshot.ts"],"names":[],"mappings":"AAkBA,eAAO,MAAM,uBAAuB,OAAO,CAAC;AAC5C,eAAO,MAAM,iBAAiB,UAAY,CAAC;AAE3C;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAQ1E;AAoJD;;;GAGG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,CA0CtD;AAED,eAAO,MAAM,cAAc,mEA6B1B,CAAC"}
|
package/dist/tools/screenshot.js
CHANGED
|
@@ -7,7 +7,24 @@ import sharp from "sharp";
|
|
|
7
7
|
import { tool } from "@anthropic-ai/claude-agent-sdk";
|
|
8
8
|
import { logger } from "../logger.js";
|
|
9
9
|
const execAsync = promisify(exec);
|
|
10
|
-
const MAX_SCREENSHOT_SIZE =
|
|
10
|
+
const MAX_SCREENSHOT_SIZE = 1 * 1024 * 1024; // 1MB
|
|
11
|
+
// ── Claude vision dimension constraints ────────────────────────────────
|
|
12
|
+
// Reference: https://platform.claude.com/docs/en/build-with-claude/vision
|
|
13
|
+
// Images larger than these limits are resized server-side, increasing
|
|
14
|
+
// time-to-first-token latency without any model performance benefit.
|
|
15
|
+
export const CLAUDE_MAX_LONG_EDGE_PX = 1568;
|
|
16
|
+
export const CLAUDE_MAX_PIXELS = 1_150_000;
|
|
17
|
+
/**
|
|
18
|
+
* Compute how much to scale image dimensions to fit Claude's vision constraints.
|
|
19
|
+
* Returns a factor <= 1.0.
|
|
20
|
+
*/
|
|
21
|
+
export function getVisionScaleFactor(width, height) {
|
|
22
|
+
const longEdge = Math.max(width, height);
|
|
23
|
+
const totalPixels = width * height;
|
|
24
|
+
const longEdgeScale = CLAUDE_MAX_LONG_EDGE_PX / longEdge;
|
|
25
|
+
const totalPixelsScale = Math.sqrt(CLAUDE_MAX_PIXELS / totalPixels);
|
|
26
|
+
return Math.min(1.0, longEdgeScale, totalPixelsScale);
|
|
27
|
+
}
|
|
11
28
|
/** Resolve the absolute path to ffmpeg, checking common Homebrew / system locations. */
|
|
12
29
|
let _ffmpegPath;
|
|
13
30
|
async function findFfmpeg() {
|
|
@@ -71,25 +88,83 @@ async function compressWithFfmpeg(inputPath, outputPath, maxColors = 128) {
|
|
|
71
88
|
catch { /* noop */ }
|
|
72
89
|
}
|
|
73
90
|
}
|
|
91
|
+
/**
|
|
92
|
+
* Resize a PNG buffer to fit within Claude's vision constraints.
|
|
93
|
+
* Uses sharp to scale down preserving aspect ratio.
|
|
94
|
+
* Returns the (possibly resized) buffer.
|
|
95
|
+
*/
|
|
96
|
+
async function resizeForVision(buffer) {
|
|
97
|
+
try {
|
|
98
|
+
const meta = await sharp(buffer).metadata();
|
|
99
|
+
const w = meta.width;
|
|
100
|
+
const h = meta.height;
|
|
101
|
+
if (!w || !h)
|
|
102
|
+
return buffer;
|
|
103
|
+
const scale = getVisionScaleFactor(w, h);
|
|
104
|
+
if (scale >= 1.0)
|
|
105
|
+
return buffer; // already within limits
|
|
106
|
+
const targetW = Math.max(1, Math.round(w * scale));
|
|
107
|
+
const targetH = Math.max(1, Math.round(h * scale));
|
|
108
|
+
const resized = await sharp(buffer)
|
|
109
|
+
.resize(targetW, targetH, { fit: "inside" })
|
|
110
|
+
.png()
|
|
111
|
+
.toBuffer();
|
|
112
|
+
logger.debug(`Screenshot resized for vision: ${w}x${h} → ${targetW}x${targetH} (scale=${scale.toFixed(3)}, ${buffer.length} → ${resized.length} bytes)`);
|
|
113
|
+
return resized;
|
|
114
|
+
}
|
|
115
|
+
catch (e) {
|
|
116
|
+
logger.warn(`Screenshot vision resize failed, keeping original: ${e instanceof Error ? e.message : String(e)}`);
|
|
117
|
+
return buffer;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
74
120
|
/**
|
|
75
121
|
* Compress a PNG buffer if it exceeds the size threshold.
|
|
76
|
-
*
|
|
122
|
+
* Tries sharp in-process first, then falls back to ffmpeg palette quantization.
|
|
77
123
|
*/
|
|
78
124
|
async function compressIfNeeded(buffer, maxSize = MAX_SCREENSHOT_SIZE) {
|
|
79
125
|
if (buffer.length <= maxSize)
|
|
80
126
|
return buffer;
|
|
127
|
+
// 1. Try sharp in-process (works in dev, may fail in bundled app)
|
|
81
128
|
try {
|
|
82
129
|
const compressed = await sharp(buffer)
|
|
83
130
|
.png({ quality: 80, compressionLevel: 9, palette: true })
|
|
84
131
|
.toBuffer();
|
|
85
132
|
if (compressed.length < buffer.length) {
|
|
86
133
|
logger.debug(`Screenshot sharp compress: ${buffer.length} → ${compressed.length} bytes`);
|
|
87
|
-
|
|
134
|
+
if (compressed.length <= maxSize)
|
|
135
|
+
return compressed;
|
|
88
136
|
}
|
|
89
137
|
}
|
|
90
138
|
catch (e) {
|
|
91
139
|
logger.warn(`Screenshot sharp compression failed: ${e instanceof Error ? e.message : String(e)}`);
|
|
92
140
|
}
|
|
141
|
+
// 2. Fallback: ffmpeg palette quantization on disk
|
|
142
|
+
const tmpIn = path.join(os.tmpdir(), `visionclaw-compress-in-${Date.now()}.png`);
|
|
143
|
+
const tmpOut = path.join(os.tmpdir(), `visionclaw-compress-out-${Date.now()}.png`);
|
|
144
|
+
try {
|
|
145
|
+
fs.writeFileSync(tmpIn, buffer);
|
|
146
|
+
for (const maxColors of [128, 64]) {
|
|
147
|
+
const ok = await compressWithFfmpeg(tmpIn, tmpOut, maxColors);
|
|
148
|
+
if (ok) {
|
|
149
|
+
const compressedBuffer = fs.readFileSync(tmpOut);
|
|
150
|
+
logger.debug(`Screenshot ffmpeg compress (${maxColors} colours): ${buffer.length} → ${compressedBuffer.length} bytes`);
|
|
151
|
+
if (compressedBuffer.length <= maxSize)
|
|
152
|
+
return compressedBuffer;
|
|
153
|
+
// Still too large but better than original — return best effort
|
|
154
|
+
return compressedBuffer;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
finally {
|
|
159
|
+
try {
|
|
160
|
+
fs.unlinkSync(tmpIn);
|
|
161
|
+
}
|
|
162
|
+
catch { /* noop */ }
|
|
163
|
+
try {
|
|
164
|
+
fs.unlinkSync(tmpOut);
|
|
165
|
+
}
|
|
166
|
+
catch { /* noop */ }
|
|
167
|
+
}
|
|
93
168
|
return buffer;
|
|
94
169
|
}
|
|
95
170
|
/**
|
|
@@ -120,37 +195,11 @@ export async function takeScreenshot() {
|
|
|
120
195
|
}
|
|
121
196
|
}
|
|
122
197
|
const rawBuffer = fs.readFileSync(tmpFile);
|
|
123
|
-
//
|
|
124
|
-
const
|
|
125
|
-
if (
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
// Sharp failed or didn't compress enough — use ffmpeg
|
|
129
|
-
const compressedPath = tmpFile.replace(/\.png$/, "-compressed.png");
|
|
130
|
-
try {
|
|
131
|
-
// Try progressively fewer colours until under threshold
|
|
132
|
-
for (const maxColors of [128, 64]) {
|
|
133
|
-
const ok = await compressWithFfmpeg(tmpFile, compressedPath, maxColors);
|
|
134
|
-
if (ok) {
|
|
135
|
-
const compressedBuffer = fs.readFileSync(compressedPath);
|
|
136
|
-
if (compressedBuffer.length <= MAX_SCREENSHOT_SIZE) {
|
|
137
|
-
logger.debug(`Screenshot ffmpeg compress (${maxColors} colours): ${rawBuffer.length} → ${compressedBuffer.length} bytes`);
|
|
138
|
-
return compressedBuffer.toString("base64");
|
|
139
|
-
}
|
|
140
|
-
logger.debug(`Screenshot ffmpeg ${maxColors} colours: ${compressedBuffer.length} bytes (still over ${MAX_SCREENSHOT_SIZE})`);
|
|
141
|
-
return compressedBuffer.toString("base64"); // Return best effort even if still too large
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
finally {
|
|
146
|
-
try {
|
|
147
|
-
fs.unlinkSync(compressedPath);
|
|
148
|
-
}
|
|
149
|
-
catch { /* noop */ }
|
|
150
|
-
}
|
|
151
|
-
// Last resort: return original uncompressed PNG
|
|
152
|
-
logger.warn(`Screenshot compression unavailable, returning ${rawBuffer.length}-byte original`);
|
|
153
|
-
return rawBuffer.toString("base64");
|
|
198
|
+
// 1. Resize to fit Claude's vision constraints (reduces TTFT)
|
|
199
|
+
const resized = await resizeForVision(rawBuffer);
|
|
200
|
+
// 2. Compress if over file size threshold (sharp → ffmpeg fallback)
|
|
201
|
+
const compressed = await compressIfNeeded(resized);
|
|
202
|
+
return compressed.toString("base64");
|
|
154
203
|
}
|
|
155
204
|
finally {
|
|
156
205
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"screenshot.js","sourceRoot":"","sources":["../../src/tools/screenshot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,IAAI,EAAE,MAAM,gCAAgC,CAAC;AAEtD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAElC,MAAM,mBAAmB,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,MAAM;AAEnD,wFAAwF;AACxF,IAAI,WAAsC,CAAC;AAC3C,KAAK,UAAU,UAAU;IACvB,IAAI,WAAW,KAAK,SAAS;QAAE,OAAO,WAAW,CAAC;IAClD,iBAAiB;IACjB,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,cAAc,CAAC,CAAC;QACnD,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;QACxB,IAAI,CAAC,EAAE,CAAC;YAAC,WAAW,GAAG,CAAC,CAAC;YAAC,OAAO,CAAC,CAAC;QAAC,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;IAC7B,6BAA6B;IAC7B,KAAK,MAAM,SAAS,IAAI;QACtB,0BAA0B;QAC1B,uBAAuB;QACvB,iBAAiB;KAClB,EAAE,CAAC;QACF,IAAI,CAAC;YACH,EAAE,CAAC,UAAU,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAC5C,WAAW,GAAG,SAAS,CAAC;YACxB,OAAO,SAAS,CAAC;QACnB,CAAC;QAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;IACxB,CAAC;IACD,WAAW,GAAG,IAAI,CAAC;IACnB,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,kBAAkB,CAC/B,SAAiB,EACjB,UAAkB,EAClB,SAAS,GAAG,GAAG;IAEf,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QAC/C,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,WAAW,GAAG,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;IAChE,IAAI,CAAC;QACH,6BAA6B;QAC7B,MAAM,SAAS,CACb,IAAI,MAAM,YAAY,SAAS,gCAAgC,SAAS,MAAM,WAAW,GAAG,CAC7F,CAAC;QACF,wBAAwB;QACxB,MAAM,SAAS,CACb,IAAI,MAAM,YAAY,SAAS,SAAS,WAAW,8DAA8D,UAAU,GAAG,CAC/H,CAAC;QACF,OAAO,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACxF,OAAO,KAAK,CAAC;IACf,CAAC;YAAS,CAAC;QACT,IAAI,CAAC;YAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"screenshot.js","sourceRoot":"","sources":["../../src/tools/screenshot.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED