@n8n/fs-proxy 0.1.0-rc1
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/LICENSE.md +88 -0
- package/README.md +267 -0
- package/dist/build.tsbuildinfo +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +189 -0
- package/dist/cli.js.map +1 -0
- package/dist/config-templates.d.ts +10 -0
- package/dist/config-templates.js +39 -0
- package/dist/config-templates.js.map +1 -0
- package/dist/config.d.ts +67 -0
- package/dist/config.js +285 -0
- package/dist/config.js.map +1 -0
- package/dist/confirm-resource-cli.d.ts +4 -0
- package/dist/confirm-resource-cli.js +28 -0
- package/dist/confirm-resource-cli.js.map +1 -0
- package/dist/daemon.d.ts +11 -0
- package/dist/daemon.js +249 -0
- package/dist/daemon.js.map +1 -0
- package/dist/gateway-client.d.ts +38 -0
- package/dist/gateway-client.js +401 -0
- package/dist/gateway-client.js.map +1 -0
- package/dist/logger.d.ts +26 -0
- package/dist/logger.js +350 -0
- package/dist/logger.js.map +1 -0
- package/dist/settings-store.d.ts +29 -0
- package/dist/settings-store.js +224 -0
- package/dist/settings-store.js.map +1 -0
- package/dist/startup-config-cli.d.ts +5 -0
- package/dist/startup-config-cli.js +185 -0
- package/dist/startup-config-cli.js.map +1 -0
- package/dist/tools/browser/index.d.ts +14 -0
- package/dist/tools/browser/index.js +72 -0
- package/dist/tools/browser/index.js.map +1 -0
- package/dist/tools/filesystem/constants.d.ts +1 -0
- package/dist/tools/filesystem/constants.js +5 -0
- package/dist/tools/filesystem/constants.js.map +1 -0
- package/dist/tools/filesystem/copy-file.d.ts +14 -0
- package/dist/tools/filesystem/copy-file.js +65 -0
- package/dist/tools/filesystem/copy-file.js.map +1 -0
- package/dist/tools/filesystem/create-directory.d.ts +11 -0
- package/dist/tools/filesystem/create-directory.js +60 -0
- package/dist/tools/filesystem/create-directory.js.map +1 -0
- package/dist/tools/filesystem/delete.d.ts +11 -0
- package/dist/tools/filesystem/delete.js +64 -0
- package/dist/tools/filesystem/delete.js.map +1 -0
- package/dist/tools/filesystem/edit-file.d.ts +17 -0
- package/dist/tools/filesystem/edit-file.js +71 -0
- package/dist/tools/filesystem/edit-file.js.map +1 -0
- package/dist/tools/filesystem/fs-utils.d.ts +15 -0
- package/dist/tools/filesystem/fs-utils.js +178 -0
- package/dist/tools/filesystem/fs-utils.js.map +1 -0
- package/dist/tools/filesystem/get-file-tree.d.ts +14 -0
- package/dist/tools/filesystem/get-file-tree.js +38 -0
- package/dist/tools/filesystem/get-file-tree.js.map +1 -0
- package/dist/tools/filesystem/index.d.ts +3 -0
- package/dist/tools/filesystem/index.js +28 -0
- package/dist/tools/filesystem/index.js.map +1 -0
- package/dist/tools/filesystem/list-files.d.ts +17 -0
- package/dist/tools/filesystem/list-files.js +76 -0
- package/dist/tools/filesystem/list-files.js.map +1 -0
- package/dist/tools/filesystem/move.d.ts +14 -0
- package/dist/tools/filesystem/move.js +65 -0
- package/dist/tools/filesystem/move.js.map +1 -0
- package/dist/tools/filesystem/read-file.d.ts +17 -0
- package/dist/tools/filesystem/read-file.js +86 -0
- package/dist/tools/filesystem/read-file.js.map +1 -0
- package/dist/tools/filesystem/search-files.d.ts +23 -0
- package/dist/tools/filesystem/search-files.js +128 -0
- package/dist/tools/filesystem/search-files.js.map +1 -0
- package/dist/tools/filesystem/write-file.d.ts +14 -0
- package/dist/tools/filesystem/write-file.js +68 -0
- package/dist/tools/filesystem/write-file.js.map +1 -0
- package/dist/tools/monitor-utils.d.ts +2 -0
- package/dist/tools/monitor-utils.js +11 -0
- package/dist/tools/monitor-utils.js.map +1 -0
- package/dist/tools/mouse-keyboard/index.d.ts +2 -0
- package/dist/tools/mouse-keyboard/index.js +70 -0
- package/dist/tools/mouse-keyboard/index.js.map +1 -0
- package/dist/tools/mouse-keyboard/mouse-keyboard.d.ts +130 -0
- package/dist/tools/mouse-keyboard/mouse-keyboard.js +249 -0
- package/dist/tools/mouse-keyboard/mouse-keyboard.js.map +1 -0
- package/dist/tools/screenshot/index.d.ts +2 -0
- package/dist/tools/screenshot/index.js +26 -0
- package/dist/tools/screenshot/index.js.map +1 -0
- package/dist/tools/screenshot/screenshot.d.ts +22 -0
- package/dist/tools/screenshot/screenshot.js +91 -0
- package/dist/tools/screenshot/screenshot.js.map +1 -0
- package/dist/tools/shell/build-shell-resource.d.ts +1 -0
- package/dist/tools/shell/build-shell-resource.js +70 -0
- package/dist/tools/shell/build-shell-resource.js.map +1 -0
- package/dist/tools/shell/index.d.ts +2 -0
- package/dist/tools/shell/index.js +11 -0
- package/dist/tools/shell/index.js.map +1 -0
- package/dist/tools/shell/shell-execute.d.ts +17 -0
- package/dist/tools/shell/shell-execute.js +88 -0
- package/dist/tools/shell/shell-execute.js.map +1 -0
- package/dist/tools/test-utils.d.ts +3 -0
- package/dist/tools/test-utils.js +16 -0
- package/dist/tools/test-utils.js.map +1 -0
- package/dist/tools/types.d.ts +43 -0
- package/dist/tools/types.js +3 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/tools/utils.d.ts +3 -0
- package/dist/tools/utils.js +19 -0
- package/dist/tools/utils.js.map +1 -0
- package/package.json +55 -0
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.keyboardShortcutTool = exports.keyboardKeyTapTool = exports.keyboardTypeTool = exports.mouseScrollTool = exports.mouseDragTool = exports.mouseDoubleClickTool = exports.mouseClickTool = exports.mouseMoveTool = void 0;
|
|
7
|
+
const robotjs_1 = __importDefault(require("@jitsi/robotjs"));
|
|
8
|
+
const zod_1 = require("zod");
|
|
9
|
+
const monitor_utils_1 = require("../monitor-utils");
|
|
10
|
+
const IS_MACOS = process.platform === 'darwin';
|
|
11
|
+
const IS_WINDOWS = process.platform === 'win32';
|
|
12
|
+
function normalizeKey(key) {
|
|
13
|
+
const k = key.toLowerCase();
|
|
14
|
+
const aliases = {
|
|
15
|
+
cmd: 'command',
|
|
16
|
+
meta: 'command',
|
|
17
|
+
super: 'command',
|
|
18
|
+
win: 'command',
|
|
19
|
+
windows: 'command',
|
|
20
|
+
ctrl: 'control',
|
|
21
|
+
option: 'alt',
|
|
22
|
+
return: 'enter',
|
|
23
|
+
esc: 'escape',
|
|
24
|
+
del: 'delete',
|
|
25
|
+
pgup: 'pageup',
|
|
26
|
+
pgdn: 'pagedown',
|
|
27
|
+
ins: 'insert',
|
|
28
|
+
caps: 'capslock',
|
|
29
|
+
};
|
|
30
|
+
return aliases[k] ?? k;
|
|
31
|
+
}
|
|
32
|
+
const MODIFIER_KEY_NAMES = IS_MACOS
|
|
33
|
+
? '"command" (⌘, aliases: "cmd", "meta", "super"), "shift", "alt" (⌥, alias: "option"), "control" (alias: "ctrl")'
|
|
34
|
+
: IS_WINDOWS
|
|
35
|
+
? '"control" (alias: "ctrl"), "shift", "alt", "command" (Win key, aliases: "win", "windows", "super")'
|
|
36
|
+
: '"control" (alias: "ctrl"), "shift", "alt", "command"';
|
|
37
|
+
const SHORTCUT_EXAMPLE = IS_MACOS
|
|
38
|
+
? '["command","t"] for ⌘T, ["command","shift","z"] for ⌘⇧Z'
|
|
39
|
+
: '["control","t"] for Ctrl+T, ["control","shift","z"] for Ctrl+Shift+Z';
|
|
40
|
+
const screenSizeParams = {
|
|
41
|
+
screenWidth: zod_1.z
|
|
42
|
+
.number()
|
|
43
|
+
.int()
|
|
44
|
+
.optional()
|
|
45
|
+
.describe('Width of the screen as the agent perceived it from the screenshot (pixels). ' +
|
|
46
|
+
'Use the actual pixel width of the screenshot image you received.'),
|
|
47
|
+
screenHeight: zod_1.z
|
|
48
|
+
.number()
|
|
49
|
+
.int()
|
|
50
|
+
.optional()
|
|
51
|
+
.describe('Height of the screen as the agent perceived it from the screenshot (pixels). ' +
|
|
52
|
+
'Use the actual pixel height of the screenshot image you received.'),
|
|
53
|
+
};
|
|
54
|
+
function scaleCoord(x, y, screenWidth, screenHeight) {
|
|
55
|
+
if (!screenWidth || !screenHeight)
|
|
56
|
+
return { x, y };
|
|
57
|
+
const monitor = (0, monitor_utils_1.getPrimaryMonitor)();
|
|
58
|
+
return {
|
|
59
|
+
x: Math.round((x * monitor.width()) / screenWidth),
|
|
60
|
+
y: Math.round((y * monitor.height()) / screenHeight),
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
const mouseMoveSchema = zod_1.z.object({
|
|
64
|
+
x: zod_1.z.number().int().describe('Target X coordinate in pixels'),
|
|
65
|
+
y: zod_1.z.number().int().describe('Target Y coordinate in pixels'),
|
|
66
|
+
...screenSizeParams,
|
|
67
|
+
});
|
|
68
|
+
const COMPUTER_RESOURCE = {
|
|
69
|
+
toolGroup: 'computer',
|
|
70
|
+
resource: '*',
|
|
71
|
+
description: 'Access screen/input devices',
|
|
72
|
+
};
|
|
73
|
+
exports.mouseMoveTool = {
|
|
74
|
+
name: 'mouse_move',
|
|
75
|
+
description: 'Move the mouse cursor to the specified screen coordinates',
|
|
76
|
+
inputSchema: mouseMoveSchema,
|
|
77
|
+
annotations: {},
|
|
78
|
+
getAffectedResources() {
|
|
79
|
+
return [COMPUTER_RESOURCE];
|
|
80
|
+
},
|
|
81
|
+
execute({ x, y, screenWidth, screenHeight }) {
|
|
82
|
+
const scaled = scaleCoord(x, y, screenWidth, screenHeight);
|
|
83
|
+
robotjs_1.default.moveMouse(scaled.x, scaled.y);
|
|
84
|
+
return { content: [{ type: 'text', text: 'ok' }] };
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
const mouseClickSchema = zod_1.z.object({
|
|
88
|
+
x: zod_1.z.number().int().describe('X coordinate to click'),
|
|
89
|
+
y: zod_1.z.number().int().describe('Y coordinate to click'),
|
|
90
|
+
button: zod_1.z.enum(['left', 'right', 'middle']).optional().describe('Mouse button (default: left)'),
|
|
91
|
+
...screenSizeParams,
|
|
92
|
+
});
|
|
93
|
+
exports.mouseClickTool = {
|
|
94
|
+
name: 'mouse_click',
|
|
95
|
+
description: 'Move the mouse to the specified coordinates and click',
|
|
96
|
+
inputSchema: mouseClickSchema,
|
|
97
|
+
annotations: {},
|
|
98
|
+
getAffectedResources() {
|
|
99
|
+
return [COMPUTER_RESOURCE];
|
|
100
|
+
},
|
|
101
|
+
execute({ x, y, button = 'left', screenWidth, screenHeight }) {
|
|
102
|
+
const scaled = scaleCoord(x, y, screenWidth, screenHeight);
|
|
103
|
+
robotjs_1.default.moveMouse(scaled.x, scaled.y);
|
|
104
|
+
robotjs_1.default.mouseClick(button);
|
|
105
|
+
return { content: [{ type: 'text', text: 'ok' }] };
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
const mouseDoubleClickSchema = zod_1.z.object({
|
|
109
|
+
x: zod_1.z.number().int().describe('X coordinate to double-click'),
|
|
110
|
+
y: zod_1.z.number().int().describe('Y coordinate to double-click'),
|
|
111
|
+
...screenSizeParams,
|
|
112
|
+
});
|
|
113
|
+
exports.mouseDoubleClickTool = {
|
|
114
|
+
name: 'mouse_double_click',
|
|
115
|
+
description: 'Move the mouse to the specified coordinates and double-click',
|
|
116
|
+
inputSchema: mouseDoubleClickSchema,
|
|
117
|
+
annotations: {},
|
|
118
|
+
getAffectedResources() {
|
|
119
|
+
return [COMPUTER_RESOURCE];
|
|
120
|
+
},
|
|
121
|
+
execute({ x, y, screenWidth, screenHeight }) {
|
|
122
|
+
const scaled = scaleCoord(x, y, screenWidth, screenHeight);
|
|
123
|
+
robotjs_1.default.moveMouse(scaled.x, scaled.y);
|
|
124
|
+
robotjs_1.default.mouseClick('left', true);
|
|
125
|
+
return { content: [{ type: 'text', text: 'ok' }] };
|
|
126
|
+
},
|
|
127
|
+
};
|
|
128
|
+
const mouseDragSchema = zod_1.z.object({
|
|
129
|
+
fromX: zod_1.z.number().int().describe('Starting X coordinate'),
|
|
130
|
+
fromY: zod_1.z.number().int().describe('Starting Y coordinate'),
|
|
131
|
+
toX: zod_1.z.number().int().describe('Target X coordinate'),
|
|
132
|
+
toY: zod_1.z.number().int().describe('Target Y coordinate'),
|
|
133
|
+
...screenSizeParams,
|
|
134
|
+
});
|
|
135
|
+
exports.mouseDragTool = {
|
|
136
|
+
name: 'mouse_drag',
|
|
137
|
+
description: 'Click-drag from one coordinate to another',
|
|
138
|
+
inputSchema: mouseDragSchema,
|
|
139
|
+
annotations: {},
|
|
140
|
+
getAffectedResources() {
|
|
141
|
+
return [COMPUTER_RESOURCE];
|
|
142
|
+
},
|
|
143
|
+
execute({ fromX, fromY, toX, toY, screenWidth, screenHeight }) {
|
|
144
|
+
const scaledFrom = scaleCoord(fromX, fromY, screenWidth, screenHeight);
|
|
145
|
+
const scaledTo = scaleCoord(toX, toY, screenWidth, screenHeight);
|
|
146
|
+
robotjs_1.default.moveMouse(scaledFrom.x, scaledFrom.y);
|
|
147
|
+
robotjs_1.default.mouseToggle('down');
|
|
148
|
+
robotjs_1.default.dragMouse(scaledTo.x, scaledTo.y);
|
|
149
|
+
robotjs_1.default.mouseToggle('up');
|
|
150
|
+
return { content: [{ type: 'text', text: 'ok' }] };
|
|
151
|
+
},
|
|
152
|
+
};
|
|
153
|
+
const mouseScrollSchema = zod_1.z.object({
|
|
154
|
+
x: zod_1.z.number().int().describe('X coordinate to scroll at'),
|
|
155
|
+
y: zod_1.z.number().int().describe('Y coordinate to scroll at'),
|
|
156
|
+
direction: zod_1.z.enum(['up', 'down', 'left', 'right']).describe('Scroll direction'),
|
|
157
|
+
amount: zod_1.z.number().int().describe('Number of scroll ticks'),
|
|
158
|
+
...screenSizeParams,
|
|
159
|
+
});
|
|
160
|
+
exports.mouseScrollTool = {
|
|
161
|
+
name: 'mouse_scroll',
|
|
162
|
+
description: 'Scroll at the specified screen coordinates',
|
|
163
|
+
inputSchema: mouseScrollSchema,
|
|
164
|
+
annotations: {},
|
|
165
|
+
getAffectedResources() {
|
|
166
|
+
return [COMPUTER_RESOURCE];
|
|
167
|
+
},
|
|
168
|
+
execute({ x, y, direction, amount, screenWidth, screenHeight }) {
|
|
169
|
+
const scaled = scaleCoord(x, y, screenWidth, screenHeight);
|
|
170
|
+
robotjs_1.default.moveMouse(scaled.x, scaled.y);
|
|
171
|
+
const dx = direction === 'right' ? amount : direction === 'left' ? -amount : 0;
|
|
172
|
+
const dy = direction === 'down' ? amount : direction === 'up' ? -amount : 0;
|
|
173
|
+
robotjs_1.default.scrollMouse(dx, dy);
|
|
174
|
+
return { content: [{ type: 'text', text: 'ok' }] };
|
|
175
|
+
},
|
|
176
|
+
};
|
|
177
|
+
const keyboardTypeSchema = zod_1.z.object({
|
|
178
|
+
text: zod_1.z.string().describe('Text to type'),
|
|
179
|
+
delayMs: zod_1.z
|
|
180
|
+
.number()
|
|
181
|
+
.int()
|
|
182
|
+
.optional()
|
|
183
|
+
.describe('Milliseconds to wait before typing. Use this when the target input field needs time to ' +
|
|
184
|
+
'gain focus after a prior action (e.g. opening a new tab). Default: 0 (type immediately).'),
|
|
185
|
+
});
|
|
186
|
+
exports.keyboardTypeTool = {
|
|
187
|
+
name: 'keyboard_type',
|
|
188
|
+
description: 'Type a string of text using the keyboard',
|
|
189
|
+
inputSchema: keyboardTypeSchema,
|
|
190
|
+
annotations: {},
|
|
191
|
+
getAffectedResources() {
|
|
192
|
+
return [COMPUTER_RESOURCE];
|
|
193
|
+
},
|
|
194
|
+
async execute({ text, delayMs }) {
|
|
195
|
+
if (delayMs) {
|
|
196
|
+
await new Promise((resolve) => setTimeout(resolve, delayMs));
|
|
197
|
+
}
|
|
198
|
+
robotjs_1.default.typeStringDelayed(text, 60 * 4);
|
|
199
|
+
return { content: [{ type: 'text', text: 'ok' }] };
|
|
200
|
+
},
|
|
201
|
+
};
|
|
202
|
+
const keyboardKeyTapSchema = zod_1.z.object({
|
|
203
|
+
key: zod_1.z
|
|
204
|
+
.string()
|
|
205
|
+
.describe('Key to press. Special keys: "enter", "escape", "tab", "backspace", "delete", "space", ' +
|
|
206
|
+
'"up", "down", "left", "right", "home", "end", "pageup", "pagedown", "insert", ' +
|
|
207
|
+
'"capslock", "printscreen", "menu", "f1"–"f24". ' +
|
|
208
|
+
'Numpad: "numpad_0"–"numpad_9", "numpad_+", "numpad_-", "numpad_*", "numpad_/", "numpad_.", "numpad_lock". ' +
|
|
209
|
+
'Media: "audio_mute", "audio_vol_up", "audio_vol_down", "audio_play", "audio_stop", "audio_pause", "audio_prev", "audio_next". ' +
|
|
210
|
+
'Aliases: "esc"→"escape", "del"→"delete", "pgup"→"pageup", "pgdn"→"pagedown", "ins"→"insert", "return"→"enter", "caps"→"capslock". ' +
|
|
211
|
+
'For single characters just pass the character directly (e.g. "a", "1", ".").'),
|
|
212
|
+
});
|
|
213
|
+
exports.keyboardKeyTapTool = {
|
|
214
|
+
name: 'keyboard_key_tap',
|
|
215
|
+
description: 'Press and release a single key. Use keyboard_shortcut for key combinations.',
|
|
216
|
+
inputSchema: keyboardKeyTapSchema,
|
|
217
|
+
annotations: {},
|
|
218
|
+
getAffectedResources() {
|
|
219
|
+
return [COMPUTER_RESOURCE];
|
|
220
|
+
},
|
|
221
|
+
execute({ key }) {
|
|
222
|
+
robotjs_1.default.keyTap(normalizeKey(key));
|
|
223
|
+
return { content: [{ type: 'text', text: 'ok' }] };
|
|
224
|
+
},
|
|
225
|
+
};
|
|
226
|
+
const keyboardShortcutSchema = zod_1.z.object({
|
|
227
|
+
keys: zod_1.z
|
|
228
|
+
.array(zod_1.z.string())
|
|
229
|
+
.min(1)
|
|
230
|
+
.describe('Keys in the shortcut. Last element is tapped; all preceding are held as modifiers. ' +
|
|
231
|
+
`Modifier names: ${MODIFIER_KEY_NAMES}. ` +
|
|
232
|
+
`Examples: ${SHORTCUT_EXAMPLE}.`),
|
|
233
|
+
});
|
|
234
|
+
exports.keyboardShortcutTool = {
|
|
235
|
+
name: 'keyboard_shortcut',
|
|
236
|
+
description: `Press a keyboard shortcut (e.g. ${IS_MACOS ? '⌘C, ⌘⇧Z' : 'Ctrl+C, Ctrl+Shift+Z'})`,
|
|
237
|
+
inputSchema: keyboardShortcutSchema,
|
|
238
|
+
annotations: {},
|
|
239
|
+
getAffectedResources() {
|
|
240
|
+
return [COMPUTER_RESOURCE];
|
|
241
|
+
},
|
|
242
|
+
execute({ keys }) {
|
|
243
|
+
const modifiers = keys.slice(0, -1).map(normalizeKey);
|
|
244
|
+
const key = normalizeKey(keys.at(-1));
|
|
245
|
+
robotjs_1.default.keyTap(key, modifiers);
|
|
246
|
+
return { content: [{ type: 'text', text: 'ok' }] };
|
|
247
|
+
},
|
|
248
|
+
};
|
|
249
|
+
//# sourceMappingURL=mouse-keyboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mouse-keyboard.js","sourceRoot":"","sources":["../../../src/tools/mouse-keyboard/mouse-keyboard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ScreenshotModule = void 0;
|
|
4
|
+
const node_screenshots_1 = require("node-screenshots");
|
|
5
|
+
const logger_1 = require("../../logger");
|
|
6
|
+
const screenshot_1 = require("./screenshot");
|
|
7
|
+
exports.ScreenshotModule = {
|
|
8
|
+
isSupported() {
|
|
9
|
+
try {
|
|
10
|
+
const monitors = node_screenshots_1.Monitor.all();
|
|
11
|
+
if (monitors.length === 0) {
|
|
12
|
+
logger_1.logger.info('Screenshot module not supported', { reason: 'no monitors detected' });
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
catch (error) {
|
|
18
|
+
logger_1.logger.info('Screenshot module not supported', {
|
|
19
|
+
error: error instanceof Error ? error.message : String(error),
|
|
20
|
+
});
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
definitions: [screenshot_1.screenshotTool, screenshot_1.screenshotRegionTool],
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/screenshot/index.ts"],"names":[],"mappings":";;;AAAA,uDAA2C;AAE3C,yCAAsC;AAEtC,6CAAoE;AAEvD,QAAA,gBAAgB,GAAe;IAC3C,WAAW;QACV,IAAI,CAAC;YACJ,MAAM,QAAQ,GAAG,0BAAO,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3B,eAAM,CAAC,IAAI,CAAC,iCAAiC,EAAE,EAAE,MAAM,EAAE,sBAAsB,EAAE,CAAC,CAAC;gBACnF,OAAO,KAAK,CAAC;YACd,CAAC;YACD,OAAO,IAAI,CAAC;QACb,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,eAAM,CAAC,IAAI,CAAC,iCAAiC,EAAE;gBAC9C,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC7D,CAAC,CAAC;YACH,OAAO,KAAK,CAAC;QACd,CAAC;IACF,CAAC;IACD,WAAW,EAAE,CAAC,2BAAc,EAAE,iCAAoB,CAAC;CACnD,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { ToolDefinition } from '../types';
|
|
3
|
+
declare const screenshotSchema: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
|
|
4
|
+
declare const screenshotRegionSchema: z.ZodObject<{
|
|
5
|
+
x: z.ZodNumber;
|
|
6
|
+
y: z.ZodNumber;
|
|
7
|
+
width: z.ZodNumber;
|
|
8
|
+
height: z.ZodNumber;
|
|
9
|
+
}, "strip", z.ZodTypeAny, {
|
|
10
|
+
x: number;
|
|
11
|
+
y: number;
|
|
12
|
+
width: number;
|
|
13
|
+
height: number;
|
|
14
|
+
}, {
|
|
15
|
+
x: number;
|
|
16
|
+
y: number;
|
|
17
|
+
width: number;
|
|
18
|
+
height: number;
|
|
19
|
+
}>;
|
|
20
|
+
export declare const screenshotTool: ToolDefinition<typeof screenshotSchema>;
|
|
21
|
+
export declare const screenshotRegionTool: ToolDefinition<typeof screenshotRegionSchema>;
|
|
22
|
+
export {};
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.screenshotRegionTool = exports.screenshotTool = void 0;
|
|
7
|
+
const zod_1 = require("zod");
|
|
8
|
+
const sharp_1 = __importDefault(require("sharp"));
|
|
9
|
+
const monitor_utils_1 = require("../monitor-utils");
|
|
10
|
+
const screenshotSchema = zod_1.z.object({});
|
|
11
|
+
const screenshotRegionSchema = zod_1.z.object({
|
|
12
|
+
x: zod_1.z.number().int().describe('Region left position in pixels (absolute screen coordinates)'),
|
|
13
|
+
y: zod_1.z.number().int().describe('Region top position in pixels (absolute screen coordinates)'),
|
|
14
|
+
width: zod_1.z.number().int().describe('Region width in pixels'),
|
|
15
|
+
height: zod_1.z.number().int().describe('Region height in pixels'),
|
|
16
|
+
});
|
|
17
|
+
async function toJpeg(rawBuffer, width, height, logicalWidth, logicalHeight) {
|
|
18
|
+
let pipeline = (0, sharp_1.default)(rawBuffer, { raw: { width, height, channels: 4 } });
|
|
19
|
+
if (logicalWidth && logicalHeight && (width !== logicalWidth || height !== logicalHeight)) {
|
|
20
|
+
pipeline = pipeline.resize(logicalWidth, logicalHeight);
|
|
21
|
+
}
|
|
22
|
+
const w = logicalWidth ?? width;
|
|
23
|
+
const h = logicalHeight ?? height;
|
|
24
|
+
const maxDim = 1024;
|
|
25
|
+
if (w > maxDim || h > maxDim) {
|
|
26
|
+
const scale = maxDim / Math.max(w, h);
|
|
27
|
+
pipeline = pipeline.resize(Math.round(w * scale), Math.round(h * scale));
|
|
28
|
+
}
|
|
29
|
+
return await pipeline.jpeg({ quality: 85 }).toBuffer();
|
|
30
|
+
}
|
|
31
|
+
exports.screenshotTool = {
|
|
32
|
+
name: 'screen_screenshot',
|
|
33
|
+
description: 'Capture a screenshot of the full screen and return it as a base64-encoded JPEG',
|
|
34
|
+
inputSchema: screenshotSchema,
|
|
35
|
+
annotations: { readOnlyHint: true },
|
|
36
|
+
getAffectedResources() {
|
|
37
|
+
return [{ toolGroup: 'computer', resource: '*', description: 'Capture screenshot' }];
|
|
38
|
+
},
|
|
39
|
+
async execute(_input, _context) {
|
|
40
|
+
const monitor = (0, monitor_utils_1.getPrimaryMonitor)();
|
|
41
|
+
const image = await monitor.captureImage();
|
|
42
|
+
const rawBuffer = await image.toRaw();
|
|
43
|
+
const jpegBuffer = await toJpeg(rawBuffer, image.width, image.height, monitor.width(), monitor.height());
|
|
44
|
+
return {
|
|
45
|
+
content: [
|
|
46
|
+
{
|
|
47
|
+
type: 'image',
|
|
48
|
+
data: jpegBuffer.toString('base64'),
|
|
49
|
+
mimeType: 'image/jpeg',
|
|
50
|
+
},
|
|
51
|
+
],
|
|
52
|
+
};
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
exports.screenshotRegionTool = {
|
|
56
|
+
name: 'screen_screenshot_region',
|
|
57
|
+
description: 'Capture a specific region of the screen and return it as a base64-encoded JPEG',
|
|
58
|
+
inputSchema: screenshotRegionSchema,
|
|
59
|
+
annotations: { readOnlyHint: true },
|
|
60
|
+
getAffectedResources() {
|
|
61
|
+
return [
|
|
62
|
+
{ toolGroup: 'computer', resource: '*', description: 'Capture screenshot region' },
|
|
63
|
+
];
|
|
64
|
+
},
|
|
65
|
+
async execute({ x, y, width, height }, _context) {
|
|
66
|
+
const monitor = (0, monitor_utils_1.getPrimaryMonitor)();
|
|
67
|
+
const image = await monitor.captureImage();
|
|
68
|
+
const scaleFactor = monitor.scaleFactor();
|
|
69
|
+
const logicalRelX = Math.max(0, x - monitor.x());
|
|
70
|
+
const logicalRelY = Math.max(0, y - monitor.y());
|
|
71
|
+
const logicalClampedW = Math.min(width, monitor.width() - logicalRelX);
|
|
72
|
+
const logicalClampedH = Math.min(height, monitor.height() - logicalRelY);
|
|
73
|
+
const physRelX = Math.round(logicalRelX * scaleFactor);
|
|
74
|
+
const physRelY = Math.round(logicalRelY * scaleFactor);
|
|
75
|
+
const physW = Math.round(logicalClampedW * scaleFactor);
|
|
76
|
+
const physH = Math.round(logicalClampedH * scaleFactor);
|
|
77
|
+
const cropped = await image.crop(physRelX, physRelY, physW, physH);
|
|
78
|
+
const rawBuffer = await cropped.toRaw();
|
|
79
|
+
const jpegBuffer = await toJpeg(rawBuffer, cropped.width, cropped.height, logicalClampedW, logicalClampedH);
|
|
80
|
+
return {
|
|
81
|
+
content: [
|
|
82
|
+
{
|
|
83
|
+
type: 'image',
|
|
84
|
+
data: jpegBuffer.toString('base64'),
|
|
85
|
+
mimeType: 'image/jpeg',
|
|
86
|
+
},
|
|
87
|
+
],
|
|
88
|
+
};
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
//# sourceMappingURL=screenshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screenshot.js","sourceRoot":"","sources":["../../../src/tools/screenshot/screenshot.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function buildShellResource(command: string): string;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.buildShellResource = buildShellResource;
|
|
37
|
+
const path = __importStar(require("node:path"));
|
|
38
|
+
const WRAPPER_COMMANDS = new Set(['sudo', 'env', 'time', 'nice', 'nohup', 'xargs', 'doas']);
|
|
39
|
+
const COMPLEX_TOKENS = ['|', ';', '&', '$(', '`', '<(', '>(', '\n'];
|
|
40
|
+
function isComplex(command) {
|
|
41
|
+
return COMPLEX_TOKENS.some((token) => command.includes(token));
|
|
42
|
+
}
|
|
43
|
+
function buildShellResource(command) {
|
|
44
|
+
const trimmed = command.trim();
|
|
45
|
+
if (isComplex(trimmed))
|
|
46
|
+
return trimmed;
|
|
47
|
+
const words = trimmed.split(/\s+/);
|
|
48
|
+
let programIndex = -1;
|
|
49
|
+
for (let i = 0; i < words.length; i++) {
|
|
50
|
+
const word = words[i];
|
|
51
|
+
if (word.startsWith('-'))
|
|
52
|
+
continue;
|
|
53
|
+
if (/^[A-Z_a-z][A-Z0-9_a-z]*=/.test(word))
|
|
54
|
+
continue;
|
|
55
|
+
if (WRAPPER_COMMANDS.has(word))
|
|
56
|
+
continue;
|
|
57
|
+
programIndex = i;
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
if (programIndex === -1)
|
|
61
|
+
return trimmed;
|
|
62
|
+
const program = words[programIndex];
|
|
63
|
+
if (program.startsWith('$') || program.startsWith('./') || program.startsWith('../')) {
|
|
64
|
+
return trimmed;
|
|
65
|
+
}
|
|
66
|
+
const basename = path.basename(program);
|
|
67
|
+
const rest = words.slice(programIndex + 1);
|
|
68
|
+
return rest.length > 0 ? `${basename} ${rest.join(' ')}` : basename;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=build-shell-resource.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-shell-resource.js","sourceRoot":"","sources":["../../../src/tools/shell/build-shell-resource.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BA,gDA8BC;AAxDD,gDAAkC;AAElC,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;AAQ5F,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAEpE,SAAS,SAAS,CAAC,OAAe;IACjC,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;AAChE,CAAC;AAYD,SAAgB,kBAAkB,CAAC,OAAe;IACjD,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAE/B,IAAI,SAAS,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC;IAEvC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACnC,IAAI,YAAY,GAAG,CAAC,CAAC,CAAC;IAEtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QACnC,IAAI,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,SAAS;QACpD,IAAI,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,SAAS;QACzC,YAAY,GAAG,CAAC,CAAC;QACjB,MAAM;IACP,CAAC;IAED,IAAI,YAAY,KAAK,CAAC,CAAC;QAAE,OAAO,OAAO,CAAC;IAExC,MAAM,OAAO,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC;IAGpC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QACtF,OAAO,OAAO,CAAC;IAChB,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;IAE3C,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;AACrE,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ShellModule = void 0;
|
|
4
|
+
const shell_execute_1 = require("./shell-execute");
|
|
5
|
+
exports.ShellModule = {
|
|
6
|
+
isSupported() {
|
|
7
|
+
return true;
|
|
8
|
+
},
|
|
9
|
+
definitions: [shell_execute_1.shellExecuteTool],
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/shell/index.ts"],"names":[],"mappings":";;;AACA,mDAAmD;AAEtC,QAAA,WAAW,GAAe;IACtC,WAAW;QACV,OAAO,IAAI,CAAC;IACb,CAAC;IACD,WAAW,EAAE,CAAC,gCAAgB,CAAC;CAC/B,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { ToolDefinition } from '../types';
|
|
3
|
+
declare const inputSchema: z.ZodObject<{
|
|
4
|
+
command: z.ZodString;
|
|
5
|
+
timeout: z.ZodOptional<z.ZodNumber>;
|
|
6
|
+
cwd: z.ZodOptional<z.ZodString>;
|
|
7
|
+
}, "strip", z.ZodTypeAny, {
|
|
8
|
+
command: string;
|
|
9
|
+
timeout?: number | undefined;
|
|
10
|
+
cwd?: string | undefined;
|
|
11
|
+
}, {
|
|
12
|
+
command: string;
|
|
13
|
+
timeout?: number | undefined;
|
|
14
|
+
cwd?: string | undefined;
|
|
15
|
+
}>;
|
|
16
|
+
export declare const shellExecuteTool: ToolDefinition<typeof inputSchema>;
|
|
17
|
+
export {};
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.shellExecuteTool = void 0;
|
|
4
|
+
const sandbox_runtime_1 = require("@anthropic-ai/sandbox-runtime");
|
|
5
|
+
const ripgrep_1 = require("@vscode/ripgrep");
|
|
6
|
+
const child_process_1 = require("child_process");
|
|
7
|
+
const zod_1 = require("zod");
|
|
8
|
+
const utils_1 = require("../utils");
|
|
9
|
+
const build_shell_resource_1 = require("./build-shell-resource");
|
|
10
|
+
async function initializeSandbox({ dir }) {
|
|
11
|
+
const config = {
|
|
12
|
+
ripgrep: {
|
|
13
|
+
command: ripgrep_1.rgPath,
|
|
14
|
+
},
|
|
15
|
+
network: {
|
|
16
|
+
allowedDomains: [],
|
|
17
|
+
deniedDomains: [],
|
|
18
|
+
},
|
|
19
|
+
filesystem: {
|
|
20
|
+
denyRead: ['~/.ssh'],
|
|
21
|
+
allowRead: [],
|
|
22
|
+
allowWrite: [dir],
|
|
23
|
+
denyWrite: [],
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
await sandbox_runtime_1.SandboxManager.initialize(config);
|
|
27
|
+
}
|
|
28
|
+
const inputSchema = zod_1.z.object({
|
|
29
|
+
command: zod_1.z.string().describe('Shell command to execute'),
|
|
30
|
+
timeout: zod_1.z.number().int().optional().describe('Timeout in milliseconds (default: 30000)'),
|
|
31
|
+
cwd: zod_1.z.string().optional().describe('Working directory for the command'),
|
|
32
|
+
});
|
|
33
|
+
exports.shellExecuteTool = {
|
|
34
|
+
name: 'shell_execute',
|
|
35
|
+
description: 'Execute a shell command and return stdout, stderr, and exit code',
|
|
36
|
+
inputSchema,
|
|
37
|
+
annotations: { destructiveHint: true },
|
|
38
|
+
getAffectedResources({ command }) {
|
|
39
|
+
return [
|
|
40
|
+
{
|
|
41
|
+
toolGroup: 'shell',
|
|
42
|
+
resource: (0, build_shell_resource_1.buildShellResource)(command),
|
|
43
|
+
description: `Execute shell command: ${command}`,
|
|
44
|
+
},
|
|
45
|
+
];
|
|
46
|
+
},
|
|
47
|
+
async execute({ command, timeout = 30_000, cwd }, { dir }) {
|
|
48
|
+
return await runCommand(command, { timeout, dir, cwd: cwd ?? dir });
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
async function spawnCommand(command, { dir, cwd }) {
|
|
52
|
+
const isWindows = process.platform === 'win32';
|
|
53
|
+
const isMac = process.platform === 'darwin';
|
|
54
|
+
if (isWindows) {
|
|
55
|
+
return (0, child_process_1.spawn)('cmd.exe', ['/C', command], { cwd });
|
|
56
|
+
}
|
|
57
|
+
if (isMac) {
|
|
58
|
+
await initializeSandbox({ dir });
|
|
59
|
+
const sandboxedCommand = await sandbox_runtime_1.SandboxManager.wrapWithSandbox(command);
|
|
60
|
+
return (0, child_process_1.spawn)(sandboxedCommand, { shell: true, cwd });
|
|
61
|
+
}
|
|
62
|
+
return (0, child_process_1.spawn)('sh', ['-c', command], { cwd });
|
|
63
|
+
}
|
|
64
|
+
async function runCommand(command, { timeout, cwd, dir }) {
|
|
65
|
+
return await new Promise((resolve, reject) => {
|
|
66
|
+
spawnCommand(command, { dir, cwd })
|
|
67
|
+
.then((child) => {
|
|
68
|
+
let stdout = '';
|
|
69
|
+
let stderr = '';
|
|
70
|
+
child.stdout?.on('data', (chunk) => {
|
|
71
|
+
stdout += String(chunk);
|
|
72
|
+
});
|
|
73
|
+
child.stderr?.on('data', (chunk) => {
|
|
74
|
+
stderr += String(chunk);
|
|
75
|
+
});
|
|
76
|
+
const timer = setTimeout(() => {
|
|
77
|
+
child.kill();
|
|
78
|
+
resolve((0, utils_1.formatCallToolResult)({ stdout, stderr, exitCode: null, timedOut: true }));
|
|
79
|
+
}, timeout);
|
|
80
|
+
child.on('close', (code) => {
|
|
81
|
+
clearTimeout(timer);
|
|
82
|
+
resolve((0, utils_1.formatCallToolResult)({ stdout, stderr, exitCode: code }));
|
|
83
|
+
});
|
|
84
|
+
})
|
|
85
|
+
.catch(reject);
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=shell-execute.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell-execute.js","sourceRoot":"","sources":["../../../src/tools/shell/shell-execute.ts"],"names":[],"mappings":"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"}
|