@element47/ag 4.5.2 → 4.5.4
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 +91 -5
- package/dist/cli/__tests__/repl-rawmode.test.d.ts +2 -0
- package/dist/cli/__tests__/repl-rawmode.test.d.ts.map +1 -0
- package/dist/cli/__tests__/repl-rawmode.test.js +46 -0
- package/dist/cli/__tests__/repl-rawmode.test.js.map +1 -0
- package/dist/cli/repl.d.ts.map +1 -1
- package/dist/cli/repl.js +24 -4
- package/dist/cli/repl.js.map +1 -1
- package/dist/cli.js +5 -0
- package/dist/cli.js.map +1 -1
- package/dist/core/__tests__/agent.test.js +19 -19
- package/dist/core/__tests__/agent.test.js.map +1 -1
- package/dist/core/__tests__/context.test.js +45 -1
- package/dist/core/__tests__/context.test.js.map +1 -1
- package/dist/core/__tests__/events.test.d.ts +2 -0
- package/dist/core/__tests__/events.test.d.ts.map +1 -0
- package/dist/core/__tests__/events.test.js +131 -0
- package/dist/core/__tests__/events.test.js.map +1 -0
- package/dist/core/__tests__/extensions.test.d.ts +2 -0
- package/dist/core/__tests__/extensions.test.d.ts.map +1 -0
- package/dist/core/__tests__/extensions.test.js +59 -0
- package/dist/core/__tests__/extensions.test.js.map +1 -0
- package/dist/core/__tests__/guardrails.test.js +18 -0
- package/dist/core/__tests__/guardrails.test.js.map +1 -1
- package/dist/core/agent.d.ts +18 -0
- package/dist/core/agent.d.ts.map +1 -1
- package/dist/core/agent.js +217 -110
- package/dist/core/agent.js.map +1 -1
- package/dist/core/context.d.ts.map +1 -1
- package/dist/core/context.js +14 -6
- package/dist/core/context.js.map +1 -1
- package/dist/core/events.d.ts +62 -0
- package/dist/core/events.d.ts.map +1 -0
- package/dist/core/events.js +23 -0
- package/dist/core/events.js.map +1 -0
- package/dist/core/extensions.d.ts +10 -0
- package/dist/core/extensions.d.ts.map +1 -0
- package/dist/core/extensions.js +66 -0
- package/dist/core/extensions.js.map +1 -0
- package/dist/core/permissions.js +1 -1
- package/dist/core/permissions.js.map +1 -1
- package/dist/memory/memory.js +1 -1
- package/dist/memory/memory.js.map +1 -1
- package/dist/tools/__tests__/bash.test.js +64 -2
- package/dist/tools/__tests__/bash.test.js.map +1 -1
- package/dist/tools/__tests__/file.test.js +7 -1
- package/dist/tools/__tests__/file.test.js.map +1 -1
- package/dist/tools/bash.d.ts +2 -0
- package/dist/tools/bash.d.ts.map +1 -1
- package/dist/tools/bash.js +175 -43
- package/dist/tools/bash.js.map +1 -1
- package/package.json +1 -4
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { bashToolFactory } from '../bash.js';
|
|
1
|
+
import { describe, it, expect, afterAll } from 'vitest';
|
|
2
|
+
import { bashToolFactory, cleanupBackgroundProcesses } from '../bash.js';
|
|
3
3
|
const cwd = process.cwd();
|
|
4
4
|
const bash = bashToolFactory(cwd);
|
|
5
|
+
afterAll(() => cleanupBackgroundProcesses());
|
|
5
6
|
describe('bash tool - dangerous command blocking', () => {
|
|
6
7
|
const blocked = [
|
|
7
8
|
['find ~ -name "*.js"', 'find on home'],
|
|
@@ -19,6 +20,10 @@ describe('bash tool - dangerous command blocking', () => {
|
|
|
19
20
|
['chown -R root /', 'recursive chown root'],
|
|
20
21
|
['sudo rm important.txt', 'sudo rm'],
|
|
21
22
|
['> /dev/sda', 'redirect to block device'],
|
|
23
|
+
['\\rm -rf /', 'backslash-escaped rm'],
|
|
24
|
+
['rm\t-rf\t/', 'tab-separated rm'],
|
|
25
|
+
['rm -rf /', 'double-spaced rm'],
|
|
26
|
+
['find\t~ -name x', 'tab-separated find on home'],
|
|
22
27
|
];
|
|
23
28
|
for (const [cmd, label] of blocked) {
|
|
24
29
|
it(`blocks: ${label}`, async () => {
|
|
@@ -55,4 +60,61 @@ describe('bash tool - execution', () => {
|
|
|
55
60
|
expect(result).toMatch(/EXIT/);
|
|
56
61
|
});
|
|
57
62
|
});
|
|
63
|
+
describe('bash tool - background processes', () => {
|
|
64
|
+
it('starts a background process and returns PID', async () => {
|
|
65
|
+
const result = await bash.execute({ command: 'sleep 10', background: true });
|
|
66
|
+
expect(result).toContain('Background process started');
|
|
67
|
+
expect(result).toContain('PID');
|
|
68
|
+
expect(result).toContain('action="output"');
|
|
69
|
+
expect(result).toContain('action="kill"');
|
|
70
|
+
}, 5000);
|
|
71
|
+
it('captures initial output from background process', async () => {
|
|
72
|
+
const result = await bash.execute({ command: 'echo bg-hello && sleep 10', background: true });
|
|
73
|
+
expect(result).toContain('bg-hello');
|
|
74
|
+
expect(result).toContain('PID');
|
|
75
|
+
}, 5000);
|
|
76
|
+
it('reads output from running background process', async () => {
|
|
77
|
+
const startResult = await bash.execute({ command: 'for i in 1 2 3; do echo "line-$i"; sleep 0.5; done && sleep 10', background: true });
|
|
78
|
+
const pidMatch = startResult.match(/PID (\d+)/);
|
|
79
|
+
expect(pidMatch).toBeTruthy();
|
|
80
|
+
const pid = Number(pidMatch[1]);
|
|
81
|
+
// Wait for some output to accumulate
|
|
82
|
+
await new Promise(r => setTimeout(r, 2500));
|
|
83
|
+
const output = await bash.execute({ action: 'output', pid });
|
|
84
|
+
expect(output).toContain(`PID ${pid}`);
|
|
85
|
+
// Should have some of the numbered lines
|
|
86
|
+
expect(output).toMatch(/line-/);
|
|
87
|
+
// Kill it
|
|
88
|
+
await bash.execute({ action: 'kill', pid });
|
|
89
|
+
}, 10000);
|
|
90
|
+
it('kills a background process', async () => {
|
|
91
|
+
const startResult = await bash.execute({ command: 'sleep 60', background: true });
|
|
92
|
+
const pidMatch = startResult.match(/PID (\d+)/);
|
|
93
|
+
const pid = Number(pidMatch[1]);
|
|
94
|
+
const killResult = await bash.execute({ action: 'kill', pid });
|
|
95
|
+
expect(killResult).toContain('killed');
|
|
96
|
+
expect(killResult).toContain(`PID ${pid}`);
|
|
97
|
+
// Subsequent output check should fail
|
|
98
|
+
const afterKill = await bash.execute({ action: 'output', pid });
|
|
99
|
+
expect(afterKill).toContain('Error: no background process');
|
|
100
|
+
}, 5000);
|
|
101
|
+
it('returns error for invalid PID', async () => {
|
|
102
|
+
const result = await bash.execute({ action: 'output', pid: 999999 });
|
|
103
|
+
expect(result).toContain('Error: no background process');
|
|
104
|
+
});
|
|
105
|
+
it('returns error when action given without pid', async () => {
|
|
106
|
+
const result = await bash.execute({ action: 'output' });
|
|
107
|
+
expect(result).toContain('Error: action requires a pid');
|
|
108
|
+
});
|
|
109
|
+
it('returns error when no command given', async () => {
|
|
110
|
+
const result = await bash.execute({});
|
|
111
|
+
expect(result).toContain('Error: command is required');
|
|
112
|
+
});
|
|
113
|
+
it('detects early exit from background process', async () => {
|
|
114
|
+
const result = await bash.execute({ command: 'echo done-fast', background: true });
|
|
115
|
+
expect(result).toContain('done-fast');
|
|
116
|
+
// Process should have exited already
|
|
117
|
+
expect(result).toContain('exited');
|
|
118
|
+
}, 5000);
|
|
119
|
+
});
|
|
58
120
|
//# sourceMappingURL=bash.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bash.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/bash.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"bash.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/bash.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
2
2
|
import { fileTool } from '../file.js';
|
|
3
|
-
import { resolve, join } from 'node:path';
|
|
3
|
+
import { resolve, join, basename } from 'node:path';
|
|
4
4
|
import { mkdirSync, writeFileSync, readFileSync, rmSync, existsSync } from 'node:fs';
|
|
5
5
|
import { randomBytes } from 'node:crypto';
|
|
6
6
|
const cwd = resolve(process.cwd());
|
|
@@ -31,6 +31,12 @@ describe('file tool - path boundary validation', () => {
|
|
|
31
31
|
expect(result).not.toMatch(/outside the project directory/);
|
|
32
32
|
expect(result).toContain('package.json');
|
|
33
33
|
});
|
|
34
|
+
it('blocks path where cwd is a prefix of a different directory name', async () => {
|
|
35
|
+
// If cwd is /path/to/simple-agent, then /path/to/simple-agent-evil should be blocked
|
|
36
|
+
const cwdName = basename(cwd);
|
|
37
|
+
const result = await file.execute({ action: 'read', path: `../${cwdName}-evil/etc/passwd` });
|
|
38
|
+
expect(result).toMatch(/outside the project directory/);
|
|
39
|
+
});
|
|
34
40
|
it('returns error for nonexistent files', async () => {
|
|
35
41
|
const result = await file.execute({ action: 'read', path: 'nonexistent-file.xyz' });
|
|
36
42
|
expect(result).toMatch(/file not found/);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/file.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"file.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/file.test.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/bash.d.ts
CHANGED
|
@@ -2,5 +2,7 @@
|
|
|
2
2
|
* Bash tool - the universal interface for system operations
|
|
3
3
|
*/
|
|
4
4
|
import { Tool } from '../core/types.js';
|
|
5
|
+
/** Kill all background processes. Called on REPL exit. */
|
|
6
|
+
export declare function cleanupBackgroundProcesses(): void;
|
|
5
7
|
export declare function bashToolFactory(cwd: string): Tool;
|
|
6
8
|
//# sourceMappingURL=bash.d.ts.map
|
package/dist/tools/bash.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bash.d.ts","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"bash.d.ts","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AA6HxC,0DAA0D;AAC1D,wBAAgB,0BAA0B,IAAI,IAAI,CAQjD;AA+CD,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CA6CjD"}
|
package/dist/tools/bash.js
CHANGED
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { spawn } from 'node:child_process';
|
|
5
5
|
const MAX_BUFFER = 1024 * 1024; // 1 MB
|
|
6
|
+
const BG_MAX_OUTPUT = 100 * 1024; // 100 KB rolling buffer for background processes
|
|
7
|
+
const BG_INITIAL_WAIT = 2000; // ms to wait for initial output from background process
|
|
6
8
|
const DANGEROUS_PATTERNS = [
|
|
7
9
|
{ pattern: /\bfind\s+[~\/](?![\w.])/, message: 'Blocked: `find` on home/root directory. Use the grep tool (action=find) to search for files, or scope to a specific subdirectory.' },
|
|
8
10
|
{ pattern: /\brm\s+(-[a-zA-Z]*r[a-zA-Z]*)?\s*-[a-zA-Z]*f[a-zA-Z]*\s+[~\/]/, message: 'Blocked: destructive `rm` targeting home or root directory.' },
|
|
@@ -23,66 +25,196 @@ function checkCommand(command) {
|
|
|
23
25
|
}
|
|
24
26
|
return null;
|
|
25
27
|
}
|
|
28
|
+
const backgrounds = new Map();
|
|
29
|
+
function appendOutput(bg, data) {
|
|
30
|
+
bg.output += data;
|
|
31
|
+
if (bg.output.length > BG_MAX_OUTPUT) {
|
|
32
|
+
bg.output = bg.output.slice(-BG_MAX_OUTPUT);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
function startBackground(command, cwd) {
|
|
36
|
+
return new Promise((resolve) => {
|
|
37
|
+
const child = spawn('sh', ['-c', command], {
|
|
38
|
+
cwd,
|
|
39
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
40
|
+
detached: true,
|
|
41
|
+
});
|
|
42
|
+
const pid = child.pid;
|
|
43
|
+
if (!pid) {
|
|
44
|
+
resolve('Error: failed to start background process');
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const bg = {
|
|
48
|
+
child,
|
|
49
|
+
command,
|
|
50
|
+
output: '',
|
|
51
|
+
startedAt: Date.now(),
|
|
52
|
+
exited: false,
|
|
53
|
+
exitCode: null,
|
|
54
|
+
};
|
|
55
|
+
backgrounds.set(pid, bg);
|
|
56
|
+
child.stdout?.on('data', (chunk) => appendOutput(bg, chunk.toString()));
|
|
57
|
+
child.stderr?.on('data', (chunk) => appendOutput(bg, chunk.toString()));
|
|
58
|
+
child.on('close', (code) => {
|
|
59
|
+
bg.exited = true;
|
|
60
|
+
bg.exitCode = code;
|
|
61
|
+
});
|
|
62
|
+
child.on('error', (err) => {
|
|
63
|
+
bg.exited = true;
|
|
64
|
+
bg.exitCode = 1;
|
|
65
|
+
appendOutput(bg, `Process error: ${err.message}\n`);
|
|
66
|
+
});
|
|
67
|
+
// Wait briefly for initial output, then return
|
|
68
|
+
setTimeout(() => {
|
|
69
|
+
const initial = bg.output;
|
|
70
|
+
bg.output = ''; // clear so next read gets new output
|
|
71
|
+
const status = bg.exited
|
|
72
|
+
? `Process exited immediately with code ${bg.exitCode}`
|
|
73
|
+
: `Background process started (PID ${pid})`;
|
|
74
|
+
const lines = [
|
|
75
|
+
status,
|
|
76
|
+
`Command: ${command}`,
|
|
77
|
+
];
|
|
78
|
+
if (initial)
|
|
79
|
+
lines.push(`Initial output:\n${initial.trim()}`);
|
|
80
|
+
if (!bg.exited) {
|
|
81
|
+
lines.push(`Use bash(action="output", pid=${pid}) to check output`);
|
|
82
|
+
lines.push(`Use bash(action="kill", pid=${pid}) to stop it`);
|
|
83
|
+
}
|
|
84
|
+
resolve(lines.join('\n'));
|
|
85
|
+
}, BG_INITIAL_WAIT);
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
function getOutput(pid) {
|
|
89
|
+
const bg = backgrounds.get(pid);
|
|
90
|
+
if (!bg)
|
|
91
|
+
return `Error: no background process with PID ${pid}`;
|
|
92
|
+
const output = bg.output || '(no new output)';
|
|
93
|
+
bg.output = ''; // clear buffer
|
|
94
|
+
const status = bg.exited ? `[exited with code ${bg.exitCode}]` : '[running]';
|
|
95
|
+
return `PID ${pid} ${status} — ${bg.command}\n${output.trim()}`;
|
|
96
|
+
}
|
|
97
|
+
function killProcess(pid) {
|
|
98
|
+
const bg = backgrounds.get(pid);
|
|
99
|
+
if (!bg)
|
|
100
|
+
return `Error: no background process with PID ${pid}`;
|
|
101
|
+
if (!bg.exited) {
|
|
102
|
+
try {
|
|
103
|
+
process.kill(-pid, 'SIGTERM');
|
|
104
|
+
}
|
|
105
|
+
catch { /* already dead */ }
|
|
106
|
+
try {
|
|
107
|
+
bg.child.kill('SIGTERM');
|
|
108
|
+
}
|
|
109
|
+
catch { /* already dead */ }
|
|
110
|
+
}
|
|
111
|
+
const output = bg.output || '(no output)';
|
|
112
|
+
backgrounds.delete(pid);
|
|
113
|
+
return `PID ${pid} killed — ${bg.command}\nFinal output:\n${output.trim()}`;
|
|
114
|
+
}
|
|
115
|
+
/** Kill all background processes. Called on REPL exit. */
|
|
116
|
+
export function cleanupBackgroundProcesses() {
|
|
117
|
+
for (const [pid, bg] of backgrounds) {
|
|
118
|
+
if (!bg.exited) {
|
|
119
|
+
try {
|
|
120
|
+
process.kill(-pid, 'SIGTERM');
|
|
121
|
+
}
|
|
122
|
+
catch { /* ignore */ }
|
|
123
|
+
try {
|
|
124
|
+
bg.child.kill('SIGTERM');
|
|
125
|
+
}
|
|
126
|
+
catch { /* ignore */ }
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
backgrounds.clear();
|
|
130
|
+
}
|
|
131
|
+
function runForeground(command, cwd) {
|
|
132
|
+
return new Promise((resolve) => {
|
|
133
|
+
const child = spawn('sh', ['-c', command], {
|
|
134
|
+
cwd,
|
|
135
|
+
timeout: 60_000,
|
|
136
|
+
stdio: ['pipe', 'pipe', 'pipe']
|
|
137
|
+
});
|
|
138
|
+
let stdout = '';
|
|
139
|
+
let stderr = '';
|
|
140
|
+
let stdoutOverflow = false;
|
|
141
|
+
child.stdout.on('data', (chunk) => {
|
|
142
|
+
if (stdout.length < MAX_BUFFER) {
|
|
143
|
+
stdout += chunk.toString();
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
stdoutOverflow = true;
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
child.stderr.on('data', (chunk) => {
|
|
150
|
+
if (stderr.length < MAX_BUFFER) {
|
|
151
|
+
stderr += chunk.toString();
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
child.on('close', (code) => {
|
|
155
|
+
let result = stdout.trim();
|
|
156
|
+
if (stdoutOverflow) {
|
|
157
|
+
result += '\n... (output truncated at 1MB)';
|
|
158
|
+
}
|
|
159
|
+
if (code === 0) {
|
|
160
|
+
resolve(result);
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
const status = code ?? 1;
|
|
164
|
+
resolve(`EXIT ${status}\n${(stdout + stderr).trim()}`);
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
child.on('error', (err) => {
|
|
168
|
+
resolve(`EXIT 1\n${err.message}`);
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
}
|
|
26
172
|
export function bashToolFactory(cwd) {
|
|
27
173
|
return {
|
|
28
174
|
type: 'function',
|
|
29
175
|
function: {
|
|
30
176
|
name: 'bash',
|
|
31
|
-
description: 'Run a shell command in the project directory. Use ONLY for: running tests, builds, installs, servers, and system operations. Do NOT use bash for: reading files (use file tool), editing files (use file tool), searching code (use grep tool), finding files (use grep tool), listing directories (use file tool), or git operations (use git tool). Dangerous commands like rm -rf, sudo rm, and pipe-to-shell are blocked.',
|
|
177
|
+
description: 'Run a shell command in the project directory. Use ONLY for: running tests, builds, installs, servers, and system operations. Do NOT use bash for: reading files (use file tool), editing files (use file tool), searching code (use grep tool), finding files (use grep tool), listing directories (use file tool), or git operations (use git tool). Dangerous commands like rm -rf, sudo rm, and pipe-to-shell are blocked. For long-running processes (dev servers, watchers), set background=true — returns PID immediately. Check output with action="output" pid=PID. Stop with action="kill" pid=PID.',
|
|
32
178
|
parameters: {
|
|
33
179
|
type: 'object',
|
|
34
180
|
properties: {
|
|
35
181
|
command: {
|
|
36
182
|
type: 'string',
|
|
37
183
|
description: 'The shell command to execute'
|
|
184
|
+
},
|
|
185
|
+
background: {
|
|
186
|
+
type: 'boolean',
|
|
187
|
+
description: 'Run in background. Returns PID immediately. Use for dev servers, watchers, long-running processes.'
|
|
188
|
+
},
|
|
189
|
+
action: {
|
|
190
|
+
type: 'string',
|
|
191
|
+
enum: ['output', 'kill'],
|
|
192
|
+
description: 'Action on a background process: "output" reads recent output, "kill" stops it'
|
|
193
|
+
},
|
|
194
|
+
pid: {
|
|
195
|
+
type: 'number',
|
|
196
|
+
description: 'PID of background process (required with action)'
|
|
38
197
|
}
|
|
39
198
|
},
|
|
40
|
-
required: [
|
|
199
|
+
required: []
|
|
41
200
|
}
|
|
42
201
|
},
|
|
43
|
-
execute: ({ command }) => {
|
|
202
|
+
execute: async ({ command, background, action, pid }) => {
|
|
203
|
+
// Background process management
|
|
204
|
+
if (action === 'output' && pid != null)
|
|
205
|
+
return getOutput(pid);
|
|
206
|
+
if (action === 'kill' && pid != null)
|
|
207
|
+
return killProcess(pid);
|
|
208
|
+
if (action && !pid)
|
|
209
|
+
return 'Error: action requires a pid';
|
|
210
|
+
if (!command)
|
|
211
|
+
return 'Error: command is required';
|
|
44
212
|
const blocked = checkCommand(command);
|
|
45
213
|
if (blocked)
|
|
46
|
-
return
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
timeout: 60_000,
|
|
51
|
-
stdio: ['pipe', 'pipe', 'pipe']
|
|
52
|
-
});
|
|
53
|
-
let stdout = '';
|
|
54
|
-
let stderr = '';
|
|
55
|
-
let stdoutOverflow = false;
|
|
56
|
-
child.stdout.on('data', (chunk) => {
|
|
57
|
-
if (stdout.length < MAX_BUFFER) {
|
|
58
|
-
stdout += chunk.toString();
|
|
59
|
-
}
|
|
60
|
-
else {
|
|
61
|
-
stdoutOverflow = true;
|
|
62
|
-
}
|
|
63
|
-
});
|
|
64
|
-
child.stderr.on('data', (chunk) => {
|
|
65
|
-
if (stderr.length < MAX_BUFFER) {
|
|
66
|
-
stderr += chunk.toString();
|
|
67
|
-
}
|
|
68
|
-
});
|
|
69
|
-
child.on('close', (code) => {
|
|
70
|
-
let result = stdout.trim();
|
|
71
|
-
if (stdoutOverflow) {
|
|
72
|
-
result += '\n... (output truncated at 1MB)';
|
|
73
|
-
}
|
|
74
|
-
if (code === 0) {
|
|
75
|
-
resolve(result);
|
|
76
|
-
}
|
|
77
|
-
else {
|
|
78
|
-
const status = code ?? 1;
|
|
79
|
-
resolve(`EXIT ${status}\n${(stdout + stderr).trim()}`);
|
|
80
|
-
}
|
|
81
|
-
});
|
|
82
|
-
child.on('error', (err) => {
|
|
83
|
-
resolve(`EXIT 1\n${err.message}`);
|
|
84
|
-
});
|
|
85
|
-
});
|
|
214
|
+
return blocked;
|
|
215
|
+
if (background)
|
|
216
|
+
return startBackground(command, cwd);
|
|
217
|
+
return runForeground(command, cwd);
|
|
86
218
|
}
|
|
87
219
|
};
|
|
88
220
|
}
|
package/dist/tools/bash.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bash.js","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"bash.js","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@element47/ag",
|
|
3
|
-
"version": "4.5.
|
|
3
|
+
"version": "4.5.4",
|
|
4
4
|
"description": "Persistent AI coding agent with memory - any model via OpenRouter",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -44,8 +44,5 @@
|
|
|
44
44
|
"prettier": "^3.8.2",
|
|
45
45
|
"typescript": "^6.0.0",
|
|
46
46
|
"vitest": "^4.1.4"
|
|
47
|
-
},
|
|
48
|
-
"dependencies": {
|
|
49
|
-
"@element47/ag": "^4.4.5"
|
|
50
47
|
}
|
|
51
48
|
}
|