@framers/agentos-ext-cli-executor 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +221 -0
- package/dist/index.d.ts +48 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +110 -0
- package/dist/index.js.map +1 -0
- package/dist/services/shellService.d.ts +47 -0
- package/dist/services/shellService.d.ts.map +1 -0
- package/dist/services/shellService.js +362 -0
- package/dist/services/shellService.js.map +1 -0
- package/dist/tools/execute.d.ts +44 -0
- package/dist/tools/execute.d.ts.map +1 -0
- package/dist/tools/execute.js +94 -0
- package/dist/tools/execute.js.map +1 -0
- package/dist/tools/fileRead.d.ts +45 -0
- package/dist/tools/fileRead.d.ts.map +1 -0
- package/dist/tools/fileRead.js +82 -0
- package/dist/tools/fileRead.js.map +1 -0
- package/dist/tools/fileWrite.d.ts +45 -0
- package/dist/tools/fileWrite.d.ts.map +1 -0
- package/dist/tools/fileWrite.js +85 -0
- package/dist/tools/fileWrite.js.map +1 -0
- package/dist/tools/listDir.d.ts +46 -0
- package/dist/tools/listDir.d.ts.map +1 -0
- package/dist/tools/listDir.js +89 -0
- package/dist/tools/listDir.js.map +1 -0
- package/dist/types.d.ts +183 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/manifest.json +91 -0
- package/package.json +59 -0
|
@@ -0,0 +1,362 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shell Service
|
|
3
|
+
* Manages command execution with security validation.
|
|
4
|
+
*
|
|
5
|
+
* @module @framers/agentos-ext-cli-executor
|
|
6
|
+
*/
|
|
7
|
+
import { exec } from 'child_process';
|
|
8
|
+
import { promisify } from 'util';
|
|
9
|
+
import * as fs from 'fs/promises';
|
|
10
|
+
import * as path from 'path';
|
|
11
|
+
const execPromise = promisify(exec);
|
|
12
|
+
/**
|
|
13
|
+
* Dangerous command patterns to block by default
|
|
14
|
+
*/
|
|
15
|
+
const DANGEROUS_PATTERNS = [
|
|
16
|
+
/rm\s+(-rf?|--recursive)\s+\/(?!\S)/i, // rm -rf / (root)
|
|
17
|
+
/rm\s+(-rf?|--recursive)\s+~(?!\S)/i, // rm -rf ~ (home)
|
|
18
|
+
/format\s+[a-z]:/i, // format C:
|
|
19
|
+
/del\s+\/s\s+\/q\s+[a-z]:\\/i, // del /s /q C:\
|
|
20
|
+
/mkfs\./i, // mkfs.*
|
|
21
|
+
/dd\s+.+of=\/dev\/sd/i, // dd to disk
|
|
22
|
+
/:\(\)\s*\{\s*:\|\:\s*&\s*\}\s*;:/, // Fork bomb
|
|
23
|
+
/>\s*\/dev\/sd[a-z]/i, // Write to disk device
|
|
24
|
+
/shutdown|reboot|poweroff/i, // System control
|
|
25
|
+
/passwd|chpasswd/i, // Password changes
|
|
26
|
+
/visudo|sudoers/i, // Sudo config
|
|
27
|
+
/chmod\s+777\s+\//i, // chmod 777 /
|
|
28
|
+
/chown\s+.+:\s*\//i, // chown root /
|
|
29
|
+
];
|
|
30
|
+
/**
|
|
31
|
+
* Shell service for executing commands
|
|
32
|
+
*/
|
|
33
|
+
export class ShellService {
|
|
34
|
+
config;
|
|
35
|
+
constructor(config = {}) {
|
|
36
|
+
this.config = {
|
|
37
|
+
defaultShell: 'auto',
|
|
38
|
+
timeout: 60000,
|
|
39
|
+
blockedCommands: [],
|
|
40
|
+
...config,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Detect the appropriate shell for the current platform
|
|
45
|
+
*/
|
|
46
|
+
detectShell() {
|
|
47
|
+
if (this.config.defaultShell && this.config.defaultShell !== 'auto') {
|
|
48
|
+
return this.config.defaultShell;
|
|
49
|
+
}
|
|
50
|
+
const platform = process.platform;
|
|
51
|
+
if (platform === 'win32') {
|
|
52
|
+
return 'powershell';
|
|
53
|
+
}
|
|
54
|
+
else if (platform === 'darwin') {
|
|
55
|
+
return 'zsh';
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
return 'bash';
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Check if a command is safe to execute
|
|
63
|
+
*/
|
|
64
|
+
checkSecurity(command) {
|
|
65
|
+
const warnings = [];
|
|
66
|
+
let riskLevel = 'safe';
|
|
67
|
+
// Check against blocked commands list
|
|
68
|
+
const blockedCommands = this.config.blockedCommands || [];
|
|
69
|
+
for (const blocked of blockedCommands) {
|
|
70
|
+
if (command.includes(blocked)) {
|
|
71
|
+
return {
|
|
72
|
+
allowed: false,
|
|
73
|
+
reason: `Command contains blocked pattern: ${blocked}`,
|
|
74
|
+
riskLevel: 'critical',
|
|
75
|
+
warnings: [],
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// Check against dangerous patterns
|
|
80
|
+
for (const pattern of DANGEROUS_PATTERNS) {
|
|
81
|
+
if (pattern.test(command)) {
|
|
82
|
+
return {
|
|
83
|
+
allowed: false,
|
|
84
|
+
reason: `Command matches dangerous pattern: ${pattern.source}`,
|
|
85
|
+
riskLevel: 'critical',
|
|
86
|
+
warnings: [],
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// Check allowed commands whitelist
|
|
91
|
+
if (this.config.allowedCommands && this.config.allowedCommands.length > 0) {
|
|
92
|
+
const baseCommand = command.split(/\s+/)[0];
|
|
93
|
+
if (!this.config.allowedCommands.includes(baseCommand)) {
|
|
94
|
+
return {
|
|
95
|
+
allowed: false,
|
|
96
|
+
reason: `Command not in allowed list: ${baseCommand}`,
|
|
97
|
+
riskLevel: 'medium',
|
|
98
|
+
warnings: [],
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// Risk assessment
|
|
103
|
+
if (/sudo|su\s/i.test(command)) {
|
|
104
|
+
warnings.push('Command uses elevated privileges');
|
|
105
|
+
riskLevel = 'high';
|
|
106
|
+
}
|
|
107
|
+
if (/curl.*\|.*sh|wget.*\|.*sh/i.test(command)) {
|
|
108
|
+
warnings.push('Piping downloaded content to shell');
|
|
109
|
+
riskLevel = 'high';
|
|
110
|
+
}
|
|
111
|
+
if (/eval|exec/i.test(command)) {
|
|
112
|
+
warnings.push('Command uses eval/exec');
|
|
113
|
+
riskLevel = 'medium';
|
|
114
|
+
}
|
|
115
|
+
if (/>|>>/.test(command)) {
|
|
116
|
+
warnings.push('Command redirects output to file');
|
|
117
|
+
if (riskLevel === 'safe')
|
|
118
|
+
riskLevel = 'low';
|
|
119
|
+
}
|
|
120
|
+
if (/rm\s|del\s|remove-item/i.test(command)) {
|
|
121
|
+
warnings.push('Command deletes files');
|
|
122
|
+
if (riskLevel === 'safe' || riskLevel === 'low')
|
|
123
|
+
riskLevel = 'medium';
|
|
124
|
+
}
|
|
125
|
+
return {
|
|
126
|
+
allowed: true,
|
|
127
|
+
riskLevel,
|
|
128
|
+
warnings,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Execute a shell command
|
|
133
|
+
*/
|
|
134
|
+
async execute(command, options) {
|
|
135
|
+
const startTime = Date.now();
|
|
136
|
+
const shell = this.detectShell();
|
|
137
|
+
const cwd = options?.cwd || this.config.workingDirectory || process.cwd();
|
|
138
|
+
const timeout = options?.timeout || this.config.timeout || 60000;
|
|
139
|
+
// Security check
|
|
140
|
+
const securityCheck = this.checkSecurity(command);
|
|
141
|
+
if (!securityCheck.allowed) {
|
|
142
|
+
return {
|
|
143
|
+
command,
|
|
144
|
+
exitCode: 1,
|
|
145
|
+
stdout: '',
|
|
146
|
+
stderr: `Security violation: ${securityCheck.reason}`,
|
|
147
|
+
duration: 0,
|
|
148
|
+
success: false,
|
|
149
|
+
cwd,
|
|
150
|
+
shell,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
try {
|
|
154
|
+
const env = { ...process.env, ...this.config.env, ...options?.env };
|
|
155
|
+
const { stdout, stderr } = await execPromise(command, {
|
|
156
|
+
cwd,
|
|
157
|
+
env,
|
|
158
|
+
timeout,
|
|
159
|
+
shell: shell === 'powershell' ? 'powershell.exe' : shell,
|
|
160
|
+
maxBuffer: 10 * 1024 * 1024, // 10MB
|
|
161
|
+
});
|
|
162
|
+
return {
|
|
163
|
+
command,
|
|
164
|
+
exitCode: 0,
|
|
165
|
+
stdout: stdout.toString(),
|
|
166
|
+
stderr: stderr.toString(),
|
|
167
|
+
duration: Date.now() - startTime,
|
|
168
|
+
success: true,
|
|
169
|
+
cwd,
|
|
170
|
+
shell,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
catch (error) {
|
|
174
|
+
return {
|
|
175
|
+
command,
|
|
176
|
+
exitCode: error.code || 1,
|
|
177
|
+
stdout: error.stdout?.toString() || '',
|
|
178
|
+
stderr: error.stderr?.toString() || error.message,
|
|
179
|
+
duration: Date.now() - startTime,
|
|
180
|
+
success: false,
|
|
181
|
+
cwd,
|
|
182
|
+
shell,
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Run a script file
|
|
188
|
+
*/
|
|
189
|
+
async runScript(scriptPath, options) {
|
|
190
|
+
const startTime = Date.now();
|
|
191
|
+
const cwd = options?.cwd || this.config.workingDirectory || process.cwd();
|
|
192
|
+
const timeout = options?.timeout || this.config.timeout || 60000;
|
|
193
|
+
// Detect interpreter from file extension if not specified
|
|
194
|
+
let interpreter = options?.interpreter;
|
|
195
|
+
if (!interpreter) {
|
|
196
|
+
const ext = path.extname(scriptPath).toLowerCase();
|
|
197
|
+
interpreter = {
|
|
198
|
+
'.py': 'python',
|
|
199
|
+
'.js': 'node',
|
|
200
|
+
'.ts': 'npx ts-node',
|
|
201
|
+
'.sh': 'bash',
|
|
202
|
+
'.bash': 'bash',
|
|
203
|
+
'.ps1': 'powershell',
|
|
204
|
+
'.rb': 'ruby',
|
|
205
|
+
'.pl': 'perl',
|
|
206
|
+
}[ext] || 'bash';
|
|
207
|
+
}
|
|
208
|
+
const args = options?.args || [];
|
|
209
|
+
const command = `${interpreter} "${scriptPath}" ${args.join(' ')}`;
|
|
210
|
+
const result = await this.execute(command, { cwd, env: options?.env, timeout });
|
|
211
|
+
return {
|
|
212
|
+
...result,
|
|
213
|
+
scriptPath,
|
|
214
|
+
interpreter,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Read a file
|
|
219
|
+
*/
|
|
220
|
+
async readFile(filePath, options) {
|
|
221
|
+
const encoding = options?.encoding || 'utf-8';
|
|
222
|
+
const absolutePath = path.isAbsolute(filePath)
|
|
223
|
+
? filePath
|
|
224
|
+
: path.resolve(this.config.workingDirectory || process.cwd(), filePath);
|
|
225
|
+
const stats = await fs.stat(absolutePath);
|
|
226
|
+
let content;
|
|
227
|
+
let truncated = false;
|
|
228
|
+
if (options?.lines) {
|
|
229
|
+
// Read specific number of lines
|
|
230
|
+
const fileContent = await fs.readFile(absolutePath, encoding);
|
|
231
|
+
const lines = fileContent.split('\n');
|
|
232
|
+
if (options.fromEnd) {
|
|
233
|
+
content = lines.slice(-options.lines).join('\n');
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
content = lines.slice(0, options.lines).join('\n');
|
|
237
|
+
}
|
|
238
|
+
truncated = lines.length > options.lines;
|
|
239
|
+
}
|
|
240
|
+
else if (options?.maxBytes) {
|
|
241
|
+
// Read limited bytes
|
|
242
|
+
const handle = await fs.open(absolutePath, 'r');
|
|
243
|
+
const buffer = Buffer.alloc(options.maxBytes);
|
|
244
|
+
const { bytesRead } = await handle.read(buffer, 0, options.maxBytes, options?.start || 0);
|
|
245
|
+
await handle.close();
|
|
246
|
+
content = buffer.slice(0, bytesRead).toString(encoding);
|
|
247
|
+
truncated = stats.size > options.maxBytes;
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
// Read entire file
|
|
251
|
+
content = await fs.readFile(absolutePath, encoding);
|
|
252
|
+
}
|
|
253
|
+
return {
|
|
254
|
+
path: absolutePath,
|
|
255
|
+
content,
|
|
256
|
+
size: stats.size,
|
|
257
|
+
truncated,
|
|
258
|
+
encoding,
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Write to a file
|
|
263
|
+
*/
|
|
264
|
+
async writeFile(filePath, content, options) {
|
|
265
|
+
const encoding = options?.encoding || 'utf-8';
|
|
266
|
+
const absolutePath = path.isAbsolute(filePath)
|
|
267
|
+
? filePath
|
|
268
|
+
: path.resolve(this.config.workingDirectory || process.cwd(), filePath);
|
|
269
|
+
// Check if file exists
|
|
270
|
+
let fileExists = true;
|
|
271
|
+
try {
|
|
272
|
+
await fs.access(absolutePath);
|
|
273
|
+
}
|
|
274
|
+
catch {
|
|
275
|
+
fileExists = false;
|
|
276
|
+
}
|
|
277
|
+
// Create parent directories if needed
|
|
278
|
+
if (options?.createDirs) {
|
|
279
|
+
await fs.mkdir(path.dirname(absolutePath), { recursive: true });
|
|
280
|
+
}
|
|
281
|
+
// Write file
|
|
282
|
+
if (options?.append) {
|
|
283
|
+
await fs.appendFile(absolutePath, content, { encoding, mode: options?.mode });
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
await fs.writeFile(absolutePath, content, { encoding, mode: options?.mode });
|
|
287
|
+
}
|
|
288
|
+
return {
|
|
289
|
+
path: absolutePath,
|
|
290
|
+
bytesWritten: Buffer.byteLength(content, encoding),
|
|
291
|
+
created: !fileExists,
|
|
292
|
+
appended: options?.append || false,
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* List directory contents
|
|
297
|
+
*/
|
|
298
|
+
async listDirectory(dirPath, options) {
|
|
299
|
+
const absolutePath = path.isAbsolute(dirPath)
|
|
300
|
+
? dirPath
|
|
301
|
+
: path.resolve(this.config.workingDirectory || process.cwd(), dirPath);
|
|
302
|
+
const entries = [];
|
|
303
|
+
const readDir = async (dir, depth) => {
|
|
304
|
+
const items = await fs.readdir(dir, { withFileTypes: true });
|
|
305
|
+
for (const item of items) {
|
|
306
|
+
// Skip hidden files unless requested
|
|
307
|
+
if (!options?.showHidden && item.name.startsWith('.')) {
|
|
308
|
+
continue;
|
|
309
|
+
}
|
|
310
|
+
// Apply pattern filter
|
|
311
|
+
if (options?.pattern) {
|
|
312
|
+
const regex = new RegExp(options.pattern.replace(/\*/g, '.*').replace(/\?/g, '.'));
|
|
313
|
+
if (!regex.test(item.name)) {
|
|
314
|
+
continue;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
const itemPath = path.join(dir, item.name);
|
|
318
|
+
const entry = {
|
|
319
|
+
name: item.name,
|
|
320
|
+
path: itemPath,
|
|
321
|
+
type: item.isDirectory()
|
|
322
|
+
? 'directory'
|
|
323
|
+
: item.isSymbolicLink()
|
|
324
|
+
? 'symlink'
|
|
325
|
+
: item.isFile()
|
|
326
|
+
? 'file'
|
|
327
|
+
: 'other',
|
|
328
|
+
};
|
|
329
|
+
if (item.isFile()) {
|
|
330
|
+
entry.extension = path.extname(item.name);
|
|
331
|
+
}
|
|
332
|
+
// Include stats if requested
|
|
333
|
+
if (options?.includeStats) {
|
|
334
|
+
try {
|
|
335
|
+
const stats = await fs.stat(itemPath);
|
|
336
|
+
entry.size = stats.size;
|
|
337
|
+
entry.modifiedAt = stats.mtime.toISOString();
|
|
338
|
+
entry.createdAt = stats.birthtime.toISOString();
|
|
339
|
+
}
|
|
340
|
+
catch {
|
|
341
|
+
// Ignore stat errors
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
entries.push(entry);
|
|
345
|
+
// Recursive listing
|
|
346
|
+
if (options?.recursive &&
|
|
347
|
+
item.isDirectory() &&
|
|
348
|
+
depth < (options?.maxDepth || 10)) {
|
|
349
|
+
await readDir(itemPath, depth + 1);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
};
|
|
353
|
+
await readDir(absolutePath, 0);
|
|
354
|
+
return {
|
|
355
|
+
path: absolutePath,
|
|
356
|
+
entries,
|
|
357
|
+
count: entries.length,
|
|
358
|
+
recursive: options?.recursive || false,
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
//# sourceMappingURL=shellService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shellService.js","sourceRoot":"","sources":["../../src/services/shellService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Execute Tool
|
|
3
|
+
* Execute shell commands.
|
|
4
|
+
*
|
|
5
|
+
* @module @framers/agentos-ext-cli-executor
|
|
6
|
+
*/
|
|
7
|
+
import type { ITool } from '@framers/agentos';
|
|
8
|
+
import type { ShellService } from '../services/shellService';
|
|
9
|
+
import type { ExecutionResult } from '../types';
|
|
10
|
+
/**
|
|
11
|
+
* Tool for executing shell commands
|
|
12
|
+
*/
|
|
13
|
+
export declare class ExecuteTool implements ITool {
|
|
14
|
+
private shellService;
|
|
15
|
+
readonly id = "shellExecute";
|
|
16
|
+
readonly name = "Execute Shell Command";
|
|
17
|
+
readonly description = "Execute a shell command and return output";
|
|
18
|
+
constructor(shellService: ShellService);
|
|
19
|
+
/**
|
|
20
|
+
* Execute command
|
|
21
|
+
*/
|
|
22
|
+
execute(input: {
|
|
23
|
+
command: string;
|
|
24
|
+
cwd?: string;
|
|
25
|
+
env?: Record<string, string>;
|
|
26
|
+
timeout?: number;
|
|
27
|
+
}): Promise<{
|
|
28
|
+
success: boolean;
|
|
29
|
+
output?: ExecutionResult;
|
|
30
|
+
error?: string;
|
|
31
|
+
}>;
|
|
32
|
+
/**
|
|
33
|
+
* Validate input
|
|
34
|
+
*/
|
|
35
|
+
validate(input: any): {
|
|
36
|
+
valid: boolean;
|
|
37
|
+
errors: string[];
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Get JSON schema for tool
|
|
41
|
+
*/
|
|
42
|
+
getSchema(): any;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=execute.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../src/tools/execute.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD;;GAEG;AACH,qBAAa,WAAY,YAAW,KAAK;IAK3B,OAAO,CAAC,YAAY;IAJhC,SAAgB,EAAE,kBAAkB;IACpC,SAAgB,IAAI,2BAA2B;IAC/C,SAAgB,WAAW,+CAA+C;gBAEtD,YAAY,EAAE,YAAY;IAE9C;;OAEG;IACG,OAAO,CAAC,KAAK,EAAE;QACnB,OAAO,EAAE,MAAM,CAAC;QAChB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,eAAe,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IA2B3E;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,GAAG,GAAG;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE;IAkB1D;;OAEG;IACH,SAAS,IAAI,GAAG;CA0BjB"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Execute Tool
|
|
3
|
+
* Execute shell commands.
|
|
4
|
+
*
|
|
5
|
+
* @module @framers/agentos-ext-cli-executor
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Tool for executing shell commands
|
|
9
|
+
*/
|
|
10
|
+
export class ExecuteTool {
|
|
11
|
+
shellService;
|
|
12
|
+
id = 'shellExecute';
|
|
13
|
+
name = 'Execute Shell Command';
|
|
14
|
+
description = 'Execute a shell command and return output';
|
|
15
|
+
constructor(shellService) {
|
|
16
|
+
this.shellService = shellService;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Execute command
|
|
20
|
+
*/
|
|
21
|
+
async execute(input) {
|
|
22
|
+
try {
|
|
23
|
+
// Security check first
|
|
24
|
+
const securityCheck = this.shellService.checkSecurity(input.command);
|
|
25
|
+
if (!securityCheck.allowed) {
|
|
26
|
+
return {
|
|
27
|
+
success: false,
|
|
28
|
+
error: `Security violation: ${securityCheck.reason}`,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
const result = await this.shellService.execute(input.command, {
|
|
32
|
+
cwd: input.cwd,
|
|
33
|
+
env: input.env,
|
|
34
|
+
timeout: input.timeout,
|
|
35
|
+
});
|
|
36
|
+
return {
|
|
37
|
+
success: result.success,
|
|
38
|
+
output: result,
|
|
39
|
+
error: result.success ? undefined : result.stderr,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
return { success: false, error: error.message };
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Validate input
|
|
48
|
+
*/
|
|
49
|
+
validate(input) {
|
|
50
|
+
const errors = [];
|
|
51
|
+
if (!input.command) {
|
|
52
|
+
errors.push('Command is required');
|
|
53
|
+
}
|
|
54
|
+
else if (typeof input.command !== 'string') {
|
|
55
|
+
errors.push('Command must be a string');
|
|
56
|
+
}
|
|
57
|
+
if (input.timeout !== undefined) {
|
|
58
|
+
if (typeof input.timeout !== 'number' || input.timeout <= 0) {
|
|
59
|
+
errors.push('Timeout must be a positive number');
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return { valid: errors.length === 0, errors };
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Get JSON schema for tool
|
|
66
|
+
*/
|
|
67
|
+
getSchema() {
|
|
68
|
+
return {
|
|
69
|
+
type: 'object',
|
|
70
|
+
required: ['command'],
|
|
71
|
+
properties: {
|
|
72
|
+
command: {
|
|
73
|
+
type: 'string',
|
|
74
|
+
description: 'Shell command to execute',
|
|
75
|
+
},
|
|
76
|
+
cwd: {
|
|
77
|
+
type: 'string',
|
|
78
|
+
description: 'Working directory for command',
|
|
79
|
+
},
|
|
80
|
+
env: {
|
|
81
|
+
type: 'object',
|
|
82
|
+
additionalProperties: { type: 'string' },
|
|
83
|
+
description: 'Environment variables',
|
|
84
|
+
},
|
|
85
|
+
timeout: {
|
|
86
|
+
type: 'number',
|
|
87
|
+
description: 'Timeout in milliseconds',
|
|
88
|
+
default: 60000,
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=execute.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execute.js","sourceRoot":"","sources":["../../src/tools/execute.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH;;GAEG;AACH,MAAM,OAAO,WAAW;IAKF;IAJJ,EAAE,GAAG,cAAc,CAAC;IACpB,IAAI,GAAG,uBAAuB,CAAC;IAC/B,WAAW,GAAG,2CAA2C,CAAC;IAE1E,YAAoB,YAA0B;QAA1B,iBAAY,GAAZ,YAAY,CAAc;IAAG,CAAC;IAElD;;OAEG;IACH,KAAK,CAAC,OAAO,CAAC,KAKb;QACC,IAAI,CAAC;YACH,uBAAuB;YACvB,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACrE,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;gBAC3B,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,uBAAuB,aAAa,CAAC,MAAM,EAAE;iBACrD,CAAC;YACJ,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE;gBAC5D,GAAG,EAAE,KAAK,CAAC,GAAG;gBACd,GAAG,EAAE,KAAK,CAAC,GAAG;gBACd,OAAO,EAAE,KAAK,CAAC,OAAO;aACvB,CAAC,CAAC;YAEH,OAAO;gBACL,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,MAAM,EAAE,MAAM;gBACd,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM;aAClD,CAAC;QACJ,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;QAClD,CAAC;IACH,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,KAAU;QACjB,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YACnB,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QACrC,CAAC;aAAM,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YAC7C,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QAC1C,CAAC;QAED,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAChC,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,IAAI,CAAC,EAAE,CAAC;gBAC5D,MAAM,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;YACnD,CAAC;QACH,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IAChD,CAAC;IAED;;OAEG;IACH,SAAS;QACP,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,CAAC,SAAS,CAAC;YACrB,UAAU,EAAE;gBACV,OAAO,EAAE;oBACP,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,0BAA0B;iBACxC;gBACD,GAAG,EAAE;oBACH,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,+BAA+B;iBAC7C;gBACD,GAAG,EAAE;oBACH,IAAI,EAAE,QAAQ;oBACd,oBAAoB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACxC,WAAW,EAAE,uBAAuB;iBACrC;gBACD,OAAO,EAAE;oBACP,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,yBAAyB;oBACtC,OAAO,EAAE,KAAK;iBACf;aACF;SACF,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File Read Tool
|
|
3
|
+
* Read file contents.
|
|
4
|
+
*
|
|
5
|
+
* @module @framers/agentos-ext-cli-executor
|
|
6
|
+
*/
|
|
7
|
+
import type { ITool } from '@framers/agentos';
|
|
8
|
+
import type { ShellService } from '../services/shellService';
|
|
9
|
+
import type { FileReadResult } from '../types';
|
|
10
|
+
/**
|
|
11
|
+
* Tool for reading files
|
|
12
|
+
*/
|
|
13
|
+
export declare class FileReadTool implements ITool {
|
|
14
|
+
private shellService;
|
|
15
|
+
readonly id = "fileRead";
|
|
16
|
+
readonly name = "Read File";
|
|
17
|
+
readonly description = "Read contents of a file";
|
|
18
|
+
constructor(shellService: ShellService);
|
|
19
|
+
/**
|
|
20
|
+
* Read file
|
|
21
|
+
*/
|
|
22
|
+
execute(input: {
|
|
23
|
+
path: string;
|
|
24
|
+
encoding?: BufferEncoding;
|
|
25
|
+
maxBytes?: number;
|
|
26
|
+
lines?: number;
|
|
27
|
+
fromEnd?: boolean;
|
|
28
|
+
}): Promise<{
|
|
29
|
+
success: boolean;
|
|
30
|
+
output?: FileReadResult;
|
|
31
|
+
error?: string;
|
|
32
|
+
}>;
|
|
33
|
+
/**
|
|
34
|
+
* Validate input
|
|
35
|
+
*/
|
|
36
|
+
validate(input: any): {
|
|
37
|
+
valid: boolean;
|
|
38
|
+
errors: string[];
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Get JSON schema for tool
|
|
42
|
+
*/
|
|
43
|
+
getSchema(): any;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=fileRead.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fileRead.d.ts","sourceRoot":"","sources":["../../src/tools/fileRead.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/C;;GAEG;AACH,qBAAa,YAAa,YAAW,KAAK;IAK5B,OAAO,CAAC,YAAY;IAJhC,SAAgB,EAAE,cAAc;IAChC,SAAgB,IAAI,eAAe;IACnC,SAAgB,WAAW,6BAA6B;gBAEpC,YAAY,EAAE,YAAY;IAE9C;;OAEG;IACG,OAAO,CAAC,KAAK,EAAE;QACnB,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,CAAC,EAAE,cAAc,CAAC;QAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,cAAc,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAe1E;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,GAAG,GAAG;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE;IAY1D;;OAEG;IACH,SAAS,IAAI,GAAG;CA8BjB"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File Read Tool
|
|
3
|
+
* Read file contents.
|
|
4
|
+
*
|
|
5
|
+
* @module @framers/agentos-ext-cli-executor
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Tool for reading files
|
|
9
|
+
*/
|
|
10
|
+
export class FileReadTool {
|
|
11
|
+
shellService;
|
|
12
|
+
id = 'fileRead';
|
|
13
|
+
name = 'Read File';
|
|
14
|
+
description = 'Read contents of a file';
|
|
15
|
+
constructor(shellService) {
|
|
16
|
+
this.shellService = shellService;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Read file
|
|
20
|
+
*/
|
|
21
|
+
async execute(input) {
|
|
22
|
+
try {
|
|
23
|
+
const result = await this.shellService.readFile(input.path, {
|
|
24
|
+
encoding: input.encoding,
|
|
25
|
+
maxBytes: input.maxBytes,
|
|
26
|
+
lines: input.lines,
|
|
27
|
+
fromEnd: input.fromEnd,
|
|
28
|
+
});
|
|
29
|
+
return { success: true, output: result };
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
return { success: false, error: error.message };
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Validate input
|
|
37
|
+
*/
|
|
38
|
+
validate(input) {
|
|
39
|
+
const errors = [];
|
|
40
|
+
if (!input.path) {
|
|
41
|
+
errors.push('Path is required');
|
|
42
|
+
}
|
|
43
|
+
else if (typeof input.path !== 'string') {
|
|
44
|
+
errors.push('Path must be a string');
|
|
45
|
+
}
|
|
46
|
+
return { valid: errors.length === 0, errors };
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Get JSON schema for tool
|
|
50
|
+
*/
|
|
51
|
+
getSchema() {
|
|
52
|
+
return {
|
|
53
|
+
type: 'object',
|
|
54
|
+
required: ['path'],
|
|
55
|
+
properties: {
|
|
56
|
+
path: {
|
|
57
|
+
type: 'string',
|
|
58
|
+
description: 'File path to read',
|
|
59
|
+
},
|
|
60
|
+
encoding: {
|
|
61
|
+
type: 'string',
|
|
62
|
+
default: 'utf-8',
|
|
63
|
+
description: 'File encoding',
|
|
64
|
+
},
|
|
65
|
+
maxBytes: {
|
|
66
|
+
type: 'number',
|
|
67
|
+
description: 'Maximum bytes to read',
|
|
68
|
+
},
|
|
69
|
+
lines: {
|
|
70
|
+
type: 'number',
|
|
71
|
+
description: 'Number of lines to read',
|
|
72
|
+
},
|
|
73
|
+
fromEnd: {
|
|
74
|
+
type: 'boolean',
|
|
75
|
+
default: false,
|
|
76
|
+
description: 'Read lines from end of file',
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=fileRead.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fileRead.js","sourceRoot":"","sources":["../../src/tools/fileRead.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH;;GAEG;AACH,MAAM,OAAO,YAAY;IAKH;IAJJ,EAAE,GAAG,UAAU,CAAC;IAChB,IAAI,GAAG,WAAW,CAAC;IACnB,WAAW,GAAG,yBAAyB,CAAC;IAExD,YAAoB,YAA0B;QAA1B,iBAAY,GAAZ,YAAY,CAAc;IAAG,CAAC;IAElD;;OAEG;IACH,KAAK,CAAC,OAAO,CAAC,KAMb;QACC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE;gBAC1D,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,OAAO,EAAE,KAAK,CAAC,OAAO;aACvB,CAAC,CAAC;YAEH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAC3C,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;QAClD,CAAC;IACH,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,KAAU;QACjB,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YAChB,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAClC,CAAC;aAAM,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC1C,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACvC,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IAChD,CAAC;IAED;;OAEG;IACH,SAAS;QACP,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,CAAC,MAAM,CAAC;YAClB,UAAU,EAAE;gBACV,IAAI,EAAE;oBACJ,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,mBAAmB;iBACjC;gBACD,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,OAAO,EAAE,OAAO;oBAChB,WAAW,EAAE,eAAe;iBAC7B;gBACD,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,uBAAuB;iBACrC;gBACD,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,yBAAyB;iBACvC;gBACD,OAAO,EAAE;oBACP,IAAI,EAAE,SAAS;oBACf,OAAO,EAAE,KAAK;oBACd,WAAW,EAAE,6BAA6B;iBAC3C;aACF;SACF,CAAC;IACJ,CAAC;CACF"}
|