@cloudcli-ai/cloudcli 1.35.0 → 1.35.1

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.
Files changed (94) hide show
  1. package/README.md +12 -7
  2. package/dist/assets/index-BvX30NW5.css +32 -0
  3. package/dist/assets/{index-CtwxqzGG.js → index-D1IdCTT6.js} +269 -258
  4. package/dist/index.html +12 -4
  5. package/dist-server/server/index.js +0 -13
  6. package/dist-server/server/index.js.map +1 -1
  7. package/dist-server/server/modules/websocket/services/websocket-server.service.js +0 -5
  8. package/dist-server/server/modules/websocket/services/websocket-server.service.js.map +1 -1
  9. package/electron/desktopWindow.js +0 -15
  10. package/electron/launcher/launcher.js +1 -143
  11. package/electron/main.js +1 -117
  12. package/electron/preload.cjs +0 -3
  13. package/package.json +3 -8
  14. package/scripts/release/prepare-desktop-app.js +0 -6
  15. package/server/index.js +0 -14
  16. package/server/modules/websocket/services/websocket-server.service.ts +0 -6
  17. package/dist/assets/index-DlvtxFyt.css +0 -32
  18. package/dist-server/server/computer-use-agent.js +0 -242
  19. package/dist-server/server/computer-use-agent.js.map +0 -1
  20. package/dist-server/server/computer-use-mcp.js +0 -519
  21. package/dist-server/server/computer-use-mcp.js.map +0 -1
  22. package/dist-server/server/modules/computer-use/actions/raw-action-dispatcher.js +0 -55
  23. package/dist-server/server/modules/computer-use/actions/raw-action-dispatcher.js.map +0 -1
  24. package/dist-server/server/modules/computer-use/actions/raw-action-types.js +0 -2
  25. package/dist-server/server/modules/computer-use/actions/raw-action-types.js.map +0 -1
  26. package/dist-server/server/modules/computer-use/computer-executor.js +0 -212
  27. package/dist-server/server/modules/computer-use/computer-executor.js.map +0 -1
  28. package/dist-server/server/modules/computer-use/computer-semantics.service.js +0 -422
  29. package/dist-server/server/modules/computer-use/computer-semantics.service.js.map +0 -1
  30. package/dist-server/server/modules/computer-use/computer-use-mcp.routes.js +0 -126
  31. package/dist-server/server/modules/computer-use/computer-use-mcp.routes.js.map +0 -1
  32. package/dist-server/server/modules/computer-use/computer-use.routes.js +0 -196
  33. package/dist-server/server/modules/computer-use/computer-use.routes.js.map +0 -1
  34. package/dist-server/server/modules/computer-use/computer-use.service.js +0 -759
  35. package/dist-server/server/modules/computer-use/computer-use.service.js.map +0 -1
  36. package/dist-server/server/modules/computer-use/desktop-agent-relay.service.js +0 -126
  37. package/dist-server/server/modules/computer-use/desktop-agent-relay.service.js.map +0 -1
  38. package/dist-server/server/modules/computer-use/index.js +0 -3
  39. package/dist-server/server/modules/computer-use/index.js.map +0 -1
  40. package/dist-server/server/modules/computer-use/semantics/adapters/helper-semantic-adapter.js +0 -59
  41. package/dist-server/server/modules/computer-use/semantics/adapters/helper-semantic-adapter.js.map +0 -1
  42. package/dist-server/server/modules/computer-use/semantics/adapters/macos/macos-semantic-adapter.js +0 -5
  43. package/dist-server/server/modules/computer-use/semantics/adapters/macos/macos-semantic-adapter.js.map +0 -1
  44. package/dist-server/server/modules/computer-use/semantics/adapters/semantic-adapter.js +0 -2
  45. package/dist-server/server/modules/computer-use/semantics/adapters/semantic-adapter.js.map +0 -1
  46. package/dist-server/server/modules/computer-use/semantics/adapters/windows/windows-semantic-adapter.js +0 -5
  47. package/dist-server/server/modules/computer-use/semantics/adapters/windows/windows-semantic-adapter.js.map +0 -1
  48. package/dist-server/server/modules/computer-use/semantics/bin/darwin-arm64/CloudCLISemantics +0 -0
  49. package/dist-server/server/modules/computer-use/semantics/bin/darwin-x64/CloudCLISemantics +0 -0
  50. package/dist-server/server/modules/computer-use/semantics/bin/win32-arm64/CloudCLISemantics.exe +0 -0
  51. package/dist-server/server/modules/computer-use/semantics/bin/win32-x64/CloudCLISemantics.exe +0 -0
  52. package/dist-server/server/modules/computer-use/semantics/helpers/semantic-helper-process.js +0 -106
  53. package/dist-server/server/modules/computer-use/semantics/helpers/semantic-helper-process.js.map +0 -1
  54. package/dist-server/server/modules/computer-use/semantics/helpers/semantic-helper-resolver.js +0 -78
  55. package/dist-server/server/modules/computer-use/semantics/helpers/semantic-helper-resolver.js.map +0 -1
  56. package/dist-server/server/modules/computer-use/semantics/semantic-session-store.js +0 -68
  57. package/dist-server/server/modules/computer-use/semantics/semantic-session-store.js.map +0 -1
  58. package/dist-server/server/modules/computer-use/semantics/semantic-tool-dispatcher.js +0 -16
  59. package/dist-server/server/modules/computer-use/semantics/semantic-tool-dispatcher.js.map +0 -1
  60. package/dist-server/server/modules/computer-use/semantics/semantic-types.js +0 -2
  61. package/dist-server/server/modules/computer-use/semantics/semantic-types.js.map +0 -1
  62. package/dist-server/server/modules/websocket/services/desktop-agent-websocket.service.js +0 -39
  63. package/dist-server/server/modules/websocket/services/desktop-agent-websocket.service.js.map +0 -1
  64. package/electron/computerAgent.js +0 -290
  65. package/scripts/build-computer-semantics.mjs +0 -133
  66. package/scripts/copy-computer-semantics-bin.mjs +0 -24
  67. package/server/computer-use-agent.ts +0 -279
  68. package/server/computer-use-mcp.ts +0 -574
  69. package/server/modules/computer-use/actions/raw-action-dispatcher.ts +0 -67
  70. package/server/modules/computer-use/actions/raw-action-types.ts +0 -28
  71. package/server/modules/computer-use/computer-executor.ts +0 -242
  72. package/server/modules/computer-use/computer-semantics.service.ts +0 -460
  73. package/server/modules/computer-use/computer-use-mcp.routes.ts +0 -141
  74. package/server/modules/computer-use/computer-use.routes.ts +0 -211
  75. package/server/modules/computer-use/computer-use.service.ts +0 -920
  76. package/server/modules/computer-use/desktop-agent-relay.service.ts +0 -158
  77. package/server/modules/computer-use/index.ts +0 -2
  78. package/server/modules/computer-use/semantics/adapters/helper-semantic-adapter.ts +0 -82
  79. package/server/modules/computer-use/semantics/adapters/macos/macos-semantic-adapter.ts +0 -5
  80. package/server/modules/computer-use/semantics/adapters/semantic-adapter.ts +0 -23
  81. package/server/modules/computer-use/semantics/adapters/windows/windows-semantic-adapter.ts +0 -5
  82. package/server/modules/computer-use/semantics/bin/darwin-arm64/CloudCLISemantics +0 -0
  83. package/server/modules/computer-use/semantics/bin/darwin-x64/CloudCLISemantics +0 -0
  84. package/server/modules/computer-use/semantics/bin/win32-arm64/CloudCLISemantics.exe +0 -0
  85. package/server/modules/computer-use/semantics/bin/win32-x64/CloudCLISemantics.exe +0 -0
  86. package/server/modules/computer-use/semantics/helpers/macos/CloudCLISemantics.swift +0 -467
  87. package/server/modules/computer-use/semantics/helpers/semantic-helper-process.ts +0 -124
  88. package/server/modules/computer-use/semantics/helpers/semantic-helper-resolver.ts +0 -97
  89. package/server/modules/computer-use/semantics/helpers/windows/CloudCLISemantics.csproj +0 -11
  90. package/server/modules/computer-use/semantics/helpers/windows/Program.cs +0 -534
  91. package/server/modules/computer-use/semantics/semantic-session-store.ts +0 -87
  92. package/server/modules/computer-use/semantics/semantic-tool-dispatcher.ts +0 -17
  93. package/server/modules/computer-use/semantics/semantic-types.ts +0 -58
  94. package/server/modules/websocket/services/desktop-agent-websocket.service.ts +0 -51
@@ -1,212 +0,0 @@
1
- import { createRequire } from 'node:module';
2
- const require = createRequire(import.meta.url);
3
- export function getNut() {
4
- try {
5
- return require('@nut-tree-fork/nut-js');
6
- }
7
- catch {
8
- return null;
9
- }
10
- }
11
- export function getScreenshot() {
12
- try {
13
- const mod = require('screenshot-desktop');
14
- return mod?.default || mod;
15
- }
16
- catch {
17
- return null;
18
- }
19
- }
20
- export function getRuntimeReadiness() {
21
- const nut = getNut();
22
- const screenshot = getScreenshot();
23
- return {
24
- nut,
25
- screenshot,
26
- nutInstalled: Boolean(nut),
27
- screenshotInstalled: typeof screenshot === 'function',
28
- };
29
- }
30
- /** Reads the pixel dimensions from a PNG/JPEG buffer header without decoding it. */
31
- export function readImageSize(buffer) {
32
- // PNG: 8-byte signature, then IHDR chunk with width/height as big-endian uint32.
33
- if (buffer.length >= 24 && buffer[0] === 0x89 && buffer[1] === 0x50) {
34
- return { width: buffer.readUInt32BE(16), height: buffer.readUInt32BE(20) };
35
- }
36
- // JPEG: scan for a Start-Of-Frame marker (0xFFC0..0xFFCF, excluding C4/C8/CC).
37
- if (buffer.length >= 4 && buffer[0] === 0xff && buffer[1] === 0xd8) {
38
- let offset = 2;
39
- while (offset + 9 < buffer.length) {
40
- if (buffer[offset] !== 0xff) {
41
- offset += 1;
42
- continue;
43
- }
44
- const marker = buffer[offset + 1];
45
- if (marker >= 0xc0 && marker <= 0xcf && marker !== 0xc4 && marker !== 0xc8 && marker !== 0xcc) {
46
- return { height: buffer.readUInt16BE(offset + 5), width: buffer.readUInt16BE(offset + 7) };
47
- }
48
- offset += 2 + buffer.readUInt16BE(offset + 2);
49
- }
50
- }
51
- return null;
52
- }
53
- export async function captureScreenshot() {
54
- const screenshot = getScreenshot();
55
- if (typeof screenshot !== 'function') {
56
- throw new Error('Computer Use runtime is not available.');
57
- }
58
- const buffer = await screenshot({ format: 'png' });
59
- return {
60
- dataUrl: `data:image/png;base64,${buffer.toString('base64')}`,
61
- size: readImageSize(buffer),
62
- };
63
- }
64
- /** Returns the mouse coordinate space size (logical screen pixels). */
65
- export async function getMouseSpaceSize() {
66
- const nut = getNut();
67
- if (!nut) {
68
- throw new Error('Computer Use runtime is not available.');
69
- }
70
- const width = await nut.screen.width();
71
- const height = await nut.screen.height();
72
- return { width, height };
73
- }
74
- /** Maps a point from screenshot/image space to the mouse coordinate space. */
75
- export async function toMouseSpace(target, point) {
76
- const mouseSize = await getMouseSpaceSize();
77
- const image = target.displaySize || mouseSize;
78
- const scaleX = image.width ? mouseSize.width / image.width : 1;
79
- const scaleY = image.height ? mouseSize.height / image.height : 1;
80
- return {
81
- x: Math.round(point.x * scaleX),
82
- y: Math.round(point.y * scaleY),
83
- };
84
- }
85
- /** Maps a point from the mouse coordinate space back to screenshot/image space. */
86
- export function toImageSpace(target, point, mouseSize) {
87
- const image = target.displaySize || mouseSize;
88
- const scaleX = mouseSize.width ? image.width / mouseSize.width : 1;
89
- const scaleY = mouseSize.height ? image.height / mouseSize.height : 1;
90
- return {
91
- x: Math.round(point.x * scaleX),
92
- y: Math.round(point.y * scaleY),
93
- };
94
- }
95
- function nutButton(nut, button) {
96
- if (button === 'right')
97
- return nut.Button.RIGHT;
98
- if (button === 'middle')
99
- return nut.Button.MIDDLE;
100
- return nut.Button.LEFT;
101
- }
102
- /** Maps a key name (xdotool-style, as Anthropic's computer tool emits) to a nut-js Key. */
103
- function nutKey(nut, token) {
104
- const map = {
105
- return: 'Enter', enter: 'Enter', esc: 'Escape', escape: 'Escape', tab: 'Tab',
106
- space: 'Space', backspace: 'Backspace', delete: 'Delete', del: 'Delete', insert: 'Insert',
107
- up: 'Up', down: 'Down', left: 'Left', right: 'Right',
108
- home: 'Home', end: 'End', pageup: 'PageUp', page_up: 'PageUp', pagedown: 'PageDown', page_down: 'PageDown',
109
- ctrl: 'LeftControl', control: 'LeftControl', alt: 'LeftAlt', shift: 'LeftShift',
110
- meta: 'LeftSuper', super: 'LeftSuper', cmd: 'LeftSuper', win: 'LeftSuper',
111
- capslock: 'CapsLock',
112
- };
113
- const lower = token.toLowerCase();
114
- if (map[lower]) {
115
- return nut.Key[map[lower]];
116
- }
117
- if (/^f([1-9]|1[0-9]|2[0-4])$/.test(lower)) {
118
- return nut.Key[`F${lower.slice(1)}`];
119
- }
120
- if (token.length === 1) {
121
- const upper = token.toUpperCase();
122
- if (nut.Key[upper] !== undefined) {
123
- return nut.Key[upper];
124
- }
125
- if (nut.Key[`Num${token}`] !== undefined && /[0-9]/.test(token)) {
126
- return nut.Key[`Num${token}`];
127
- }
128
- }
129
- throw new Error(`Unsupported key: ${token}`);
130
- }
131
- /**
132
- * The cross-platform OS executor. It is intentionally free of any server,
133
- * database, or session dependencies so it can run both inside the local server
134
- * process (OSS mode) and inside the standalone desktop agent (cloud relay).
135
- */
136
- export const executor = {
137
- async configure() {
138
- const nut = getNut();
139
- if (nut) {
140
- // Make actions responsive; the agent loop already paces itself with screenshots.
141
- nut.mouse.config.autoDelayMs = 2;
142
- nut.keyboard.config.autoDelayMs = 2;
143
- }
144
- return nut;
145
- },
146
- async cursorPosition(target) {
147
- const nut = await this.configure();
148
- const mouseSize = await getMouseSpaceSize();
149
- const pos = await nut.mouse.getPosition();
150
- return toImageSpace(target, { x: pos.x, y: pos.y }, mouseSize);
151
- },
152
- async moveTo(target, point) {
153
- const nut = await this.configure();
154
- const dest = await toMouseSpace(target, point);
155
- await nut.mouse.setPosition(new nut.Point(dest.x, dest.y));
156
- },
157
- async click(target, button, point, doubleClick = false) {
158
- const nut = await this.configure();
159
- if (point) {
160
- await this.moveTo(target, point);
161
- }
162
- if (doubleClick) {
163
- await nut.mouse.doubleClick(nutButton(nut, button));
164
- }
165
- else {
166
- await nut.mouse.click(nutButton(nut, button));
167
- }
168
- },
169
- async drag(target, from, to, button = 'left') {
170
- const nut = await this.configure();
171
- const start = await toMouseSpace(target, from);
172
- const end = await toMouseSpace(target, to);
173
- await nut.mouse.setPosition(new nut.Point(start.x, start.y));
174
- await nut.mouse.pressButton(nutButton(nut, button));
175
- await nut.mouse.setPosition(new nut.Point(end.x, end.y));
176
- await nut.mouse.releaseButton(nutButton(nut, button));
177
- },
178
- async type(text) {
179
- const nut = await this.configure();
180
- await nut.keyboard.type(text);
181
- },
182
- async pressChord(chord) {
183
- const nut = await this.configure();
184
- const tokens = chord.split('+').map((token) => token.trim()).filter(Boolean);
185
- if (tokens.length === 0) {
186
- return;
187
- }
188
- const keys = tokens.map((token) => nutKey(nut, token));
189
- for (const key of keys) {
190
- await nut.keyboard.pressKey(key);
191
- }
192
- for (const key of [...keys].reverse()) {
193
- await nut.keyboard.releaseKey(key);
194
- }
195
- },
196
- async scroll(target, direction, amount, point) {
197
- const nut = await this.configure();
198
- if (point) {
199
- await this.moveTo(target, point);
200
- }
201
- const steps = Math.max(1, Math.round(amount));
202
- if (direction === 'up')
203
- await nut.mouse.scrollUp(steps);
204
- else if (direction === 'down')
205
- await nut.mouse.scrollDown(steps);
206
- else if (direction === 'left')
207
- await nut.mouse.scrollLeft(steps);
208
- else
209
- await nut.mouse.scrollRight(steps);
210
- },
211
- };
212
- //# sourceMappingURL=computer-executor.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"computer-executor.js","sourceRoot":"","sources":["../../../../server/modules/computer-use/computer-executor.ts"],"names":[],"mappings":"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"}
@@ -1,422 +0,0 @@
1
- import { execFile } from 'node:child_process';
2
- import { promisify } from 'node:util';
3
- import { captureScreenshot, executor, } from '../../modules/computer-use/computer-executor.js';
4
- import { createMacOsSemanticAdapter } from '../../modules/computer-use/semantics/adapters/macos/macos-semantic-adapter.js';
5
- import { createWindowsSemanticAdapter } from '../../modules/computer-use/semantics/adapters/windows/windows-semantic-adapter.js';
6
- import { resolveSemanticHelper } from '../../modules/computer-use/semantics/helpers/semantic-helper-resolver.js';
7
- import { semanticSessionStore } from '../../modules/computer-use/semantics/semantic-session-store.js';
8
- const execFileAsync = promisify(execFile);
9
- const MAX_APP_STATE_ELEMENTS = 250;
10
- let helperAdapter;
11
- function readString(value) {
12
- return typeof value === 'string' ? value.trim() : '';
13
- }
14
- function requireApp(input) {
15
- const app = readString(input.app);
16
- if (!app) {
17
- throw new Error('app is required.');
18
- }
19
- return app;
20
- }
21
- function readNumber(value) {
22
- return typeof value === 'number' && Number.isFinite(value) ? value : undefined;
23
- }
24
- function readButton(value) {
25
- return value === 'right' || value === 'middle' ? value : 'left';
26
- }
27
- function readClickCount(value) {
28
- const count = readNumber(value);
29
- if (count === undefined) {
30
- return 1;
31
- }
32
- return Math.max(1, Math.min(5, Math.trunc(count)));
33
- }
34
- function readDirection(value) {
35
- return value === 'up' || value === 'left' || value === 'right' ? value : 'down';
36
- }
37
- function readSessionId(input) {
38
- return readString(input.sessionId) || 'default';
39
- }
40
- function centerOf(element) {
41
- const bounds = element.bounds;
42
- if (!bounds) {
43
- return null;
44
- }
45
- return {
46
- x: Math.round(bounds.x + bounds.width / 2),
47
- y: Math.round(bounds.y + bounds.height / 2),
48
- };
49
- }
50
- function getCachedElement(sessionId, app, index, stateId) {
51
- return semanticSessionStore.getElement(sessionId, app, index, stateId);
52
- }
53
- function getPoint(input, sessionId, app) {
54
- const x = readNumber(input.x);
55
- const y = readNumber(input.y);
56
- if (x !== undefined && y !== undefined) {
57
- return { x, y };
58
- }
59
- const elementIndex = readString(input.element_index);
60
- if (!elementIndex) {
61
- return undefined;
62
- }
63
- const element = getCachedElement(sessionId, app, elementIndex, readString(input.stateId) || undefined);
64
- return element ? centerOf(element) || undefined : undefined;
65
- }
66
- function getHelperAdapter() {
67
- if (helperAdapter !== undefined) {
68
- return helperAdapter;
69
- }
70
- if (process.platform !== 'darwin' && process.platform !== 'win32') {
71
- helperAdapter = null;
72
- return helperAdapter;
73
- }
74
- const resolution = resolveSemanticHelper();
75
- if (!resolution.available) {
76
- helperAdapter = null;
77
- return helperAdapter;
78
- }
79
- helperAdapter = process.platform === 'darwin'
80
- ? createMacOsSemanticAdapter()
81
- : createWindowsSemanticAdapter();
82
- return helperAdapter;
83
- }
84
- function shouldFallbackFromHelper(error) {
85
- const message = error instanceof Error ? error.message : String(error);
86
- return /not implemented|unavailable|not found|does not exist|timed out|not running|exited with code|failed to start/i.test(message);
87
- }
88
- async function withHelperState(sessionId, operation) {
89
- const adapter = getHelperAdapter();
90
- if (!adapter) {
91
- return null;
92
- }
93
- try {
94
- return semanticSessionStore.save(sessionId, await operation(adapter));
95
- }
96
- catch (error) {
97
- if (shouldFallbackFromHelper(error)) {
98
- console.warn('[ComputerSemantics] Falling back from helper:', error instanceof Error ? error.message : String(error));
99
- return null;
100
- }
101
- throw error;
102
- }
103
- }
104
- async function run(command, args, timeout = 5000) {
105
- const { stdout } = await execFileAsync(command, args, {
106
- timeout,
107
- windowsHide: true,
108
- maxBuffer: 1024 * 1024 * 4,
109
- });
110
- return stdout;
111
- }
112
- async function listMacApps() {
113
- const script = [
114
- 'tell application "System Events"',
115
- 'set appRows to {}',
116
- 'repeat with p in (application processes whose background only is false)',
117
- 'set end of appRows to (name of p as text)',
118
- 'end repeat',
119
- 'return appRows',
120
- 'end tell',
121
- ].join('\n');
122
- const output = await run('osascript', ['-e', script]);
123
- return output.split(', ')
124
- .map((name) => name.trim())
125
- .filter(Boolean)
126
- .map((name) => ({ name, running: true }));
127
- }
128
- async function listWindowsApps() {
129
- const script = [
130
- 'Get-Process | Where-Object { $_.MainWindowTitle } |',
131
- 'Select-Object ProcessName, Id, MainWindowTitle | ConvertTo-Json -Depth 3',
132
- ].join(' ');
133
- const output = await run('powershell.exe', ['-NoProfile', '-Command', script]);
134
- const parsed = JSON.parse(output || '[]');
135
- const rows = Array.isArray(parsed) ? parsed : [parsed];
136
- return rows.map((row) => ({
137
- name: row.ProcessName,
138
- pid: row.Id,
139
- windowTitle: row.MainWindowTitle,
140
- running: true,
141
- }));
142
- }
143
- async function listLinuxApps() {
144
- try {
145
- const output = await run('wmctrl', ['-lx']);
146
- return output.split(/\r?\n/)
147
- .map((line) => line.trim())
148
- .filter(Boolean)
149
- .map((line) => {
150
- const parts = line.split(/\s+/);
151
- return {
152
- windowId: parts[0],
153
- desktop: parts[1],
154
- host: parts[2],
155
- className: parts[3],
156
- windowTitle: parts.slice(4).join(' '),
157
- running: true,
158
- };
159
- });
160
- }
161
- catch {
162
- const output = await run('ps', ['-eo', 'comm=']);
163
- return [...new Set(output.split(/\r?\n/).map((name) => name.trim()).filter(Boolean))]
164
- .slice(0, 200)
165
- .map((name) => ({ name, running: true }));
166
- }
167
- }
168
- async function listApps() {
169
- if (process.platform === 'darwin') {
170
- return listMacApps();
171
- }
172
- if (process.platform === 'win32') {
173
- return listWindowsApps();
174
- }
175
- return listLinuxApps();
176
- }
177
- async function macAccessibilityTree(app) {
178
- const escapedApp = app.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
179
- const script = `
180
- on safeText(v)
181
- try
182
- return v as text
183
- on error
184
- return ""
185
- end try
186
- end safeText
187
-
188
- on emitElement(e, depth, maxDepth, counter)
189
- if depth > maxDepth then return {}
190
- set rows to {}
191
- try
192
- set roleText to my safeText(role of e)
193
- on error
194
- set roleText to "element"
195
- end try
196
- try
197
- set titleText to my safeText(title of e)
198
- on error
199
- set titleText to ""
200
- end try
201
- try
202
- set valueText to my safeText(value of e)
203
- on error
204
- set valueText to ""
205
- end try
206
- try
207
- set posValue to position of e
208
- set sizeValue to size of e
209
- set boundsText to ((item 1 of posValue) as text) & "," & ((item 2 of posValue) as text) & "," & ((item 1 of sizeValue) as text) & "," & ((item 2 of sizeValue) as text)
210
- on error
211
- set boundsText to ""
212
- end try
213
- set end of rows to ((counter as text) & tab & roleText & tab & titleText & tab & valueText & tab & boundsText)
214
- if counter > ${MAX_APP_STATE_ELEMENTS} then return rows
215
- try
216
- repeat with childElement in UI elements of e
217
- set childRows to my emitElement(childElement, depth + 1, maxDepth, counter + (count of rows))
218
- set rows to rows & childRows
219
- if (count of rows) > ${MAX_APP_STATE_ELEMENTS} then return rows
220
- end repeat
221
- end try
222
- return rows
223
- end emitElement
224
-
225
- tell application "System Events"
226
- if not (exists process "${escapedApp}") then error "App is not running: ${escapedApp}"
227
- tell process "${escapedApp}"
228
- set rows to {}
229
- repeat with w in windows
230
- set rows to rows & my emitElement(w, 0, 4, (count of rows) + 1)
231
- if (count of rows) > ${MAX_APP_STATE_ELEMENTS} then exit repeat
232
- end repeat
233
- return rows
234
- end tell
235
- end tell
236
- `;
237
- const output = await run('osascript', ['-e', script], 10000);
238
- return output.split(/\r?\n|, /)
239
- .map((line) => line.trim())
240
- .filter(Boolean)
241
- .map((line, index) => {
242
- const [rawIndex, role, title, value, boundsText] = line.split('\t');
243
- const boundsParts = (boundsText || '').split(',').map((part) => Number.parseFloat(part));
244
- const hasBounds = boundsParts.length === 4 && boundsParts.every(Number.isFinite);
245
- return {
246
- index: rawIndex || String(index + 1),
247
- role: role || 'element',
248
- title: title || undefined,
249
- value: value || undefined,
250
- bounds: hasBounds
251
- ? { x: boundsParts[0], y: boundsParts[1], width: boundsParts[2], height: boundsParts[3] }
252
- : undefined,
253
- };
254
- });
255
- }
256
- async function getAccessibilityTree(app) {
257
- if (process.platform === 'darwin') {
258
- try {
259
- return { elements: await macAccessibilityTree(app) };
260
- }
261
- catch (error) {
262
- return { elements: [], message: error instanceof Error ? error.message : String(error) };
263
- }
264
- }
265
- return {
266
- elements: [],
267
- message: 'Native accessibility tree capture is not implemented for this platform yet.',
268
- };
269
- }
270
- async function getAppState(sessionId, app) {
271
- if (!app) {
272
- throw new Error('app is required.');
273
- }
274
- const helperState = await withHelperState(sessionId, (adapter) => adapter.getAppState({ sessionId, app }));
275
- if (helperState) {
276
- return helperState;
277
- }
278
- const screenshot = await captureScreenshot();
279
- const tree = await getAccessibilityTree(app);
280
- const state = {
281
- stateId: semanticSessionStore.createStateId(),
282
- app,
283
- platform: process.platform,
284
- screenshotDataUrl: screenshot.dataUrl,
285
- displaySize: screenshot.size,
286
- elements: tree.elements,
287
- accessibilityTree: tree.elements,
288
- message: tree.message,
289
- };
290
- return semanticSessionStore.save(sessionId, state);
291
- }
292
- async function targetFor(sessionId, app, stateId) {
293
- const cached = semanticSessionStore.getState(sessionId, app, stateId);
294
- return { displaySize: cached?.displaySize || (await captureScreenshot()).size };
295
- }
296
- export const computerSemanticsService = {
297
- async callTool(name, input) {
298
- const sessionId = readSessionId(input);
299
- switch (name) {
300
- case 'list_apps': {
301
- const adapter = getHelperAdapter();
302
- if (adapter) {
303
- try {
304
- return { apps: await adapter.listApps(), platform: process.platform };
305
- }
306
- catch (error) {
307
- if (!shouldFallbackFromHelper(error)) {
308
- throw error;
309
- }
310
- console.warn('[ComputerSemantics] Falling back from helper:', error instanceof Error ? error.message : String(error));
311
- }
312
- }
313
- return { apps: await listApps(), platform: process.platform };
314
- }
315
- case 'get_app_state':
316
- return getAppState(sessionId, readString(input.app));
317
- case 'click':
318
- case 'click_element': {
319
- const app = requireApp(input);
320
- const helperState = await withHelperState(sessionId, (adapter) => adapter.clickElement({ ...input, sessionId, app }));
321
- if (helperState) {
322
- return helperState;
323
- }
324
- const stateId = readString(input.stateId) || undefined;
325
- const point = getPoint(input, sessionId, app);
326
- if (!point) {
327
- throw new Error('click requires x/y or an element_index from computer_get_app_state.');
328
- }
329
- const target = await targetFor(sessionId, app, stateId);
330
- const button = readButton(input.mouse_button ?? input.mouseButton);
331
- const clickCount = readClickCount(input.click_count ?? input.clickCount);
332
- for (let index = 0; index < clickCount; index += 1) {
333
- await executor.click(target, button, point, false);
334
- }
335
- return getAppState(sessionId, app);
336
- }
337
- case 'drag': {
338
- const app = requireApp(input);
339
- const helperState = await withHelperState(sessionId, (adapter) => adapter.drag({ ...input, sessionId, app }));
340
- if (helperState) {
341
- return helperState;
342
- }
343
- const stateId = readString(input.stateId) || undefined;
344
- const fromX = readNumber(input.from_x);
345
- const fromY = readNumber(input.from_y);
346
- const toX = readNumber(input.to_x);
347
- const toY = readNumber(input.to_y);
348
- if (fromX === undefined || fromY === undefined || toX === undefined || toY === undefined) {
349
- throw new Error('drag requires from_x/from_y/to_x/to_y.');
350
- }
351
- await executor.drag(await targetFor(sessionId, app, stateId), { x: fromX, y: fromY }, { x: toX, y: toY }, readButton(input.mouse_button ?? input.mouseButton));
352
- return getAppState(sessionId, app);
353
- }
354
- case 'scroll':
355
- case 'scroll_element': {
356
- const app = requireApp(input);
357
- const helperState = await withHelperState(sessionId, (adapter) => adapter.scrollElement({ ...input, sessionId, app }));
358
- if (helperState) {
359
- return helperState;
360
- }
361
- const stateId = readString(input.stateId) || undefined;
362
- const point = getPoint(input, sessionId, app);
363
- if (!point) {
364
- throw new Error('scroll requires x/y or an element_index from computer_get_app_state.');
365
- }
366
- await executor.scroll(await targetFor(sessionId, app, stateId), readDirection(input.direction), readNumber(input.pages) ?? 1, point);
367
- return getAppState(sessionId, app);
368
- }
369
- case 'type_text': {
370
- const app = requireApp(input);
371
- const helperState = await withHelperState(sessionId, (adapter) => adapter.typeText({ ...input, sessionId, app }));
372
- if (helperState) {
373
- return helperState;
374
- }
375
- await executor.type(readString(input.text));
376
- return getAppState(sessionId, app);
377
- }
378
- case 'press_key': {
379
- const app = requireApp(input);
380
- const helperState = await withHelperState(sessionId, (adapter) => adapter.pressKey({ ...input, sessionId, app }));
381
- if (helperState) {
382
- return helperState;
383
- }
384
- await executor.pressChord(readString(input.key));
385
- return getAppState(sessionId, app);
386
- }
387
- case 'set_value': {
388
- const app = requireApp(input);
389
- const helperState = await withHelperState(sessionId, (adapter) => adapter.setValue({ ...input, sessionId, app }));
390
- if (helperState) {
391
- return helperState;
392
- }
393
- const stateId = readString(input.stateId) || undefined;
394
- const point = getPoint(input, sessionId, app);
395
- if (!point) {
396
- throw new Error('set_value requires x/y or an element_index from computer_get_app_state.');
397
- }
398
- await executor.click(await targetFor(sessionId, app, stateId), 'left', point, false);
399
- await executor.pressChord(process.platform === 'darwin' ? 'cmd+a' : 'ctrl+a');
400
- await executor.type(readString(input.value));
401
- return getAppState(sessionId, app);
402
- }
403
- case 'perform_secondary_action': {
404
- const app = requireApp(input);
405
- const helperState = await withHelperState(sessionId, (adapter) => adapter.performSecondaryAction({ ...input, sessionId, app }));
406
- if (helperState) {
407
- return helperState;
408
- }
409
- const stateId = readString(input.stateId) || undefined;
410
- const point = getPoint(input, sessionId, app);
411
- if (!point) {
412
- throw new Error('perform_secondary_action requires x/y or an element_index from computer_get_app_state.');
413
- }
414
- await executor.click(await targetFor(sessionId, app, stateId), 'right', point, false);
415
- return getAppState(sessionId, app);
416
- }
417
- default:
418
- throw new Error(`Unknown semantic Computer Use tool: ${name}`);
419
- }
420
- },
421
- };
422
- //# sourceMappingURL=computer-semantics.service.js.map