@element47/ag 4.5.3 → 4.5.5

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.
@@ -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: ['command']
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 Promise.resolve(blocked);
47
- return new Promise((resolve) => {
48
- const child = spawn('sh', ['-c', command], {
49
- cwd,
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
  }
@@ -1 +1 @@
1
- {"version":3,"file":"bash.js","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bash.js","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Task tool — structured task tracking for plans and sub-agents
3
+ */
4
+ import { Tool } from '../core/types.js';
5
+ export declare function taskTool(cwd: string): Tool;
6
+ //# sourceMappingURL=task.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task.d.ts","sourceRoot":"","sources":["../../src/tools/task.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAWxC,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CA+G1C"}
@@ -0,0 +1,128 @@
1
+ /**
2
+ * Task tool — structured task tracking for plans and sub-agents
3
+ */
4
+ import { loadTasks, saveTasks, getActivePlanName } from '../memory/memory.js';
5
+ const VALID_STATUSES = ['pending', 'in_progress', 'done'];
6
+ function formatTask(t) {
7
+ const plan = t.plan ? ` (plan: ${t.plan})` : '';
8
+ const desc = t.description ? `\n ${t.description}` : '';
9
+ return `${t.id}. [${t.status}] ${t.title}${plan} (created ${t.created.slice(0, 10)})${desc}`;
10
+ }
11
+ export function taskTool(cwd) {
12
+ return {
13
+ type: 'function',
14
+ function: {
15
+ name: 'task',
16
+ description: 'Manage tasks — the executable steps of a plan. Use to track progress on multi-step work. Tasks appear in context so you always know what\'s done and what remains.',
17
+ parameters: {
18
+ type: 'object',
19
+ properties: {
20
+ action: {
21
+ type: 'string',
22
+ enum: ['create', 'list', 'update', 'read', 'remove', 'clear'],
23
+ description: 'create: new task. list: show all. update: change status. read: task details. remove: delete. clear: remove all done tasks.'
24
+ },
25
+ title: {
26
+ type: 'string',
27
+ description: 'Task title (for create)'
28
+ },
29
+ id: {
30
+ type: 'number',
31
+ description: 'Task ID (for update, read, remove)'
32
+ },
33
+ description: {
34
+ type: 'string',
35
+ description: 'Detailed description of what needs to be done (for create). Gives sub-agents enough context to work independently.'
36
+ },
37
+ status: {
38
+ type: 'string',
39
+ enum: ['pending', 'in_progress', 'done'],
40
+ description: 'New status (for update)'
41
+ }
42
+ },
43
+ required: ['action']
44
+ }
45
+ },
46
+ execute: ({ action, title, description: desc, id, status }) => {
47
+ const tasks = loadTasks(cwd);
48
+ switch (action) {
49
+ case 'create': {
50
+ if (!title)
51
+ return 'Error: title is required for create';
52
+ const nextId = tasks.length > 0 ? Math.max(...tasks.map(t => t.id)) + 1 : 1;
53
+ const task = {
54
+ id: nextId,
55
+ title,
56
+ description: desc || undefined,
57
+ status: 'pending',
58
+ plan: getActivePlanName(cwd) || undefined,
59
+ created: new Date().toISOString(),
60
+ };
61
+ tasks.push(task);
62
+ saveTasks(tasks, cwd);
63
+ return `Task #${nextId} created: ${title}`;
64
+ }
65
+ case 'list': {
66
+ if (tasks.length === 0)
67
+ return 'No tasks.';
68
+ const pending = tasks.filter(t => t.status === 'pending');
69
+ const inProgress = tasks.filter(t => t.status === 'in_progress');
70
+ const done = tasks.filter(t => t.status === 'done');
71
+ const sections = [];
72
+ if (inProgress.length > 0)
73
+ sections.push('In Progress:\n' + inProgress.map(formatTask).join('\n'));
74
+ if (pending.length > 0)
75
+ sections.push('Pending:\n' + pending.map(formatTask).join('\n'));
76
+ if (done.length > 0)
77
+ sections.push('Done:\n' + done.map(formatTask).join('\n'));
78
+ return sections.join('\n\n');
79
+ }
80
+ case 'update': {
81
+ if (id == null)
82
+ return 'Error: id is required for update';
83
+ if (!status)
84
+ return 'Error: status is required for update';
85
+ if (!VALID_STATUSES.includes(status)) {
86
+ return `Error: invalid status "${status}". Use: ${VALID_STATUSES.join(', ')}`;
87
+ }
88
+ const task = tasks.find(t => t.id === id);
89
+ if (!task)
90
+ return `Error: task #${id} not found`;
91
+ task.status = status;
92
+ saveTasks(tasks, cwd);
93
+ return `Task #${id} updated: [${status}] ${task.title}`;
94
+ }
95
+ case 'read': {
96
+ if (id == null)
97
+ return 'Error: id is required for read';
98
+ const task = tasks.find(t => t.id === id);
99
+ if (!task)
100
+ return `Error: task #${id} not found`;
101
+ return formatTask(task);
102
+ }
103
+ case 'remove': {
104
+ if (id == null)
105
+ return 'Error: id is required for remove';
106
+ const idx = tasks.findIndex(t => t.id === id);
107
+ if (idx === -1)
108
+ return `Error: task #${id} not found`;
109
+ const removed = tasks.splice(idx, 1)[0];
110
+ saveTasks(tasks, cwd);
111
+ return `Task #${removed.id} removed: ${removed.title}`;
112
+ }
113
+ case 'clear': {
114
+ const before = tasks.length;
115
+ const remaining = tasks.filter(t => t.status !== 'done');
116
+ saveTasks(remaining, cwd);
117
+ const cleared = before - remaining.length;
118
+ return cleared > 0
119
+ ? `Cleared ${cleared} done task(s). ${remaining.length} remaining.`
120
+ : 'No done tasks to clear.';
121
+ }
122
+ default:
123
+ return `Error: unknown action "${action}". Use: create, list, update, read, remove, clear`;
124
+ }
125
+ }
126
+ };
127
+ }
128
+ //# sourceMappingURL=task.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task.js","sourceRoot":"","sources":["../../src/tools/task.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",
3
+ "version": "4.5.5",
4
4
  "description": "Persistent AI coding agent with memory - any model via OpenRouter",
5
5
  "type": "module",
6
6
  "bin": {