network-ai 4.13.0 → 4.14.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/INTEGRATION_GUIDE.md +2 -2
- package/QUICKSTART.md +9 -0
- package/README.md +14 -3
- package/SKILL.md +2 -0
- package/bin/console.ts +769 -0
- package/dist/bin/console.d.ts +18 -0
- package/dist/bin/console.d.ts.map +1 -0
- package/dist/bin/console.js +799 -0
- package/dist/bin/console.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +21 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/agent-runtime.d.ts +310 -0
- package/dist/lib/agent-runtime.d.ts.map +1 -0
- package/dist/lib/agent-runtime.js +630 -0
- package/dist/lib/agent-runtime.js.map +1 -0
- package/dist/lib/console-ui.d.ts +134 -0
- package/dist/lib/console-ui.d.ts.map +1 -0
- package/dist/lib/console-ui.js +276 -0
- package/dist/lib/console-ui.js.map +1 -0
- package/dist/lib/phase-pipeline.js +1 -1
- package/dist/lib/phase-pipeline.js.map +1 -1
- package/dist/lib/strategy-agent.d.ts +320 -0
- package/dist/lib/strategy-agent.d.ts.map +1 -0
- package/dist/lib/strategy-agent.js +601 -0
- package/dist/lib/strategy-agent.js.map +1 -0
- package/package.json +4 -2
|
@@ -0,0 +1,630 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Agent Runtime — Sandboxed execution environment for AI agents
|
|
4
|
+
*
|
|
5
|
+
* Provides controlled access to shell commands, file system, and system
|
|
6
|
+
* resources with policy enforcement, approval gates, and audit logging.
|
|
7
|
+
*
|
|
8
|
+
* Components:
|
|
9
|
+
* - SandboxPolicy — defines what agents are allowed to do
|
|
10
|
+
* - ShellExecutor — spawns child processes within policy constraints
|
|
11
|
+
* - FileAccessor — scoped file read/write with traversal protection
|
|
12
|
+
* - ApprovalGate — human-in-the-loop approval for sensitive operations
|
|
13
|
+
* - AgentRuntime — unified facade combining all components
|
|
14
|
+
*
|
|
15
|
+
* @module AgentRuntime
|
|
16
|
+
* @version 1.0.0
|
|
17
|
+
*/
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
exports.RuntimeExecutionError = exports.RuntimeApprovalError = exports.RuntimePolicyError = exports.AgentRuntime = exports.ApprovalGate = exports.FileAccessor = exports.ShellExecutor = exports.SandboxPolicy = void 0;
|
|
20
|
+
const child_process_1 = require("child_process");
|
|
21
|
+
const promises_1 = require("fs/promises");
|
|
22
|
+
const path_1 = require("path");
|
|
23
|
+
const events_1 = require("events");
|
|
24
|
+
// ============================================================================
|
|
25
|
+
// SANDBOX POLICY
|
|
26
|
+
// ============================================================================
|
|
27
|
+
const DEFAULT_POLICY = {
|
|
28
|
+
allowedCommands: [],
|
|
29
|
+
blockedCommands: [
|
|
30
|
+
'rm -rf /',
|
|
31
|
+
'rm -rf /*',
|
|
32
|
+
'rmdir /s /q C:\\',
|
|
33
|
+
'format *',
|
|
34
|
+
'mkfs*',
|
|
35
|
+
'dd if=*',
|
|
36
|
+
':(){:|:&};:', // fork bomb
|
|
37
|
+
'shutdown*',
|
|
38
|
+
'reboot*',
|
|
39
|
+
'halt*',
|
|
40
|
+
'init 0',
|
|
41
|
+
'init 6',
|
|
42
|
+
'del /f /s /q C:\\*',
|
|
43
|
+
'reg delete*',
|
|
44
|
+
'net user*',
|
|
45
|
+
'net localgroup*',
|
|
46
|
+
],
|
|
47
|
+
allowedPaths: ['.'],
|
|
48
|
+
blockedPaths: [],
|
|
49
|
+
maxConcurrentProcesses: 5,
|
|
50
|
+
defaultTimeoutMs: 30_000,
|
|
51
|
+
defaultMaxOutputBytes: 1_048_576,
|
|
52
|
+
approvalRequired: [
|
|
53
|
+
'rm *',
|
|
54
|
+
'del *',
|
|
55
|
+
'rmdir *',
|
|
56
|
+
'git push*',
|
|
57
|
+
'git reset --hard*',
|
|
58
|
+
'npm publish*',
|
|
59
|
+
'docker *',
|
|
60
|
+
'kubectl *',
|
|
61
|
+
],
|
|
62
|
+
autoApproveReads: true,
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* Sandbox policy engine — determines what agents are allowed to do.
|
|
66
|
+
*
|
|
67
|
+
* @example
|
|
68
|
+
* ```typescript
|
|
69
|
+
* const policy = new SandboxPolicy({
|
|
70
|
+
* basePath: '/project',
|
|
71
|
+
* allowedCommands: ['npm *', 'node *', 'git status'],
|
|
72
|
+
* });
|
|
73
|
+
* policy.isCommandAllowed('npm test'); // true
|
|
74
|
+
* policy.isCommandAllowed('rm -rf /'); // false
|
|
75
|
+
* ```
|
|
76
|
+
*/
|
|
77
|
+
class SandboxPolicy {
|
|
78
|
+
config;
|
|
79
|
+
constructor(config) {
|
|
80
|
+
this.config = { ...DEFAULT_POLICY, ...config };
|
|
81
|
+
this.config.basePath = (0, path_1.resolve)(this.config.basePath);
|
|
82
|
+
}
|
|
83
|
+
/** Check if a command matches the policy's allowed list and isn't blocked */
|
|
84
|
+
isCommandAllowed(command) {
|
|
85
|
+
const trimmed = command.trim();
|
|
86
|
+
if (!trimmed)
|
|
87
|
+
return false;
|
|
88
|
+
// Check blocked first (always wins)
|
|
89
|
+
if (this.matchesAny(trimmed, this.config.blockedCommands))
|
|
90
|
+
return false;
|
|
91
|
+
// If no allowedCommands, deny all
|
|
92
|
+
if (this.config.allowedCommands.length === 0)
|
|
93
|
+
return false;
|
|
94
|
+
// Check allowed
|
|
95
|
+
return this.matchesAny(trimmed, this.config.allowedCommands);
|
|
96
|
+
}
|
|
97
|
+
/** Check if a command requires human approval */
|
|
98
|
+
requiresApproval(command) {
|
|
99
|
+
return this.matchesAny(command.trim(), this.config.approvalRequired);
|
|
100
|
+
}
|
|
101
|
+
/** Assess risk level of a command */
|
|
102
|
+
assessRisk(command) {
|
|
103
|
+
const trimmed = command.trim().toLowerCase();
|
|
104
|
+
const highRisk = ['rm ', 'del ', 'format', 'drop ', 'delete ', 'truncate ', 'git push', 'git reset', 'docker', 'kubectl'];
|
|
105
|
+
const medRisk = ['git ', 'npm ', 'pip ', 'mv ', 'move ', 'cp ', 'copy ', 'chmod ', 'chown '];
|
|
106
|
+
if (highRisk.some(p => trimmed.startsWith(p) || trimmed.includes(' ' + p)))
|
|
107
|
+
return 'high';
|
|
108
|
+
if (medRisk.some(p => trimmed.startsWith(p) || trimmed.includes(' ' + p)))
|
|
109
|
+
return 'medium';
|
|
110
|
+
return 'low';
|
|
111
|
+
}
|
|
112
|
+
/** Validate that a file path is within allowed scope */
|
|
113
|
+
isPathAllowed(filePath) {
|
|
114
|
+
const normalized = this.resolvePath(filePath);
|
|
115
|
+
if (!normalized)
|
|
116
|
+
return false;
|
|
117
|
+
// Check blocked paths
|
|
118
|
+
for (const blocked of this.config.blockedPaths) {
|
|
119
|
+
const blockedAbs = (0, path_1.resolve)(this.config.basePath, blocked);
|
|
120
|
+
if (normalized.startsWith(blockedAbs))
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
// Check allowed paths
|
|
124
|
+
for (const allowed of this.config.allowedPaths) {
|
|
125
|
+
const allowedAbs = (0, path_1.resolve)(this.config.basePath, allowed);
|
|
126
|
+
if (normalized.startsWith(allowedAbs))
|
|
127
|
+
return true;
|
|
128
|
+
}
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
/** Resolve and validate a path against basePath (returns null if traversal detected) */
|
|
132
|
+
resolvePath(filePath) {
|
|
133
|
+
const normalized = (0, path_1.normalize)(filePath);
|
|
134
|
+
const absolute = (0, path_1.isAbsolute)(normalized)
|
|
135
|
+
? normalized
|
|
136
|
+
: (0, path_1.join)(this.config.basePath, normalized);
|
|
137
|
+
const resolved = (0, path_1.resolve)(absolute);
|
|
138
|
+
// Traversal check
|
|
139
|
+
if (!resolved.startsWith(this.config.basePath))
|
|
140
|
+
return null;
|
|
141
|
+
return resolved;
|
|
142
|
+
}
|
|
143
|
+
/** Get a copy of the current policy config */
|
|
144
|
+
getConfig() {
|
|
145
|
+
return { ...this.config };
|
|
146
|
+
}
|
|
147
|
+
/** Update allowed commands */
|
|
148
|
+
allowCommand(pattern) {
|
|
149
|
+
if (!this.config.allowedCommands.includes(pattern)) {
|
|
150
|
+
this.config.allowedCommands.push(pattern);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/** Remove an allowed command pattern */
|
|
154
|
+
disallowCommand(pattern) {
|
|
155
|
+
this.config.allowedCommands = this.config.allowedCommands.filter(c => c !== pattern);
|
|
156
|
+
}
|
|
157
|
+
/** Update allowed paths */
|
|
158
|
+
allowPath(path) {
|
|
159
|
+
if (!this.config.allowedPaths.includes(path)) {
|
|
160
|
+
this.config.allowedPaths.push(path);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
/** Block a path */
|
|
164
|
+
blockPath(path) {
|
|
165
|
+
if (!this.config.blockedPaths.includes(path)) {
|
|
166
|
+
this.config.blockedPaths.push(path);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
get basePath() { return this.config.basePath; }
|
|
170
|
+
get maxConcurrentProcesses() { return this.config.maxConcurrentProcesses; }
|
|
171
|
+
get defaultTimeoutMs() { return this.config.defaultTimeoutMs; }
|
|
172
|
+
get defaultMaxOutputBytes() { return this.config.defaultMaxOutputBytes; }
|
|
173
|
+
get autoApproveReads() { return this.config.autoApproveReads; }
|
|
174
|
+
/** Simple glob matching: supports * as wildcard */
|
|
175
|
+
matchesAny(value, patterns) {
|
|
176
|
+
return patterns.some(pattern => this.globMatch(pattern, value));
|
|
177
|
+
}
|
|
178
|
+
/** Match a simple glob pattern against a string */
|
|
179
|
+
globMatch(pattern, value) {
|
|
180
|
+
// Escape regex special chars except *
|
|
181
|
+
const regexStr = pattern
|
|
182
|
+
.replace(/[.+^${}()|[\]\\]/g, '\\$&')
|
|
183
|
+
.replace(/\*/g, '.*');
|
|
184
|
+
return new RegExp(`^${regexStr}$`, 'i').test(value);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
exports.SandboxPolicy = SandboxPolicy;
|
|
188
|
+
// ============================================================================
|
|
189
|
+
// SHELL EXECUTOR
|
|
190
|
+
// ============================================================================
|
|
191
|
+
/**
|
|
192
|
+
* Sandboxed shell command executor with timeout, output limits, and
|
|
193
|
+
* concurrent process tracking.
|
|
194
|
+
*
|
|
195
|
+
* @example
|
|
196
|
+
* ```typescript
|
|
197
|
+
* const executor = new ShellExecutor(policy);
|
|
198
|
+
* const result = await executor.execute('npm test', { agentId: 'tester' });
|
|
199
|
+
* console.log(result.exitCode, result.stdout);
|
|
200
|
+
* ```
|
|
201
|
+
*/
|
|
202
|
+
class ShellExecutor {
|
|
203
|
+
policy;
|
|
204
|
+
activeProcesses = 0;
|
|
205
|
+
constructor(policy) {
|
|
206
|
+
this.policy = policy;
|
|
207
|
+
}
|
|
208
|
+
/** Execute a shell command within policy constraints */
|
|
209
|
+
async execute(command, opts = {}) {
|
|
210
|
+
// Policy check
|
|
211
|
+
if (!this.policy.isCommandAllowed(command)) {
|
|
212
|
+
throw new RuntimePolicyError(`Command blocked by policy: ${command}`);
|
|
213
|
+
}
|
|
214
|
+
// Concurrency check
|
|
215
|
+
if (this.activeProcesses >= this.policy.maxConcurrentProcesses) {
|
|
216
|
+
throw new RuntimePolicyError(`Concurrency limit reached (${this.policy.maxConcurrentProcesses} max)`);
|
|
217
|
+
}
|
|
218
|
+
const cwd = opts.cwd
|
|
219
|
+
? (this.policy.resolvePath(opts.cwd) ?? this.policy.basePath)
|
|
220
|
+
: this.policy.basePath;
|
|
221
|
+
const timeoutMs = opts.timeoutMs ?? this.policy.defaultTimeoutMs;
|
|
222
|
+
const maxBytes = opts.maxOutputBytes ?? this.policy.defaultMaxOutputBytes;
|
|
223
|
+
this.activeProcesses++;
|
|
224
|
+
const startTime = Date.now();
|
|
225
|
+
try {
|
|
226
|
+
return await this.spawnCommand(command, cwd, timeoutMs, maxBytes, opts.env);
|
|
227
|
+
}
|
|
228
|
+
finally {
|
|
229
|
+
this.activeProcesses--;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
/** Get the number of currently running processes */
|
|
233
|
+
get running() { return this.activeProcesses; }
|
|
234
|
+
spawnCommand(command, cwd, timeoutMs, maxBytes, env) {
|
|
235
|
+
return new Promise((resolvePromise, reject) => {
|
|
236
|
+
const isWindows = process.platform === 'win32';
|
|
237
|
+
const shell = isWindows ? 'cmd.exe' : '/bin/sh';
|
|
238
|
+
const shellArgs = isWindows ? ['/c', command] : ['-c', command];
|
|
239
|
+
const child = (0, child_process_1.spawn)(shell, shellArgs, {
|
|
240
|
+
cwd,
|
|
241
|
+
env: env ? { ...process.env, ...env } : process.env,
|
|
242
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
243
|
+
windowsHide: true,
|
|
244
|
+
});
|
|
245
|
+
let stdout = '';
|
|
246
|
+
let stderr = '';
|
|
247
|
+
let totalBytes = 0;
|
|
248
|
+
let timedOut = false;
|
|
249
|
+
let truncated = false;
|
|
250
|
+
const timer = setTimeout(() => {
|
|
251
|
+
timedOut = true;
|
|
252
|
+
child.kill('SIGTERM');
|
|
253
|
+
setTimeout(() => { if (!child.killed)
|
|
254
|
+
child.kill('SIGKILL'); }, 2000);
|
|
255
|
+
}, timeoutMs);
|
|
256
|
+
child.stdout?.on('data', (chunk) => {
|
|
257
|
+
totalBytes += chunk.length;
|
|
258
|
+
if (totalBytes <= maxBytes) {
|
|
259
|
+
stdout += chunk.toString();
|
|
260
|
+
}
|
|
261
|
+
else if (!truncated) {
|
|
262
|
+
truncated = true;
|
|
263
|
+
stdout += '\n[OUTPUT TRUNCATED — exceeded limit]';
|
|
264
|
+
child.kill('SIGTERM');
|
|
265
|
+
}
|
|
266
|
+
});
|
|
267
|
+
child.stderr?.on('data', (chunk) => {
|
|
268
|
+
totalBytes += chunk.length;
|
|
269
|
+
if (totalBytes <= maxBytes) {
|
|
270
|
+
stderr += chunk.toString();
|
|
271
|
+
}
|
|
272
|
+
});
|
|
273
|
+
child.on('close', (code) => {
|
|
274
|
+
clearTimeout(timer);
|
|
275
|
+
resolvePromise({
|
|
276
|
+
exitCode: code ?? (timedOut ? 124 : 1),
|
|
277
|
+
stdout,
|
|
278
|
+
stderr,
|
|
279
|
+
durationMs: Date.now() - startTime,
|
|
280
|
+
timedOut,
|
|
281
|
+
truncated,
|
|
282
|
+
});
|
|
283
|
+
});
|
|
284
|
+
child.on('error', (err) => {
|
|
285
|
+
clearTimeout(timer);
|
|
286
|
+
reject(new RuntimeExecutionError(`Failed to spawn: ${err.message}`));
|
|
287
|
+
});
|
|
288
|
+
const startTime = Date.now();
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
exports.ShellExecutor = ShellExecutor;
|
|
293
|
+
// ============================================================================
|
|
294
|
+
// FILE ACCESSOR
|
|
295
|
+
// ============================================================================
|
|
296
|
+
/**
|
|
297
|
+
* Policy-scoped file system accessor. All paths are validated against
|
|
298
|
+
* the sandbox policy before any I/O.
|
|
299
|
+
*
|
|
300
|
+
* @example
|
|
301
|
+
* ```typescript
|
|
302
|
+
* const files = new FileAccessor(policy);
|
|
303
|
+
* const result = await files.read('src/index.ts', 'reader-agent');
|
|
304
|
+
* ```
|
|
305
|
+
*/
|
|
306
|
+
class FileAccessor {
|
|
307
|
+
policy;
|
|
308
|
+
constructor(policy) {
|
|
309
|
+
this.policy = policy;
|
|
310
|
+
}
|
|
311
|
+
/** Read a file within the sandbox scope */
|
|
312
|
+
async read(filePath, agentId) {
|
|
313
|
+
const start = Date.now();
|
|
314
|
+
const resolved = this.policy.resolvePath(filePath);
|
|
315
|
+
if (!resolved) {
|
|
316
|
+
return { success: false, path: filePath, error: 'Path traversal blocked', durationMs: Date.now() - start };
|
|
317
|
+
}
|
|
318
|
+
if (!this.policy.isPathAllowed(filePath)) {
|
|
319
|
+
return { success: false, path: filePath, error: 'Path not in allowed scope', durationMs: Date.now() - start };
|
|
320
|
+
}
|
|
321
|
+
try {
|
|
322
|
+
const content = await (0, promises_1.readFile)(resolved, 'utf-8');
|
|
323
|
+
return { success: true, path: resolved, content, durationMs: Date.now() - start };
|
|
324
|
+
}
|
|
325
|
+
catch (err) {
|
|
326
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
327
|
+
return { success: false, path: resolved, error: msg, durationMs: Date.now() - start };
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
/** Write a file within the sandbox scope */
|
|
331
|
+
async write(filePath, content, agentId) {
|
|
332
|
+
const start = Date.now();
|
|
333
|
+
const resolved = this.policy.resolvePath(filePath);
|
|
334
|
+
if (!resolved) {
|
|
335
|
+
return { success: false, path: filePath, error: 'Path traversal blocked', durationMs: Date.now() - start };
|
|
336
|
+
}
|
|
337
|
+
if (!this.policy.isPathAllowed(filePath)) {
|
|
338
|
+
return { success: false, path: filePath, error: 'Path not in allowed scope', durationMs: Date.now() - start };
|
|
339
|
+
}
|
|
340
|
+
try {
|
|
341
|
+
await (0, promises_1.mkdir)((0, path_1.dirname)(resolved), { recursive: true });
|
|
342
|
+
await (0, promises_1.writeFile)(resolved, content, 'utf-8');
|
|
343
|
+
return { success: true, path: resolved, durationMs: Date.now() - start };
|
|
344
|
+
}
|
|
345
|
+
catch (err) {
|
|
346
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
347
|
+
return { success: false, path: resolved, error: msg, durationMs: Date.now() - start };
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
/** List directory contents within the sandbox scope */
|
|
351
|
+
async list(dirPath, agentId) {
|
|
352
|
+
const start = Date.now();
|
|
353
|
+
const resolved = this.policy.resolvePath(dirPath);
|
|
354
|
+
if (!resolved) {
|
|
355
|
+
return { success: false, path: dirPath, error: 'Path traversal blocked', durationMs: Date.now() - start };
|
|
356
|
+
}
|
|
357
|
+
if (!this.policy.isPathAllowed(dirPath)) {
|
|
358
|
+
return { success: false, path: dirPath, error: 'Path not in allowed scope', durationMs: Date.now() - start };
|
|
359
|
+
}
|
|
360
|
+
try {
|
|
361
|
+
const items = await (0, promises_1.readdir)(resolved);
|
|
362
|
+
const entries = [];
|
|
363
|
+
for (const item of items) {
|
|
364
|
+
const itemPath = (0, path_1.join)(resolved, item);
|
|
365
|
+
const info = await (0, promises_1.stat)(itemPath);
|
|
366
|
+
entries.push(info.isDirectory() ? `${item}/` : item);
|
|
367
|
+
}
|
|
368
|
+
return { success: true, path: resolved, entries, durationMs: Date.now() - start };
|
|
369
|
+
}
|
|
370
|
+
catch (err) {
|
|
371
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
372
|
+
return { success: false, path: resolved, error: msg, durationMs: Date.now() - start };
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
exports.FileAccessor = FileAccessor;
|
|
377
|
+
// ============================================================================
|
|
378
|
+
// APPROVAL GATE
|
|
379
|
+
// ============================================================================
|
|
380
|
+
/**
|
|
381
|
+
* Human-in-the-loop approval gate. Queues requests and waits for
|
|
382
|
+
* a decision from the configured callback.
|
|
383
|
+
*
|
|
384
|
+
* @example
|
|
385
|
+
* ```typescript
|
|
386
|
+
* const gate = new ApprovalGate(async (req) => {
|
|
387
|
+
* return { approved: true, approvedBy: 'operator' };
|
|
388
|
+
* });
|
|
389
|
+
* const decision = await gate.request({ type: 'shell', target: 'npm publish', ... });
|
|
390
|
+
* ```
|
|
391
|
+
*/
|
|
392
|
+
class ApprovalGate extends events_1.EventEmitter {
|
|
393
|
+
callback;
|
|
394
|
+
autoApproveAll;
|
|
395
|
+
history = [];
|
|
396
|
+
constructor(callback, autoApproveAll = false) {
|
|
397
|
+
super();
|
|
398
|
+
this.callback = callback ?? null;
|
|
399
|
+
this.autoApproveAll = autoApproveAll;
|
|
400
|
+
}
|
|
401
|
+
/** Request approval for an operation */
|
|
402
|
+
async request(req) {
|
|
403
|
+
this.emit('requested', req);
|
|
404
|
+
if (this.autoApproveAll) {
|
|
405
|
+
const decision = { approved: true, approvedBy: 'auto-approve-all' };
|
|
406
|
+
this.history.push({ request: req, decision });
|
|
407
|
+
this.emit('decided', req, decision);
|
|
408
|
+
return decision;
|
|
409
|
+
}
|
|
410
|
+
if (!this.callback) {
|
|
411
|
+
const decision = { approved: false, reason: 'No approval callback configured' };
|
|
412
|
+
this.history.push({ request: req, decision });
|
|
413
|
+
this.emit('decided', req, decision);
|
|
414
|
+
return decision;
|
|
415
|
+
}
|
|
416
|
+
const decision = await this.callback(req);
|
|
417
|
+
this.history.push({ request: req, decision });
|
|
418
|
+
this.emit('decided', req, decision);
|
|
419
|
+
return decision;
|
|
420
|
+
}
|
|
421
|
+
/** Get approval history */
|
|
422
|
+
getHistory() {
|
|
423
|
+
return this.history;
|
|
424
|
+
}
|
|
425
|
+
/** Get count of approvals/denials */
|
|
426
|
+
getStats() {
|
|
427
|
+
const approved = this.history.filter(h => h.decision.approved).length;
|
|
428
|
+
return { total: this.history.length, approved, denied: this.history.length - approved };
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
exports.ApprovalGate = ApprovalGate;
|
|
432
|
+
// ============================================================================
|
|
433
|
+
// AGENT RUNTIME (Facade)
|
|
434
|
+
// ============================================================================
|
|
435
|
+
/**
|
|
436
|
+
* Unified agent execution runtime. Combines policy, shell, file access,
|
|
437
|
+
* and approval into a single interface for agent consumption.
|
|
438
|
+
*
|
|
439
|
+
* @example
|
|
440
|
+
* ```typescript
|
|
441
|
+
* const runtime = new AgentRuntime({
|
|
442
|
+
* policy: {
|
|
443
|
+
* basePath: '/project',
|
|
444
|
+
* allowedCommands: ['npm *', 'node *', 'git status', 'git diff'],
|
|
445
|
+
* },
|
|
446
|
+
* onApproval: async (req) => {
|
|
447
|
+
* console.log(`Approve? ${req.type}: ${req.target}`);
|
|
448
|
+
* return { approved: true, approvedBy: 'operator' };
|
|
449
|
+
* },
|
|
450
|
+
* });
|
|
451
|
+
*
|
|
452
|
+
* const result = await runtime.exec('npm test', 'tester-agent');
|
|
453
|
+
* ```
|
|
454
|
+
*/
|
|
455
|
+
class AgentRuntime extends events_1.EventEmitter {
|
|
456
|
+
policy;
|
|
457
|
+
shell;
|
|
458
|
+
files;
|
|
459
|
+
gate;
|
|
460
|
+
auditLog = [];
|
|
461
|
+
constructor(opts) {
|
|
462
|
+
super();
|
|
463
|
+
this.policy = new SandboxPolicy(opts.policy);
|
|
464
|
+
this.shell = new ShellExecutor(this.policy);
|
|
465
|
+
this.files = new FileAccessor(this.policy);
|
|
466
|
+
this.gate = new ApprovalGate(opts.onApproval, opts.autoApproveAll);
|
|
467
|
+
// Wire approval events
|
|
468
|
+
this.gate.on('requested', (req) => {
|
|
469
|
+
this.emit('approval:requested', req);
|
|
470
|
+
this.audit({ action: 'approval_requested', agentId: req.agentId, target: req.target, result: 'success' });
|
|
471
|
+
});
|
|
472
|
+
this.gate.on('decided', (req, dec) => {
|
|
473
|
+
this.emit('approval:decided', req, dec);
|
|
474
|
+
this.audit({
|
|
475
|
+
action: dec.approved ? 'approval_granted' : 'approval_denied',
|
|
476
|
+
agentId: req.agentId,
|
|
477
|
+
target: req.target,
|
|
478
|
+
result: dec.approved ? 'success' : 'denied',
|
|
479
|
+
details: { approvedBy: dec.approvedBy, reason: dec.reason },
|
|
480
|
+
});
|
|
481
|
+
});
|
|
482
|
+
}
|
|
483
|
+
/**
|
|
484
|
+
* Execute a shell command with policy + approval checks.
|
|
485
|
+
* Returns ShellResult on success, throws on policy violation.
|
|
486
|
+
*/
|
|
487
|
+
async exec(command, agentId, opts = {}) {
|
|
488
|
+
// Policy check
|
|
489
|
+
if (!this.policy.isCommandAllowed(command)) {
|
|
490
|
+
this.emit('policy:violation', agentId, command, 'Command not allowed by policy');
|
|
491
|
+
this.audit({ action: 'shell_execute', agentId, target: command, result: 'blocked' });
|
|
492
|
+
throw new RuntimePolicyError(`Command blocked by policy: ${command}`);
|
|
493
|
+
}
|
|
494
|
+
// Approval check
|
|
495
|
+
const needsApproval = opts.requiresApproval ?? this.policy.requiresApproval(command);
|
|
496
|
+
if (needsApproval) {
|
|
497
|
+
const decision = await this.gate.request({
|
|
498
|
+
type: 'shell',
|
|
499
|
+
target: command,
|
|
500
|
+
agentId,
|
|
501
|
+
risk: this.policy.assessRisk(command),
|
|
502
|
+
timestamp: Date.now(),
|
|
503
|
+
});
|
|
504
|
+
if (!decision.approved) {
|
|
505
|
+
this.audit({ action: 'shell_execute', agentId, target: command, result: 'denied', details: { reason: decision.reason } });
|
|
506
|
+
throw new RuntimeApprovalError(`Command denied: ${decision.reason ?? 'no reason given'}`);
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
// Execute
|
|
510
|
+
this.emit('command:start', agentId, command);
|
|
511
|
+
const result = await this.shell.execute(command, { ...opts, agentId });
|
|
512
|
+
this.emit('command:complete', agentId, command, result);
|
|
513
|
+
this.audit({
|
|
514
|
+
action: 'shell_execute',
|
|
515
|
+
agentId,
|
|
516
|
+
target: command,
|
|
517
|
+
result: result.exitCode === 0 ? 'success' : (result.timedOut ? 'timeout' : 'error'),
|
|
518
|
+
durationMs: result.durationMs,
|
|
519
|
+
details: { exitCode: result.exitCode, timedOut: result.timedOut },
|
|
520
|
+
});
|
|
521
|
+
return result;
|
|
522
|
+
}
|
|
523
|
+
/** Read a file with policy + optional approval */
|
|
524
|
+
async readFile(filePath, agentId) {
|
|
525
|
+
if (!this.policy.isPathAllowed(filePath)) {
|
|
526
|
+
this.emit('policy:violation', agentId, filePath, 'Path not allowed');
|
|
527
|
+
this.audit({ action: 'file_read', agentId, target: filePath, result: 'blocked' });
|
|
528
|
+
return { success: false, path: filePath, error: 'Path not allowed by policy', durationMs: 0 };
|
|
529
|
+
}
|
|
530
|
+
// Reads can auto-approve
|
|
531
|
+
if (!this.policy.autoApproveReads) {
|
|
532
|
+
const decision = await this.gate.request({
|
|
533
|
+
type: 'file_read', target: filePath, agentId, risk: 'low', timestamp: Date.now(),
|
|
534
|
+
});
|
|
535
|
+
if (!decision.approved) {
|
|
536
|
+
this.audit({ action: 'file_read', agentId, target: filePath, result: 'denied' });
|
|
537
|
+
return { success: false, path: filePath, error: 'Read denied', durationMs: 0 };
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
this.emit('file:access', agentId, filePath, 'read');
|
|
541
|
+
const result = await this.files.read(filePath, agentId);
|
|
542
|
+
this.audit({
|
|
543
|
+
action: 'file_read', agentId, target: filePath,
|
|
544
|
+
result: result.success ? 'success' : 'error', durationMs: result.durationMs,
|
|
545
|
+
});
|
|
546
|
+
return result;
|
|
547
|
+
}
|
|
548
|
+
/** Write a file with policy + approval */
|
|
549
|
+
async writeFile(filePath, content, agentId) {
|
|
550
|
+
if (!this.policy.isPathAllowed(filePath)) {
|
|
551
|
+
this.emit('policy:violation', agentId, filePath, 'Path not allowed');
|
|
552
|
+
this.audit({ action: 'file_write', agentId, target: filePath, result: 'blocked' });
|
|
553
|
+
return { success: false, path: filePath, error: 'Path not allowed by policy', durationMs: 0 };
|
|
554
|
+
}
|
|
555
|
+
const decision = await this.gate.request({
|
|
556
|
+
type: 'file_write', target: filePath, agentId, risk: 'medium', timestamp: Date.now(),
|
|
557
|
+
});
|
|
558
|
+
if (!decision.approved) {
|
|
559
|
+
this.audit({ action: 'file_write', agentId, target: filePath, result: 'denied' });
|
|
560
|
+
return { success: false, path: filePath, error: `Write denied: ${decision.reason ?? 'no reason'}`, durationMs: 0 };
|
|
561
|
+
}
|
|
562
|
+
this.emit('file:access', agentId, filePath, 'write');
|
|
563
|
+
const result = await this.files.write(filePath, content, agentId);
|
|
564
|
+
this.audit({
|
|
565
|
+
action: 'file_write', agentId, target: filePath,
|
|
566
|
+
result: result.success ? 'success' : 'error', durationMs: result.durationMs,
|
|
567
|
+
});
|
|
568
|
+
return result;
|
|
569
|
+
}
|
|
570
|
+
/** List a directory with policy check */
|
|
571
|
+
async listDir(dirPath, agentId) {
|
|
572
|
+
if (!this.policy.isPathAllowed(dirPath)) {
|
|
573
|
+
this.emit('policy:violation', agentId, dirPath, 'Path not allowed');
|
|
574
|
+
this.audit({ action: 'file_list', agentId, target: dirPath, result: 'blocked' });
|
|
575
|
+
return { success: false, path: dirPath, error: 'Path not allowed by policy', durationMs: 0 };
|
|
576
|
+
}
|
|
577
|
+
this.emit('file:access', agentId, dirPath, 'list');
|
|
578
|
+
const result = await this.files.list(dirPath, agentId);
|
|
579
|
+
this.audit({
|
|
580
|
+
action: 'file_list', agentId, target: dirPath,
|
|
581
|
+
result: result.success ? 'success' : 'error', durationMs: result.durationMs,
|
|
582
|
+
});
|
|
583
|
+
return result;
|
|
584
|
+
}
|
|
585
|
+
/** Get the internal audit log */
|
|
586
|
+
getAuditLog() {
|
|
587
|
+
return this.auditLog;
|
|
588
|
+
}
|
|
589
|
+
/** Clear the internal audit log */
|
|
590
|
+
clearAuditLog() {
|
|
591
|
+
this.auditLog = [];
|
|
592
|
+
}
|
|
593
|
+
audit(entry) {
|
|
594
|
+
const full = { ...entry, timestamp: new Date().toISOString() };
|
|
595
|
+
this.auditLog.push(full);
|
|
596
|
+
this.emit('audit', full);
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
exports.AgentRuntime = AgentRuntime;
|
|
600
|
+
// ============================================================================
|
|
601
|
+
// ERROR TYPES
|
|
602
|
+
// ============================================================================
|
|
603
|
+
/** Thrown when an operation violates the sandbox policy */
|
|
604
|
+
class RuntimePolicyError extends Error {
|
|
605
|
+
code = 'POLICY_VIOLATION';
|
|
606
|
+
constructor(message) {
|
|
607
|
+
super(message);
|
|
608
|
+
this.name = 'RuntimePolicyError';
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
exports.RuntimePolicyError = RuntimePolicyError;
|
|
612
|
+
/** Thrown when an operation is denied by the approval gate */
|
|
613
|
+
class RuntimeApprovalError extends Error {
|
|
614
|
+
code = 'APPROVAL_DENIED';
|
|
615
|
+
constructor(message) {
|
|
616
|
+
super(message);
|
|
617
|
+
this.name = 'RuntimeApprovalError';
|
|
618
|
+
}
|
|
619
|
+
}
|
|
620
|
+
exports.RuntimeApprovalError = RuntimeApprovalError;
|
|
621
|
+
/** Thrown when a command fails to spawn */
|
|
622
|
+
class RuntimeExecutionError extends Error {
|
|
623
|
+
code = 'EXECUTION_ERROR';
|
|
624
|
+
constructor(message) {
|
|
625
|
+
super(message);
|
|
626
|
+
this.name = 'RuntimeExecutionError';
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
exports.RuntimeExecutionError = RuntimeExecutionError;
|
|
630
|
+
//# sourceMappingURL=agent-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-runtime.js","sourceRoot":"","sources":["../../lib/agent-runtime.ts"],"names":[],"mappings":"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"}
|