@nexagent-cli/cli 0.5.1 → 0.7.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.
Files changed (65) hide show
  1. package/README.md +5 -5
  2. package/dist/bin/amarax.d.ts +3 -0
  3. package/dist/bin/amarax.d.ts.map +1 -0
  4. package/dist/bin/amarax.js +7 -0
  5. package/dist/bin/amarax.js.map +1 -0
  6. package/dist/bin/sophie.d.ts +3 -0
  7. package/dist/bin/sophie.d.ts.map +1 -0
  8. package/dist/bin/sophie.js +7 -0
  9. package/dist/bin/sophie.js.map +1 -0
  10. package/dist/commands/amarax.d.ts +10 -0
  11. package/dist/commands/amarax.d.ts.map +1 -0
  12. package/dist/commands/amarax.js +143 -0
  13. package/dist/commands/amarax.js.map +1 -0
  14. package/dist/commands/doctor.d.ts.map +1 -1
  15. package/dist/commands/doctor.js +22 -1
  16. package/dist/commands/doctor.js.map +1 -1
  17. package/dist/commands/sophie.d.ts +11 -0
  18. package/dist/commands/sophie.d.ts.map +1 -0
  19. package/dist/commands/sophie.js +140 -0
  20. package/dist/commands/sophie.js.map +1 -0
  21. package/dist/db/audit-log.d.ts +23 -0
  22. package/dist/db/audit-log.d.ts.map +1 -0
  23. package/dist/db/audit-log.js +29 -0
  24. package/dist/db/audit-log.js.map +1 -0
  25. package/dist/index.d.ts +1 -1
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +175 -249
  28. package/dist/index.js.map +1 -1
  29. package/dist/profiles/aiko.d.ts +3 -0
  30. package/dist/profiles/aiko.d.ts.map +1 -0
  31. package/dist/profiles/aiko.js +25 -0
  32. package/dist/profiles/aiko.js.map +1 -0
  33. package/dist/profiles/amarax.d.ts +3 -0
  34. package/dist/profiles/amarax.d.ts.map +1 -0
  35. package/dist/profiles/amarax.js +31 -0
  36. package/dist/profiles/amarax.js.map +1 -0
  37. package/dist/profiles/nexagent.d.ts +3 -0
  38. package/dist/profiles/nexagent.d.ts.map +1 -0
  39. package/dist/profiles/nexagent.js +36 -0
  40. package/dist/profiles/nexagent.js.map +1 -0
  41. package/dist/profiles/registry.d.ts +13 -0
  42. package/dist/profiles/registry.d.ts.map +1 -0
  43. package/dist/profiles/registry.js +51 -0
  44. package/dist/profiles/registry.js.map +1 -0
  45. package/dist/profiles/sophie.d.ts +3 -0
  46. package/dist/profiles/sophie.d.ts.map +1 -0
  47. package/dist/profiles/sophie.js +31 -0
  48. package/dist/profiles/sophie.js.map +1 -0
  49. package/dist/profiles/types.d.ts +50 -0
  50. package/dist/profiles/types.d.ts.map +1 -0
  51. package/dist/profiles/types.js +5 -0
  52. package/dist/profiles/types.js.map +1 -0
  53. package/dist/runtime/dispatch.d.ts +24 -0
  54. package/dist/runtime/dispatch.d.ts.map +1 -0
  55. package/dist/runtime/dispatch.js +49 -0
  56. package/dist/runtime/dispatch.js.map +1 -0
  57. package/dist/safety/command-profile.d.ts +22 -0
  58. package/dist/safety/command-profile.d.ts.map +1 -0
  59. package/dist/safety/command-profile.js +138 -0
  60. package/dist/safety/command-profile.js.map +1 -0
  61. package/dist/tools/shell-exec.d.ts +2 -0
  62. package/dist/tools/shell-exec.d.ts.map +1 -1
  63. package/dist/tools/shell-exec.js +129 -45
  64. package/dist/tools/shell-exec.js.map +1 -1
  65. package/package.json +7 -5
@@ -1,26 +1,21 @@
1
1
  // ============================================================
2
2
  // Tool: shell_exec — Execute shell commands in the workspace
3
- // Windows-safe: auto-detects cmd/PowerShell/bash
3
+ // v0.6.0: Process tree termination, command profiles, audit logging
4
4
  // ============================================================
5
- import { spawn } from 'node:child_process';
5
+ import { spawn, exec } from 'node:child_process';
6
6
  import { resolve } from 'node:path';
7
+ import { promisify } from 'node:util';
7
8
  import { generateId, GLOBAL_SHELL_BLOCKLIST } from '@nexagent-cli/shared';
8
- /** Write an audit log entry for shell execution */
9
- function writeAuditLog(db, sessionId, action, details, status) {
10
- if (!db)
11
- return;
12
- try {
13
- const stmt = db.prepare('INSERT INTO audit_log (id, session_id, tool_name, action, details, status, created_at) VALUES (?, ?, ?, ?, ?, ?, ?)');
14
- stmt.run(generateId(), sessionId, 'shell_exec', action, JSON.stringify(details), status, Date.now());
15
- }
16
- catch {
17
- // Audit logging is best-effort; never fail the tool execution
18
- }
19
- }
9
+ import { writeAuditLog } from '../db/audit-log.js';
10
+ import { loadProjectPolicy, resolveProfile, checkCommand } from '../safety/command-profile.js';
11
+ const execAsync = promisify(exec);
12
+ const SIGKILL_DELAY_MS = 5_000;
13
+ const ABSOLUTE_MAX_TIMEOUT = 120_000;
14
+ const ABSOLUTE_MAX_OUTPUT = 50_000;
20
15
  export class ShellExecTool {
21
16
  name = 'shell_exec';
22
- version = '1.0.0';
23
- description = 'Execute a shell command in the workspace directory. Output is captured and returned. Long-running commands time out after timeout_ms. Dangerous commands are blocked by safety checks.';
17
+ version = '1.1.0';
18
+ description = 'Execute a shell command in the workspace directory. Output is captured and returned. Long-running commands time out after timeout_ms. Dangerous commands are blocked by safety checks. Command profiles restrict which commands are allowed per project.';
24
19
  enabled = true;
25
20
  cacheable = false;
26
21
  riskLevel = 'high';
@@ -48,57 +43,107 @@ export class ShellExecTool {
48
43
  required: ['command'],
49
44
  };
50
45
  async execute(args, ctx) {
51
- const { command, cwd: relCwd = '.', timeout_ms: timeout = 30_000, env: extraEnv = {}, } = args;
52
- // Blocklist check (belt-and-suspenders on top of safety gate)
46
+ const { command, cwd: relCwd = '.', timeout_ms: userTimeout = 30_000, env: extraEnv = {}, } = args;
47
+ const executionId = generateId();
48
+ const start = Date.now();
49
+ const absCwd = resolve(ctx.workspaceDir, relCwd);
50
+ // ── 1. Load command profile ────────────────────────────────
51
+ const projectPolicy = await loadProjectPolicy(ctx.workspaceDir);
52
+ const profile = resolveProfile(undefined, projectPolicy);
53
+ const profileCheck = checkCommand(command, profile);
54
+ if (!profileCheck.allowed) {
55
+ writeAuditLog(ctx.db, {
56
+ sessionId: ctx.sessionId,
57
+ toolName: this.name,
58
+ action: 'blocked_by_profile',
59
+ details: { command: command.slice(0, 2000), reason: profileCheck.reason, profile: profile.name },
60
+ status: 'blocked',
61
+ });
62
+ throw new Error(profileCheck.reason);
63
+ }
64
+ // ── 2. Belt-and-suspenders blocklist (also in Safety Gate) ─
53
65
  for (const blocked of GLOBAL_SHELL_BLOCKLIST) {
54
66
  if (command.toLowerCase().includes(blocked.toLowerCase())) {
67
+ writeAuditLog(ctx.db, {
68
+ sessionId: ctx.sessionId,
69
+ toolName: this.name,
70
+ action: 'blocked_by_global_blocklist',
71
+ details: { command: command.slice(0, 2000), matched: blocked },
72
+ status: 'blocked',
73
+ });
55
74
  throw new Error(`Command blocked by global blocklist: "${blocked}"`);
56
75
  }
57
76
  }
77
+ // ── 3. Apply profile limits ────────────────────────────────
78
+ const effectiveTimeout = Math.min(userTimeout, profileCheck.effectiveTimeout, ABSOLUTE_MAX_TIMEOUT);
79
+ const effectiveMaxOutput = Math.min(profileCheck.effectiveMaxOutput, ABSOLUTE_MAX_OUTPUT);
80
+ // ── 4. Dry run ─────────────────────────────────────────────
58
81
  if (ctx.dryRun) {
59
82
  return {
60
83
  success: true,
61
84
  output: `[DRY RUN] Would execute: ${command}`,
62
- data: { dryRun: true, command },
63
- executionId: generateId(),
85
+ data: { dryRun: true, command, profile: profile.name },
86
+ executionId,
64
87
  durationMs: 0,
65
88
  };
66
89
  }
67
- const absCwd = resolve(ctx.workspaceDir, relCwd);
68
- const executionId = generateId();
69
- const start = Date.now();
70
- const effectiveTout = Math.min(timeout, 120_000);
90
+ // ── 5. Execute with process tree control ───────────────────
71
91
  const { shell, shellFlag } = this.detectShell();
72
92
  return new Promise((resolve_p, reject) => {
93
+ // Unix: detached=true creates new process group for tree killing
94
+ // Windows: we use taskkill /T instead
95
+ const isUnix = process.platform !== 'win32';
73
96
  const proc = spawn(shell, [shellFlag, command], {
74
97
  cwd: absCwd,
75
98
  env: { ...process.env, ...extraEnv },
76
99
  stdio: 'pipe',
100
+ detached: isUnix, // new process group on Unix
77
101
  });
78
102
  let stdout = '';
79
103
  let stderr = '';
104
+ let killed = false;
80
105
  proc.stdout?.on('data', (d) => { stdout += d.toString(); });
81
106
  proc.stderr?.on('data', (d) => { stderr += d.toString(); });
107
+ // ── Timeout handler with escalation ──────────────────────
82
108
  const timer = setTimeout(() => {
83
- proc.kill('SIGTERM');
84
- reject(new Error(`Command timed out after ${effectiveTout}ms: ${command}`));
85
- }, effectiveTout);
86
- proc.on('close', (code) => {
109
+ killed = true;
110
+ this.killProcessTree(proc.pid, 'SIGTERM');
111
+ // Escalation: SIGTERM → wait → SIGKILL
112
+ const killTimer = setTimeout(() => {
113
+ this.killProcessTree(proc.pid, 'SIGKILL');
114
+ }, SIGKILL_DELAY_MS);
115
+ // Clean up escalation timer if process exits gracefully after SIGTERM
116
+ proc.on('close', () => clearTimeout(killTimer));
117
+ }, effectiveTimeout);
118
+ proc.on('close', (code, signal) => {
87
119
  clearTimeout(timer);
88
120
  const durationMs = Date.now() - start;
89
121
  const combined = [stdout, stderr].filter(Boolean).join('\n--- stderr ---\n');
90
- const truncated = combined.length > 20_000
91
- ? combined.slice(0, 20_000) + '\n[...output truncated at 20k chars...]'
122
+ const truncated = combined.length > effectiveMaxOutput
123
+ ? combined.slice(0, effectiveMaxOutput) + '\n[...output truncated...]'
92
124
  : combined;
93
- const success = code === 0;
94
- const status = success ? 'success' : 'failed';
95
- writeAuditLog(ctx.db, ctx.sessionId, 'execute', {
96
- command: command.slice(0, 2000), // cap detail size
97
- cwd: absCwd,
98
- exitCode: code,
99
- durationMs,
100
- outputLength: combined.length,
101
- }, status);
125
+ const wasKilledByUs = killed && (signal === 'SIGTERM' || signal === 'SIGKILL');
126
+ const success = code === 0 && !wasKilledByUs;
127
+ const status = wasKilledByUs ? 'failed' : success ? 'success' : 'failed';
128
+ writeAuditLog(ctx.db, {
129
+ sessionId: ctx.sessionId,
130
+ toolName: this.name,
131
+ action: wasKilledByUs ? 'timeout_killed' : 'execute',
132
+ details: {
133
+ command: command.slice(0, 2000),
134
+ cwd: absCwd,
135
+ exitCode: code,
136
+ signal,
137
+ durationMs,
138
+ outputLength: combined.length,
139
+ profile: profile.name,
140
+ },
141
+ status,
142
+ });
143
+ if (wasKilledByUs) {
144
+ reject(new Error(`Command timed out after ${effectiveTimeout}ms (killed with ${signal}): ${command}`));
145
+ return;
146
+ }
102
147
  if (code !== 0 && !stderr) {
103
148
  reject(new Error(`Command exited with code ${code}: ${truncated}`));
104
149
  return;
@@ -106,18 +151,25 @@ export class ShellExecTool {
106
151
  resolve_p({
107
152
  success,
108
153
  output: truncated || `(no output, exit code ${code})`,
109
- data: { exitCode: code, stdout, stderr, command, durationMs },
154
+ data: { exitCode: code, stdout, stderr, command, durationMs, profile: profile.name },
110
155
  executionId,
111
156
  durationMs,
112
157
  });
113
158
  });
114
159
  proc.on('error', (err) => {
115
160
  clearTimeout(timer);
116
- writeAuditLog(ctx.db, ctx.sessionId, 'spawn_error', {
117
- command: command.slice(0, 2000),
118
- cwd: absCwd,
119
- error: err.message,
120
- }, 'error');
161
+ writeAuditLog(ctx.db, {
162
+ sessionId: ctx.sessionId,
163
+ toolName: this.name,
164
+ action: 'spawn_error',
165
+ details: {
166
+ command: command.slice(0, 2000),
167
+ cwd: absCwd,
168
+ error: err.message,
169
+ profile: profile.name,
170
+ },
171
+ status: 'error',
172
+ });
121
173
  reject(new Error(`Failed to spawn process: ${err.message}`));
122
174
  });
123
175
  });
@@ -126,6 +178,7 @@ export class ShellExecTool {
126
178
  const { command } = args;
127
179
  return `Would execute shell command: "${command}"`;
128
180
  }
181
+ // ── Helpers ─────────────────────────────────────────────────
129
182
  detectShell() {
130
183
  if (process.platform === 'win32') {
131
184
  // Prefer PowerShell 7, fall back to cmd
@@ -135,5 +188,36 @@ export class ShellExecTool {
135
188
  }
136
189
  return { shell: process.env['SHELL'] ?? '/bin/sh', shellFlag: '-c' };
137
190
  }
191
+ /** Kill a process and its children. Platform-aware. */
192
+ killProcessTree(pid, signal) {
193
+ if (!pid)
194
+ return;
195
+ if (process.platform === 'win32') {
196
+ // Windows: taskkill /T kills the entire tree
197
+ const forceFlag = signal === 'SIGKILL' ? '/F' : '';
198
+ exec(`taskkill ${forceFlag} /T /PID ${pid}`, (err) => {
199
+ if (err && !err.message.includes('not found')) {
200
+ // Fallback: just kill the direct PID
201
+ try {
202
+ process.kill(pid, signal);
203
+ }
204
+ catch { /* ignore */ }
205
+ }
206
+ });
207
+ }
208
+ else {
209
+ // Unix: kill the process group (negative PID)
210
+ try {
211
+ process.kill(-pid, signal);
212
+ }
213
+ catch {
214
+ // Fallback: kill direct PID
215
+ try {
216
+ process.kill(pid, signal);
217
+ }
218
+ catch { /* ignore */ }
219
+ }
220
+ }
221
+ }
138
222
  }
139
223
  //# sourceMappingURL=shell-exec.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"shell-exec.js","sourceRoot":"","sources":["../../src/tools/shell-exec.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shell-exec.js","sourceRoot":"","sources":["../../src/tools/shell-exec.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,9 +1,11 @@
1
1
  {
2
2
  "name": "@nexagent-cli/cli",
3
- "version": "0.5.1",
3
+ "version": "0.7.0",
4
4
  "description": "NexAgent — locally-runnable AI agent CLI with file editing, tools, and beautiful TUI",
5
5
  "bin": {
6
- "nexagent": "./dist/index.js"
6
+ "nexagent": "./dist/index.js",
7
+ "sophie": "./dist/bin/sophie.js",
8
+ "amarax": "./dist/bin/amarax.js"
7
9
  },
8
10
  "main": "./dist/index.js",
9
11
  "types": "./dist/index.d.ts",
@@ -34,13 +36,13 @@
34
36
  "@anthropic-ai/sdk": "^0.29.0",
35
37
  "@google/generative-ai": "^0.19.0",
36
38
  "@inquirer/prompts": "^5.0.0",
37
- "@nexagent-cli/shared": "0.5.1",
39
+ "@nexagent-cli/shared": "^0.7.0",
38
40
  "better-sqlite3": "^11.0.0",
39
41
  "boxen": "^8.0.0",
40
42
  "chalk": "^5.3.0",
41
43
  "commander": "^12.1.0",
42
44
  "cors": "^2.8.5",
43
- "diff": "^7.0.0",
45
+ "diff": "^8.0.3",
44
46
  "dotenv": "^16.4.5",
45
47
  "express": "^4.21.0",
46
48
  "figures": "^6.1.0",
@@ -69,7 +71,7 @@
69
71
  "@types/react": "^18.3.0",
70
72
  "tsx": "^4.15.0",
71
73
  "typescript": "^5.5.0",
72
- "vitest": "^2.0.0"
74
+ "vitest": "^4.1.8"
73
75
  },
74
76
  "engines": {
75
77
  "node": ">=22.0.0"