@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.
@@ -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"}